1 pontos por GN⁺ 2024-07-28 | 1 comentários | Compartilhar no WhatsApp
  • Um projeto de hacking que coloca uma placa de substituição Sensor Watch em um Casio F-91W comum para ver códigos 2FA TOTP do Google e do Github no pulso
  • Mantém o LCD, os botões e o buzzer piezoelétrico originais, trocando apenas a placa ARM Cortex M0+, e executa mostradores programáveis e apps utilitários sem Bluetooth
  • O mostrador TOTP funciona extraindo o Base32 secret de um QR code, convertendo-o para bytes hexadecimais, inserindo-o em totp_face.c e recompilando o movement
  • O mostrador ratemeter criado junto calcula a velocidade por minuto a partir do intervalo entre acionamentos do botão ALARM; acima de 500/min exibe Hi, abaixo de 1/min exibe Lo
  • A combinação de bateria com duração de vários meses, caixa Casio original, emulador wasm baseado na web e árvore de código-fonte modificável permite transformar o F-91W em uma pequena plataforma de hacking de pulso

Transformando o Casio F-91W em um relógio programável

  • Sensor Watch é uma placa lógica que substitui o movimento de quartzo original do Casio F-91W
  • O F-91W é um relógio de quartzo clássico que, segundo se sabe, vendeu cerca de 90 milhões de unidades
  • A nova placa aproveita os componentes originais
    • O display LCD original
    • Botões
    • Buzzer piezoelétrico
  • A placa é programável e baseada em ARM Cortex M0+
  • O projeto Sensor Watch oferece um conjunto de mostradores fáceis de modificar e pequenos apps utilitários chamados “complications”
  • Não há rádio Bluetooth, mas os pontos fortes são a caixa leve do relógio, bateria com duração de vários meses e uma estrutura que pode ser recompilada diretamente

Recursos criados em menos de uma hora

  • A troca da placa, a configuração dos secrets de 2FA e a criação de um novo mostrador foram concluídas em cerca de 1 hora
  • Foi configurado para permitir ver no pulso os códigos OTP das contas do Google e do Github
  • Foi criado um novo mostrador ratemeter, que pode ser usado como medidor de remadas no remo ou medidor de cadência
  • Há um emulador baseado em wasm, o que facilita testar no computador, e também é possível executar builds pessoais diretamente em uma página web

Fluxo de mostradores oferecido pelo relógio

  • Pressionar o botão MODE uma vez leva ao mostrador de token 2FA
  • No mostrador 2FA, o botão ALARM alterna entre os tokens do Google e do Github
  • Pressionar o botão MODE novamente leva ao mostrador ratemeter recém-criado
  • No ratemeter, pressiona-se o botão ALARM periodicamente para medir a velocidade por minuto do alvo que está sendo acompanhado
  • Este build também inclui vários mostradores padrão
    • Relógio mundial
    • Calculadora de nascer/pôr do sol
    • Indicador de fase da lua
    • Saída em tempo real do sensor de temperatura interno do relógio
    • Seletor de configuração de 24 horas
    • Modo de configuração de hora/data
  • A árvore de código-fonte do movement do Sensor Watch também contém outros mostradores, como pulsometer e orrery
  • O processo de upgrade do módulo do F-91W está documentado no blog de John Graham-Cumming

Como configurar o mostrador TOTP

  • O mostrador TOTP gera uma senha descartável baseada em tempo, usando a hora atual como fonte de unicidade
  • Pode ser usado para gerar códigos de autenticação em duas etapas para login em vários sites, como Google e Github
  • O botão ALARM alterna entre os sites e os TOTP secrets configurados
  • Há suporte a vários sites e secrets, mas é preciso extrair o secret do QR code e inseri-lo diretamente no código-fonte do mostrador
  • Procedimento para adicionar um TOTP secret

    • Obtenha o TOTP secret ou QR code no site para o qual deseja gerar códigos
    • Se houver apenas o QR code, é possível extrair o secret no site de Stefan Sundin
    • O resultado da extração é uma string alfanumérica de cerca de 32 caracteres, que é o TOTP secret codificado em Base32
    • Para colocar o secret no código do mostrador, é preciso converter Base32 para bytes hexadecimais em cryptii.com
    • O TOTP secret deve ser inserido em letras maiúsculas
    • Depois de adicionar os bytes hexadecimais convertidos ao código-fonte do mostrador TOTP, recompile o movement
  • Pontos de modificação em totp_face.c

    • É possível remover a chave de demonstração; para adicionar uma nova chave ao fim da lista, incremente o valor de num_keys em 1
    • Adicione os bytes hexadecimais convertidos ao fim do array keys[]
      • Coloque 0x antes de cada byte e separe-os por vírgulas
      • Também é preciso adicionar uma vírgula após o último byte existente
    • No fim do array key_sizes[], adicione o tamanho do secret inserido, ou seja, a quantidade de bytes hexadecimais recém-adicionados
    • No fim do array timesteps[], adicione o item 30
    • No array labels[][2], adicione o rótulo a ser exibido
      • Para uma conta Google, é possível usar um rótulo como { 'g', 'o' }

