Cómo obtener acceso root a una cama Sleep Number
(dillan.org)- 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
- En Linux y Mac se puede usar
- 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 parterun set_bootargs;para que los argumentos de arranque se configuren manualmente - Como el script
/initestá en un bootrom con hash y no puede modificarse directamente, se cambia el contenido de/initen tiempo de ejecución mediantebootargs- 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
- El script por defecto busca un archivo cifrado que se descifra con la frase
- 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
- Si después de arrancar aparece el prompt
- Luego se vuelve a montar la partición root en modo lectura/escritura y se crea el archivo
/root/let_me_rootpara 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_keyspara 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 usaed25519
- El comando de ejemplo es
- 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_keysy 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.pyabre 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
argpara 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
/initdel 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
/etcoriginales 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 entmp/etc/init.dde la partición root original - Se agregan enlaces simbólicos en
rc0.d,rc3.d,rc4.d,rc5.d,rc6.dpara 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
/bioparece 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 camaPSNl,PSNr: consulta del valor actual del lado izquierdo o derecho de la camaPSNX: consulta de los últimos valores configurados y los valores actuales de ambos ladosPSNS&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 privacidadSPAU&arg=on: activa la configuración de privacidad; se desactiva conoffLBPL,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 ladosLRLE&arg=on,LRRE&arg=off: cambia la configuración de Responsive Air izquierda o derechaMFST: consulta la posición de la cabeza y los piesMFUL,MFUR,MFFL,MFFR: configura la posición de cabeza y pies izquierdos o derechosMFO3,MFSO: estado de la iluminación inferior o del tomacorriente y configuración de brillo/temporizadorFWGL,FWGR,FWSL,FWSR: consulta/configuración del nivel y temporizador de calefacción de pies izquierda o derechaSBAS: configura los valores de referencia de la cama
/bio?arg=helpmuestra 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
- Si se agrega un comando como segundo argumento a la llamada
- El script
biotambié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 reseto control de radio - En la versión de
biousada por el autor, el orden del elementoMFSOestaba mal enLIST, por lo que hubo que moverlo unas líneas hacia arriba para poder llamarlo
- Se requiere precaución con comandos destructivos como
Á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
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
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
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
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 ;)
¿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
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
“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”
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
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 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
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
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
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
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”
Lo próximo seguramente será ransomware. “Paga 1000 dólares o no podrás dormir en tu cama durante el próximo mes”
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
Buscando, parece que combinan un análisis estadístico bastante plausible y logran datos suficientemente precisos. Interesante