Como obter acesso root à cama Sleep Number
(dillan.org)- Ao obter acesso root no Sleep Number Hub usando o console UART e variáveis de ambiente do U-Boot, é possível criar um caminho de controle local sem passar pelos servidores SleepIQ
- O plugin Homebridge anterior chamava a API SleepIQ a cada 5 segundos e, com milhares de usuários, sobrecarregava a rede da Sleep Number, o que levou a um pedido de desativação
- O equipamento alvo é o Sleep Number Hub 360SIQ01D, e os requisitos principais são pinos UART J16, console a 115200 baud, unidade USB em FAT32 ou Ext3 e registro de chave pública SSH
- Depois do acesso root, usando o Python 2.7.18 do Hub e
/bam/scripts, é possível lidar com configurações e estado da cama pela rede local via um servidor HTTP na porta 8000 - O Hub pode abrir um túnel SSH reverso para os servidores da Sleep Number, então, quando o controle local for suficiente, é mais seguro cortar a conexão externa com a internet e usar Bluetooth ou controle interno
O que levou à busca por acesso local
- O objetivo era controlar a cama Sleep Number pela rede local sem passar pelos servidores SleepIQ
- Um plugin homebridge criado anteriormente permitia controlar configurações da cama a partir do HomeKit ou de automações
- Em especial, o valor de presença na cama era útil para automações como apagar luzes ou trancar portas
- O plugin chamava a API SleepIQ a cada 5 segundos e, à medida que o número de usuários cresceu para milhares, isso sobrecarregou a rede da Sleep Number
- A Sleep Number pediu a desativação do plugin
- Também havia o problema de a marca do repositório poder parecer uma ferramenta oficial da Sleep Number
- Depois disso, o trabalho anterior continuou no novo plugin homebridge-bed-control
- O novo plugin desativa por padrão o monitoramento de presença na cama e adiciona um aviso antes da ativação
Caminho de acesso encontrado no hardware do Hub
- Inicialmente, foi analisado o header J10 perto da CPU, mas não foi possível obter dados UART
- Nessa configuração de CPU, as linhas UART não estavam expostas
- Para encontrar sinais UART no header J16 na parte inferior da placa, foi conectado um analisador lógico aos 10 pinos do header
- Ao conectar um dispositivo UART-TTY, foi possível acessar o console do aparelho
- Foi feito dump da flash para analisar o sistema de arquivos e possíveis vulnerabilidades, mas não foi encontrado nenhum backdoor que permitisse login sem UART
- Em vez disso, foi encontrado um backdoor de manutenção que permite à Sleep Number acessar o Hub por SSH
- Como o Hub fica conectado à rede doméstica interna, esse caminho de acesso pode levar à rede interna
- Recomenda-se desconectar o Wi‑Fi e usar controle por Bluetooth sempre que possível
Itens necessários e equipamento alvo
- O procedimento foi realizado no modelo Sleep Number Hub 360SIQ01D
- O equipamento necessário inclui um dispositivo UART-TTY e ferramentas para conexão à placa
- USB-C para UART ou USB-A para UART
- Um Raspberry Pi Pico W pode ser instalado permanentemente na parte interna para acesso remoto ao console quando o SSH não funcionar
- Header de pinos de 2,54 mm e ferro de solda, ou grampos de fixação para PCB
- É necessário um console serial para se comunicar com a placa
- Em Linux e Mac, é possível usar
minicom - Em Windows, é possível usar PuTTY
- Em Linux e Mac, é possível usar
- O pendrive USB-A deve estar formatado em FAT32 ou Ext3
- Se o Hub em uso já tiver um dispositivo USB conectado, pode ser um dongle Wi‑Fi, e a ausência desse dispositivo pode causar loop de boot
Fluxo principal do procedimento de acesso root
- O dispositivo UART deve ser conectado ao header J16 da placa
- pin 1: TX, sinal que entra no Hub
- pin 2: RX, sinal que sai do Hub
- pin 3: ground
- O console serial deve ser configurado para 115200 baud
- Depois de ligar o Hub, pressione a tecla Space em até 2 segundos para interromper o boot automático
- As variáveis de ambiente do U-Boot devem primeiro ser salvas com
printenv -a- Como pode ser necessário restaurar os valores padrão, é importante registrar qualquer diferença em relação ao ambiente atual
- Em
bootcmd, remova a parterun set_bootargs;para definir os argumentos de boot manualmente - Como o script
/initestá em uma bootrom com hash e não pode ser modificado diretamente, o conteúdo de/inité alterado em tempo de execução por meio debootargs- O script padrão procura um arquivo criptografado que é descriptografado com a frase
let_me_root - Ao substituir a linha de descriptografia pelo valor já descriptografado, é possível contornar a exigência do arquivo criptografado
- O script padrão procura um arquivo criptografado que é descriptografado com a frase
- No primeiro boot, é necessário um pendrive contendo o arquivo
let_me_root- Se após o boot o prompt
root@bam-se:~#aparecer no console, o shell root foi obtido
- Se após o boot o prompt
- Depois disso, remonte a partição root em modo leitura/escrita e crie o arquivo
/root/let_me_rootpara manter o acesso mesmo sem USB
Configuração do acesso SSH
- Depois de obter o prompt root, adicione uma chave pública SSH em
/root/.ssh/authorized_keyspara configurar o acesso pela rede - É preciso gerar uma chave SSH na máquina local que fará a conexão
- O comando de exemplo é
ssh-keygen -t ed25519 - O texto explicativo recomenda uma chave
ecdsa, mas o exemplo real usaed25519
- O comando de exemplo é
- Depois de adicionar a chave pública, teste a conexão com
ssh root@$hub_ip -i <path to id_ed25519> - Se a conexão não funcionar, verifique o formato de
authorized_keyse o conteúdo do arquivo- O texto diz que esse arquivo deve conter duas chaves
Criando um servidor de controle na rede local
- Como o acesso root sozinho não substitui facilmente as funções de controle do app da cama, é executado um servidor HTTP local dentro do Hub
- O Hub inclui Python 2.7.18
- O último update do Hub aparentemente é de 2018
- O Python 2.7.18 inclui o pacote
simpleHTTPServer, que oferece a funcionalidade necessária
script_server.pyabre um servidor HTTP na porta 8000 e executa scripts dentro de/bam/scripts- O caminho da URL vira o nome do script
- Vários parâmetros de consulta
argpodem ser enviados para uso como argumentos do script - O resultado da execução é exibido no navegador
- O script pode ser copiado para o Hub com
scp -O script_server.py root@$hub_ip:~ - Para iniciar automaticamente após reboot, é preciso anexá-lo a um script de inicialização ou adicionar um script em
rc.d
Configuração para execução automática após reboot
- A instância do sistema operacional em execução roda dentro de um chroot criado pelo script
/initdo bootloader - Vários arquivos do sistema ficam em partições
tmpfs, então modificá-los diretamente não preserva as mudanças após reboot - Ao montar separadamente a partição de disco onde ficam os arquivos originais, é possível editar os arquivos originais de
/etcque serão copiados após o reboot - Crie um script init no formato
script_server.sh, copie-o para o Hub e coloque-o emtmp/etc/init.dda partição root original - Adicione links simbólicos em
rc0.d,rc3.d,rc4.d,rc5.derc6.dpara que ele rode nos momentos de início e encerramento - Depois do reboot, se ao acessar
http://$hub_ip:8000/bamstatno navegador aparecerem informações de status do Hub, o servidor está funcionando corretamente
O que é possível controlar com o script /bio
/bioparece ser o script principal de controle da cama- Os comandos são enviados no formato
/bio?arg=XXXX - É possível consultar e definir valores Sleep Number
PSNL,PSNR: consulta dos últimos valores configurados dos lados esquerdo e direito da camaPSNl,PSNr: consulta dos valores atuais dos lados esquerdo e direitoPSNX: consulta dos últimos valores configurados e dos valores atuais de ambos os ladosPSNS&arg=L100: define o valor Sleep Number do lado esquerdo como 100, com faixa de 5..100
- Também é possível lidar com detecção de presença e configurações de privacidade
SPAU: consulta da configuração de privacidadeSPAU&arg=on: ativa a configuração de privacidade, useoffpara desativarLBPL,LBPR,LBPX: consulta dos valores de presença esquerdo, direito ou ambos
- Também há recursos para Responsive Air, posição da cama, iluminação e aquecimento dos pés
LRSG: consulta da configuração Responsive Air de ambos os ladosLRLE&arg=on,LRRE&arg=off: altera a configuração Responsive Air dos lados esquerdo e direitoMFST: consulta das posições da cabeceira e dos pésMFUL,MFUR,MFFL,MFFR: definem as posições de cabeceira e pés dos lados esquerdo e direitoMFO3,MFSO: definem estado, brilho e timer da iluminação inferior ou das tomadasFWGL,FWGR,FWSL,FWSR: consultam e definem nível e timer do aquecimento dos pés dos lados esquerdo e direitoSBAS: define o valor de referência da cama
/bio?arg=helpmostra a lista de comandos executáveis- Se um segundo argumento com um comando for adicionado à chamada
help, são mostradas informações detalhadas sobre esse comando
- Se um segundo argumento com um comando for adicionado à chamada
- O script
biotambém inclui preset da base, configuração de ronco, controle de DualTemp e informações de status- É preciso cuidado com comandos destrutivos, como
factory resetou controle de rádio - Na versão de
biousada pelo autor, a ordem do itemMFSOestava incorreta emLIST, então foi necessário movê-lo algumas linhas para cima para conseguir chamá-lo
- É preciso cuidado com comandos destrutivos, como
Áreas a explorar após o acesso e preocupações de segurança
- As funções de controle da cama ficam concentradas no diretório raiz
/bam- Ao analisar os vários scripts ali presentes, é possível entender como o Hub funciona
- Houve tentativa de encontrar um backdoor acessível sem UART, mas os canais de acesso mais óbvios estavam fechados
- O Hub abre um túnel SSH ao se comunicar com os servidores da Sleep Number e oferece um túnel reverso para uso de manutenção pelos desenvolvedores
- Como um usuário externo poderia se conectar diretamente à rede doméstica interna, foi considerada a ideia de cortar a conexão externa do Hub com a internet quando os scripts de controle da rede interna forem suficientes
- Um Progressive Web App simples capaz de substituir diretamente o app SleepIQ também é um candidato para a próxima etapa
1 comentários
Opiniões no Hacker News
Bem absurdo. Já usei uma cama dessas no passado, mas foi antes de tudo virar smart. Havia dois controles com fio conectados à bomba, e os controles tinham um mostrador numérico e botões para aumentar/diminuir
Não precisava de internet, não precisava de um microcontrolador baseado em Linux, não havia risco de a cama ser hackeada, e dava para dormir confortavelmente
Por exemplo, se a pessoa tiver algum distúrbio motor, de Parkinson a tetraplegia, poder conectar isso a um controlador comum que funcione por voz ou por um método de entrada padronizado pode ser uma vantagem enorme. Porque ela não precisaria lidar separadamente com as limitações de acessibilidade específicas de cada produto
Para quem não tem limitações físicas, a maioria dos dispositivos de casa inteligente parece quase inútil, mas para outras pessoas pode ser uma tábua de salvação
Fiquei curioso com a parte de que “quando o hub se comunica com os servidores da Sleep Number, ele abre um túnel SSH e fornece um túnel reverso para que os desenvolvedores possam acessar o hub quando necessário e fazer manutenção”
Queria ver se usam autenticação por chave pública ou senha, e se usam IP ou DNS ao tunelar para a casa. Se as condições forem exatamente certas, parece que daria para montar a configuração de sequestro de DNS mais engraçada da história da humanidade
Pegando emprestada a expressão imortal de Homer Simpson: a cama sobe, a cama desce
Novo: como a cama Sleep Number está vinculada às informações do pedido, invadir a Sleep Number para encontrar o alvo, acessar a cama da pessoa por SSH e então pivotar para a rede doméstica para roubar a carteira de criptomoedas
Afinal, dinheiro sempre fica escondido debaixo do colchão mesmo ;)
Por que uma cama precisa rodar Linux? Por quê?
Parece que vivemos na linha do tempo mais idiota de todas as possíveis. Qual era o problema de uma cama comum sem 1 GB de RAM e um sistema operacional completo? É assim em todo lugar. Já foi difícil encontrar uma lavadora que não se conectasse ao Wi‑Fi, e só de pensar em fazer isso de novo daqui a 10 anos já dá horror
Como alguém que já invadiu algo na ordem de O(1000) dispositivos “smart”, seja por diversão ou para ganhar dinheiro, não quero trazer esse tipo de coisa para dentro de casa. Mas, por causa de loucuras como essa cama rodando Linux, está ficando cada vez mais difícil evitar. Por favor, parem
Só não sinto saudade de ter que levar um disco de vinil virgem até a biblioteca pública para buscar atualizações de software. Se eu esquecesse, apareciam percevejos
“O produto tecnológico mais moderno que eu tenho é uma impressora de 2004, e deixo uma arma carregada pronta para atirar nela se fizer algum som inesperado”
Um século atrás descobrimos os antibióticos, e isso foi um grande avanço. Depois encontramos muitas doenças claras com tratamentos claros, e agora restam coisas complexas e sutis. Essa cama roda Linux para informar sobre o seu sono
Dormir mal geralmente causa vários efeitos negativos, ainda que fracos, e, sabendo disso, é possível corrigir. É como fazer um exame de sono de baixa intensidade todas as noites, então pode ser uma informação valiosa
Camas Sleep Number custam milhares de dólares, então imagino que dê para evitá-las com facilidade se quiser
É uma grande vantagem para o bolso, e também dá muita satisfação não mandar coisas perfeitamente boas para aterros. Reduzir, reutilizar e reciclar está exatamente nessa ordem de importância
No começo, achei totalmente que este texto era sobre alguém hackeando uma cama Eight Sleep, sem querer dizer o nome da empresa diretamente por motivos legais
Mas então vi uma foto do “Number Sleep Hub”, que parece existir de verdade, e perdi a cabeça. Existem duas empresas que fazem camas com resfriamento a água, uma é a Eight Sleep e a outra é a Sleep Number; esta linha do tempo é estranha demais. Parece que o gerador de números aleatórios desta instância recebeu uma semente ruim
https://i.ytimg.com/vi/pMiTq6YkJ2c/maxresdefault.jpg
As pessoas estão literalmente pagando alguns milhares de dólares por uma cama inflável ajustável premium com espuma por cima
Espero que essas camas tenham controles físicos que dê para usar pelo tato no escuro. Se, quando estou tentando pegar no sono, eu tiver que colocar um smartphone na frente do rosto para ajustar alguma coisa, fico na dúvida se os fabricantes de camas e colchões realmente sabem o que é bom ou ruim para a qualidade do sono
Há uma forma parecida de acessar também o Eight Sleep Pod 3 [0]. Alguns modelos têm um cartão MicroSD modificável, então exigem menos hardware adicional
O método do texto pode ser uma boa forma de obter acesso root em Pods que não têm o cartão. Só que acabei de descobrir que a Eight Sleep assina as atualizações de firmware, mas também envia no mesmo pacote a chave privada usada para assinar essas atualizações
[0]: https://github.com/bobobo1618/ninesleep
Claro que US$ 2 mil a US$ 4 mil é caro, mas, se for um custo único para usar por uns 10 anos, é razoável. Mas pagar US$ 4 mil e ainda ter que pagar US$ 25 por mês é absurdo
Fico curioso se alguém já fez a mesma coisa com a Eight Sleep. É profundamente irritante não conseguir ajustar a temperatura da cama só porque a internet caiu
Não vou comprar Sleep Number
Dormi por alguns anos em colchões infláveis, e depois que o fabricante começou a terceirizar para a China, as costuras das divisórias internas estouraram em dois colchões
Gostaria que parassem de espalhar bobagens do tipo “seguir este guia exige modificar arquivos internos do hub da Sleep Number e anula a garantia”
Assim como adesivos de “garantia anulada se removido” não têm validade legal, nada anula automaticamente a garantia de um produto, salvo mau uso ou manutenção inadequada
Se uma cama inteligente quebra, o fabricante não se livra das obrigações de garantia só porque você mexeu no controlador. Isso inclui garantias implícitas. O ônus de provar que o consumidor danificou o produto, usou de forma “irrazoável” ou não fez a manutenção adequada é do fabricante
Se você, ao tentar conectar JTAG, acidentalmente fizer uma ponte de 5V para um circuito lógico de 3,3V e queimar o cérebro da cama, aí a responsabilidade é sua
Mas, se a fonte de alimentação explodiu e o controlador parou de funcionar, o fato de você ter colocado um header JTAG, colado adesivos de olhinhos e pintado de rosa é irrelevante. Eles têm que consertar
Mesmo que você tenha modificado o firmware, o fabricante precisa provar que essa modificação foi a causa da falha
Ninguém espera que a garantia de um notebook seja anulada porque você joga nele e ele esquenta muito. O mesmo vale para instalar o Firefox ou Linux. Então não há motivo para achar que as regras mudam só porque o dispositivo é um pouco mais “burro”
O próximo passo deve ser ransomware. “Pague US$ 1000 ou você não vai poder dormir na sua cama pelo próximo mês”
Vamos ver alguns fatos
As camas Sleep Number têm sensores que detectam a frequência cardíaca. Elas fazem isso detectando diferenças de pressão dentro do colchão de ar. Na prática, é quase um microfone, e bem sensível
Pesquisando, parece que combinam isso com uma análise estatística bastante plausível para obter dados suficientemente precisos. Interessante