Implementação do mostrador ratemeter

  • O código do mostrador ratemeter está no pull request enviado ao projeto principal
  • A maior parte da implementação fica dentro da função de loop principal chamada ratemeter_face_loop
  • Essa função trata eventos de entrada dos botões e eventos de tick do relógio
  • O mostrador pode solicitar uma periodicidade de ticks para medições de intervalo ou tratamento de animações
  • O movement fornece a função utilitária watch_display_string
    • É uma função que tenta exibir strings alfanuméricas nos elementos limitados de 7+ segmentos do display Casio
    • O problema de mapear strings arbitrárias para uma tela limitada, e suas exceções, está organizado na documentação
  • Comportamento por evento

    • EVENT_ACTIVATE
      • Quando o mostrador é ativado, exibe RA na área de indicação do dia da semana
    • EVENT_MODE_BUTTON_UP
      • Ao pressionar o botão MODE, avança para o próximo mostrador
    • EVENT_LIGHT_BUTTON_DOWN
      • Ao pressionar o botão LIGHT, acende a luz LED
    • EVENT_ALARM_BUTTON_DOWN
      • Ao pressionar o botão ALARM, calcula a velocidade por minuto a partir do intervalo entre este acionamento e o anterior
      • Inicializa o contador de ticks armazenado no estado do mostrador
      • Solicita a periodicidade rápida de ticks com RATEMETER_FACE_FREQUENCY
      • Essa constante é definida como 1/16 de segundo
    • EVENT_TICK
      • Exibe a velocidade atual no display
      • Se a velocidade for 0, exibe apenas ra
      • Se for mais rápida que 500/min, exibe ra Hi
      • Se for mais lenta que 1/min, exibe ra Lo
      • Caso contrário, exibe a velocidade calculada no formato ra %-3d pn
      • Por fim, incrementa o contador de ticks

Informações de compra e afiliação

  • O Sensor Watch está disponível na Oddly Specific Objects
  • Não há relação de afiliação com a Oddly Specific Objects

