- Wenn man auf dem Sleep Number Hub über die UART-Konsole und U-Boot-Umgebungsvariablen Root-Zugriff erhält, lässt sich ein lokaler Steuerungspfad einrichten, der nicht über die SleepIQ-Server läuft
- Das bisherige Homebridge-Plugin rief alle 5 Sekunden die SleepIQ API auf und belastete bei mehreren Tausend Nutzern das Netzwerk von Sleep Number, weshalb um Deaktivierung gebeten wurde
- Zielgerät ist der Sleep Number Hub 360SIQ01D; entscheidend sind die J16-UART-Pins, eine Konsole mit 115200 Baud, ein FAT32- oder Ext3-USB-Laufwerk sowie die Registrierung eines öffentlichen SSH-Schlüssels
- Nach dem Root-Zugriff lassen sich mit Python 2.7.18 auf dem Hub und
/bam/scriptsüber einen HTTP-Server auf Port 8000 Einstellungen und Status des Betts im lokalen Netzwerk verwalten - Der Hub kann SSH-Reverse-Tunnel zu den Servern von Sleep Number öffnen; wenn lokale Steuerung ausreicht, ist es sicherer, die externe Internetverbindung zu trennen und Bluetooth oder interne Steuerung zu nutzen
Wie es zur Suche nach lokalem Zugriff kam
- Ziel war es, ein Sleep-Number-Bett im lokalen Netzwerk zu steuern, ohne über die SleepIQ-Server zu gehen
- Ein zuvor erstelltes homebridge-Plugin ermöglichte es, Betteinstellungen über HomeKit oder Automatisierungen zu steuern
- Besonders der bed presence-Wert, der anzeigt, ob jemand im Bett liegt, war für Automatisierungen wie Licht ausschalten oder Türen verriegeln nützlich
- Das Plugin rief alle 5 Sekunden die SleepIQ API auf und belastete mit wachsender Nutzerzahl im Tausenderbereich das Netzwerk von Sleep Number
- Sleep Number bat darum, das Plugin zu deaktivieren
- Außerdem gab es das Problem, dass das Branding des Repositorys wie ein offizielles Tool von Sleep Number wirken konnte
- Die bisherige Arbeit wurde später im neuen Plugin homebridge-bed-control fortgeführt
- Das neue Plugin deaktiviert das Monitoring von bed presence standardmäßig und zeigt vor der Aktivierung eine Warnung an
Auf dem Hub-Hardwareboard gefundener Zugriffspfad
- Zunächst wurde der J10-Header nahe der CPU untersucht, dort ließen sich aber keine UART-Daten gewinnen
- In dieser CPU-Konfiguration waren die UART-Leitungen nicht herausgeführt
- Um UART-Signale zu finden, wurde ein Logic Analyzer an die 10 Header-Pins des J16-Headers auf der Unterseite des Boards angeschlossen
- Nach dem Anschluss eines UART-TTY-Geräts war Zugriff auf die Gerätekonsole möglich
- Durch Dumpen des Flash-Speichers wurden Dateisystem und Schwachstellen untersucht, aber es wurde keine Backdoor gefunden, über die sich ohne UART jeder einloggen könnte
- Stattdessen wurde eine Wartungs-Backdoor entdeckt, über die Sleep Number per SSH auf den Hub zugreifen kann
- Da der Hub mit dem internen Heimnetzwerk verbunden ist, kann dieser Zugriffspfad bis ins interne Netzwerk führen
- Empfohlen wird, die WLAN-Verbindung zu trennen und soweit möglich Bluetooth-Steuerung zu verwenden
Vorbereitung und Zielgerät
- Das Verfahren wurde am Modell Sleep Number Hub 360SIQ01D durchgeführt
- Benötigt werden ein UART-TTY-Gerät und Werkzeuge zum Verbinden mit dem Board
- USB-C auf UART oder USB-A auf UART
- Ein Raspberry Pi Pico W kann dauerhaft intern installiert werden, um bei nicht funktionierendem SSH Remote-Konsolenzugriff zu ermöglichen
- 2,54-mm-Pin-Header und Lötkolben oder PCB-Clip-Klemmen
- Für die Kommunikation mit dem Board wird eine serielle Konsole benötigt
- Unter Linux und Mac kann
minicomverwendet werden - Unter Windows kann PuTTY verwendet werden
- Unter Linux und Mac kann
- Ein USB-A-Flash-Laufwerk muss im Format FAT32 oder Ext3 formatiert sein
- Falls am verwendeten Hub bereits ein USB-Gerät eingesteckt ist, könnte es ein WLAN-Dongle sein; ohne dieses Gerät kann eine Boot-Schleife auftreten
Kernablauf für Root-Zugriff
- Das UART-Gerät wird mit dem J16-Header des Boards verbunden
- Pin 1: TX, Signal in den Hub hinein
- Pin 2: RX, Signal aus dem Hub heraus
- Pin 3: Masse
- Die serielle Konsole wird auf 115200 Baud eingestellt
- Nach dem Einschalten des Hubs muss innerhalb von 2 Sekunden die Leertaste gedrückt werden, um den automatischen Bootvorgang anzuhalten
- Die U-Boot-Umgebungsvariablen sollten zunächst mit
printenv -agesichert werden- Da eventuell eine Wiederherstellung der Standardwerte nötig ist, sollte festgehalten werden, ob Unterschiede zur aktuellen Umgebung bestehen
- In
bootcmdwird der Teilrun set_bootargs;entfernt, damit die Boot-Argumente manuell gesetzt werden können - Da sich das
/init-Skript in einem gehashten Boot-ROM befindet und nicht direkt geändert werden kann, wird der Inhalt von/initzur Laufzeit überbootargsverändert- Das Standardskript sucht nach einer verschlüsselten Datei, die mit der Zeichenfolge
let_me_rootentschlüsselt wird - Die Entschlüsselungszeile wird durch den entschlüsselten Wert ersetzt, um die Anforderung an die verschlüsselte Datei zu umgehen
- Das Standardskript sucht nach einer verschlüsselten Datei, die mit der Zeichenfolge
- Beim ersten Boot wird ein USB-Laufwerk mit der Datei
let_me_rootbenötigt- Wenn nach dem Booten auf der Konsole der Prompt
root@bam-se:~#erscheint, befindet man sich in einer Root-Shell
- Wenn nach dem Booten auf der Konsole der Prompt
- Anschließend wird die Root-Partition erneut im Lese-/Schreibmodus gemountet und die Datei
/root/let_me_rooterstellt, damit der Zugriff auch ohne USB erhalten bleibt
SSH-Zugriff einrichten
- Nach Erhalt des Root-Prompts wird ein öffentlicher SSH-Schlüssel zu
/root/.ssh/authorized_keyshinzugefügt, um Netzwerkzugriff einzurichten - Auf dem lokalen Rechner, von dem aus zugegriffen werden soll, muss ein SSH-Schlüssel erzeugt werden
- Der Beispielbefehl lautet
ssh-keygen -t ed25519 - Im erklärenden Text wird ein
ecdsa-Schlüssel empfohlen, das konkrete Beispiel verwendet jedoched25519
- Der Beispielbefehl lautet
- Nach dem Hinzufügen des öffentlichen Schlüssels wird der Zugriff mit
ssh root@$hub_ip -i <path to id_ed25519>getestet - Wenn die Verbindung nicht funktioniert, sollten Format und Inhalt von
authorized_keysgeprüft werden- Es heißt, dass diese Datei zwei Schlüssel enthalten sollte
Lokalen Netzwerk-Steuerungsserver erstellen
- Root-Zugriff allein reicht nicht aus, um die Steuerfunktionen der Bett-App bequem zu ersetzen; deshalb wird auf dem Hub ein lokaler HTTP-Server ausgeführt
- Der Hub enthält Python 2.7.18
- Der letzte Updatezeitpunkt des Hubs scheint 2018 zu sein
- Python 2.7.18 enthält das Paket
simpleHTTPServer, das die benötigten Funktionen bereitstellt
script_server.pyöffnet auf Port 8000 einen HTTP-Server und führt Skripte in/bam/scriptsaus- Der URL-Pfad wird zum Skriptnamen
- Mehrere
arg-Query-Parameter können übergeben und als Skriptargumente genutzt werden - Das Ergebnis der Ausführung wird im Browser angezeigt
- Das Skript wird in der Form
scp -O script_server.py root@$hub_ip:~auf den Hub kopiert - Für einen automatischen Start nach dem Neustart muss es an ein Startskript angehängt oder ein
rc.d-Skript hinzugefügt werden
Automatische Ausführung nach dem Neustart einrichten
- Die laufende OS-Instanz läuft in einem chroot, das vom
/init-Skript des Bootloaders erstellt wurde - Viele Systemdateien liegen auf einer
tmpfs-Partition; direkte Änderungen bleiben daher nach einem Neustart nicht erhalten - Wenn die Festplattenpartition mit den Originaldateien separat gemountet wird, lassen sich die ursprünglichen
/etc-Dateien ändern, die nach dem Neustart kopiert werden - Es wird ein Init-Skript in der Form
script_server.sherstellt, auf den Hub kopiert und intmp/etc/init.dder ursprünglichen Root-Partition abgelegt - In
rc0.d,rc3.d,rc4.d,rc5.d,rc6.dwerden symbolische Links hinzugefügt, damit es beim Starten und Herunterfahren ausgeführt wird - Wenn nach dem Neustart im Browser unter
http://$hub_ip:8000/bamstatStatusinformationen des Hubs erscheinen, läuft der Server korrekt
Steuerungsmöglichkeiten mit dem /bio-Skript
/bioscheint das zentrale Steuerungsskript des Betts zu sein- Befehle werden in der Form
/bio?arg=XXXXübergeben - Sleep-Number-Werte können abgefragt und gesetzt werden
PSNL,PSNR: letzte Einstellwerte der linken und rechten Bettseite abfragenPSNl,PSNr: aktuelle Werte der linken und rechten Bettseite abfragenPSNX: letzte Einstellwerte und aktuelle Werte beider Seiten abfragenPSNS&arg=L100: Sleep-Number-Wert links auf 100 setzen, Wertebereich 5..100
- Anwesenheitserkennung und Privatsphäre-Einstellungen lassen sich ebenfalls steuern
SPAU: Privatsphäre-Einstellung abfragenSPAU&arg=on: Privatsphäre-Einstellung einschalten, mitoffausschaltenLBPL,LBPR,LBPX: Anwesenheitswerte links, rechts bzw. beidseitig abfragen
- Auch Responsive Air, Bettposition, Beleuchtung und Fußwärme sind enthalten
LRSG: Responsive-Air-Einstellungen beider Seiten abfragenLRLE&arg=on,LRRE&arg=off: Responsive-Air-Einstellungen links/rechts ändernMFST: Kopf- und Fußposition abfragenMFUL,MFUR,MFFL,MFFR: Kopf- und Fußposition links/rechts einstellenMFO3,MFSO: Status sowie Helligkeits- und Timer-Einstellungen von Unterbettbeleuchtung oder SteckdoseFWGL,FWGR,FWSL,FWSR: Stufe und Timer der Fußheizung links/rechts abfragen und einstellenSBAS: Bett-Referenzwerte setzen
/bio?arg=helpzeigt eine Liste ausführbarer Befehle- Wird beim
help-Aufruf ein Befehl als zweites Argument hinzugefügt, erscheinen Detailinformationen zu diesem Befehl
- Wird beim
- Das
bio-Skript enthält außerdem Foundation-Presets, Schnarch-Einstellungen, DualTemp-Steuerung und Statusinformationen- Bei destruktiven Befehlen wie
factory resetoder Funksteuerung ist Vorsicht geboten - In der vom Autor verwendeten
bio-Version war die Reihenfolge des EintragsMFSOinLISTfalsch; um ihn aufzurufen, musste er einige Zeilen nach oben verschoben werden
- Bei destruktiven Befehlen wie
Nach dem Zugriff untersuchbare Bereiche und Sicherheitsbedenken
- Die Steuerfunktionen des Betts sind im Root-Verzeichnis
/bamgebündelt- Wenn man die dortigen Skripte untersucht, lässt sich nachvollziehen, wie der Hub funktioniert
- Es wurde nach einer Backdoor gesucht, die ohne UART zugänglich ist, aber offensichtliche Zugriffskanäle waren geschlossen
- Der Hub öffnet bei der Kommunikation mit den Sleep-Number-Servern einen SSH-Tunnel und stellt einen Reverse-Tunnel bereit, den Entwickler für Wartung nutzen können
- Da externe Nutzer möglicherweise direkt Zugriff auf das interne Heimnetzwerk erhalten könnten, wird erwogen, die externe Internetverbindung des Hubs zu trennen, sobald interne Netzwerk-Steuerungsskripte ausreichen
- Eine einfache Progressive Web App, die die SleepIQ-App direkt ersetzen kann, ist ebenfalls ein möglicher nächster Schritt
1 Kommentare
Hacker-News-Kommentare
Ziemlich absurd. Ich hatte früher mal so ein Bett, aber das war vor der Zeit, als alles smart werden musste. An die Pumpe waren zwei kabelgebundene Controller angeschlossen, und die Controller hatten eine Zahlenanzeige sowie Tasten zum Hoch- und Runterstellen
Es brauchte kein Internet, keinen Linux-basierten Mikrocontroller, das Bett konnte nicht gehackt werden, und man konnte bequem schlafen
Wenn jemand zum Beispiel eine Bewegungsstörung hat, von Parkinson bis zur Tetraplegie, kann es ein riesiger Vorteil sein, an einen gemeinsamen Controller angebunden zu sein, der per Sprache oder standardisierten Eingabemethoden funktioniert. Dann muss man sich nicht mit den jeweils unterschiedlichen Grenzen der Barrierefreiheit einzelner Produkte herumschlagen
Für Menschen ohne körperliche Einschränkungen wirken die meisten Smart-Home-Geräte fast nutzlos, für andere können sie aber eine Lebensader sein
Mich interessiert der Teil: „Wenn der Hub mit den Sleep-Number-Servern kommuniziert, öffnet er einen SSH-Tunnel und stellt einen Reverse-Tunnel bereit, damit Entwickler sich bei Bedarf zur Wartung mit dem Hub verbinden können“
Ich würde gern sehen, ob sie Public-Key-Authentifizierung oder Passwörter verwenden und ob beim Tunneln ins Haus IPs oder DNS genutzt werden. Wenn die Bedingungen genau passen, wäre das womöglich die lustigste DNS-Hijacking-Konfiguration der Menschheitsgeschichte
Um Homer Simpsons unsterbliche Worte zu zitieren: Das Bett geht hoch, das Bett geht runter
Newschool: Da Sleep-Number-Betten mit Bestelldaten verknüpft sind, dringt man bei Sleep Number ein, sucht sich ein Ziel, verbindet sich per SSH mit dessen Bett, pivotiert dann ins Heimnetzwerk und stiehlt die Krypto-Wallets
Das Geld wird ja ohnehin immer unter der Matratze versteckt ;)
Warum muss ein Bett überhaupt Linux ausführen? Warum?
Ich habe das Gefühl, in der dümmsten aller möglichen Zeitlinien zu leben. Was war falsch an einem ganz normalen Bett ohne 1 GB RAM und komplettes Betriebssystem? Es ist überall dasselbe. Schon eine Waschmaschine zu finden, die nicht mit Wi‑Fi verbunden ist, war mühsam, und der Gedanke, das in zehn Jahren wieder tun zu müssen, ist schrecklich
Als jemand, der aus Spaß oder fürs Geld O(1000) „smarte“ Geräte geknackt hat, will ich so etwas nicht im Haus haben. Aber wegen dieses Wahnsinns wie einem Linux-betriebenen Bett wird es immer schwerer, dem auszuweichen. Ich wünschte wirklich, es würde aufhören
Was ich allerdings nicht vermisse: mit einer leeren Vinylplatte in die öffentliche Bibliothek zu gehen, um Software-Updates zu holen. Wenn man das vergaß, bekam man Bettwanzen
„Das modernste Technikprodukt, das ich besitze, ist ein Drucker aus dem Jahr 2004, und falls er jemals unerwartete Geräusche macht, halte ich eine geladene Waffe bereit, um ihn sofort zu erschießen“
Vor einem Jahrhundert haben wir Antibiotika entdeckt, und das war ein großer Fortschritt. Danach haben wir viele klar umrissene Krankheiten und klare Behandlungen gefunden, und jetzt bleiben die komplexen und subtilen Dinge übrig. Dieses Bett führt Linux aus, um Auskunft über deinen Schlafzustand zu geben
Schlechter Schlaf hat meist schwächere, aber vielfältige negative Auswirkungen, und wenn man sie kennt, kann man etwas dagegen tun. Es ist gewissermaßen jede Nacht eine Schlafuntersuchung mit niedriger Intensität, und das kann wertvolle Information sein
Sleep-Number-Betten kosten mehrere tausend Dollar, also sollte man ihnen gut aus dem Weg gehen können, wenn man das will
Das ist großartig für den Geldbeutel und gibt ein gutes Gefühl, weil man funktionierende Dinge nicht auf der Deponie landen lässt. Reduzieren, wiederverwenden, recyceln steht nicht umsonst in genau dieser Reihenfolge
Zuerst war ich völlig überzeugt, dass dies ein Artikel über das Hacken eines Eight-Sleep-Betts ist, geschrieben von jemandem, der den Firmennamen aus rechtlichen Gründen nicht direkt nennen wollte
Aber dann habe ich das Foto eines offenbar tatsächlich existierenden „Number Sleep Hub“ gesehen und den Verstand verloren. Es gibt also gleich zwei Firmen, die wassergekühlte Betten bauen, eine heißt Eight Sleep und die andere Sleep Number — diese Zeitlinie ist einfach zu seltsam. Es fühlt sich an, als hätte der Zufallszahlengenerator dieser Instanz einen schlechten Seed bekommen
https://i.ytimg.com/vi/pMiTq6YkJ2c/maxresdefault.jpg
Die Leute zahlen also buchstäblich ein paar tausend Dollar für ein luxuriöses verstellbares Luftbett mit etwas Schaumstoff obendrauf
Ich hoffe, solche Betten haben physische Bedienelemente, die man auch im Dunkeln ertasten kann. Wenn ich zum Verstellen beim Einschlafen mein Smartphone vor das Gesicht halten muss, zweifle ich daran, dass Bett- und Matratzenhersteller wirklich wissen, was gut und was schlecht für die Schlafqualität ist
Es gibt einen ähnlichen Weg, in den Eight Sleep Pod 3 zu gelangen [0]. Einige Modelle enthalten eine modifizierbare MicroSD-Karte, sodass weniger zusätzliche Hardware nötig ist
Die im Artikel beschriebene Methode könnte ein guter Ansatz sein, um auf Pods ohne Karte Root-Zugriff zu erhalten. Ich habe allerdings gerade erfahren, dass Eight Sleep zwar Firmware-Updates signiert, aber den privaten Schlüssel, mit dem diese Updates signiert werden, im selben Paket mitliefert
[0]: https://github.com/bobobo1618/ninesleep
Natürlich sind 2.000 bis 4.000 Dollar teuer, aber als einmalige Ausgabe für etwa 10 Jahre wäre das vertretbar. Wenn ich aber 4.000 Dollar bezahle und dann noch 25 Dollar im Monat abdrücken soll, ist das absurd
Ich frage mich, ob das schon jemand bei Eight Sleep gemacht hat. Dass man die Temperatur des Betts nicht regeln kann, nur weil das Internet ausgefallen ist, ist wirklich zutiefst unerquicklich
Ich werde kein Sleep Number kaufen
Ich habe mehrere Jahre auf einer Luftmatratze geschlafen, und nachdem der Hersteller die Produktion nach China ausgelagert hatte, sind bei zwei Matratzen die Nähte der inneren Trennwände aufgeplatzt
Ich wünschte, die Leute würden aufhören, so einen Unsinn zu verbreiten wie
„Wenn du dieser Anleitung folgst, musst du interne Dateien des Sleep-Number-Hubs verändern, und dadurch erlischt die Garantie“
So wie „Garantie erlischt beim Entfernen“-Sticker rechtlich nicht durchsetzbar sind, gibt es nichts, was eine Produktgarantie automatisch erlöschen lässt, außer Missbrauch oder mangelhafter Wartung
Wenn ein Smart-Bett kaputtgeht, ist der Hersteller nicht allein deshalb von seiner Garantiepflicht befreit, weil du am Controller herumgefummelt hast. Das gilt auch für implizite Garantien. Der Hersteller trägt die Beweislast dafür, dass der Verbraucher das Produkt beschädigt, es auf „unangemessene“ Weise benutzt oder nicht ordnungsgemäß gewartet hat
Wenn du beim Anschließen von JTAG versehentlich 5 V auf eine 3,3-V-Logikschaltung gebrückt und damit das Gehirn des Betts gegrillt hast, dann ist das natürlich deine Verantwortung
Wenn aber das Netzteil hochgeht und dadurch der Controller ausfällt, dann ist es irrelevant, dass du einen JTAG-Header angelötet, Googly Eyes aufgeklebt und das Ganze pink angemalt hast. Sie müssen es reparieren
Selbst wenn du die Firmware modifiziert hast, muss der Hersteller nachweisen, dass genau diese Modifikation den Defekt verursacht hat
Niemand würde erwarten, dass die Garantie eines Laptops erlischt, nur weil man darauf Spiele spielt und er dadurch heiß wird. Genauso wenig, wenn man Firefox oder Linux installiert. Es gibt keinen Grund anzunehmen, dass andere Regeln gelten, nur weil das Gerät etwas „dümmer“ ist
Als Nächstes kommt wohl Ransomware. „Wenn du nicht 1.000 Dollar zahlst, kannst du im nächsten Monat nicht in deinem Bett schlafen“
Schauen wir uns ein paar Fakten an
Sleep-Number-Betten haben Sensoren zur Erfassung der Herzfrequenz. Das funktioniert über die Erkennung von Druckunterschieden in der Luftmatratze. Praktisch ist das fast schon ein Mikrofon und ziemlich empfindlich
Ich habe es nachgeschlagen, und offenbar kombinieren sie das mit ziemlich plausibler statistischer Auswertung, um ausreichend genaue Daten zu erhalten. Interessant