Android security tags, read closely by Lightrion

CVE-2025-48601 AI-generated analysis

platform/frameworks/base, services/core notification (NotificationManagerService, PreferencesHelper)

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.

Stops NotificationManagerService/PreferencesHelper from lazily creating (and letting callers mutate) PackagePreferences for packages that do not exist, by making getOrCreatePackagePreferencesLocked reject Process.INVALID_UID, making pure getters non-creating, and early-exiting channel lookups on an invalid uid.

Root cause

PreferencesHelper.getOrCreatePackagePreferencesLocked(pkg, uid) lazily created and stored a PackagePreferences entry for any pkg/uid pair. It only special-cased its own sentinel UNKNOWN_UID (UserHandle.USER_NULL), while NotificationManagerService used a different sentinel INVALID_UID (-1), which per the commit message is what NMS passes along from getUidForPackageAndUser for a missing package. Per the commit message, most API paths were protected by other checks (e.g. canNotifyAsPackage), but the "fromPrivilegedListener" methods (tests cover getNotificationChannelsFromPrivilegedListener, getNotificationChannelGroupsFromPrivilegedListener, updateNotificationChannelFromPrivilegedListener) had no similar enforcement, so PackagePreferences could be created for a non-existing package. Many read-only getters (canShowBadge, getBubblePreference, isImportanceLocked, ...) also had creation as a side effect, and the RoleObserver passed Pair(pkg, -1) entries to updateDefaultApps when a role holder package was missing.

How the fix works

Completeness

Behavior changes

Per major

Unknowns

Back to December 2025 · Findings