2 puntos por GN⁺ 2024-07-02 | 1 comentarios | Compartir por WhatsApp
  • Al obtener acceso root en el Sleep Number Hub usando la consola UART y variables de entorno de U-Boot, es posible crear una ruta de control local que no pase por los servidores de SleepIQ
  • El plugin existente de Homebridge llamaba a la API de SleepIQ cada 5 segundos y, con miles de usuarios, generó carga en la red de Sleep Number, por lo que se recibió una solicitud para desactivarlo
  • El equipo objetivo es el Sleep Number Hub 360SIQ01D; las condiciones clave son los pines UART J16, una consola a 115200 baudios, una unidad USB FAT32 o Ext3, y registrar una clave pública SSH
  • Después de obtener acceso root, usando Python 2.7.18 del Hub y /bam/scripts, se pueden manejar la configuración y el estado de la cama desde la red local mediante un servidor HTTP en el puerto 8000
  • El Hub puede abrir un túnel inverso SSH hacia los servidores de Sleep Number, por lo que, cuando el control local sea suficiente, es más seguro desconectarlo de Internet externo y usar Bluetooth o control interno

Por qué se buscó acceso local

  • El objetivo era controlar la cama Sleep Number desde la red local sin pasar por los servidores de SleepIQ
  • Un plugin de homebridge creado anteriormente permitía controlar la configuración de la cama desde HomeKit o automatizaciones
    • En particular, el valor de presencia en la cama era útil para automatizaciones como apagar luces o cerrar puertas con llave
  • El plugin llamaba a la API de SleepIQ cada 5 segundos y, al crecer a miles de usuarios, generó carga en la red de Sleep Number
    • Sleep Number solicitó desactivar el plugin
    • También había un problema de branding del repositorio, que podía hacer que pareciera una herramienta oficial de Sleep Number
  • Luego, el trabajo existente continuó como el nuevo plugin homebridge-bed-control
    • El nuevo plugin desactiva por defecto el monitoreo de presencia en la cama y agrega una advertencia antes de activarlo

Ruta de acceso encontrada en el hardware del Hub

  • Al principio se revisó el header J10 cerca de la CPU, pero no se obtuvieron datos UART
    • En esa configuración de CPU, las líneas UART no estaban expuestas
  • Para encontrar señales UART en el header J16 en la parte inferior de la placa, se conectó un analizador lógico a los 10 pines del header
  • Al conectar un dispositivo UART-TTY, fue posible acceder a la consola del dispositivo
  • Se hizo un dump de la flash para revisar el sistema de archivos y vulnerabilidades, pero no se encontró una puerta trasera que permitiera iniciar sesión sin UART
  • En cambio, se descubrió una puerta trasera de mantenimiento que permite a Sleep Number conectarse por SSH al Hub
    • Como el Hub está conectado a la red doméstica interna, esta ruta de acceso podría conducir a la red interna
    • Se recomienda desconectar el Wi-Fi y usar control por Bluetooth tanto como sea posible

Preparativos y equipo objetivo

  • El procedimiento se realizó en el modelo Sleep Number Hub 360SIQ01D
  • El equipo necesario es un dispositivo UART-TTY y herramientas para conectarlo a la placa
    • USB-C a UART o USB-A a UART
    • Una Raspberry Pi Pico W puede instalarse de forma permanente en el interior para acceso remoto a la consola cuando SSH no funcione
    • Header de pines de 2.54 mm y cautín, o pinzas tipo clip para PCB
  • Para comunicarse con la placa se necesita una consola serial
    • En Linux y Mac se puede usar minicom
    • En Windows se puede usar PuTTY
  • La unidad flash USB-A debe estar formateada como FAT32 o Ext3
  • Si el Hub en uso ya tiene conectado un dispositivo USB, podría ser un dongle Wi-Fi; sin ese dispositivo, puede producirse un bucle de arranque

