1 puntos por GN⁺ 2024-07-28 | 1 comentarios | Compartir por WhatsApp
  • Es un proyecto de hackeo que mete una placa de reemplazo Sensor Watch en un común Casio F-91W para ver códigos 2FA TOTP de Google y Github desde la muñeca
  • Mantiene el LCD, los botones y el zumbador piezoeléctrico originales, y solo cambia la placa ARM Cortex M0+ para ejecutar carátulas programables y apps utilitarias sin Bluetooth
  • La carátula TOTP funciona extrayendo el Base32 secret de un código QR, convirtiéndolo a bytes hexadecimales, poniéndolo en totp_face.c y volviendo a compilar movement
  • La carátula ratemeter creada junto con el proyecto calcula una velocidad por minuto según el intervalo entre pulsaciones del botón ALARM; por encima de 500/min muestra Hi y por debajo de 1/min muestra Lo
  • La combinación de batería de varios meses, carcasa Casio original, emulador wasm basado en web y árbol de código modificable permite convertir el F-91W en una pequeña plataforma de hackeo de muñeca

Convertir un Casio F-91W en un reloj programable

  • Sensor Watch es una placa lógica que reemplaza el movimiento de cuarzo original del Casio F-91W
  • El F-91W es un reloj de cuarzo clásico del que se dice que se vendieron alrededor de 90 millones de unidades
  • La nueva placa reutiliza los componentes existentes
    • La pantalla LCD original
    • Los botones
    • El zumbador piezoeléctrico
  • La placa es programable y está basada en ARM Cortex M0+
  • El proyecto Sensor Watch ofrece un conjunto de carátulas fáciles de modificar y pequeñas apps utilitarias llamadas “complications”
  • No tiene radio Bluetooth, pero sus ventajas son la carcasa ligera del reloj, una batería que dura varios meses y una estructura que se puede recompilar directamente

Funciones creadas en menos de una hora

  • El reemplazo de la placa, la configuración del secret 2FA y la escritura de una nueva carátula se completaron en alrededor de 1 hora
  • Se configuró para poder ver en la muñeca los códigos OTP de cuentas de Google y Github
  • Se escribió una nueva carátula ratemeter que puede usarse como medidor de paladas de remo o medidor de cadencia
  • Hay un emulador basado en wasm, lo que facilita probar en la computadora, y permite ejecutar una compilación personal directamente desde una página web

Flujo de carátulas ofrecido en el reloj

  • Al presionar una vez el botón MODE, se pasa a la carátula de token 2FA
  • En la carátula 2FA, el botón ALARM alterna entre los tokens de Google y Github
  • Al volver a presionar el botón MODE, se pasa a la nueva carátula ratemeter
  • En ratemeter, se presiona periódicamente el botón ALARM para medir la velocidad por minuto del objeto que se está siguiendo
  • Esta compilación también incluye varias carátulas básicas
    • Reloj mundial
    • Calculadora de salida y puesta del sol
    • Indicador de fase lunar
    • Salida en tiempo real del sensor de temperatura interno del reloj
    • Selector de configuración de 24 horas
    • Modo de configuración de hora/fecha
  • El árbol de código fuente de movement de Sensor Watch también contiene otras carátulas como pulsometer y orrery
  • El proceso de actualización del módulo F-91W está documentado en el blog de John Graham-Cumming

Cómo configurar la carátula TOTP

  • La carátula TOTP genera contraseñas de un solo uso basadas en tiempo que usan la hora actual como fuente de unicidad
  • Puede usarse para generar códigos de autenticación de dos factores al iniciar sesión en varios sitios web como Google y Github
  • Con el botón ALARM se alterna entre los sitios web configurados y sus TOTP secrets
  • Soporta varios sitios web y secrets, pero hay que extraer el secret del código QR e insertarlo directamente en el código fuente de la carátula
  • Procedimiento para agregar un TOTP secret

    • Obtener el TOTP secret o el código QR desde el sitio web para el que se quiere generar el código
    • Si solo se tiene el código QR, se puede extraer el secret en el sitio web de Stefan Sundin
    • El resultado extraído es una cadena alfanumérica de alrededor de 32 caracteres, y es el TOTP secret codificado en Base32
    • Para poner el secret en el código de la carátula, hay que convertir Base32 a bytes hexadecimales en cryptii.com
    • El TOTP secret debe ingresarse en mayúsculas
    • Después de agregar los bytes hexadecimales convertidos al código fuente de la carátula TOTP, se recompila movement
  • Puntos de modificación en totp_face.c

    • Se pueden eliminar las claves de demostración; para agregar una nueva clave al final de la lista, se incrementa en 1 el valor de num_keys
    • Se agregan al final del arreglo keys[] los bytes hexadecimales convertidos
      • Cada byte debe llevar 0x delante y separarse con comas
      • También hay que agregar una coma después del último byte existente
    • Al final del arreglo key_sizes[], se agrega el tamaño del secret añadido, es decir, la cantidad de bytes hexadecimales recién insertados
    • Al final del arreglo timesteps[], se agrega una entrada 30
    • En el arreglo labels[][2], se agrega una etiqueta para mostrar
      • Para una cuenta de Google, se puede usar una etiqueta como { 'g', 'o' }