1 comentários

 
GN⁺ 2024-07-28
Comentários no Hacker News
  • É incômodo inserir o segredo TOTP em uma página web qualquer
    No Linux, as ferramentas base32 e od talvez já estejam instaladas, e no Ubuntu elas vêm no pacote coreutils
    Fora isso, o projeto é excelente, mas o design do relógio é meio feio

    • Se realmente precisar usar um app web, pelo menos é melhor usar o CyberChef, que roda só no cliente e é amplamente usado em testes de segurança
      https://gchq.github.io/CyberChef/
    • É por isso que eu ainda mantenho o uMatrix
      https://i.imgur.com/9MYqLvj.png
      Dá para desativar rapidamente XHR para verificar se não há nenhum comportamento inesperado do lado do servidor
    • Esta placa também é compatível com os A158W e A171W, e eles são bem mais bonitos
    • Fico pensando por que alguém confiaria em um terceiro, ainda mais um site, para uma tarefa simples como decodificar base-32 ou gerar TOTP
  • Se às vezes você vir um símbolo estranho de na demo, isso é um “7 pequeno”
    Isso acontece porque este relógio liga em conjunto os segmentos superior e inferior do primeiro e do terceiro dígito, ou seja, os segmentos A e D
    https://joeycastillo.github.io/Sensor-Watch-Documentation/wi...
    É realmente impressionante o quanto de eficiência colocaram nesse display
    No uso normal, essas posições só precisam mostrar de 0 a 5, e o primeiro dígito em um relógio só precisa de 0, 1 e 2, mas o cronômetro vai até 59:59.99
    Esses dígitos não precisam distinguir os segmentos A e D, e em teoria não haveria problema se o cronômetro fosse até 69:59.99, mas aparentemente acharam que “uma hora” já era suficiente
    Os números 8 e 9 também acendem os segmentos de cima e de baixo, então na prática o único problema é o 7

    • A oddly specific objects está fazendo um LCD alternativo avançado
  • Finalmente apareceu um conteúdo que me faz vir ao HN
    O F-91W provavelmente tem o mesmo formato do A158W[1], e o A158W é um relógio absurdamente bonito pelo preço
    Combina com tudo, é estiloso sem chamar atenção, então acabo usando mais do que relógios mais caros
    Se você estiver preocupado com a pulseira de metal puxar os pelos do braço, isso só aconteceu umas duas vezes em um ano, bem menos do que em outras pulseiras metálicas baratas
    Se quiser uma alternativa mais “smoky”, o A168WGG[2] tem uma tonalidade cinza gunmetal na pulseira, o mostrador é escurecido, e o illuminator ilumina só as letras
    Mas o A168 é só um pouquinho maior que o A158, então não sei se o mesmo módulo interno encaixa igual; por outro lado, sendo maior, talvez até haja mais espaço
    Já que estamos falando de relógios, para trabalho eu uso um GA-B2100-1AJF[3] com pulseira preta
    Para um G-Shock, ele é bem estiloso e tem muitos recursos mesmo sem ser um smartwatch
    O modelo com Bluetooth tem cores e contraste tonal melhores no mostrador do que os modelos mais baratos, então é mais fácil combinar com a roupa
    [1] https://www.amazon.com/Casio-A158WA-1-Water-Resistant-Digita... [2] https://www.amazon.com/dp/B08195YQLQ/ [3] https://www.amazon.com/dp/B09YG8F41Y/

    • Infelizmente não é compatível
      A placa Sensor Watch precisa de peças doadas de um módulo Casio 593 original
      Você pode ver a lista de relógios compatíveis aqui
      https://www.sensorwatch.net/docs/
      Relógios que não funcionam mesmo com a mesma disposição de 3 botões, porque usam outro movimento: A168W, A700W, LA680W, B650W
      Em geral, se for um Casio digital de 3 botões e tiver uma boa luz de fundo “illuminator” em vez de iluminação lateral, então não é um 593 e não vai funcionar
  • Eu realmente adoro este projeto e literalmente uso todo dia
    Há pouco tempo implementei uma nova interface para definir códigos TOTP direto no código-fonte, então por causa disso a explicação deste post já não está mais correta
    Agora funciona assim
    static totp_t credentials[] = {
    CREDENTIAL(2F, "JBSWY3DPEHPK3PXP", SHA1, 30),
    CREDENTIAL(AC, "JBSWY3DPEHPK3PXP", SHA1, 30),
    };
    https://github.com/joeycastillo/Sensor-Watch/blob/main/movem...
    Também adicionei calibração do usuário para que o medidor de pulso possa ser usado como medidor de frequência respiratória para asma, e isso já ajudou a salvar vidas
    Há também calibração e compensação de temperatura, o que melhora a precisão do relógio para algo em torno de 10 segundos por ano
    A comunidade está crescendo, e muita gente entrou para hackear o firmware
    Recentemente alguém até fez um jogo de corrida infinita para este relógio
    https://github.com/joeycastillo/Sensor-Watch/pull/419
    Os mantenedores também são pessoas realmente ótimas
    Se você está procurando um excelente projeto open source em que valha a pena investir tempo, este é perfeito

    • Parece que roda com uma bateria comum de relógio, então fiquei curioso sobre a duração da bateria
      Não consegui encontrar isso na documentação
  • Se for preciso recompilar e regravar o relógio de pulso, o uso de TOTP parece ficar bem limitado

  • Muito legal
    Sempre quis que alguém fizesse algo assim também para os relógios calculadora da Casio

  • Seria ótimo se isso também funcionasse com tokens SecurID

  • Muito interessante
    Eu trabalho na Nixon e adoraria tentar algo assim também em um relógio digital da Nixon; se o autor quiser escrever um post parecido, talvez eu consiga arranjar alguns relógios grátis

  • Por que eu não consigo usar isso no meu smartwatch mais inteligente?
    Dá vontade de voltar para os antigos Casio

  • Isso é realmente bom, e eu já pensei em fazer algo parecido com um smartwatch burro, mas do ponto de vista de segurança operacional, fico em dúvida se é ok deixar o TOTP tão visível e de acesso tão fácil assim
    O que acontece se você perder o relógio ou ele for roubado?

    • A menos que o dono fique dizendo por aí “este é meu segundo fator de autenticação”, um estranho provavelmente só vai achar que é um relógio quebrado
    • Eu uso códigos TOTP em um Pebble e acho tranquilo
      Eu coloco rótulos para não ficar óbvio de qual serviço se trata
      O Pebble praticamente não tem trava nem segurança, mas no fim das contas isso é só o segundo fator de autenticação
      Se alguém já souber a minha senha aleatória gerada, tiver investigado a ponto de descobrir que eu posso ter TOTP no pulso, e ainda conseguir roubar meu relógio, então eu já perdi de qualquer forma, e acho que esse risco vale a conveniência
    • Ainda assim, não chama menos atenção do que uma YubiKey?