2 points par GN⁺ 2024-07-02 | 1 commentaires | Partager sur WhatsApp
  • En obtenant un accès console UART et en exploitant les variables d’environnement U-Boot sur le Sleep Number Hub, il est possible de mettre en place une voie de contrôle locale sans passer par les serveurs SleepIQ
  • L’ancien plugin Homebridge interrogeait l’API SleepIQ toutes les 5 secondes et, à l’échelle de plusieurs milliers d’utilisateurs, surchargeait l’infrastructure réseau de Sleep Number, qui a demandé sa désactivation
  • L’équipement visé est le Sleep Number Hub 360SIQ01D ; les éléments clés sont les broches UART J16, une console à 115200 bauds, une clé USB en FAT32 ou Ext3, et l’enregistrement d’une clé publique SSH
  • Une fois l’accès root obtenu, on peut utiliser Python 2.7.18 et /bam/scripts sur le Hub pour piloter les réglages et l’état du lit via un serveur HTTP sur le port 8000 depuis le réseau local
  • Le Hub peut ouvrir un tunnel SSH inversé vers les serveurs Sleep Number ; une fois le contrôle local suffisant, il est plus sûr de couper l’accès Internet externe et de privilégier le Bluetooth ou le contrôle interne

Pourquoi chercher un accès local

  • L’objectif était de contrôler le lit Sleep Number depuis le réseau local sans passer par les serveurs SleepIQ
  • Un plugin homebridge créé auparavant permettait de contrôler les réglages du lit depuis HomeKit ou via des automatisations
    • En particulier, la valeur de bed presence indiquant si une personne est dans le lit était utile pour des automatisations comme éteindre les lumières ou verrouiller les portes
  • Le plugin appelait l’API SleepIQ toutes les 5 secondes et, avec plusieurs milliers d’utilisateurs, cela surchargeait le réseau Sleep Number
    • Sleep Number a demandé la désactivation du plugin
    • Le branding du dépôt pouvait aussi donner l’impression qu’il s’agissait d’un outil Sleep Number officiel
  • Ce travail a ensuite été poursuivi dans le nouveau plugin homebridge-bed-control
    • Le nouveau plugin désactive par défaut la surveillance de la bed presence et ajoute un avertissement avant son activation

Voie d’accès trouvée sur le matériel du Hub

  • Au départ, le header J10 près du CPU a été examiné, mais aucun flux UART exploitable n’a été trouvé
    • Sur cette configuration CPU, les lignes UART n’étaient pas exposées
  • Un analyseur logique a ensuite été branché sur les 10 broches du header J16 situé en bas de la carte pour repérer les signaux UART
  • Une fois un périphérique UART-TTY connecté, l’accès à la console de l’appareil a été possible
  • Un dump de la mémoire flash a été analysé pour examiner le système de fichiers et d’éventuelles vulnérabilités, mais aucune porte dérobée permettant une connexion sans UART n’a été trouvée
  • En revanche, une porte dérobée de maintenance permettant à Sleep Number d’accéder au Hub en SSH a été identifiée
    • Le Hub étant connecté au réseau domestique interne, cette voie d’accès peut mener au réseau interne
    • Il est recommandé de couper le Wi-Fi et d’utiliser autant que possible le contrôle via Bluetooth

Matériel nécessaire et équipement visé

  • La procédure a été réalisée sur le modèle Sleep Number Hub 360SIQ01D
  • Il faut un périphérique UART-TTY et de quoi le connecter à la carte
    • USB-C vers UART ou USB-A vers UART
    • Un Raspberry Pi Pico W peut être installé de façon permanente à l’intérieur pour un accès console distant si SSH ne fonctionne pas
    • Des barrettes de broches 2,54 mm et un fer à souder, ou des pinces de contact PCB
  • Une console série est nécessaire pour communiquer avec la carte
    • Sous Linux et macOS, on peut utiliser minicom
    • Sous Windows, on peut utiliser PuTTY
  • La clé USB-A doit être formatée en FAT32 ou en Ext3
  • Si un périphérique USB est déjà branché sur le Hub, il peut s’agir d’un dongle Wi-Fi ; son absence peut provoquer une boucle de démarrage

