This is a bad valet key, not an unlocked front door
CVE-2026-0023 is an Android PackageInstallerService authorization flaw in createSessionInternal(). Public records tie it to Android 14, 15, 16, and 16-qpr2 before the March 2026 fixes; the bug lets an already-installed app abuse installer session state because a permission/flag check was missing or incomplete, resulting in local elevation of privilege on that one device.
Google's HIGH 7.8 CVSS is technically fair in a lab because the impact on the compromised handset can be serious. In enterprise reality, though, this starts after the attacker already has code running on the device, has no network reachability, has no KEV or exploitation signal, and often runs into Managed Google Play, sideload restrictions, and Play Protect. That's why this drops to MEDIUM for a 10,000-device patch queue.
4 steps from start to impact.
Land code on the handset
- Target is running affected Android 14/15/16 lineage
- Attacker can get an app installed in the personal profile or work profile
- Managed Google Play allowlists and
DISALLOW_INSTALL_UNKNOWN_SOURCEScut off a large chunk of enterprise exposure - Google Play Protect and mobile threat defense products can block or flag the delivery stage
Abuse the installer session API
PackageInstaller.SessionParams values to request installer-controlled behavior. Public Android API docs show update-ownership-related behavior is guarded by ENFORCE_UPDATE_OWNERSHIP, so the exploit path is to smuggle installer state through createSessionInternal() when the service should have stripped it.- App can invoke local package install/session APIs
- Device is unpatched before the March 2026 fix
- There is no public end-to-end PoC showing reliable exploitation across OEM builds
- The exact exploit primitive is muddied by public metadata: the CVE text mentions update ownership, while the linked AOSP bug fix also hardens installer-managed flags
Bypass the missing check in createSessionInternal()
PackageInstallerService fails to fully reject or sanitize certain privileged installer flags during session creation. AOSP's March 2026 fixes explicitly clear privileged install flags and preserve the permission gate around update ownership, closing the trust boundary the app was crossing.- Affected framework build from Android 14/15/16/16-qpr2
- Attack reaches
PackageInstallerServicelocally
- This is framework logic, so behavior can vary with OEM backports and monthly patch cadence
- Exploit reliability is likely branch-specific because AOSP lists different fix commits per release train
Convert installer trust into local privilege gain
- Attacker app remains resident on the device
- Follow-on package operations succeed under the abused installer state
- SELinux, app sandboxing, work-profile isolation, and enterprise install controls limit what the attacker can turn this into
- No confirmed in-the-wild campaign or KEV listing suggests low operational maturity by attackers so far
The supporting signals.
| In-the-wild status | No public exploitation evidence found. Google's March 2026 bulletin only calls out a different CVE (CVE-2026-21385) as seeing limited targeted exploitation, not this one. |
|---|---|
| PoC availability | No public weaponized PoC located in open web/GitHub search results. The public AOSP fix diff exists, which lowers reverse-engineering cost, but that's not the same as a turnkey exploit. |
| EPSS | 0.00003 from the user-supplied intel; secondary enrichment sources place it around the bottom tenth percentile. Translation: exploit interest is currently negligible. |
| KEV status | Not in CISA KEV as checked on 2026-05-30 against the KEV catalog. |
| CVSS vector | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H — the important part is AV:L + PR:L. An attacker already needs code execution on the device. |
| Affected versions | Android bulletin and OSV map this to Android 14, 15, 16, and 16-qpr2 / corresponding platform/frameworks/base branches before the March 2026 fix train. |
| Fixed versions | Google says security patch level 2026-03-05 or later addresses all issues in the March 2026 bulletin. OSV also lists branch-specific frameworks/base fixes for 14/15/16/16-qpr2. |
| Scanning / exposure data | No meaningful Shodan/Censys/FOFA angle. This is a local framework flaw inside package installation logic, so internet census tools won't show exposure. Reachable population is driven by *installed-app execution*, not open ports. |
| Disclosure timeline | Disclosed 2026-03-02 in the Android Security Bulletin; public AOSP commit metadata shows the fix was authored in late 2025-11 and merged into release branches ahead of bulletin publication. |
| Reporting / patch ownership | No public researcher credit is listed in the bulletin. The linked AOSP change is authored by Sanjana Sunil for bug A-459461121. |
noisgate verdict.
The decisive factor is attacker position: this bug is only useful after an attacker already has an app running on the device. That sharply narrows reachable population and turns a scary handset impact into a lower-priority enterprise patching event unless your mobile fleet tolerates sideloading or untrusted app distribution.
Why this verdict
- Starts post-compromise:
AV:LandPR:Lmean the attacker already has an installed app executing on the handset before this CVE matters. - Exposure population is narrow: enterprise Android fleets using Managed Google Play, app allowlists, and unknown-source restrictions materially reduce the number of devices where step 1 is realistic.
- No active exploitation signal: no KEV, no public campaign attribution, and an extremely low EPSS keep downward pressure on urgency.
Why not higher?
This is not remotely reachable, not wormable, and not an edge-service bug that can be sprayed across your estate. Even if the per-device impact is severe, the prerequisite of local code execution means the attacker is already through your first line of defense.
Why not lower?
Once a malicious app is on an affected device, exploitation appears low-complexity and silent. For organizations with Android BYOD, permissive sideloading, or weak mobile app governance, this can still convert a modest foothold into a stronger one on the same handset.
What to do — in priority order.
- Block unknown app sources — Use Android Enterprise controls such as
DISALLOW_INSTALL_UNKNOWN_SOURCESand Google Play managed configuration to keep installs inside Managed Google Play. For a MEDIUM verdict there is no noisgate mitigation SLA, so do this in the next mobile policy cycle rather than as an emergency change. - Enforce app allowlisting — Restrict work-profile and fully managed devices to approved app catalogs only. This directly attacks the hardest prerequisite in the chain: getting attacker code onto the handset in the first place.
- Watch for package-installer abuse — Turn on whatever MTD/UEM telemetry you have for suspicious installs, silent update attempts, or unexpected installer/package-owner changes. This won't prevent the bug, but it improves visibility on the only practical exploitation path.
- Prioritize risky mobile cohorts — Focus first on BYOD, COPE, contractor, kiosk, and field devices that routinely receive third-party APKs or looser app controls. That's where the local-app prerequisite is most credible.
- Perimeter firewalls or WAFs do nothing here; there is no network-facing service to shield.
- Routine external vulnerability scanning does nothing here; exposure is determined by handset patch level and app governance, not open ports.
- Desktop EDR assumptions don't translate cleanly; if you don't have mobile telemetry, this bug can stay invisible after app installation.
Crowdsourced verification payload.
Run this on an auditor workstation with adb installed and USB debugging or enterprise debugging access to the target Android device. Invoke it as ./check-cve-2026-0023.sh <serial> or omit the serial if only one device is attached; no root is required, but you need adb shell access.
#!/usr/bin/env bash
# check-cve-2026-0023.sh
# Purpose: Determine likely exposure to CVE-2026-0023 using Android version + security patch level.
# Logic:
# - Affected major versions: Android 14, 15, 16 / API 34, 35, 36
# - Patched if security patch level >= 2026-03-05
# Output: VULNERABLE / PATCHED / UNKNOWN
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -u
SERIAL_ARG="${1:-}"
ADB=(adb)
if [[ -n "$SERIAL_ARG" ]]; then
ADB+=( -s "$SERIAL_ARG" )
fi
need_cmd() {
command -v "$1" >/dev/null 2>&1
}
if ! need_cmd adb; then
echo "UNKNOWN: adb not found in PATH"
exit 2
fi
if ! "${ADB[@]}" get-state >/dev/null 2>&1; then
echo "UNKNOWN: no reachable adb device"
exit 2
fi
getprop_safe() {
local key="$1"
"${ADB[@]}" shell getprop "$key" 2>/dev/null | tr -d '\r'
}
SDK="$(getprop_safe ro.build.version.sdk)"
RELEASE="$(getprop_safe ro.build.version.release)"
PATCH="$(getprop_safe ro.build.version.security_patch)"
FINGERPRINT="$(getprop_safe ro.build.fingerprint)"
MODEL="$(getprop_safe ro.product.model)"
if [[ -z "$SDK" || -z "$PATCH" ]]; then
echo "UNKNOWN: unable to read required properties"
echo "model=${MODEL:-unknown} release=${RELEASE:-unknown} sdk=${SDK:-unknown} patch=${PATCH:-unknown}"
exit 2
fi
# Normalize patch string to YYYY-MM-DD and compare lexicographically.
PATCH_CUTOFF="2026-03-05"
echo "model=${MODEL:-unknown}"
echo "release=${RELEASE:-unknown}"
echo "sdk=${SDK:-unknown}"
echo "patch=${PATCH:-unknown}"
echo "fingerprint=${FINGERPRINT:-unknown}"
case "$SDK" in
34|35|36)
if [[ "$PATCH" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
if [[ "$PATCH" < "$PATCH_CUTOFF" ]]; then
echo "VULNERABLE"
exit 1
else
echo "PATCHED"
exit 0
fi
else
echo "UNKNOWN: unexpected patch format"
exit 2
fi
;;
''|*[!0-9]*)
echo "UNKNOWN: unexpected SDK value"
exit 2
;;
*)
# Outside the affected Android major versions cited by bulletin/OSV.
echo "PATCHED"
exit 0
;;
esac
If you remember one thing.
Sources
- Android Security Bulletin — March 2026
- AOSP fix commit for bug A-459461121
- OSV advisory for ASB-A-459461121 / CVE-2026-0023
- NVD entry for CVE-2026-0023
- Android PackageInstaller API docs showing `ENFORCE_UPDATE_OWNERSHIP` requirement
- Android Enterprise security controls for blocking unknown sources
- CISA Known Exploited Vulnerabilities Catalog
- Secondary enrichment with EPSS percentile and affected-version summary
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.