Android security tags, read closely by Lightrion

CVE-2025-26440 AI-generated analysis

platform/frameworks/av (libcameraservice, CameraService::BasicClient AppOps handling) and platform/frameworks/base (AppOps, AppOpsUidStateTrackerImpl)

AI-generated: written from the bulletin and the fixing diffs by claude-fable-5-1, then checked against the code by claude-opus-5-5 (6 corrections). Verify against the commit before relying on it.

CameraService now registers its AppOps watcher with WATCH_FOREGROUND_CHANGES and blocks untrusted MODE_IGNORED clients that are not user-visible (proc state above PROCESS_STATE_BOUND_TOP). Before, it decided between mute and block based on whether the uid was "active". AppOpsUidStateTrackerImpl now delays committing a uid-state change that loses a capability instead of committing it immediately.

Root cause

In services/camera/libcameraservice/CameraService.cpp, BasicClient::startCameraOps() called mAppOpsManager->startWatchingMode(OP_CAMERA, pkg, cb) without the WATCH_FOREGROUND_CHANGES flag, so the client was not notified of foreground-related changes such as the app losing its camera capability. BasicClient::opChanged() handled MODE_IGNORED for untrusted uids using mUidPolicy->isUidActive(). It muted only if the uid was active, camera privacy was enabled and mute was supported. It blocked only if the uid was not active, or if camera privacy was enabled and mute was not supported. An active but not visible uid (such as a foreground service) with camera privacy disabled matched neither branch, so the client was neither muted nor blocked. The commit message states that an app that should not have camera access outside the foreground could otherwise keep it.

How the fix works

Completeness

Behavior changes

Per major

Unknowns

Back to May 2025 · Findings