Flux principal de la procédure d’accès root

  • Le périphérique UART se connecte au header J16 de la carte
    • pin 1 : TX, signal entrant vers le Hub
    • pin 2 : RX, signal sortant du Hub
    • pin 3 : ground
  • La console série doit être réglée sur 115200 bauds
  • Après avoir mis le Hub sous tension, il faut appuyer sur la touche Espace dans les 2 secondes pour interrompre le démarrage automatique
  • Les variables d’environnement U-Boot doivent d’abord être sauvegardées avec printenv -a
    • Comme un retour aux valeurs par défaut peut être nécessaire, il faut noter toute différence avec l’environnement actuel
  • Dans bootcmd, il faut supprimer la partie run set_bootargs; afin de définir manuellement les arguments de démarrage
  • Le script /init se trouve dans une bootrom hachée et ne peut pas être modifié directement ; il faut donc en altérer le contenu à l’exécution via bootargs
    • Le script par défaut cherche un fichier chiffré qui se déchiffre en la chaîne let_me_root
    • En remplaçant la ligne de déchiffrement par la valeur déjà déchiffrée, on contourne l’exigence de fichier chiffré
  • Au premier démarrage, une clé USB contenant le fichier let_me_root est nécessaire
    • Si l’invite root@bam-se:~# apparaît dans la console après le démarrage, c’est que le shell root est actif
  • Ensuite, il faut remonter la partition root en lecture/écriture et créer le fichier /root/let_me_root pour conserver l’accès sans clé USB

Configuration de l’accès SSH

  • Une fois l’invite root obtenue, il faut ajouter une clé publique SSH à /root/.ssh/authorized_keys pour activer l’accès réseau
  • Il faut générer une clé SSH sur la machine locale utilisée pour se connecter
    • La commande d’exemple est ssh-keygen -t ed25519
    • Le texte recommande une clé ecdsa, mais l’exemple réel utilise ed25519
  • Après ajout de la clé publique, on peut tester la connexion avec une commande du type ssh root@$hub_ip -i <path to id_ed25519>
  • Si la connexion échoue, il faut vérifier le format de authorized_keys et le contenu du fichier
    • Il est indiqué que ce fichier doit contenir deux clés

Mettre en place un serveur de contrôle sur le réseau local

  • L’accès root seul ne suffit pas à remplacer facilement les fonctions de contrôle de l’application du lit ; un serveur HTTP local est donc lancé directement sur le Hub
  • Le Hub embarque Python 2.7.18
    • Son dernier firmware semble dater de 2018
    • Python 2.7.18 inclut le paquet simpleHTTPServer, qui fournit la fonctionnalité nécessaire
  • script_server.py ouvre un serveur HTTP sur le port 8000 et exécute les scripts situés dans /bam/scripts
    • Le chemin d’URL devient le nom du script
    • Plusieurs paramètres de requête arg peuvent être passés pour servir d’arguments au script
    • Le résultat d’exécution s’affiche dans le navigateur
  • Le script se copie sur le Hub avec une commande du type scp -O script_server.py root@$hub_ip:~
  • Pour le lancer automatiquement après redémarrage, il faut l’ajouter à un script de démarrage ou créer un script rc.d

Lancement automatique après redémarrage

  • L’instance de l’OS en cours d’exécution fonctionne dans un chroot créé par le script /init du bootloader
  • Plusieurs fichiers système sont stockés sur une partition tmpfs, donc les modifications directes ne persistent pas après redémarrage
  • En montant séparément la partition disque contenant les fichiers d’origine, on peut modifier les fichiers /etc source qui seront recopiés après redémarrage
  • Il faut créer un script d’initialisation comme script_server.sh, le copier sur le Hub, puis le placer dans tmp/etc/init.d sur la partition root d’origine
  • Des liens symboliques doivent être ajoutés dans rc0.d, rc3.d, rc4.d, rc5.d et rc6.d pour exécuter le script au démarrage et à l’arrêt
  • Si, après redémarrage, http://$hub_ip:8000/bamstat affiche les informations d’état du Hub dans le navigateur, alors le serveur fonctionne correctement