Implementación de la carátula ratemeter

  • El código de la carátula ratemeter está en el pull request enviado al proyecto principal
  • La mayor parte de la implementación está dentro de la función de bucle principal llamada ratemeter_face_loop
  • Esta función procesa eventos de entrada de botones y eventos tick del reloj
  • La carátula puede solicitar una frecuencia de tick para manejar mediciones de intervalos o animaciones
  • movement ofrece la función utilitaria watch_display_string
    • Es una función que intenta mostrar cadenas alfanuméricas en los limitados elementos de 7+ segmentos de la pantalla Casio
    • El problema de mapear cadenas arbitrarias a la pantalla limitada y sus excepciones están documentados en la documentación
  • Comportamiento por evento

    • EVENT_ACTIVATE
      • Cuando se activa la carátula, muestra RA en el área de visualización del día de la semana
    • EVENT_MODE_BUTTON_UP
      • Al presionar el botón MODE, pasa a la siguiente carátula
    • EVENT_LIGHT_BUTTON_DOWN
      • Al presionar el botón LIGHT, enciende la iluminación LED
    • EVENT_ALARM_BUTTON_DOWN
      • Al presionar el botón ALARM, calcula la velocidad por minuto a partir del intervalo entre esta entrada y la entrada anterior
      • Reinicia el contador de ticks guardado en el estado de la carátula
      • Solicita una frecuencia de tick rápida con RATEMETER_FACE_FREQUENCY
      • Esta constante está definida como 1/16 de segundo
    • EVENT_TICK
      • Muestra la velocidad actual en la pantalla
      • Si la velocidad es 0, solo muestra ra
      • Si es más rápida que 500/min, muestra ra Hi
      • Si es más lenta que 1/min, muestra ra Lo
      • En los demás casos, muestra la velocidad calculada con el formato ra %-3d pn
      • Al final incrementa el contador de ticks

Información de compra y afiliación

  • Sensor Watch se puede conseguir en Oddly Specific Objects
  • No hay relación de afiliación con Oddly Specific Objects

