Android ActivityManagerService dumpBitmapsProto() Missing Permission Check (CVE-2026-0047)
by Mobile Hacking Lab (independent patch analysis / reproduction); original discovery and responsible disclosure credited to the reporting researchers per the repo's own attribution · 2026-07-05
- Severity
- Critical
- CVE
- CVE-2026-0047
- Category
- binary
- Affected product
- Android system_server ActivityManagerService.dumpBitmapsProto()
- Affected versions
- Android 16 QPR2 Beta 1–3 ("Baklava"), security patch level before 2026-03-01
- Disclosed
- 2026-07-05
- Patch status
- unpatched
Tags
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-05 |
| Last Updated | 2026-05 |
| Author / Researcher | Mobile Hacking Lab (independent patch analysis / reproduction); original discovery and responsible disclosure credited to the reporting researchers per the repo’s own attribution |
| CVE / Advisory | CVE-2026-0047 |
| Category | binary |
| Severity | Critical |
| CVSS Score | 8.4 (as stated in source repository) |
| Status | Weaponized |
| Tags | android, activitymanagerservice, binder, missing-permission-check, information-disclosure, zero-permission, baklava, bitmap-theft |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | Android system_server ActivityManagerService.dumpBitmapsProto() |
| Versions Affected | Android 16 QPR2 Beta 1–3 (“Baklava”), security patch level before 2026-03-01 |
| Language / Platform | Java / Android Binder IPC; PoC packaged as Android Studio (Gradle) apps |
| Authentication Required | No |
| Network Access Required | No |
Summary
ActivityManagerService.dumpBitmapsProto() is missing an enforceCallingOrSelfPermission(DUMP) check that should gate access to a system-wide UI bitmap dump used for debugging. Because the method body executes fully before any permission is verified, any installed app — even one declaring zero permissions — can invoke the underlying Binder transaction (code #117 on the activity service) directly via IBinder.transact() and receive a protobuf stream of PNG-encoded UI bitmaps captured from every running process on the device. The repository ships both an “audit tool” style PoC app that demonstrates the raw Binder call and bitmap extraction, and a disguised “Flashlight Pro” attacker app that performs the same exfiltration silently on launch while declaring no permissions at all, plus a one-shot shell script that automates emulator setup, build, and exploitation end-to-end.
Vulnerability Details
Root Cause
dumpBitmapsProto() in ActivityManagerService omits the enforceCallingOrSelfPermission(android.permission.DUMP) guard that equivalent debug-dump methods enforce, so any caller — regardless of granted permissions — reaches the bitmap-collection logic (CWE-280: Improper Handling of Insufficient Permissions).
Attack Vector
- Attacker probes Binder transaction code
#117on theactivityservice with an empty Parcel; aNullPointerException(rather than aSecurityException) confirms the method body executes without a permission check. - Attacker crafts a full Parcel — interface token
android.app.IActivityManager, a non-null marker plus aParcelFileDescriptorwrite-end, an empty process-name array (meaning “all processes”),userId = -2(USER_CURRENT),dumpAll = true, andformat = "png"— and sends it viaIBinder.transact(), bypassing hidden-API restrictions entirely since no framework API is used. ActivityManagerServicewrites protobuf-encoded data containing PNG bitmaps from every running app’s UI to the supplied pipe.- Attacker’s app reads the pipe, scans for PNG magic bytes (
89 50 4E 47) andIENDtrailers, and reassembles individual images captured from other apps’ current UI state. - In the disguised-app variant, this entire flow runs automatically and silently at app launch with zero declared permissions.
Impact
A zero-permission app can passively steal rendered UI screenshots (potentially containing PII, credentials, banking data, messages, etc.) from every other running app on the device without any user interaction or granted permission.
Environment / Lab Setup
Target: Android 16 QPR2 Beta ("Baklava") emulator/device, security patch level before 2026-03-01
Attacker: Android Studio / Gradle, adb, Android SDK (system-images;android-Baklava;google_apis;arm64-v8a)
Proof of Concept
PoC Script
See
exploit.sh,app/(PoC audit-tool app), andattacker/(disguised “Flashlight Pro” app) in this folder.
| |
exploit.sh builds and installs the PoC app(s), triggers the raw Binder call against dumpBitmapsProto(), and extracts the resulting PNG bitmaps from the returned protobuf stream. Pre-built APKs (apk/cve-2026-0047-poc.apk and apk/flashlight-pro-attacker.apk) are also included for installing and running the PoC directly with adb install/adb shell am start without building from source.
Detection & Indicators of Compromise
Signs of compromise:
- Newly installed apps with no camera/screen-capture permissions producing screenshot-like image files
- Apps invoking low-level Binder transactions against
ActivityManagerServiceoutside normal framework API usage - Anomalous
system_serveractivity correlated with third-party app launches on unpatched Baklava builds
Remediation
| Action | Detail |
|---|---|
| Primary fix | Apply the Android March 2026 Security Bulletin update, which adds enforceCallingOrSelfPermission(DUMP) as the first line of dumpBitmapsProto() |
| Interim mitigation | Avoid running Android 16 QPR2 Beta builds with a pre-2026-03-01 patch level on devices handling sensitive data; restrict sideloading of untrusted apps until patched |
References
Notes
Mirrored from https://github.com/mobilehackinglab/CVE-2026-0047-poc on 2026-07-05.
| |