Ce qu’il est possible de contrôler avec le script /bio

  • /bio semble être le script de contrôle principal du lit
  • Les commandes se transmettent sous la forme /bio?arg=XXXX
  • Il permet de consulter et de définir les valeurs Sleep Number
    • PSNL, PSNR : lecture des dernières valeurs configurées à gauche et à droite
    • PSNl, PSNr : lecture des valeurs actuelles à gauche et à droite
    • PSNX : lecture des dernières valeurs configurées et des valeurs actuelles des deux côtés
    • PSNS&arg=L100 : définit la valeur Sleep Number de gauche à 100 ; la plage autorisée est 5..100
  • Il gère aussi la détection de présence et les paramètres de confidentialité
    • SPAU : lecture du réglage de confidentialité
    • SPAU&arg=on : active le réglage de confidentialité, off le désactive
    • LBPL, LBPR, LBPX : lecture des valeurs de présence à gauche, à droite ou des deux côtés
  • Les fonctions Responsive Air, la position du lit, l’éclairage et le réchauffement des pieds sont également incluses
    • LRSG : lecture des réglages Responsive Air des deux côtés
    • LRLE&arg=on, LRRE&arg=off : modifient les réglages Responsive Air gauche et droit
    • MFST : lecture de la position de la tête et des pieds
    • MFUL, MFUR, MFFL, MFFR : définissent la position de la tête et des pieds à gauche et à droite
    • MFO3, MFSO : définissent l’état, la luminosité et la minuterie de l’éclairage inférieur ou des prises
    • FWGL, FWGR, FWSL, FWSR : lecture et réglage du niveau de chauffe des pieds et de la minuterie à gauche et à droite
    • SBAS : définit la valeur de référence du lit
  • /bio?arg=help affiche la liste des commandes disponibles
    • En ajoutant une commande comme second argument à help, on obtient des informations détaillées sur cette commande
  • Le script bio comprend aussi des préréglages de base, des réglages anti-ronflement, le contrôle DualTemp et des informations d’état
    • Les commandes destructrices comme factory reset ou le contrôle radio doivent être utilisées avec prudence
    • Dans la version de bio utilisée par l’auteur, l’entrée MFSO était mal placée dans LIST ; il a fallu la remonter de quelques lignes pour pouvoir l’appeler

Zones à explorer après l’accès et préoccupations de sécurité

  • Les fonctions de contrôle du lit sont regroupées dans le répertoire racine /bam
    • En examinant les différents scripts qu’il contient, on peut comprendre le fonctionnement du Hub
  • Une porte dérobée accessible sans UART a été recherchée, mais aucun canal d’accès évident n’a été trouvé
  • Le Hub ouvre un tunnel SSH lorsqu’il communique avec les serveurs Sleep Number et fournit un tunnel inversé que les développeurs peuvent utiliser pour la maintenance
  • Comme un utilisateur externe pourrait potentiellement atteindre directement le réseau domestique interne, l’idée est d’envisager de couper l’accès Internet externe du Hub une fois que les scripts de contrôle local sont suffisants
  • Une Progressive Web App simple capable de remplacer directement l’application SleepIQ est aussi envisagée comme prochaine étape