Flujo central del procedimiento de acceso root

  • El dispositivo UART se conecta al header J16 de la placa
    • pin 1: TX, señal que entra al Hub
    • pin 2: RX, señal que sale del Hub
    • pin 3: tierra
  • La consola serial se configura a 115200 baudios
  • Después de encender el Hub, se presiona la tecla Space dentro de los primeros 2 segundos para detener el arranque automático
  • Primero hay que respaldar las variables de entorno de U-Boot con printenv -a
    • Como puede ser necesario restaurar los valores por defecto, hay que registrar si hay diferencias con el entorno actual
  • En bootcmd, se elimina la parte run set_bootargs; para que los argumentos de arranque se configuren manualmente
  • Como el script /init está en un bootrom con hash y no puede modificarse directamente, se cambia el contenido de /init en tiempo de ejecución mediante bootargs
    • El script por defecto busca un archivo cifrado que se descifra con la frase let_me_root
    • Se evita el requisito del archivo cifrado reemplazando la línea de descifrado por el valor ya descifrado
  • En el primer arranque se necesita una unidad USB que contenga el archivo let_me_root
    • Si después de arrancar aparece el prompt root@bam-se:~# en la consola, ya se está dentro de un shell root
  • Luego se vuelve a montar la partición root en modo lectura/escritura y se crea el archivo /root/let_me_root para mantener el acceso sin USB

Configurar acceso SSH

  • Después de obtener el prompt root, se agrega una clave pública SSH a /root/.ssh/authorized_keys para configurar el acceso por red
  • En la máquina local desde la que se conectará, hay que generar una clave SSH
    • El comando de ejemplo es ssh-keygen -t ed25519
    • En el texto explicativo se recomienda una clave ecdsa, pero el ejemplo real usa ed25519
  • Después de agregar la clave pública, se prueba la conexión con ssh root@$hub_ip -i <path to id_ed25519>
  • Si no se puede conectar, hay que revisar el formato de authorized_keys y el contenido del archivo
    • Se indica que ese archivo debe contener dos claves

Crear un servidor de control en la red local

  • Como el acceso root por sí solo no alcanza para reemplazar las funciones de control de la app de la cama, se ejecuta un servidor HTTP local dentro del Hub
  • El Hub incluye Python 2.7.18
    • La última actualización del Hub parece ser de 2018
    • Python 2.7.18 incluye el paquete simpleHTTPServer, que ofrece la funcionalidad necesaria
  • script_server.py abre un servidor HTTP en el puerto 8000 y ejecuta scripts dentro de /bam/scripts
    • La ruta de la URL se convierte en el nombre del script
    • Se pueden pasar varios parámetros de consulta arg para usarlos como argumentos del script
    • El resultado de la ejecución se muestra en el navegador
  • El script se copia al Hub con una forma como scp -O script_server.py root@$hub_ip:~
  • Para que inicie automáticamente después de reiniciar, hay que adjuntarlo a un script de inicio o agregar un script en rc.d

Configurar ejecución automática tras reiniciar

  • La instancia del sistema operativo en ejecución opera dentro de un chroot creado por el script /init del bootloader
  • Varios archivos del sistema se almacenan en una partición tmpfs, por lo que no persisten después de reiniciar aunque se modifiquen directamente
  • Si se monta por separado la partición de disco donde están los archivos originales, se pueden modificar los archivos /etc originales que se copiarán después del reinicio
  • Se crea un script init con una forma como script_server.sh, se copia al Hub y luego se ubica en tmp/etc/init.d de la partición root original
  • Se agregan enlaces simbólicos en rc0.d, rc3.d, rc4.d, rc5.d, rc6.d para que se ejecute al iniciar y al apagar
  • Si después de reiniciar, al acceder desde el navegador a http://$hub_ip:8000/bamstat, se ve la información de estado del Hub, el servidor está funcionando correctamente

