NOW Briefing
Android WAP Push 헤더 처리 원격 서비스 거부 취약점 (CVE-2026-58882)
■ 개요
WAP Push(멀티미디어 메시지 도착 알림처럼 통신사 망에서 단말로 보내는 특수 문자 메시지 규격)는 사용자 화면에 보이지 않고 Android 통신 계층이 자동으로 해석합니다. 이 해석 과정에 범위 검증이 빠져 있어, 연구자 재현에서는 조작된 WAP Push 메시지 한 통을 수신하는 것만으로 전화 기능이 중단됐습니다. 연구자 공개 글 기준 Android 12부터 17까지가 영향을 받으며, 공격에 필요한 것은 대상 전화번호와 데이터 SMS를 보낼 수 있는 발신 단말이고 사용자가 메시지를 열거나 확인하는 동작은 필요하지 않습니다.
영향은 서비스 거부에 그치지만 중단되는 기능이 통화입니다. 메시지가 처리되는 순간 전화 기능을 담당하는 시스템 프로세스가 종료되면서 진행 중인 통화가 끊길 수 있고, 여기에는 긴급통화도 포함됩니다. 문제 메시지는 수신 원본 테이블에 남아 재부팅 이후에도 다시 처리되고, 연구자 분석에 따르면 Android의 RescueParty 복구 기능이 반복되는 비정상 종료를 감지해 약 90초마다 단말을 재부팅시킵니다. 연구자 재현 기준으로 약 20통을 보내면 단말을 장기간 사용할 수 없는 상태로 만들 수 있습니다. 복구 방법으로는 Android 디버깅 도구(ADB)로 해당 메시지 행을 삭제하는 절차가 공개됐으며, ADB를 사용할 수 없는 사용자는 초기화가 필요합니다.
패치는 2026년 10월 Android 보안 업데이트로 Android 14~17에 배포됐지만, 해당 CVE는 Google의 10월 Android 보안 공지 목록에 포함되지 않았습니다. 해외 보도 기준으로는 11월 공지에 등재될 것으로 예상되며, 그때까지는 패치 적용 여부를 공지 기준으로 추적하기 어렵습니다. 특히 Android 12·13 단말에는 수정이 제공되지 않아 구형 단말이 그대로 노출된 상태로 남습니다. 국내에서도 KISA 보호나라가 Android 및 제조사 단말 보안 업데이트 권고를 정기적으로 발행하고 있어, 단말 보안 패치 수준은 기존 운영 절차 안에서 점검할 수 있습니다.
■ 요약
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2026-58882 (WAP Push 헤더 길이 처리 취약점) |
| CVSS 점수 | 공식 점수 미산정 |
| 취약점 유형 | 부호 있는 정수 캐스팅 시 범위 검증 누락, 원격 서비스 거부(DoS) |
| 영향/위험 | • 사용자 조작 없이 메시지 수신만으로 전화 담당 시스템 프로세스 종료됨 • 진행 중 통화 및 긴급통화 단절 가능 • 반복 수신 시 약 90초 주기 재부팅 루프 발생함(연구자 재현 기준) • 복구에 ADB 접속 또는 초기화 필요 |
| 취약 버전 | • Android 12 ~ 17 (연구자 분석 기준) |
| 패치 버전 | • Android 14 ~ 17 (2026년 10월 Android 보안 업데이트) • Android 12·13 (수정 미배포) |
■ 기술 분석
WAP Push 메시지의 세션 계층 규격(WSP) 헤더 길이는 uintvar(가변 길이로 표현하는 정수) 형식으로 최대 32비트 값을 담을 수 있습니다. Android 통신 계층의 WAP Push 해석 코드인 WapPushOverSms.decodeWapPdu()는 이 값을 32비트 값으로 읽은 뒤 범위 검사 없이 부호 있는 int로 그대로 캐스팅합니다(int headerLength = (int) pduDecoder.getValue32();). 최상위 비트가 켜진 값은 이 변환에서 음수가 되고, 연구자 분석에 따르면 이 길이로 바이트 배열을 할당하는 지점에서 NegativeArraySizeException이 발생합니다.
문제는 예외가 발생한 뒤의 처리입니다. 수정 전 코드는 ArrayIndexOutOfBoundsException만 포착하도록 작성돼 있어 이 예외가 그대로 상위로 전파됩니다. 메시지 수신을 처리하는 통신 스레드에서 처리되지 않은 예외가 되면서 전화 기능을 담당하는 Android 시스템 프로세스 com.android.phone이 종료됩니다. 또한 처리에 실패한 메시지가 수신 원본 테이블에서 정리되지 않아 재부팅 이후에도 같은 메시지가 다시 처리되고, 반복되는 비정상 종료를 감지한 RescueParty가 단말을 재부팅시키면서 단발성 장애가 재부팅 루프로 커집니다.
아래 코드는 AOSP 수정 커밋 735d967의 src/java/com/android/internal/telephony/WapPushOverSms.java 변경 구간입니다. Google은 길이값 범위 검증을 추가하는 대신 포착 범위를 RuntimeException으로 넓히는 방식을 택했습니다.
--- a/src/java/com/android/internal/telephony/WapPushOverSms.java
+++ b/src/java/com/android/internal/telephony/WapPushOverSms.java
@@ -314,10 +314,10 @@
result.intentData = intentData;
result.contentTypeParameters = pduDecoder.getContentParameters();
result.statusCode = Activity.RESULT_OK;
- } catch (ArrayIndexOutOfBoundsException aie) {
+ } catch (RuntimeException e) {
// 0-byte WAP PDU or other unexpected WAP PDU contents can easily throw this;
// log exception string without stack trace and return false.
- Rlog.e(TAG, "ignoring dispatchWapPdu() array index exception: " + aie);
+ Rlog.e(TAG, "ignoring decodeWapPdu() runtime exception: " + e);
result.statusCode = Intents.RESULT_SMS_GENERIC_ERROR;
}
return result;
같은 커밋은 메시지 전달 단계에도 예외 포착을 추가하고, 처리에 실패한 메시지를 수신 원본 테이블에서 삭제해 재처리 루프를 끊도록 변경했습니다. 근본 원인인 범위 검증 누락은 그대로 남아 있고, 그에 따른 프로세스 종료와 재부팅 반복만 차단했습니다.
■ PoC
연구자는 기술 공개와 함께 PoC를 GitHub 저장소로 배포했습니다. 저장소에는 Android 앱 소스와 미리 빌드된 APK가 포함되어 있고, 해당 앱은 공격자 측 단말에서 WAP Push용 데이터 포트에 짧은 조작 메시지를 보냅니다. 실행에는 공격자 소유의 Android 단말, 발신용 SIM과 문자 발송 권한, 대상 전화번호가 필요하며 대상 단말에서는 어떤 조작도 필요하지 않습니다. PoC 코드는 본문에 싣지 않았으며, 원문은 참고 자료의 링크에서 확인할 수 있습니다.
⚠️ WARN
긴급통화 단절로 이어질 수 있어, 테스트는 반드시 분리된 시험 단말과 명시적 승인 아래에서만 수행해야 합니다.
■ 탐지 및 점검
• 단말 설정의 보안 업데이트 날짜가 2026년 10월 1일 이후 패치 수준인지 확인하고, 제조사별 배포 일정과 실제 적용 여부를 함께 점검합니다.
• 통화 중 갑작스러운 단절, 전화 앱 강제 종료, 반복 재부팅 신고가 접수되면 단말 로그에서 java.lang.NegativeArraySizeException과 WapPushOverSms.decodeWapPdu가 함께 기록됐는지 확인합니다.
• 자산 관리·MDM 목록에서 Android 12·13 단말을 식별해 패치가 제공되지 않는 대상으로 별도 분류합니다.
• 재부팅 루프가 발생한 단말은 ADB로 수신 메시지 원본 테이블(content://sms/raw)을 조회해, 수신 포트를 담는 열 destination_port의 값이 134020(WAP Push 데이터 포트 2948에 대응)인 항목이 남아 있는지 점검합니다.
• 현장 안전 담당, 당직, 비상 연락 체계처럼 통화 가용성이 핵심인 사용자 단말을 먼저 점검합니다.
■ 대응 방안
• 2026년 10월 이후 보안 패치 수준으로 단말을 업데이트하고, 제조사 업데이트가 조직 내 전 단말에 적용됐는지 확인합니다.
• Android 12·13 단말은 지원 릴리스로 업그레이드하거나 교체 계획을 수립하고, 둘 다 불가하면 통화 가용성이 중요한 용도에서 제외합니다.
• 재부팅 루프 복구에는 ADB 접속이 필요하므로, 대응 대상 단말에서 USB 디버깅과 ADB 접근이 가능한지 미리 확인하고 불가능한 단말은 초기화를 전제로 백업 정책을 점검합니다.
• 긴급통화에 의존하는 업무에는 패치가 적용된 단말만 사용하도록 기준을 정하고, 통화 장애 발생 시의 대체 연락 수단을 함께 지정합니다.
• 일반 사용자가 직접 차단할 수 있는 설정은 없으므로, 개인 차원에서는 단말 보안 업데이트를 지체 없이 적용해야 합니다.
💡 TIP
이 CVE는 Google의 10월 Android 보안 공지에 등재되지 않았습니다.
공지 목록 대조만으로 패치 여부를 판단하지 말고, 단말의 보안 패치 수준 날짜를 기준으로 점검하는 편이 안전합니다.
[참고 자료]
• AOSP 수정 커밋 — Fix remote DoS in decodeWapPdu
• AOSP WapPushOverSms.java 소스 (해당 커밋 기준)
• BleepingComputer — New Android SMS of Death exploit can remotely crash unpatched phones
• heise online — SMS of Death: Security flaw crashes Android phones