1 commentaires

 
GN⁺ 2024-07-02
Avis de Hacker News
  • C’est assez absurde. J’ai déjà eu un lit comme ça, mais c’était avant que tout devienne smart. Deux télécommandes filaires étaient reliées à la pompe, avec un affichage numérique et des boutons haut/bas.
    Pas besoin d’Internet, pas besoin de microcontrôleur sous Linux, aucun risque que le lit se fasse pirater, et on dormait très bien.

    • Chaque fois que je me dis « c’est une surcomplexité délirante », j’essaie d’imaginer à quel point cela peut simplifier la vie de quelqu’un.
      Par exemple, si l’on souffre d’un trouble moteur, de la maladie de Parkinson à la tétraplégie, pouvoir le connecter à un contrôleur commun fonctionnant à la voix ou via une méthode d’entrée standardisée peut être un avantage énorme. Cela évite de devoir composer avec les limites d’accessibilité propres à chaque produit.
      Pour les personnes valides, la plupart des appareils de maison connectée semblent presque inutiles, mais pour d’autres, ils peuvent être une bouée de sauvetage.
    • Un lit comme celui-là, je l’achèterais. Ce qui est bizarre, c’est de devoir y ajouter une connectivité Wi‑Fi. Cela demande plus de matériel que de simplement le brancher à une prise murale ; c’est de la folie.
  • Le passage qui m’intrigue est : « quand le hub communique avec les serveurs de Sleep Number, il ouvre un tunnel SSH et fournit un tunnel inverse pour permettre aux développeurs de se connecter au hub et d’en assurer la maintenance si nécessaire ».
    J’aimerais voir s’ils utilisent une authentification par clé publique ou par mot de passe, et s’ils utilisent une IP ou du DNS pour tunneler jusqu’au domicile. Si les conditions sont réunies, on pourrait obtenir la configuration de détournement DNS la plus drôle de l’histoire de l’humanité.
    Pour reprendre l’expression immortelle de Homer Simpson : le lit monte, le lit descend.

    • Ancienne méthode : attaques de SIM swapping visant les détenteurs de cryptomonnaies.
      Nouvelle méthode : comme les lits Sleep Number sont liés aux informations de commande, on s’introduit chez Sleep Number pour trouver une cible, on se connecte à son lit en SSH, puis on pivote vers son réseau domestique pour voler son portefeuille crypto.
      Après tout, l’argent est toujours caché sous le matelas ;)
    • Si cela n’a pas été indiqué avant l’achat, le propriétaire du lit ne devrait-il pas intenter une action en justice ? Accéder sans autorisation à un réseau et y implanter une backdoor, ce n’est pas un délit ?
  • Pourquoi un lit devrait-il faire tourner Linux ? Pourquoi ?
    On dirait qu’on vit dans la plus stupide de toutes les lignes temporelles possibles. Qu’est-ce qui n’allait pas avec un lit ordinaire sans 1 Go de RAM ni système d’exploitation complet ? C’est pareil partout. Trouver un lave-linge qui ne se connecte pas au Wi‑Fi a déjà été toute une affaire, et l’idée de devoir recommencer dans 10 ans me terrifie.
    Pour avoir compromis de l’ordre de O(1000) appareils « smart », que ce soit pour le fun ou pour gagner de l’argent, je n’ai aucune envie de faire entrer ce genre d’objet chez moi. Mais avec des folies comme ce lit sous Linux, cela devient de plus en plus difficile à éviter. Par pitié, arrêtez.

    • Un lit n’a pas besoin d’être compliqué. À l’époque, un Z80 et 32 K de RAM suffisaient pour faire tout ce qu’on avait à faire dans un lit. Le jour où j’ai acheté mon premier lit multitâche coopératif a vraiment été historique, et les couettes haute densité ont changé la donne.
      En revanche, aller à la bibliothèque municipale avec un disque vinyle vierge pour récupérer des mises à jour logicielles, ça ne me manque pas. Si on oubliait, on se retrouvait avec des punaises de lit.
    • https://imgur.com/6wbgy2L
      « Le produit technologique le plus récent que je possède est une imprimante de 2004, et je garde une arme chargée à portée de main pour lui tirer dessus dès qu’elle émet un bruit inattendu. »
    • La raison pour laquelle le lit fait tourner Linux, c’est que nous vivons à une époque où l’on se mesure soi-même pour obtenir de meilleurs résultats.
      Il y a un siècle, on a découvert les antibiotiques, et c’était une avancée majeure. Ensuite, on a identifié beaucoup de maladies bien définies avec des traitements bien définis, et il reste maintenant les choses complexes et subtiles. Ce lit fait tourner Linux pour vous renseigner sur votre sommeil.
      Quand on dort mal, cela entraîne généralement plusieurs effets négatifs diffus, mais réels ; si on le sait, on peut y remédier. C’est comme passer un examen du sommeil de faible intensité chaque nuit, et cela peut fournir des informations précieuses.
      Les lits Sleep Number coûtent plusieurs milliers de dollars, donc j’imagine qu’il est assez facile de les éviter si on le veut.
    • Je ressens la même chose. Le bon côté, c’est que cette tendance m’a poussé à acheter beaucoup moins cher des objets plus anciens, d’occasion et réparables, et à apprendre peu à peu à effectuer de petites réparations sur de vieux appareils électroniques.
      C’est très bénéfique pour le portefeuille, et c’est aussi satisfaisant de ne pas envoyer à la décharge des objets encore parfaitement utilisables. Réduire, réutiliser, recycler : l’ordre reflète bien les priorités.
    • Au moins, il ne fait pas tourner Windows.
  • Au début, j’étais absolument persuadé que cet article parlait du piratage d’un lit Eight Sleep, écrit par quelqu’un qui évitait de nommer directement l’entreprise pour des raisons juridiques.
    Puis j’ai vu la photo d’un « Number Sleep Hub » qui semble vraiment exister, et ça m’a retourné le cerveau. Il y a donc deux entreprises qui fabriquent des lits à refroidissement liquide, l’une s’appelle Eight Sleep et l’autre Sleep Number ; cette ligne temporelle est trop étrange. On dirait que le générateur de nombres aléatoires de cette instance a reçu une mauvaise graine.

    • Le nom Sleep Number vient de la valeur de fermeté réglable du matelas. On choisit son « sleep number », et son partenaire choisit le sien de l’autre côté du lit.
    • Je vois ça comme une coïncidence amusante, mais Eight Sleep semble avoir choisi un nom facile à confondre avec Sleep Number juste assez pour ne pas se faire poursuivre immédiatement.
    • La marque Sleep Number existe probablement depuis les années 80. Je n’en ai jamais utilisé moi-même, mais c’est clairement une vieille marque. Si vous êtes hors des États-Unis, vous n’en avez peut-être jamais entendu parler.
    • Un lit Sleep Number est en gros constitué d’une grande poche d’air rectangulaire en forme de matelas, enterrée dans une tombe de mousse.
      https://i.ytimg.com/vi/pMiTq6YkJ2c/maxresdefault.jpg
      Les gens paient littéralement plusieurs milliers de dollars pour un matelas pneumatique réglable haut de gamme, avec de la mousse par-dessus.
    • Comme je n’avais entendu parler ni de l’un ni de l’autre, je pensais que le titre était une métaphore sur « comment obtenir les droits root sur son cerveau pour améliorer la qualité de son sommeil ».
      J’espère que ces lits ont des commandes physiques utilisables au toucher dans le noir. Si, au moment de s’endormir, il faut sortir son smartphone devant son visage pour faire un réglage, je me demande vraiment si les fabricants de lits et de matelas savent ce qui est bon ou mauvais pour la qualité du sommeil.
  • Il existe une méthode similaire pour accéder à l’Eight Sleep Pod 3 [0]. Certains modèles contiennent une carte MicroSD modifiable, ce qui nécessite moins de matériel supplémentaire
    La méthode décrite dans l’article pourrait être une bonne façon d’obtenir les droits root sur les Pod dépourvus de carte. En revanche, ce que je viens d’apprendre, c’est qu’Eight Sleep signe bien ses mises à jour de firmware, mais envoie aussi dans le même paquet la clé privée utilisée pour les signer
    [0]: https://github.com/bobobo1618/ninesleep

    • Ironiquement, voir ça me donne plutôt envie d’en acheter un. Si l’on peut rendre ces appareils connectés locaux, ou les contrôler via Home Assistant, puis couper leur connexion Internet, ça n’a pas l’air si mauvais
      Bien sûr, 2 000 à 4 000 dollars, c’est cher, mais comme coût ponctuel sur une dizaine d’années, ça peut se défendre. En revanche, payer 4 000 dollars et devoir encore ajouter 25 dollars par mois, c’est absurde
  • Je me demande si quelqu’un a fait la même chose avec Eight Sleep. Le fait de ne pas pouvoir régler la température du lit simplement parce qu’Internet est coupé me dérange profondément

    • C’est quoi ce nouvel enfer ? Pourquoi faut-il être connecté à Internet ?
    • Dans mon cas, une couverture règle 95 % du problème, et dans un chalet de ski, un surmatelas chauffant bon marché couvre les 5 % restants
    • J’envisageais d’acheter un Eight Sleep, puis j’ai découvert ce genre de pratiques et j’ai immédiatement perdu tout intérêt. Payer plus de 1 000 dollars pour une housse de matelas, d’accord, mais je n’ai aucune intention de payer en plus un « loyer » pour que l’objet fonctionne
  • Je n’achèterai pas de Sleep Number
    J’ai dormi pendant des années sur des matelas gonflables, et après que le fabricant a commencé à sous-traiter en Chine, les coutures des cloisons internes ont lâché sur deux matelas

  • J’aimerais qu’on arrête de répandre des absurdités du type « suivre ce guide vous oblige à modifier les fichiers internes du hub Sleep Number et annule la garantie »
    Tout comme les autocollants « garantie annulée si retiré » ne sont pas juridiquement applicables, rien n’annule automatiquement la garantie d’un produit, sauf usage abusif ou mauvais entretien
    Si un lit connecté tombe en panne, le simple fait d’avoir touché au contrôleur ne libère pas le fabricant de ses obligations de garantie. Cela inclut les garanties implicites. C’est au fabricant de prouver que le consommateur a endommagé le produit, l’a utilisé de manière « déraisonnable » ou ne l’a pas entretenu correctement
    Si vous branchez du JTAG et que, par erreur, vous pontiez du 5 V sur un circuit logique en 3,3 V, grillant ainsi le cerveau du lit, c’est votre responsabilité
    Mais si l’alimentation explose et que le contrôleur tombe en panne, le fait d’avoir ajouté un connecteur JTAG, collé des autocollants en forme d’yeux et peint le tout en rose n’a aucun rapport. Ils doivent réparer
    Même si vous avez modifié le firmware, le fabricant doit prouver que cette modification est la cause de la panne
    On ne s’attend pas à ce que la garantie d’un ordinateur portable soit annulée parce qu’on joue dessus et qu’il chauffe beaucoup. Même chose si l’on installe Firefox ou Linux. Il n’y a aucune raison de penser que les règles changent simplement parce qu’un appareil est un peu plus « idiot »

    • Le droit sur le papier et le droit sur le terrain sont deux choses différentes. Si le fabricant refuse d’honorer la garantie, le client a très peu de recours
  • La prochaine étape, ce sera probablement un rançongiciel : « paie 1 000 dollars, sinon tu ne pourras pas dormir dans ton lit pendant le mois qui vient »

    • La prochaine étape, ce n’est pas plutôt l’abonnement ?
  • Regardons quelques faits
    Les lits Sleep Number intègrent un capteur qui détecte la fréquence cardiaque. Ils le font en mesurant les variations de pression dans le matelas à air. En pratique, c’est presque un micro, et plutôt sensible

    • On peut vraiment détecter le rythme cardiaque avec un capteur de pression ? Il doit y avoir tellement de bruit que les données semblent inutilisables
      Après vérification, il semble qu’en combinant une analyse statistique assez plausible, on obtienne des données suffisamment précises. Intéressant