Controles posibles con el script /bio

  • /bio parece ser el script principal de control de la cama
  • Los comandos se pasan con el formato /bio?arg=XXXX
  • Es posible consultar y configurar valores de Sleep Number
    • PSNL, PSNR: consulta del último valor configurado del lado izquierdo o derecho de la cama
    • PSNl, PSNr: consulta del valor actual del lado izquierdo o derecho de la cama
    • PSNX: consulta de los últimos valores configurados y los valores actuales de ambos lados
    • PSNS&arg=L100: configura el valor Sleep Number del lado izquierdo en 100; el rango de valores es 5..100
  • También se pueden manejar la detección de presencia y la configuración de privacidad
    • SPAU: consulta de la configuración de privacidad
    • SPAU&arg=on: activa la configuración de privacidad; se desactiva con off
    • LBPL, LBPR, LBPX: consulta de valores de presencia del lado izquierdo, derecho o ambos
  • También incluye funciones de Responsive Air, posición de la cama, iluminación y calentamiento de pies
    • LRSG: consulta la configuración de Responsive Air de ambos lados
    • LRLE&arg=on, LRRE&arg=off: cambia la configuración de Responsive Air izquierda o derecha
    • MFST: consulta la posición de la cabeza y los pies
    • MFUL, MFUR, MFFL, MFFR: configura la posición de cabeza y pies izquierdos o derechos
    • MFO3, MFSO: estado de la iluminación inferior o del tomacorriente y configuración de brillo/temporizador
    • FWGL, FWGR, FWSL, FWSR: consulta/configuración del nivel y temporizador de calefacción de pies izquierda o derecha
    • SBAS: configura los valores de referencia de la cama
  • /bio?arg=help muestra la lista de comandos ejecutables
    • Si se agrega un comando como segundo argumento a la llamada help, se muestra información detallada de ese comando
  • El script bio también contiene presets de la base, configuración de ronquidos, control de DualTemp e información de estado
    • Se requiere precaución con comandos destructivos como factory reset o control de radio
    • En la versión de bio usada por el autor, el orden del elemento MFSO estaba mal en LIST, por lo que hubo que moverlo unas líneas hacia arriba para poder llamarlo

Áreas que se pueden explorar después del acceso y preocupaciones de seguridad

  • Las funciones de control de la cama están agrupadas en el directorio raíz /bam
    • Revisando varios scripts ahí dentro se puede ver cómo funciona el Hub
  • Se intentó encontrar una puerta trasera accesible sin UART, pero los canales de acceso evidentes estaban cerrados
  • El Hub abre un túnel SSH al comunicarse con los servidores de Sleep Number y ofrece un túnel inverso que los desarrolladores pueden usar para mantenimiento
  • Como existe la posibilidad de que un usuario externo se conecte directamente a la red doméstica interna, una vez que los scripts de control de la red interna sean suficientes, se considera desconectar el Hub de Internet externo
  • Un Progressive Web App simple que pueda reemplazar directamente la app SleepIQ también es una posible siguiente etapa

