December 2025: the bulletin, and what actually shipped
The bulletin lists CVEs. The public security tags carry the code. This page joins the two for Android 14 to 17: which CVEs have a public fix in each major's tags, which do not, and what the tags fix that no bulletin mentions.
At a glance
| Major | CVEs for it | Fixed | Probable | No public code | Security tags this month |
|---|---|---|---|---|---|
| Android 14 | 37 | 36 | 1 | 0 | android-security-14.0.0_r24 |
| Android 15 | 38 | 37 | 1 | 0 | android-security-15.0.0_r12 |
| Android 16 | 37 | 37 | 0 | 0 | android-security-16.0.0_r3 |
| Android 17 (pre-release, 17-next) | 0 | 0 | 0 | 0 | none |
The bulletin also has 56 vendor and kernel rows (closed-source components, kernel LTS) with no AOSP code to check; they are not counted above.
What this month's security tags add
Each security tag published this month, and the CVEs whose public fix first appears in it. CVEs resolved by an earlier tag are not repeated here; they are in the table above and on each CVE page.
android-security-14.0.0_r24 adds the fix for 33 CVEs: CVE-2025-32328, CVE-2025-32329, CVE-2025-48536, CVE-2025-48555, CVE-2025-48572, CVE-2025-48573, CVE-2025-48575, CVE-2025-48576, CVE-2025-48580, CVE-2025-48583, CVE-2025-48588, CVE-2025-48589, CVE-2025-48590, CVE-2025-48591, CVE-2025-48594, CVE-2025-48596, CVE-2025-48597, CVE-2025-48599, CVE-2025-48601, CVE-2025-48603, CVE-2025-48604, CVE-2025-48614, CVE-2025-48618, CVE-2025-48620, CVE-2025-48621, CVE-2025-48622, CVE-2025-48626, CVE-2025-48627, CVE-2025-48628, CVE-2025-48629, CVE-2025-48632, CVE-2025-48633, CVE-2025-48639.
android-security-15.0.0_r12 adds the fix for 36 CVEs: CVE-2023-40130, CVE-2025-22420, CVE-2025-32328, CVE-2025-32329, CVE-2025-48536, CVE-2025-48555, CVE-2025-48572, CVE-2025-48573, CVE-2025-48575, CVE-2025-48576, CVE-2025-48580, CVE-2025-48583, CVE-2025-48586, CVE-2025-48588, CVE-2025-48589, CVE-2025-48590, CVE-2025-48591, CVE-2025-48592, CVE-2025-48594, CVE-2025-48596, CVE-2025-48597, CVE-2025-48601, CVE-2025-48603, CVE-2025-48604, CVE-2025-48607, CVE-2025-48614, CVE-2025-48618, CVE-2025-48620, CVE-2025-48621, CVE-2025-48622, CVE-2025-48626, CVE-2025-48628, CVE-2025-48629, CVE-2025-48632, CVE-2025-48633, CVE-2025-48639.
android-security-16.0.0_r3 adds the fix for 37 CVEs: CVE-2023-40130, CVE-2025-22420, CVE-2025-22432, CVE-2025-32319, CVE-2025-48525, CVE-2025-48536, CVE-2025-48555, CVE-2025-48572, CVE-2025-48573, CVE-2025-48575, CVE-2025-48576, CVE-2025-48580, CVE-2025-48583, CVE-2025-48584, CVE-2025-48586, CVE-2025-48589, CVE-2025-48590, CVE-2025-48592, CVE-2025-48594, CVE-2025-48596, CVE-2025-48597, CVE-2025-48598, CVE-2025-48601, CVE-2025-48603, CVE-2025-48604, CVE-2025-48607, CVE-2025-48614, CVE-2025-48618, CVE-2025-48620, CVE-2025-48621, CVE-2025-48622, CVE-2025-48626, CVE-2025-48628, CVE-2025-48629, CVE-2025-48632, CVE-2025-48633, CVE-2025-48639.
Announced, with no public code
None this month.
Public before it was announced
The fixing commit was in a public security tag before the bulletin announced the CVE.
| CVE | Majors (tag where the fix is complete) | Public since | Days early |
|---|---|---|---|
| CVE-2023-40130 | 14 (r2) | 2023-11-06 | 756 |
| CVE-2025-22432 | 14 (r19), 15 (r7) | 2025-04-07 | 238 |
| CVE-2025-22420 | 14 (r22) | 2025-09-02 | 90 |
| CVE-2025-48525 | 14 (r22), 15 (r10) | 2025-09-02 | 90 |
Fixed, by a probable match
These fixes carry a different trace from the bulletin's commit (another bug id, no Bug line, a merge), and were matched by content. Similarity is the share of the reference's changed lines found in the commit.
| CVE | Major | Clue | Commit | Similarity |
|---|---|---|---|---|
| CVE-2025-48639 | 14 | related_bug | 848e575f07ff | 1.00 |
| CVE-2025-48639 | 15 | related_bug | 06e697583c87 | 1.00 |
Security fixes no advisory mentions
Commits of this month's security tags whose bug ids are in no bulletin and no OSV advisory. Some are likely lower-severity fixes, some may become CVEs later.
Android 14: 4 fixes in android-security-14.0.0_r24
Show the list
Android 15: 5 fixes in android-security-15.0.0_r12
Show the list
Android 16: 5 fixes in android-security-16.0.0_r3
Show the list
Fix analysis AI-generated
For each CVE with a public fix, an analysis of Google's patch: root cause, how the fix works, what it covers and leaves out. Written by a model from the bulletin and the fixing diffs, then checked against the code by a second model. It can still be wrong: verify against the commit.
- CVE-2023-40130 · platform/packages/services/Telecomm
Adds an onBindingDied override to Telecom's CallRedirectionServiceConnection that calls finishCallRedirection() under mTelecomLock, so the CallRedirectionService is unbound when its binding dies. - CVE-2025-22420 · platform/frameworks/base
Adds a Uri read-permission check (UriGrantsManagerInternal.checkGrantUriPermission) on a content:// sound Uri when a new notification channel is created in PreferencesHelper.createNotificationChannel, and moves the check into a new PermissionHelper.grantUriPermission helper. On Android 14 a first commit made channel creation throw SecurityException; a second commit falls back to the default notification sound instead. - CVE-2025-22432 · platform/packages/services/Telecomm
Makes CallRedirectionProcessor.notifyTimeout() unbind the CallRedirectionServiceConnection and clear mConnection/mService when a call redirection service times out, so Telecom releases the bound service instead of keeping it bound. - CVE-2025-32319 · platform/frameworks/base
Removes the flag-gated Context.BIND_INCLUDE_CAPABILITIES term (previously gated by the aconfig flag com.android.server.print.do_not_include_capabilities) from the bindServiceAsUser call in RemotePrintService.ensureBound(), so system_server no longer binds PrintService implementations with BIND_INCLUDE_CAPABILITIES. - CVE-2025-32328 · platform/frameworks/base
The Autofill system UI (FillUi, DialogFillUi, SaveUi) now inflates service-supplied RemoteViews (and in SaveUi its whole UI) with a Context created for the current foreground user (new Helper.getUserContext) instead of the system_server user 0 context. Session also fetches the service's custom icon and label resources under a cleared Binder calling identity. - CVE-2025-32329 · platform/frameworks/base
Autofill system UI (FillUi, DialogFillUi, SaveUi) now applies the fill service's RemoteViews presentations with a Context created for the current foreground user (new Helper.getUserContext) instead of the system_server user-0 context, and Session's custom icon/label PackageManager lookups run under a cleared Binder calling identity. - CVE-2025-48525 · platform/frameworks/base
When a package's last companion association for a user is removed, the companion device service now revokes notification listener (NLS) access for all of that package's NotificationListenerService components. - CVE-2025-48536 · platform/packages/apps/Settings
SettingsSliceProvider.grantAllowlistedPackagePermissions now combines the existing slice allowlist (slice_allowlist_package_names) with a new debug-only array (slice_allowlist_package_names_for_dev) whose entries are granted only when Build.IS_DEBUGGABLE is true, so packages listed only in the dev array no longer get Settings slice permissions on non-debuggable builds. - CVE-2025-48555 · platform/packages/apps/Settings
Settings' NotificationStation (notification log/history screen) now works out in onResume which profiles of the current user are secure, currently locked and have LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS disabled. For history entries from those profiles it hides the title, the text and the notification/ranking extras. - CVE-2025-48572 · platform/frameworks/base
MediaButtonReceiverHolder.send no longer attaches BroadcastOptions that grant background-activity-start and FGS temp-allowlist privileges to the media button receiver; it instead calls MediaSessionService.tempAllowlistTargetPkgIfPossible for the target package, with caller identity. - CVE-2025-48573 · platform/frameworks/base
Removes the temporary allowlist grant (tempAllowlistTargetPkgIfPossible) that system_server made to the media session owner whenever a controller invoked MediaController.sendCommand, so this call no longer propagates while-in-use / background-FGS-launch privileges. - CVE-2025-48575 · platform/packages/apps/CertInstaller
CertInstaller now trusts a "called by Settings" referrer for the CA certificate installation path only if the package named com.android.settings resolves to the system uid. Before, it relied on the referrer package-name string alone. - CVE-2025-48576 · platform/frameworks/base
Removes the unused, AIDL-only Binder method updateNotificationChannelGroupFromPrivilegedListener from INotificationManager and its NotificationManagerService implementation, eliminating a system_server entry point that created and persisted a notification channel group on behalf of a listener. - CVE-2025-48580 · platform/frameworks/base
MediaBrowser no longer always binds to a MediaBrowserService with Context.BIND_INCLUDE_CAPABILITIES; the flag is dropped when the root hints contain the new hidden key BrowserRoot.EXTRA_EXCLUDE_CAPABILITIES or the existing key BrowserRoot.EXTRA_RECENT. - CVE-2025-48583 · platform/frameworks/base
Once a bundle's lazy values have all been consumed, or the bundle is cleared, BaseBundle no longer puts its backing Parcel back into the Parcel pool with recycle(). Instead it calls Parcel.destroy(), which is now exposed as a public @hide method, so these Parcel instances are never reused. - CVE-2025-48584 · platform/frameworks/base
Adds a per-listener cap (5,000) on the conversation channels a privileged NotificationListenerService can create for other packages via createConversationNotificationChannelForPackageFromPrivilegedListener, and adds null and edge-case checks in that method so it no longer hits NPEs in system_server. - CVE-2025-48586 · platform/packages/services/Telephony
In Telephony's FDN contact editor, the onActivityResult handler now uses ComponentCaller.checkContentUriPermission to check that the caller holds a read grant for the returned contact URI. This replaces a user-ID comparison, and the handler throws SecurityException when the check is denied. - CVE-2025-48588 · platform/frameworks/base
Vpn.startAlwaysOnVpn() no longer resets the always-on VPN configuration (setAlwaysOnPackage(null, false, null)) when the always-on package is deemed unsupported while the device is in safe mode; per the code comment, the always-on VPN can then start after rebooting to normal mode. - CVE-2025-48589 · platform/frameworks/base
SystemUI's HeaderPrivacyIconsController now filters the PermissionGroupUsage list it sends to Safety Center (ACTION_VIEW_SAFETY_CENTER_QS, EXTRA_PERMISSION_USAGES). Only usages belonging to the current user and its profiles, plus phone-call usages, are included. Before the fix, the unfiltered list from PermissionManager.getIndicatorAppOpUsageData() was sent. - CVE-2025-48590 · platform/frameworks/base
Removes the Q- app compat exemption in AppOpsService attribution tag validation. An attribution tag not declared by the package (or whose package is not found) is no longer forced to valid when SECURITY_EXCEPTION_ON_INVALID_ATTRIBUTION_TAG_CHANGE is disabled for the package or calling UID. - CVE-2025-48591 · platform/frameworks/base
Adds a callingUser parameter to the IMms binder interface and makes MmsServiceBroker fill it from Binder.getCallingUserHandle(), so MmsService can check that the client-supplied contentUri belongs to the originating user. - CVE-2025-48592 · platform/frameworks/av
The Codec2 software AV1 decoder plugin (C2SoftDav1dDec) now sets Dav1dSettings.all_layers = 0 before dav1d_open, so dav1d outputs only one layer for SVC streams instead of all layers, which the plugin was not designed to handle. - CVE-2025-48594 · platform/frameworks/base
The CompanionDeviceManager UID callback that drains revoked/pending associations now resolves every package sharing a UID via PackageManager.getPackagesForUid() and processes pending revoked associations for each of them, instead of only the single package name previously resolved for the UID. - CVE-2025-48596 · platform/frameworks/native
Parcel::appendFrom in libbinder now sets mDataSize to mDataPos only when the new position exceeds the current size, instead of unconditionally adding len to mDataSize. - CVE-2025-48597 · platform/frameworks/base
Moves the grant of the TRUSTED_OVERLAY surface flag for a PiP task out of WindowManager (where it was set as soon as the activity was marked pinned) into WM Shell's PipTransition.onFinishResize, so it is only set once Shell finishes the enter-PiP transition with a valid leash, while WM keeps only the revocation when the task leaves pinned mode. - CVE-2025-48598 · platform/packages/apps/Settings
Settings biometric enrollment now only honors Intent.EXTRA_USER_ID when the activity was launched by the Settings package itself, and the FaceEnroll trampoline strips EXTRA_USER_ID before forwarding extras from external callers, so a third-party app can no longer steer face enrollment to another user id. - CVE-2025-48599 · platform/packages/apps/Settings
Settings' WifiScanModeActivity now finishes immediately, without showing the "allow scanning when Wi-Fi is off" dialog, when the current user has the DISALLOW_CONFIG_LOCATION user restriction. - CVE-2025-48601 · platform/frameworks/base
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. - CVE-2025-48603 · platform/frameworks/base
Adds a 200 KB size limit on an input method's metadata XML resource (InputMethod.SERVICE_META_DATA) in InputMethodInfo. An oversized resource now makes the code throw XmlPullParserException before the XML is parsed, so the system process (IMMS) cannot be driven out of memory while constructing InputMethodInfo. - CVE-2025-48604 · platform/packages/services/Mms
MmsService now records the calling user for each MMS download request and refuses to write the downloaded PDU to the caller-supplied content URI when the URI's embedded user ID does not match the calling user. - CVE-2025-48607 · platform/frameworks/base
Changes the IAppOpsService.getPackagesForOpsForDevice binder method to return a ParceledListSlice<AppOpsManager.PackageOps> instead of a plain List, so that large result sets are paginated across binder transactions instead of overflowing a single one. - CVE-2025-48614 · platform/frameworks/base
RecoverySystem.rebootWipeUserData now throws a SecurityException when DynamicSystemManager.isInUse() reports that the device is running a Dynamic System Update (DSU) image, so a factory reset can no longer be started while in DSU mode. - CVE-2025-48618 · platform/frameworks/opt/telephony
Adds a KeyguardManager.isDeviceLocked() check to CommandParamsFactory.processLaunchBrowser so that a SIM Toolkit LAUNCH BROWSER proactive command is rejected with a ResultException(ResultCode.LAUNCH_BROWSER_ERROR) while the device is locked. It also relaxes ResultException so this result code can be thrown with only a text explanation. - CVE-2025-48620 · platform/frameworks/base
Removes an early return in VoiceInteractionManagerService's package-change handler so that, when a voice interaction service is set, the code that resets the current voice recognition service on package removal is still reached. - CVE-2025-48621 · platform/frameworks/native (inputflinger InputDispatcher) and platform/frameworks/base (libs/WindowManager/Shell transition
Two linked changes under bug 266433089: InputDispatcher stops delivering motion events to windows that use TouchOcclusionMode::USE_OPACITY while their alpha is below 0.5, and the WM Shell DefaultTransitionHandler lowers MAX_ANIMATION_DURATION from 3000 to 1500. The commit message frames this as reducing tapjacking risk during animations. - CVE-2025-48622 · platform/external/dng_sdk (libdng_sdk
Replaces the Android copy of Adobe's DNG SDK (platform/external/dng_sdk) with an import of version 1.7.1 that has JXL and XMP support stubbed out. It also adapts the two in-tree consumers, Skia's SkRawCodec and the CTS dng-validate JNI helper, to the new SDK API. - CVE-2025-48626 · platform/packages/apps/Launcher3 (quickstep OverviewCommandHelper / SystemUiProxy) and platform/frameworks/base (SystemUI OverviewProxyService
Launcher3's OverviewCommandHelper no longer launches the home activity directly via startActivity for the TYPE_HOME command; it asks SystemUI (new ISystemUiProxy.onKeyEvent) to send a KEYCODE_HOME key event so the press goes through the system's key handling. - CVE-2025-48627 · platform/frameworks/base
In ActivityTaskManagerService.startNextMatchingActivity, the fix saves the real Binder caller (uid/pid) before the calling identity is cleared. It then passes them to the ActivityStarter as realCallingUid/realCallingPid instead of r.launchedFromUid / -1, so the background activity launch (BAL) decision is made against the app that actually calls the method. It also removes the earlier setAvoidMoveToFront() workaround from b/230492947. - CVE-2025-48628 · platform/frameworks/base
PrintManagerService.validateIconUserBoundary now derives the icon URI's user id from the URI authority via ContentProvider.getUserIdFromAuthority (defaulting to the resolved calling user) and always enforces the current-user-group check for URI-type icons, instead of relying on Uri.getEncodedUserInfo and skipping the check when it returned null. - CVE-2025-48629 · platform/frameworks/base
When the preferred recognizer package is not found, VoiceInteractionManagerService no longer falls back to the first available RecognitionService. It now auto-selects only a service whose application has ApplicationInfo.FLAG_SYSTEM, and returns null if there is none. - CVE-2025-48632 · platform/frameworks/base
Adds a shared validateDisplayName() length check (DISPLAY_NAME_LENGTH_LIMIT = 1024) to the private AssociationRequest constructor and the @hide setDisplayName() in core/java/android/companion/AssociationRequest.java. Before this, the display-name limit was enforced only in Builder.setDisplayName(). - CVE-2025-48633 · platform/frameworks/base
DevicePolicyManagerService.hasAccountsOnAnyUser() is changed to query AccountManagerService.getSingleton().getAllAccountsForSystemProcess() instead of iterating users and calling AccountManager.getAccounts(). Per the commit title, this makes it count all accounts regardless of visibility. - CVE-2025-48639 · platform/frameworks/base
Halves the maximum animation duration enforced by WM Shell's DefaultTransitionHandler (MAX_ANIMATION_DURATION 3000 -> 1500 ms) to shrink the window in which a running transition animation can be used for tap-jacking.
Bulletin revisions
| Version | Date | Notes |
|---|---|---|
| 1.0 | December 1, 2025 | Bulletin Published |
| 1.1 | December 4, 2025 | Bulletin revised to include AOSP links |
| 1.2 | December 17, 2025 | CVE-2025-48600 and CVE-2025-48615 have been removed from ASB#2025-12 due to an incomplete fix. Partners may keep these fixes. An updated fix will be required as part of a future Android Security Bulletin. |
| 1.3 | January 8, 2026 | CVE-2025-48631 has been removed due to an incomplete fix for Android 16 25Q4, all other Android versions are fine. Partners may keep this fix. An updated fix will be required as part of ASB#2026-03 Android Security Bulletin. |
| 1.3 | February 10, 2026 | CVE-2025-48612 A-429417453 will be removed from ASB#2025-12 due to a possible regression that may limit the ability to switch default payment apps for contactless payments. Partners may keep this fix. An updated fix will be required as part of a future Android Security Bulletin. |
| 1.4 | March 3, 2026 | CVE-2025-48565 A-407763772 will be removed from ASB#2025-12 due to an incomplete fix. Partners may keep this fix. An updated fix will be required as part of a future Android Security Bulletin. |
| 1.5 | March 6, 2026 | CVE-2025-48566 and CVE-2025-48564 were removed as they share a fix with CVE-2025-48565. |
- No change seen since tracking started (2026-09-30).
Method and limits
Fixes are found in the public android-security-* tags by the bug id in the
commit message, then Change-Id and patch id against the bulletin's commit, then two probable
matches checked by content. "No public code" means no fixing commit in the ingested tags of
that major, not proof that no fix exists anywhere. When none of the code the bulletin's
commit patches exists in a major (removed or reworked before its release), the CVE is shown
as "patched code absent" instead. Vendor closed-source components and the kernel are out of
scope.
Data for this page (JSON).