Android security tags, read closely by Lightrion

CVE-2025-48549 AI-generated analysis

platform/frameworks/av (audiopolicy service, AudioRecordClient / OpRecordAudioMonitor); platform/frameworks/base (PermissionManagerService app-op attribution chain handling; SystemUI AppOpsControllerImpl mic indicator)

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 (9 corrections). Verify against the commit before relying on it.

Four coordinated changes make microphone app-op enforcement and the mic indicator consistent across a full attribution chain: audioserver's OpRecordAudioMonitor now checks and watches every link of the chain (and always OP_RECORD_AUDIO); PermissionManagerService finishes already-started proxy ops when a later link fails and aligns the preflight check with the data-delivery path; and SystemUI only suppresses the mic indicator when all of a UID's recordings are silenced.

Root cause

In services/audiopolicy/service/AudioRecordClient.cpp, OpRecordAudioMonitor::onFirstRef registered an AppOps watch only for mAttributionSource.packageName (the top of the chain) and only for mAppOp. OpRecordAudioMonitor::checkOp called mAppOpsManager.checkOp only for mAttributionSource.uid/packageName. Links further down the AttributionSourceState.next chain were neither checked nor watched, and OP_RECORD_AUDIO was not checked when mAppOp was a different op (TODOs in the code noted this). In PermissionManagerService.checkRuntimePermission, if a later link of a chain failed during startDataDelivery, proxy ops already started higher in the chain were left running, which split the op state. In SystemUI AppOpsControllerImpl, isAnyRecordingPausedLocked disabled the mic indicator for a UID as soon as any one of its AudioRecordingConfigurations was silenced, even if another recording for the same UID was not.

How the fix works

Completeness

Behavior changes

Per major

Unknowns

Back to September 2025 · Findings