1 comentarios

 
GN⁺ 2024-07-28
Opiniones en Hacker News
  • Es incómodo ingresar el secreto TOTP en una página web cualquiera.
    En Linux, puede que ya tengas instaladas las herramientas base32 y od; en Ubuntu vienen en el paquete coreutils.
    Fuera de eso, el proyecto está excelente, pero el diseño del reloj es medio feo.

    • Si de verdad hay que usar una app web, como mínimo sería mejor usar CyberChef, que corre solo del lado del cliente y se usa mucho en pruebas de seguridad.
      https://gchq.github.io/CyberChef/
    • Por eso todavía mantengo uMatrix instalado.
      https://i.imgur.com/9MYqLvj.png
      Para poder desactivar rápidamente XHR y comprobar que no haya comportamiento inesperado del lado del servidor.
    • Esta placa también es compatible con los A158W y A171W, y esos se ven mucho mejor.
    • Me pregunto por qué confiaría en un tercero, y encima en un sitio web, para algo tan simple como decodificar base-32 o generar TOTP.
  • Si en la demo a veces ves un símbolo raro, es un “7 pequeño”.
    Esto pasa porque en este reloj los segmentos superior e inferior del primer y tercer dígito, es decir los segmentos A y D, están unidos.
    https://joeycastillo.github.io/Sensor-Watch-Documentation/wi...
    Es realmente sorprendente cuánta eficiencia lograron meter en esta pantalla.
    En el uso normal, esas posiciones solo necesitan mostrar del 0 al 5, y el primer dígito en el reloj solo necesita 0, 1 y 2, aunque el cronómetro llega hasta 59:59.99.
    Esos dígitos no necesitan distinguir entre los segmentos A y D, y en teoría el cronómetro podría haber llegado a 69:59.99 sin problema, pero parece que consideraron que “una hora” era suficiente.
    Como el 8 y el 9 también encienden ambos segmentos superior e inferior, en la práctica el único problemático es el 7.

    • oddly specific objects está fabricando LCD de reemplazo de gama alta.
  • Por fin contenido que hace que valga la pena entrar a HN.
    El F-91W probablemente tenga el mismo factor de forma que el A158W[1], y el A158W es un reloj absurdamente atractivo para lo que cuesta.
    Combina con todo, es estiloso sin llamar demasiado la atención, y termino usándolo seguido en vez de relojes más caros.
    Si te preocupa que la correa metálica te jale los vellos del brazo, en un año me pasó unas dos veces como mucho, bastante menos que con otras correas metálicas baratas.
    Si quieres una alternativa más “smoky”, el A168WGG[2] tiene una tonalidad gris gunmetal en la correa, la carátula en negro, y el illuminator solo ilumina los caracteres.
    Eso sí, el A168 es apenas más grande que el A158, así que no sé si el módulo interno encaja igual, aunque si es más grande probablemente haya más espacio y quizá funcione.
    Ya que hablamos de relojes, como reloj de trabajo con correa negra uso el GA-B2100-1AJF[3].
    Para ser un G-Shock es bastante estiloso, y tiene muchas funciones aunque no sea un smartwatch.
    El modelo con Bluetooth tiene mejor contraste de color y tono en la carátula que los modelos más baratos, así que es más fácil combinarlo con la ropa.
    [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/

    • Lamentablemente no es compatible.
      La placa Sensor Watch necesita piezas donadas por un módulo Casio 593 original.
      La lista de relojes compatibles se puede ver aquí:
      https://www.sensorwatch.net/docs/
      Relojes que no funcionan porque usan otro movimiento aunque tengan la misma disposición de 3 botones: A168W, A700W, LA680W, B650W.
      En general, si es un Casio digital de 3 botones y tiene una retroiluminación “illuminator” decente en lugar de luz lateral, no es un 593 y no va a funcionar.
  • Me encanta este proyecto y lo uso literalmente todos los días.
    Hace poco implementé una nueva interfaz para definir códigos TOTP dentro del código fuente, así que la explicación de este artículo ya quedó desactualizada.
    Ahora funciona así:
    static totp_t credentials[] = {
    CREDENTIAL(2F, "JBSWY3DPEHPK3PXP", SHA1, 30),
    CREDENTIAL(AC, "JBSWY3DPEHPK3PXP", SHA1, 30),
    };
    https://github.com/joeycastillo/Sensor-Watch/blob/main/movem...
    También agregué calibración de usuario para que el medidor de pulso pueda usarse como medidor de frecuencia respiratoria para asma, y ya ayudó a salvar vidas.
    También tiene calibración y compensación de temperatura, lo que mejora la precisión del reloj a alrededor de 10 segundos por año.
    La comunidad está creciendo y mucha gente se sumó para hackear el firmware.
    Hace poco alguien creó un endless runner para este reloj.
    https://github.com/joeycastillo/Sensor-Watch/pull/419
    Los mantenedores también son gente buenísima.
    Si estás buscando un gran proyecto open source al que valga la pena dedicarle tiempo, este es el indicado.

    • Parece que funciona con una batería de reloj común, y me da curiosidad saber cuál es la duración de la batería.
      No lo encontré en la documentación.
  • Si tienes que recompilar y volver a flashear tu reloj de pulsera, me parece que el uso de TOTP queda bastante limitado.

  • Genial.
    Siempre quise que alguien hiciera algo así para los relojes calculadora de Casio.

  • Sería bueno que esto también funcionara en un token SecurID.

  • Muy interesante.
    Trabajo en Nixon, y me gustaría probar algo así en relojes digitales Nixon; si el autor quisiera escribir un artículo parecido, creo que podría conseguirle algunos relojes gratis.

  • ¿Por qué no puedo usar esto en mi smartwatch más inteligente?
    Me dan ganas de volver a mi viejo Casio.

  • Esto está muy bueno, y también había pensado en hacer algo parecido con un smartwatch tonto, pero desde el punto de vista de la seguridad operativa me pregunto si está bien que el TOTP sea tan visible y fácil de acceder.
    ¿Qué pasa si pierdes el reloj o te lo roban?

    • Mientras el dueño no ande diciendo “este es mi segundo factor de autenticación”, alguien que pase por ahí simplemente pensará que es un reloj descompuesto.
    • Uso códigos TOTP en mi Pebble y me parece aceptable.
      Les puse etiquetas para que no sea obvio de qué servicio se trata.
      El Pebble prácticamente no tiene bloqueo ni seguridad, pero al final no deja de ser un segundo factor.
      Si alguien ya conoce mi contraseña generada aleatoriamente, además investigó lo suficiente para saber que podría tener TOTP en la muñeca y realmente puede robarme el reloj, entonces ya perdí; y para mí ese riesgo vale la conveniencia.
    • Aun así, ¿no es menos llamativo que una YubiKey?