1 comentarios

 
GN⁺ 2024-07-02
Opiniones en Hacker News
  • Bastante absurdo. Tuve una cama de estas hace tiempo, pero fue antes de que todo se volviera smart. Había dos controles cableados conectados a la bomba, y los controles tenían una pantalla numérica y botones para subir/bajar
    No hacía falta internet, no hacía falta un microcontrolador basado en Linux, no había forma de que hackearan la cama, y se podía dormir cómodo

    • Cada vez que siento que “esto es una complejidad excesiva sin sentido”, intento imaginar cuánto podría simplificarle la vida a alguien
      Por ejemplo, si alguien tiene algún trastorno motor, desde Parkinson hasta tetraplejia, poder conectarlo a un controlador común que funcione con voz o con métodos de entrada estandarizados puede ser una ventaja enorme. Así no tiene que lidiar por separado con las limitaciones de accesibilidad propias de cada producto
      Para alguien sin discapacidad, la mayoría de los dispositivos de smart home parecen casi inútiles, pero para otras personas pueden ser una línea de vida
    • Compraría una cama así. Lo raro es que haya que agregarle hasta conectividad Wi‑Fi a la cama. Eso implica más hardware que simplemente enchufarla a la pared; me parece una locura
  • Me da curiosidad la parte que dice: “cuando el hub se comunica con los servidores de Sleep Number, abre un túnel SSH y ofrece un túnel inverso para que los desarrolladores puedan conectarse al hub y darle mantenimiento cuando lo necesiten”
    Quisiera ver si usan autenticación con clave pública o contraseña, y si al tunelizar hacia la casa usan IP o DNS. Si se dan las condiciones justas, podría armarse la configuración de secuestro de DNS más graciosa de la historia de la humanidad
    Tomando prestada la inmortal frase de Homer Simpson: la cama sube y la cama baja

    • Vieja escuela: ataques de SIM swapping contra personas con criptomonedas
      Nueva escuela: como las camas Sleep Number están asociadas con la información de pedidos, te metes en Sleep Number, encuentras un objetivo, entras por SSH a su cama y luego haces pivot hacia la red de su casa para robarle la wallet de cripto
      Después de todo, el dinero siempre se esconde bajo el colchón ;)
    • Si no te informaron de eso antes de comprarla, ¿no debería demandar el dueño de la cama? ¿No es delito acceder sin autorización a una red e instalar una backdoor?
  • ¿Por qué una cama tiene que correr Linux? ¿Por qué?
    Siento que vivimos en la línea temporal más estúpida de todas las posibles. ¿Qué tenía de malo una cama normal sin 1 GB de RAM y un sistema operativo completo? Es igual en todos lados. Hasta encontrar una lavadora que no se conectara a Wi‑Fi fue un trabajo, y me aterra pensar en volver a hacer eso dentro de 10 años
    Como alguien que ha vulnerado alrededor de O(1000) dispositivos “smart”, ya sea por diversión o para ganar dinero, no quiero meter estas cosas en mi casa. Pero con locuras como esta cama con Linux, cada vez es más difícil evitarlas. Por favor, que se detengan

    • Una cama no tiene por qué ser compleja. Antes, con un Z80 y 32K de RAM alcanzaba para todo lo que había que hacer en una cama. El día que compré mi primera cama con multitarea cooperativa fue realmente histórico, y el edredón de alta densidad cambió las reglas del juego
      Eso sí, no extraño tener que ir a la biblioteca pública con un disco de vinilo en blanco para traerme actualizaciones de software. Si te descuidabas, te salían chinches
    • https://imgur.com/6wbgy2L
      “El producto tecnológico más moderno que tengo es una impresora de 2004, y tengo una pistola cargada lista para dispararle si hace un ruido inesperado”
    • La razón por la que una cama corre Linux es que vivimos en una época en la que nos medimos a nosotros mismos para obtener mejores resultados
      Hace un siglo descubrimos los antibióticos, y fue un gran avance. Después encontramos muchas enfermedades claras con tratamientos claros, y ahora quedan las cosas complejas y sutiles. Esta cama corre Linux para informarte sobre tu sueño
      Si duermes mal, por lo general eso genera varios efectos negativos, aunque sean leves, y si lo sabes puedes corregirlo. Es como hacerte una prueba de sueño de baja intensidad cada noche, así que puede ser información valiosa
      Las camas Sleep Number cuestan miles de dólares, así que parece que se pueden evitar con bastante facilidad
    • Siento lo mismo. Lo bueno es que esta tendencia me ha llevado a comprar cosas más viejas, usadas y reparables por mucho menos dinero, y a aprender poco a poco a hacer pequeñas reparaciones en electrónicos antiguos
      Es un gran beneficio para el bolsillo, y también da mucha satisfacción no mandar cosas perfectamente funcionales al relleno sanitario. Reducir, reutilizar y reciclar está en ese orden por algo
    • Al menos no corre Windows
  • Al principio pensé por completo que este artículo era sobre hackear una cama Eight Sleep, escrito por alguien que no quería mencionar el nombre de la empresa directamente por razones legales
    Pero cuando vi la foto de un “Number Sleep Hub” que aparentemente existe de verdad, perdí la cabeza. Que haya dos empresas que fabrican camas con refrigeración por agua, una Eight Sleep y la otra Sleep Number, hace que esta línea temporal sea demasiado rara. Se siente como si el generador de números aleatorios de esta instancia hubiera recibido una mala semilla

    • El nombre Sleep Number viene del valor de ajuste de firmeza del colchón. Tú eliges tu “sleep number”, y tu pareja elige el suyo del otro lado de la cama
    • Lo veo como una coincidencia graciosa, pero parece que Eight Sleep eligió un nombre lo bastante fácil de confundir con Sleep Number como para no recibir una demanda inmediata
    • Creo que la marca Sleep Number existe probablemente desde los años 80. Nunca la usé, pero definitivamente es una marca antigua. Si estás fuera de EE. UU., puede que no la hayas escuchado
    • Una cama Sleep Number es básicamente una enorme bolsa de aire rectangular con forma de colchón metida en una tumba de espuma
      https://i.ytimg.com/vi/pMiTq6YkJ2c/maxresdefault.jpg
      La gente literalmente paga varios miles de dólares por una cama inflable ajustable de lujo con espuma encima
    • Como no había oído hablar de ninguna de las dos, pensé que el título era una metáfora sobre “cómo obtener permisos de root en el cerebro para mejorar la calidad del sueño”
      Espero que estas camas tengan controles físicos que se puedan usar al tacto en la oscuridad. Si para ajustar la cama mientras intentas dormir tienes que sacarte el smartphone frente a la cara, me hace dudar de que los fabricantes de camas y colchones realmente sepan qué es bueno o malo para la calidad del sueño
  • Hay una forma similar de acceder al Eight Sleep Pod 3 [0]. Algunos modelos traen una tarjeta MicroSD modificable, así que requieren menos hardware adicional
    El método del artículo podría ser una buena forma de obtener acceso root en los Pod que no tienen tarjeta. Aunque algo que acabo de enterarme es que Eight Sleep firma las actualizaciones de firmware, pero también envía en el mismo paquete la clave privada que usa para firmarlas
    [0]: https://github.com/bobobo1618/ninesleep

    • Irónicamente, ver esto hace que me den aún más ganas de comprar uno. Si se puede localizar un dispositivo inteligente o hacer que se controle con Home Assistant, y cortarle la conexión a internet, no parece tan malo
      Claro, entre 2.000 y 4.000 dólares es caro, pero si es un gasto único para usarlo unos 10 años, es razonable. Pero pagar 4.000 dólares y además tener que pagar 25 dólares al mes es absurdo
  • Me pregunto si alguien hizo lo mismo con Eight Sleep. Me molesta profundamente no poder ajustar la temperatura de la cama solo porque se cayó internet

    • ¿Qué nuevo infierno es este? ¿Por qué tiene que conectarse a internet?
    • En mi caso, una manta resuelve el 95%, y en la cabaña de esquí una almohadilla eléctrica barata para colchón se encarga del 5% restante
    • Estaba por comprar un Eight Sleep, pero en cuanto supe que hacían estas cosas perdí todo interés. Ya estás pagando más de 1000 dólares por una funda de colchón; no pienso pagar además “renta” para que el producto funcione
  • No compraría Sleep Number
    Dormí durante años en colchones inflables, y después de que el fabricante empezó a tercerizar la producción en China, las costuras de los tabiques internos se reventaron en dos colchones

  • Ojalá dejaran de difundir tonterías como “si sigues esta guía, tendrás que modificar archivos internos del hub de Sleep Number y eso anula la garantía”
    Así como las calcomanías de “garantía anulada si se retira” no son legalmente exigibles, nada anula automáticamente la garantía de un producto salvo el mal uso o el mantenimiento deficiente
    Si una cama inteligente falla, el fabricante no se libra de sus obligaciones de garantía solo porque tocaste el controlador. Eso incluye las garantías implícitas. La carga de demostrar que el consumidor dañó el producto, lo usó de forma “irrazonable” o no le dio mantenimiento adecuado recae en el fabricante
    Si al intentar conectar JTAG accidentalmente puenteaste 5V a un circuito lógico de 3,3V y quemaste el cerebro de la cama, eso es responsabilidad tuya
    Pero si la fuente de alimentación explotó y dañó el controlador, el hecho de que le hayas puesto un header JTAG, una calcomanía de ojitos y lo hayas pintado de rosa no tiene relación. Tienen que arreglarlo
    Incluso si modificaste el firmware, el fabricante tiene que demostrar que esa modificación fue la causa de la falla
    No esperarías que la garantía de una laptop se anule por jugar y generar mucho calor. Lo mismo si instalas Firefox o Linux. No hay razón para pensar que las reglas cambian solo porque el dispositivo es un poco más “tonto”

    • La ley en el papel y la ley en la práctica son distintas. Si el fabricante se niega a cumplir la garantía, el cliente tiene muy poco que pueda hacer
  • Lo próximo seguramente será ransomware. “Paga 1000 dólares o no podrás dormir en tu cama durante el próximo mes”

    • ¿Lo próximo no será una suscripción?
  • Veamos algunos hechos
    Las camas Sleep Number tienen un sensor que detecta la frecuencia cardíaca. Lo hacen detectando diferencias de presión dentro del colchón de aire. En la práctica es casi como un micrófono, y bastante sensible

    • ¿De verdad detectan la frecuencia cardíaca con un sensor de presión? Me parece que habría demasiado ruido como para que los datos sirvan
      Buscando, parece que combinan un análisis estadístico bastante plausible y logran datos suficientemente precisos. Interesante