Ausgeleuchtet

Smarte Glühbirne "Xiaomi Yeelight" verrät WLAN-Zugangsdaten

Die Einen lieben sie, die Anderen halten sie für die überflüssigste der modernen Errungenschaften, aber wenige sind sich bewusst dass "Smart Home"-Produkte leicht auch zum Einfallstor in das heimische WLAN werden können.

Ein Beispiel für unzureichende Sicherheit im Internet der Dinge liefert das LED-Leuchtmittel Yeelight RGBW des Herstellers Xiaomi.

Angreifer können die privaten WLAN-Zugangsdaten des Benutzers erhaschen, im wörtlichen Sinn: der kryptographische Schlüssel der smarten Glühbirne leitet sich aus dem MD5-Hash einer Gerätekennung ab.

Photo

https://github.com/openmihome

Normalbetrieb

Das Yeelight RGBW ist ein LED-Leuchtmittel mit WLAN-Funktion. Der Benutzer kann es mit einer MiHome genannten Android-App steuern. Bevor das funktioniert, muss das Leuchtmittel jedoch in das heimische WLAN eingebunden werden. Diesen Vorgang nennt Xiaomi auch "SmartConnect".

Aus Benutzersicht läuft es so:

  1. Benutzer gibt WLAN-Zugangsdaten in MiHome-App ein.
  2. Das Yeelight verbindet sich zum WLAN.
  3. Fertig.

Die MiHome-App muss beim Erstkontakt mit dem Yeelight die WLAN-Zugangsdaten übertragen. Dieser Vorgang ist leider unsicher.

Photo

Security by obscurity

Was geschieht hinter den Kulissen?

Im Auslieferungszustand öffnet das Yeelight einen WLAN-AP, wie iwlist scan zeigt:

Cell 01 - Address: F0:B4:29:XX:XX:XX
    Channel:6
    Frequency:2.437 GHz (Channel 6)
    Quality=70/70  Signal level=-34 dBm  
    Encryption key:off
    ESSID:"yeelink-light-color1_xxxxxxxx"

Beim Erstkontakt verbindet die MiHome-App das Smartphone mit diesem Netzwerk und erhält per DHCP die IPv4-Adresse 192.168.13.2. Das Yeelight selbst belegt 192.168.13.1. Ein Scan dieser IP mit nmap offenbart leider keinen erreichbaren TCP-Port.

Ein Traffic-Dump mit Wireshark ist ernüchternd. Augenscheinlich handelt es sich um proprietäres Protokoll auf UDP-Port 54321.

Photo

Dieses Protokoll wird sowohl bei der Initialisierung als auch später zur Steuerung benutzt. Es hat dieses Format;

 0                   1                   2                   3   
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Magic number = 0x2131         | Packet Length (incl. header)  |
|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
| Unknown1 (const)                                              |
|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
| Unknown2 (const)                                              |
|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
| Stamp (counter)                                               |
|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
| MD5 checksum                                                  |
| ... or Device Token in response to the "Hello" packet         |
|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
| optional variable-sized data (encrypted)                      |
|...............................................................|

Eine detaillierte Beschreibung findet sich im Git-Repository.

Kurzfassung:

  1. MiHome verbindet sich zu diesem offenen WLAN
  2. MiHome sendet ein "Hallo"-Paket an Yeelight
  3. Yeelight antwortet mit 128-bit Gerätekennung (Token)
  4. MiHome errechnet AES-Parameter aus Token
  5. MiHome sendet WLAN-Zugangsdaten verschlüsselt an Yeelight
  6. Yeelight schließt den offenen AP
  7. Yeelight verbindet sich zum WLAN

Die Verschlüsselung leitet sich aus dem Token ab.

Key = MD5(Token)
IV  = MD5(MD5(Key) + Token)
PKCS#7 padding
Cipher Block Chaining (CBC).

Kritisch sind also die Punkte 3) bis 5). Das Token wird auf dem initialen, unverschlüsselten WLAN-AP übertragen. Ein Angreifer kann es problemlos abhören, daraus die AES-Parameter errechnen, und die WLAN-Zugangsdaten in Schritt 5) entschlüsseln.

Proof-of-concept code habe ich auf Github eingestellt. Das Skript extrahiert und entschlüsselt das Protokoll zwischen Yeelight und MiHome-App.

./pcap-decrypt.py wlan0.pcapng.gz

### 192.168.13.2 (xx:xx:xx:xx:xx:xx) => 192.168.13.1 (yy:yy:yy:yy:yy:yy)
DECRYPTED: {"id":1234567890,"method":"miIO.config_router",
"params":{"ssid":"WiFi name","passwd":"WiFi password","uid":987654321}}

Fatal ist auch, dass die Birne im Werkszustand immer nur auf Kanal 6 aktiv ist. Ein Angreifer kann so mit nur einem einzigen WLAN-Adapter im Monitor Mode und einer großen omnidirektionalen Antenne problemlos sämtliche Yeelights im Umkreis von einigen hundert Metern erfassen.

Aus der Yeelight WiFi Light Inter-Operation Specification:

When user received the smart LED device for the first time, he/she needs to complete a configuration procedure to provision the router's SSID and password to the device. This procedure is normally called SmartConfig or QuickConnect. Due to security consideration, the protocol used for SmartConfig is proprietary

Links

Verwandte Projekte

social