
CVE-2026-0013 Android EoP PoC - 보안 연구를 위한 컴파일된 아티팩트 (inforcqb/cve-2026-0013-exploit의 파생물)
Android DocumentsUI Confused Deputy 취약점 - 보안 연구 검증 프로젝트
본 저장소는 파생 컴파일 저장소로, 원본 메인 저장소와 종속 관계를 구성합니다.
| 역할 | 저장소 | 설명 |
|---|---|---|
| 메인 저장소 | inforcqb/cve-2026-0013-exploit | 원본 취약점 연구 |
| 본 저장소 | XiaoBaiLovesStirring/cve-2026-0013-poc | 클라우드 컴파일 산출물 배포 |
본 저장소에 접근하기 전에 반드시 SECURITY_PROTOCOL.md를 읽고 이해하십시오.
주요 사항:
GitHub Pages: https://XiaoBaiLovesStirring.github.io/cve-2026-0013-poc/
컴파일 트리거: https://github.com/XiaoBaiLovesStirring/cve-2026-0013-poc/actions
산출물 받기: git clone --branch artifacts https://github.com/XiaoBaiLovesStirring/cve-2026-0013-poc.git
변경: DocumentsUI가 대신 실행하는 targetIntent를 새로 추가된 자체 컴포넌트 IdTestActivity로 지정합니다. 이 컴포넌트는 id를 실행하고 실행 주체와 결과를 logcat, 알림 바에 기록하여 두 가지 핵심 사실을 실측하는 데 사용됩니다:
Intent.EXTRA_INTENT를 소비하고 대상 컴포넌트를 대신 실행하는지 여부메커니즘 설명(중요): Android 격리 모델에 따르면, 타사 앱의 모든 컴포넌트는 누가 실행하든 자체적으로 선언한 프로세스/UID 내에서만 실행됩니다. DocumentsUI가 대신 실행한다고 해도 IdTestActivity는 여전히 com.example.cve20260013exploit 자체의 UID(예: u0_a702/10702)로 실행되며, DocumentsUI의 uid=10054로 자동 변경되지 않습니다. 전체 APK가 10054를 얻으려면 sharedUserId="android.uid.documentsui"(system 서명 필요, 타사는 획득 불가) 또는 root 환경이 필요합니다. v1.0.4의 가치는 EXTRA_INTENT가 소비되는지 여부와 대신 실행된 실제 주체를 검증하는 데 있습니다.
문제: OPPO/ColorOS에서 DocumentsUI의 PickActivity는 호출자가 전달한 Intent.EXTRA_INTENT를 더 이상 소비하지 않습니다. 실측에서 mCallingUid는 여전히 호출자 u0_a702이며, PickActivity는 자체 선택 화면만 렌더링한 후 중지됩니다. DocumentsUI 신분(uid=10054)으로 대신 실행되는 대상 동작이 전혀 없어, 기존 Confused Deputy 체인은 사실상 끊어졌습니다.
수정(트리거 체인 재설계):
ACTION_OPEN_DOCUMENT / ACTION_GET_CONTENT + CATEGORY_OPENABLE + */*)에서 DocumentsUI를 해석하도록 변경picker.PickActivity와 네이티브 엔트리 PickActivity에 대한 명시적 지정 폴백을 유지하여, 엔트리를 찾지 못해 크래시되는 것을 방지content:// 임시 권한 URI를 통해 권한 호스트 신원을 역추적(probeUriGrant)하여, 권한 부여자 관점에서 Confused Deputy 성립 여부를 검증메커니즘 설명: 앱 자체가 DocumentsUI 프로세스로 하여금 임의 명령을 대신 실행하게 할 수는 없습니다. Confused Deputy의 '권한 상승'은 DocumentsUI가 자신의 uid로만 획득할 수 있는 권한 리소스를 대신 보유/전달하게 하는 데 있습니다. 따라서 v1.0.3은 앱 자체 프로세스에서 id를 실행하는 대신 '누가 DocumentsUI가 부여한 URI 권한을 획득했는지'를 검증하도록 변경되었습니다.
컴파일 수정 기록: 첫 빌드가 실패했습니다. getPackageManager().resolveActivity()의 반환 타입이 ComponentName이 아닌 ResolveInfo여서 error: incompatible types: ResolveInfo cannot be converted to ComponentName 오류가 발생했습니다. ResolveInfo.activityInfo에서 packageName/name을 추출하여 ComponentName을 구성하는 방식으로 수정한 후 통과했습니다.
변경: 개념 증명 동작을 'Termux 실행'에서 'Confused Deputy 체인 트리거 후 id 명령을 실행하고 결과를 시스템 알림 바에 표시'로 변경했습니다.
id 명령 실행(sh -c id, id, /system/bin/id, /system/xbin/id 등 여러 경로 시도)uid/gid/groups 등 실행 결과를 알림 바에 표시picker.PickActivity → 네이티브 .PickActivity)POST_NOTIFICATIONS 권한 추가문제: 다수 제조사(예: OPPO)가 DocumentsUI의 클래스 경로를 개조하여 네이티브 엔트리 com.android.documentsui.PickActivity이(가) com.android.documentsui.picker.PickActivity(으)로 이동되었습니다. 이로 인해 구버전 컴파일 산출물이 대상 기기에서 취약점 악용 엔트리를 찾지 못했습니다.
수정:
com.android.documentsui.picker.PickActivity(으)로 업데이트.PickActivity(으)로 폴백컴파일 실패 문제 해결 가이드(중요):
dumpsys package com.android.documentsui 또는 Activity Resolver Table을 통해 제조사가 개조한 실제 엔트리 클래스명을 직접 확인한 후, ExploitActivity.java의 setClassName 매개변수를 수정하고 푸시하여 재컴파일을 트리거하십시오CVE-2026-0013 | HIGH (CVSS 8.4) | CWE-441 | Android 14-16 | DocumentsUI PickActivity
수정 공지: Android Security Bulletin 2026-03-01