
원본 파이썬 익스플로잇을 C로 변환 중
CVE‑2026‑0073은 Android ADB 데몬(adbd)의 논리 버그로, 공격자가 TLS 상호 인증을 우회하고 무선 디버깅이 활성화되어 있고 최소 한 번 이상 컴퓨터와 페어링된 기기에서 원격 셸을 열 수 있게 합니다. 근본 원인은 하나의 잘못 사용된 API입니다. OpenSSL의 EVP_PKEY_cmp() 반환 값이 세 가지 값을 갖는 결과 대신 부울(Boolean)로 처리된다는 점입니다.
Android 개발자 설정에서 무선 디버깅을 활성화하면 기기는 임의의 TCP 포트에서 수신 대기하는 adbd 인스턴스를 시작합니다.
참고: 이 기능은 Android 11부터 도입되었습니다.
프로토콜은 두 단계로 이루어집니다:
adbd는 클라이언트가 인증서를 제시하도록 요구합니다.adbd는 해당 인증서에서 공개 키를 추출합니다./data/misc/adb/adb_keys에 저장된 모든 승인된 RSA 키와 키를 비교합니다. 키는 이전 페어링 중에 이곳에 배치됩니다 (이 익스플로잇을 실행하려면 최소 하나의 키가 여기에 있어야 합니다).shell 사용자로 셸 명령을 보낼 수 있습니다.
키 비교는 OPENSSL의 EVP_PKEY_cmp(key1, key2)를 사용하여 수행되며, 반환 값은 다음과 같습니다:daemon/auth.cpp 파일에서 취약한 함수 adb_tls_verify_cert()는 대략 다음과 같은 형태입니다:
int cmp = EVP_PKEY_cmp(stored_rsa_key, peer_key);
if (cmp) {
authorised = true;
}
if(cmp)는 cmp가 0이 아닌 한 true를 반환하므로, EVP_PKEY_cmp()가 -1을 반환하면 인증이 허용됩니다. 즉, 저장된 키가 RSA이므로 클라이언트가 EC 또는 ed25519 인증서를 제시하면 함수가 -1을 반환하고 공격자는 승인된 접근 권한을 얻게 됩니다.
대상: 무선 디버깅이 활성화되어 있고 키 저장소에 RSA 키가 하나 이상 있는 Android 기기 (누구에 의해 한 번 이상 페어링된 기기).
평문 핸드셰이크: 공격자는 adbd TCP 포트에 연결하고 CNXN/STLS를 교환합니다.
EC 인증서를 사용한 TLS 핸드셰이크: 공격자는 임시 EC P‑256 키와 자체 서명된 인증서를 생성합니다. 이 키는 의도적으로 RSA가 아닙니다.
잘못된 비교: EVP_PKEY_cmp(RSA, EC)가 ‑1을 반환 → if (cmp)가 true → adbd가 전송 채널을 승인된 것으로 표시합니다.
TLS 이후: 공격자는 호스트 CNXN(전송 채널을 재설정함) 전송을 피하고 큰 delayed_ack 윈도우를 사용하여 shell: 스트림을 직접 엽니다.
결과: 사용자 상호 작용, 알림, 합법적인 개인 키 보유 필요 없이 shell 사용자로 원격 셸을 획득합니다.
Python 스크립트는 공격자 머신에 Python 3 인터프리터와 cryptography 라이브러리가 설치되어 있어야 합니다. C 구현은 시스템의 OpenSSL/libssl 외에는 외부 종속성이 없는 독립 실행형 바이너리로 컴파일되며, 이는 사실상 모든 Linux 시스템에 기본적으로 존재합니다. 따라서 배포 장벽이 크게 낮아집니다. 게다가 C 프로그램은 모든 대상 아키텍처(x86_64, ARM, MIPS)로 크로스 컴파일할 수 있습니다. 즉, 이 익스플로잇을 라우터, Raspberry Pi와 같은 임베디드 기기나 공격자 역할을 하는 또 다른 Android 기기에서도 Python 환경 없이 직접 컴파일하고 실행할 수 있습니다. 또한 컴파일된 C 바이너리는 심볼을 제거하고 UPX로 패킹할 수 있으며, 디스어셈블러 없이는 내용을 파악하기 어려워 Python 스크립트보다 은닉성이 높습니다.
익스플로잇 실행: 무선 디버깅 인터페이스의 IP와 PORT를 입력하면 기기에서 셸을 얻습니다.
docker build -t adb_bypass .
docker run -it --network host adb_bypass <IP> <PORT>
계산기(calc) 실행
am start -n com.sec.android.app.popupcalculator/com.sec.android.app.popupcalculator.Calculator
LLM을 사용하여 익스플로잇을 Python에서 C로 번역했습니다. 원본 익스플로잇은 여기 있습니다. 번역이 1:1로 정확하지 않아 많은 문제가 발생했으며, 따라서 코드 분석과 반복적인 채팅을 통해 번역의 버그를 수정하고 완전히 실행되는 익스플로잇을 완성할 수 있었습니다.