- 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/scriptssur 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
- Sous Linux et macOS, on peut utiliser
- 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 partierun set_bootargs;afin de définir manuellement les arguments de démarrage - Le script
/initse trouve dans une bootrom hachée et ne peut pas être modifié directement ; il faut donc en altérer le contenu à l’exécution viabootargs- 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é
- Le script par défaut cherche un fichier chiffré qui se déchiffre en la chaîne
- Au premier démarrage, une clé USB contenant le fichier
let_me_rootest 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
- Si l’invite
- Ensuite, il faut remonter la partition root en lecture/écriture et créer le fichier
/root/let_me_rootpour 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_keyspour 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 utiliseed25519
- La commande d’exemple est
- 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_keyset 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.pyouvre 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
argpeuvent ê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
/initdu 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
/etcsource 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 danstmp/etc/init.dsur la partition root d’origine - Des liens symboliques doivent être ajoutés dans
rc0.d,rc3.d,rc4.d,rc5.detrc6.dpour exécuter le script au démarrage et à l’arrêt - Si, après redémarrage,
http://$hub_ip:8000/bamstataffiche 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
/biosemble ê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 à droitePSNl,PSNr: lecture des valeurs actuelles à gauche et à droitePSNX: lecture des dernières valeurs configurées et des valeurs actuelles des deux côtésPSNS&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é,offle désactiveLBPL,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ésLRLE&arg=on,LRRE&arg=off: modifient les réglages Responsive Air gauche et droitMFST: lecture de la position de la tête et des piedsMFUL,MFUR,MFFL,MFFR: définissent la position de la tête et des pieds à gauche et à droiteMFO3,MFSO: définissent l’état, la luminosité et la minuterie de l’éclairage inférieur ou des prisesFWGL,FWGR,FWSL,FWSR: lecture et réglage du niveau de chauffe des pieds et de la minuterie à gauche et à droiteSBAS: définit la valeur de référence du lit
/bio?arg=helpaffiche la liste des commandes disponibles- En ajoutant une commande comme second argument à
help, on obtient des informations détaillées sur cette commande
- En ajoutant une commande comme second argument à
- Le script
biocomprend 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 resetou le contrôle radio doivent être utilisées avec prudence - Dans la version de
bioutilisée par l’auteur, l’entréeMFSOétait mal placée dansLIST; il a fallu la remonter de quelques lignes pour pouvoir l’appeler
- Les commandes destructrices comme
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
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.
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.
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.
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 ;)
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.
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.
« 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. »
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.
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 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.
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.
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
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
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 »
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 »
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
Après vérification, il semble qu’en combinant une analyse statistique assez plausible, on obtienne des données suffisamment précises. Intéressant