2 pontos por GN⁺ 2024-07-02 | 1 comentários | Compartilhar no WhatsApp
  • 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
  • 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 parte run set_bootargs; para definir os argumentos de boot manualmente
  • Como o script /init está 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 de bootargs
    • 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
  • 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
  • Depois disso, remonte a partição root em modo leitura/escrita e crie o arquivo /root/let_me_root para 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_keys para 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 usa ed25519
  • 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_keys e 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.py abre 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 arg podem 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 /init do 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 /etc que serão copiados após o reboot
  • Crie um script init no formato script_server.sh, copie-o para o Hub e coloque-o em tmp/etc/init.d da partição root original
  • Adicione links simbólicos em rc0.d, rc3.d, rc4.d, rc5.d e rc6.d para que ele rode nos momentos de início e encerramento
  • Depois do reboot, se ao acessar http://$hub_ip:8000/bamstat no navegador aparecerem informações de status do Hub, o servidor está funcionando corretamente

O que é possível controlar com o script /bio

  • /bio parece 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 cama
    • PSNl, PSNr: consulta dos valores atuais dos lados esquerdo e direito
    • PSNX: consulta dos últimos valores configurados e dos valores atuais de ambos os lados
    • PSNS&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 privacidade
    • SPAU&arg=on: ativa a configuração de privacidade, use off para desativar
    • LBPL, 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 lados
    • LRLE&arg=on, LRRE&arg=off: altera a configuração Responsive Air dos lados esquerdo e direito
    • MFST: consulta das posições da cabeceira e dos pés
    • MFUL, MFUR, MFFL, MFFR: definem as posições de cabeceira e pés dos lados esquerdo e direito
    • MFO3, MFSO: definem estado, brilho e timer da iluminação inferior ou das tomadas
    • FWGL, FWGR, FWSL, FWSR: consultam e definem nível e timer do aquecimento dos pés dos lados esquerdo e direito
    • SBAS: define o valor de referência da cama
  • /bio?arg=help mostra 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
  • O script bio também inclui preset da base, configuração de ronco, controle de DualTemp e informações de status
    • É preciso cuidado com comandos destrutivos, como factory reset ou controle de rádio
    • Na versão de bio usada pelo autor, a ordem do item MFSO estava incorreta em LIST, então foi necessário movê-lo algumas linhas para cima para conseguir chamá-lo

Á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

 
GN⁺ 2024-07-02
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

    • Sempre que sinto que “isso é uma complexidade excessiva sem sentido”, tento imaginar o quanto isso poderia simplificar a vida de alguém
      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
    • Eu compraria uma cama dessas. O estranho é achar que é preciso colocar até conectividade Wi‑Fi na cama. Isso exige mais hardware do que simplesmente ligar na tomada, então acho uma loucura
  • 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

    • Antigo: ataque de SIM swapping contra detentores de criptomoedas
      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 ;)
    • Se o proprietário da cama não foi avisado disso antes da compra, ele não deveria processar? Acessar uma rede sem autorização e implantar um backdoor não é crime?
  • 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

    • Uma cama não precisa ser complexa. Antigamente, com apenas um Z80 e 32K de RAM, já dava para fazer tudo o que uma cama precisava fazer. O dia em que comprei minha primeira cama com multitarefa cooperativa foi realmente marcante, e o edredom de alta densidade mudou o jogo
      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
    • https://imgur.com/6wbgy2L
      “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”
    • O motivo de a cama rodar Linux é que vivemos numa era em que medimos a nós mesmos para obter resultados melhores
      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
    • Também tenho a mesma sensação. O lado bom é que essa tendência me fez comprar coisas mais antigas, usadas e reparáveis por muito menos, e também aprender aos poucos pequenos consertos em eletrônicos antigos
      É 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
    • Pelo menos não roda Windows
  • 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

    • O nome Sleep Number veio do valor de ajuste de firmeza do colchão. Você escolhe o seu “sleep number”, e seu parceiro escolhe o valor dele do outro lado da cama
    • Vejo isso como uma coincidência engraçada, mas parece que a Eight Sleep escolheu um nome fácil de confundir com Sleep Number só o bastante para não ser processada imediatamente
    • A marca Sleep Number provavelmente existe desde os anos 80. Nunca usei, mas é definitivamente uma marca antiga. Se você está fora dos EUA, talvez nunca tenha ouvido falar
    • Uma cama Sleep Number é basicamente uma enorme bolsa de ar retangular em formato de colchão dentro de uma tumba de espuma
      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
    • Como eu nunca tinha ouvido falar de nenhuma das duas, achei que o título fosse uma metáfora sobre “como obter acesso root ao cérebro para melhorar a qualidade do sono”
      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

    • Ironicamente, ver isso me deixou com mais vontade de comprar um. Se der para tornar o dispositivo inteligente local, ou controlá-lo pelo Home Assistant, e cortar a conexão com a internet, não parece tão ruim
      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

    • Que novo inferno é esse? Por que precisa se conectar à internet?
    • No meu caso, um cobertor resolve 95%, e numa cabana de esqui um protetor de colchão elétrico barato cuida dos outros 5%
    • Eu estava pensando em comprar um Eight Sleep, mas, quando descobri que eles fazem esse tipo de coisa, perdi o interesse na hora. Já se paga mais de US$ 1000 por uma capa de colchão; não vou pagar “aluguel” para o produto funcionar
  • 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”

    • A lei no papel e a lei na prática são coisas diferentes. Se o fabricante se recusa a cumprir a garantia, há muito pouco que o cliente possa fazer
  • 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”

    • O próximo passo não é assinatura?
  • 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

    • Sério que detectam a frequência cardíaca com sensor de pressão? Parece que haveria ruído demais para os dados serem úteis
      Pesquisando, parece que combinam isso com uma análise estatística bastante plausível para obter dados suficientemente precisos. Interessante