
Probes CVE-2026-0075 Android ContactsProvider side channel with a no-permission PoC, enabling root-cause analysis and patched-vs-vulnerable comparison.
A controlled-lab Android research prototype for evaluating the observable behavior associated with CVE-2026-0075 in ContactsProvider2.
CVE-2026-0075 is an Android local elevation-of-privilege issue in ContactsProvider2. The public advisory describes a possible path to contacts-database access through SQL injection, without user interaction. Android lists the issue as High and identifies Android 14, 15, 16, and 16-qpr2 as affected AOSP versions. Devices with the 2026-06-05 security patch level or later address the June 2026 bulletin issues.
The included app is a standalone Java/Android PoC that intentionally declares neither READ_CONTACTS nor WRITE_CONTACTS. It is intended to help authorized researchers compare permission-boundary behavior and exception handling on controlled builds.
This repository is for authorized security research only.
The project does not claim a universal exploitation path. It records a controlled observation that must be validated against the target build, its patch level, and its ContactsProvider implementation.
.
├── no-permission-probe/ Standalone Android application and PowerShell helpers
│ ├── build.ps1 Compiles, packages, aligns, and signs a debug APK
│ ├── run-poc.ps1 Installs the APK and starts the controlled probe
│ ├── AndroidManifest.xml No READ_CONTACTS or WRITE_CONTACTS declaration
│ ├── res/ Android resources
│ └── src/ Application source
├── CONTRIBUTING.md Contribution and research-data requirements
├── SECURITY.md Vulnerability reporting guidance
└── .gitignore Local build and IDE exclusions
The public AOSP fix, bb9f36b3ff6d42136afb61d527e1e8f67242fe32, is titled Fix side channel attacks in CP2. It changes ContactsProvider2 to strip JSON-related SQLiteException messages for callers without READ_CONTACTS, and brings cursor materialization into the exception-handling path. This PoC is designed for controlled before/after behavioral comparison; it does not substitute for patch validation.
javac, jar, and keytool available on PATHandroid-3536.0.0adb)Set ANDROID_HOME to the SDK root before building. ANDROID_SDK_ROOT may also be used by your local tooling, but the provided scripts read ANDROID_HOME.
$env:ANDROID_HOME = 'C:\Android\Sdk'
From the repository root:
Set-Location .\no-permission-probe
.\build.ps1
The signed debug APK is written to no-permission-probe\build\probe.apk. The build directory is excluded from version control.
Start an authorized emulator or test device containing only synthetic contacts.
Confirm the device and patch level:
adb devices
adb shell getprop ro.build.version.security_patch
Build the app, then run:
Set-Location .\no-permission-probe
.\run-poc.ps1
Review only the application UI and the scoped log tag:
adb logcat -s CVE20260075Probe:I
The run helper selects an exact data/<id> URI from the connected test device and launches the activity with a read grant. Do not use it where that behavior is not explicitly authorized.
For a defensible result, capture the following with every run:
Compare a known vulnerable lab image with an image that contains the June 2026 fix. The expected remediation signal is that qualifying JSON-related SQLite errors returned to callers lacking READ_CONTACTS are replaced with a generic message; this does not by itself establish the absence of every observable oracle.
This CVE was publicly disclosed and addressed in the June 2026 Android Security Bulletin. For current Android product vulnerabilities, report directly through the Android Security process. See SECURITY.md for repository-specific guidance.
bb9f36b3ff6d42136afb61d527e1e8f67242fe32Licensed under the Apache License 2.0.