This is a side door inside the apartment, not a hole in the building’s front wall
CVE-2026-0047 is a missing permission check in dumpBitmapsProto inside Android's ActivityManagerService. In plain English: a locally running app may be able to ask the framework for bitmap-related data it should not get, leading to access to private information without prompting the user. Public records reviewed tie the affected population to Android 16-qpr2, with NVD enrichment specifically listing qpr2_beta_1 through qpr2_beta_3 CPEs and CVE.org listing the affected version as 16-qpr2.
Google's bulletin labels the issue Critical in the Framework section, and the CVSS vector in NVD/CISA-ADP is 8.4 / High, but both overstate enterprise urgency for most fleets. This is local-only, requires the attacker to already land a malicious app on the handset, appears limited to a narrow Android branch, has no KEV listing, and carries a near-floor EPSS. For a 10,000-device program, that is a containment problem on a subset of endpoints, not a fleet-wide emergency.
3 steps from start to impact.
Get code onto the handset
- Target device is actually on an affected
Android 16-qpr2build - Attacker can place or convince installation of an app on the device
- Enterprise policy does not fully block unapproved app installs
- Managed Google Play allowlisting blocks most random third-party installs on well-run fleets
- Google Play Protect and mobile threat defense can flag commodity droppers
- Corporate-owned work-profile deployments often prevent user-driven sideloading
Call the unguarded framework path
dumpBitmapsProto through framework/Binder plumbing. The core defect is the missing permission check, so the app does not need to hold an expected privileged permission before making the request. *Weaponized tool:* app code using Android framework/Binder calls to reach the dump path.- Vulnerable framework code is present
- The relevant Binder/service path is reachable from an unprivileged app context
- No OEM backport has already fixed the check
- Public patch details are sparse, which slows reliable weaponization
- OEM modifications may alter reachability or behavior
- The bug is version-specific rather than broad across Android generations
Harvest bitmap-derived private data
- Returned data is valuable enough to operationalize
- App has outbound network access or another exfil path
- User or policy does not immediately remove the app
- Impact appears centered on privacy exposure rather than a dependable path to durable system compromise
- Per-device value is uneven across enterprise users
- Outbound exfil can be constrained by VPN/per-app networking/MTD controls
The supporting signals.
| In-the-wild status | No public evidence of active exploitation found in sources reviewed, and not present in CISA KEV as checked against the KEV catalog source. |
|---|---|
| PoC availability | No credible public exploit or GitHub PoC surfaced in source review. That does not mean unexploitable; it means weaponization evidence is currently weak. |
| EPSS | User-supplied EPSS is 0.00003 (~0.003%), which is floor-level threat probability. Third-party views reviewed classify it as very low / <1% band. |
| KEV status | No KEV listing found. No CISA due date applies because it is not cataloged as known exploited. |
| CVSS vector reality check | CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H says local, no-privs, no-user-interaction. The local attacker position is the big real-world brake: an attacker still needs an app running on the phone first. |
| Affected versions | CVE.org lists the affected version as 16-qpr2. NVD enrichment further narrows this to qpr2_beta_1, qpr2_beta_2, and qpr2_beta_3 CPEs. |
| Fixed versions | Android's March 2026 bulletin states that security patch levels of 2026-03-05 or later address all issues in the bulletin; for Google Pixel devices, the Pixel bulletin says 2026-03-05 or later remediates March 2026 Android bulletin issues. |
| Exposure model | This is not internet-addressable. Shodan/Censys/FOFA-style exposure counting is basically irrelevant; exposure is driven by device count, app-install posture, and whether you run the affected Android branch. |
| Disclosure timeline | Published 2026-03-02 in CVE/NVD records; Android bulletin published 2026-03-02 and later updated 2026-04-17. |
| Researcher / reporting | No public external researcher credit was visible in the Android bulletin or CVE record reviewed. |
noisgate verdict.
The decisive factor is attacker position: this bug is only useful after an attacker gets an app onto the device, which makes it a post-delivery endpoint issue rather than an initial-access fleet emergency. The second major brake is population size—the affected scope points to Android 16-qpr2, not the full Android estate.
Why this verdict
- Down from vendor baseline: local-only means post-delivery.
AV:LwithPR:Nstill requires attacker code running on the handset, which in enterprise reality means you already lost app-control on that endpoint. - Down again: affected population looks narrow. CVE.org says
16-qpr2, and NVD enrichment points specifically toqpr2_beta_1/2/3, which is a much smaller slice than 'Android' writ large. - Down again: blast radius is one device at a time. There is no network reachability, no wormability, and no obvious tenant- or fleet-wide pivot from the flaw alone.
- Down again: threat telemetry is cold. No KEV, no public exploitation evidence, and an EPSS near zero all argue against emergency handling.
- Still not LOW: the bypass is real and permissionless once the app is present. An unprivileged app should not be able to reach private framework dump output, and no user click is needed after installation.
Why not higher?
This does not give unauthenticated remote access, and it does not help an attacker get onto the phone in the first place. The need for a malicious app plus the likely narrow 16-qpr2 exposure slice compounds the friction enough that an enterprise should not treat this like a critical patch-now event.
Why not lower?
I am not putting this in LOW because the vulnerable boundary is a framework permission check, and exploitation from an installed app appears to require no extra privileges and no user interaction. If you do have affected devices and looser app-governance, the bug can still expose sensitive on-device data in a way defenders should not ignore.
What to do — in priority order.
- Enforce app allowlisting — Require managed Google Play or equivalent allowlisting so unknown APKs cannot land on affected devices. This directly cuts off the exploit's biggest prerequisite; for a MEDIUM verdict there is no noisgate mitigation SLA, so use this as an operational hardening step while you work the normal remediation window.
- Block sideloading on managed devices — Disable or tightly restrict user sideloading, ADB installs, and externally hosted private APK distribution where business-possible. That shrinks the realistic exploit population because the bug is only reachable after app placement; again, no noisgate mitigation SLA applies for MEDIUM.
- Hunt for Android 16-qpr2 devices — Query UEM/MDM inventory for build fingerprints, OS release, and security patch level to identify whether you even own the affected branch. This is the fastest way to turn a noisy Android CVE into a scoped device list instead of a fleet-wide scramble.
- Turn on mobile threat telemetry — Use Play Protect, MTD, and UEM app-install telemetry to flag unapproved apps and suspicious outbound behavior from newly installed packages. These controls do not fix the bug, but they materially raise friction for the malicious-app prerequisite during the 365-day remediation window.
- Perimeter network scanning does nothing here; the flaw is on-device and not internet-exposed.
- Traditional server-side WAF/IPS controls are irrelevant because there is no inbound network exploit path to block.
- Relying on permission prompts is not sufficient; the core issue is a missing permission check in framework code.
Crowdsourced verification payload.
Run this on an auditor workstation with adb installed and USB/network debugging access to the target Android device. Invoke it as ./check-cve-2026-0047.sh <device-serial> or without an argument if only one device is attached; it needs no root, only normal adb shell getprop access.
#!/usr/bin/env bash
# check-cve-2026-0047.sh
# Purpose: Heuristically assess exposure to CVE-2026-0047 on an Android device via adb.
# Output: VULNERABLE / PATCHED / UNKNOWN
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN, 3=USAGE/ADB ERROR
set -euo pipefail
SERIAL="${1:-}"
ADB=(adb)
if [[ -n "$SERIAL" ]]; then
ADB+=( -s "$SERIAL" )
fi
need_cmd() {
command -v "$1" >/dev/null 2>&1 || {
echo "UNKNOWN - required command '$1' not found"
exit 3
}
}
getprop_safe() {
local key="$1"
"${ADB[@]}" shell getprop "$key" 2>/dev/null | tr -d '\r'
}
need_cmd adb
if ! "${ADB[@]}" get-state >/dev/null 2>&1; then
echo "UNKNOWN - adb device not reachable"
exit 3
fi
release="$(getprop_safe ro.build.version.release)"
security_patch="$(getprop_safe ro.build.version.security_patch)"
fingerprint="$(getprop_safe ro.build.fingerprint)"
incremental="$(getprop_safe ro.build.version.incremental)"
product="$(getprop_safe ro.product.device)"
model="$(getprop_safe ro.product.model)"
# Normalize a little
release_lc="$(printf '%s' "$release" | tr '[:upper:]' '[:lower:]')"
fingerprint_lc="$(printf '%s' "$fingerprint" | tr '[:upper:]' '[:lower:]')"
incremental_lc="$(printf '%s' "$incremental" | tr '[:upper:]' '[:lower:]')"
# Helper: compare ISO dates lexicographically (works for YYYY-MM-DD)
is_ge_date() {
local a="$1"
local b="$2"
[[ "$a" > "$b" || "$a" == "$b" ]]
}
# Determine whether device appears to be on the affected Android 16-qpr2 branch.
is_android16=0
if [[ "$release_lc" == "16" || "$release_lc" == "android 16" ]]; then
is_android16=1
fi
is_qpr2_hint=0
if [[ "$fingerprint_lc" == *"qpr2"* || "$incremental_lc" == *"qpr2"* || "$fingerprint_lc" == *"beta"* ]]; then
is_qpr2_hint=1
fi
# Decision logic:
# - If SPL is 2026-03-01 or later, Android bulletin says framework issues are addressed.
# - Pixel bulletin says 2026-03-05 or later covers all March 2026 Android bulletin issues on Google devices.
# - Because public metadata narrows exposure to Android 16-qpr2, anything outside that branch is UNKNOWN/PATCHED depending on confidence.
if [[ -z "$security_patch" ]]; then
echo "UNKNOWN - could not read security patch level (device: $model / $product)"
exit 2
fi
if is_ge_date "$security_patch" "2026-03-05"; then
echo "PATCHED - security patch level $security_patch is at or above 2026-03-05 (device: $model / $product)"
exit 0
fi
if [[ $is_android16 -eq 1 && $is_qpr2_hint -eq 1 ]]; then
if is_ge_date "$security_patch" "2026-03-01"; then
echo "PATCHED - Android 16 qpr2-like build with security patch $security_patch, which is at or above 2026-03-01"
exit 0
else
echo "VULNERABLE - Android 16 qpr2-like build with security patch $security_patch below 2026-03-01"
exit 1
fi
fi
if [[ $is_android16 -eq 1 && $is_qpr2_hint -eq 0 ]]; then
echo "UNKNOWN - Android 16 detected but qpr2 branch not confirmed; fingerprint='$fingerprint' patch='$security_patch'"
exit 2
fi
echo "UNKNOWN - device does not clearly match public affected-version data (release='$release', patch='$security_patch', fingerprint='$fingerprint')"
exit 2
If you remember one thing.
16-qpr2 or March 2026-unpatched Pixels; if not, document and move on. If you do, tighten app-install governance immediately on that subset and validate Play Protect/MTD visibility, but because this is a MEDIUM reassessment there is no noisgate mitigation SLA — go straight to the 365-day remediation window. Under the noisgate remediation SLA, get affected devices onto a March 2026-fixed build within 365 days; if your environment permits sideloading or you have high-risk user groups, front-load those devices first even though there is no formal mitigation SLA.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.