September 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 | 44 | 42 | 2 | 0 | android-security-14.0.0_r22 |
| Android 15 | 50 | 50 | 0 | 0 | android-security-15.0.0_r10 |
| Android 16 | 42 | 42 | 0 | 0 | none |
| Android 17 (pre-release, 17-next) | 0 | 0 | 0 | 0 | none |
The bulletin also has 53 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_r22 adds the fix for 41 CVEs: CVE-2024-49714, CVE-2025-26454, CVE-2025-32321, CVE-2025-32323, CVE-2025-32325, CVE-2025-32326, CVE-2025-32327, CVE-2025-32330, CVE-2025-32333, CVE-2025-32347, CVE-2025-32349, CVE-2025-32350, CVE-2025-48522, CVE-2025-48523, CVE-2025-48524, CVE-2025-48526, CVE-2025-48527, CVE-2025-48529, CVE-2025-48531, CVE-2025-48534, CVE-2025-48535, CVE-2025-48537, CVE-2025-48538, CVE-2025-48540, CVE-2025-48541, CVE-2025-48542, CVE-2025-48543, CVE-2025-48545, CVE-2025-48546, CVE-2025-48547, CVE-2025-48548, CVE-2025-48549, CVE-2025-48550, CVE-2025-48551, CVE-2025-48552, CVE-2025-48553, CVE-2025-48554, CVE-2025-48558, CVE-2025-48559, CVE-2025-48562, CVE-2025-48563.
android-security-15.0.0_r10 adds the fix for 47 CVEs: CVE-2025-0089, CVE-2025-26454, CVE-2025-32321, CVE-2025-32323, CVE-2025-32324, CVE-2025-32325, CVE-2025-32326, CVE-2025-32327, CVE-2025-32330, CVE-2025-32331, CVE-2025-32345, CVE-2025-32347, CVE-2025-32349, CVE-2025-32350, CVE-2025-48522, CVE-2025-48523, CVE-2025-48524, CVE-2025-48526, CVE-2025-48527, CVE-2025-48528, CVE-2025-48529, CVE-2025-48531, CVE-2025-48534, CVE-2025-48535, CVE-2025-48537, CVE-2025-48538, CVE-2025-48539, CVE-2025-48540, CVE-2025-48541, CVE-2025-48542, CVE-2025-48543, CVE-2025-48545, CVE-2025-48546, CVE-2025-48547, CVE-2025-48548, CVE-2025-48549, CVE-2025-48550, CVE-2025-48551, CVE-2025-48552, CVE-2025-48553, CVE-2025-48554, CVE-2025-48556, CVE-2025-48558, CVE-2025-48559, CVE-2025-48560, CVE-2025-48562, CVE-2025-48563.
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-24023 | 14 (r12), 15 (r5) | 2024-09-03 | 363 |
| CVE-2025-0076 | 14 (r18), 15 (r6) | 2025-03-03 | 182 |
| CVE-2025-0089 | 14 (r20) | 2025-05-05 | 119 |
| CVE-2025-26464 | 15 (r9) | 2025-06-02 | 91 |
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-2023-24023 | 14 | related_bug | b5155f0591f9 | |
| CVE-2025-32350 | 14 | subject | b08dcc947008 | 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_r22
Show the list
Android 15: 4 fixes in android-security-15.0.0_r10
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-24023 · platform/packages/modules/Bluetooth
The Bluetooth stack now caches a bonded BR/EDR peer's Secure Connections support when its link key is notified. When peer security capabilities arrive on a new connection, it disconnects the link if the peer reports a downgrade from Secure Connections mode (a BLUFFS mitigation). - CVE-2024-49714 · platform/packages/modules/Bluetooth
Replaces an insufficient CHECK-based size assertion in avrc_vendor_msg (system/stack/avrc/avrc_opt.cc) with a bound that accounts for the BT_HDR, AVCT_MSG_OFFSET, the 3 AVRC header bytes and the 3 company_id bytes before vendor_len. The function now returns nullptr instead of aborting when the composed command would not fit in the AVRC_META_CMD_BUF_SIZE buffer. - CVE-2025-0076 · platform/frameworks/base
SystemUI's Quick Access Wallet tile and wallet screen now only load a WalletCard's card image and card icon when the Icon is TYPE_BITMAP or TYPE_ADAPTIVE_BITMAP; all other Icon types (URI, URI_ADAPTIVE_BITMAP, RESOURCE, DATA) produce a null drawable instead of being loaded in SystemUI's context. - CVE-2025-0089 · platform/frameworks/base
Adds a home-intent normalization step to ActivityStartInterceptor. ACTION_MAIN intents that carry CATEGORY_HOME/CATEGORY_SECONDARY_HOME in a non-standard format (extra categories, data/type, or an explicit component naming the default home) are rewritten into the canonical home intent and re-resolved before the activity is started. - CVE-2025-26454 · platform/packages/apps/ManagedProvisioning
ManagedProvisioning's DisclaimersParserImpl now validates each caller-supplied EXTRA_PROVISIONING_DISCLAIMER_CONTENT Uri before copying its content into the provisioning disclaimer cache. The scheme must be content or android.resource, and for content URIs the Binder caller must hold read permission. Any disclaimer that fails validation is skipped. - CVE-2025-26464 · platform/packages/modules/AppSearch
Replaces the whole body of the hidden binder method AppSearchManagerService.executeAppFunction (AppSearch module, Android 15) with an unconditional UnsupportedOperationException. This disables the never-launched, flag-guarded app-function execution path in which, according to the commit, a security issue was reported. - CVE-2025-32321 · platform/packages/apps/Settings
In Settings' AccountTypePreferenceLoader.isSafeIntent, the fix keeps the existing check that the activity an intent resolves to belongs to the authenticator's uid. When the check passes, it now pins the intent to that resolved component with intent.setComponent(), so the intent becomes explicit and targets the validated activity. - CVE-2025-32323 · platform/packages/apps/DocumentsUI
DocumentsUI now sanitizes the calling app's label in Shared.getCallingAppName with TextUtils.makeSafeForPresentation (500-character limit, TRIM and SINGLE_LINE flags) and puts the name in double quotes in the open_tree_dialog_message string. This stops the label from reading as part of the folder-access confirmation text. - CVE-2025-32324 · platform/frameworks/base
Moves the runStartActivity(pw) call of the `am start-in-vsync` shell command out of the Choreographer frame callback (posted via the system_server UI handler) back onto the shell command's own thread, so the activity is started with the shell caller's pid/uid. - CVE-2025-32325 · platform/frameworks/native
Hardens Parcel::appendFrom in libbinder in three ways: it rejects appends that would overwrite existing objects in the destination, it only copies and acquires source objects that actually fall inside the requested [offset, offset+len) range (instead of a contiguous index range), and it keeps the object-ordering bookkeeping (mObjectsSorted, RPC mObjectPositions) accurate. - CVE-2025-32326 · platform/packages/apps/Settings
In Settings' AppRestrictionsFragment, the custom restrictions Intent supplied by an app is now launched only as a copy pinned to the component and package that the safety check resolved, instead of relaunching a copy of the original Intent after vetting. - CVE-2025-32327 · platform/packages/providers/MediaProvider
PickerDbFacade no longer embeds unrecognized, caller-supplied projection column names into the SQL projection of queryMediaIdForApps; unknown columns are dropped from the SQL query and re-added as null-valued columns in a MatrixCursor built after the query. - CVE-2025-32330 · platform/frameworks/base
Replaces the LE audio broadcast (audio sharing) password generator in SettingsLib's LocalBluetoothLeBroadcast, which derived a 12-character hex string from UUID.randomUUID(), with a 16-character password drawn from an 89-symbol alphabet using java.security.SecureRandom. - CVE-2025-32331 · platform/frameworks/base
The fix makes IKeyguardService.showDismissibleKeyguard() in SystemUI's KeyguardService return early whenever ActivityManager reports a lock task mode other than NONE (app pinning). As a result, folding a device with "Swipe up to continue" set no longer shows a dismissible keyguard over a pinned app. - CVE-2025-32333 · platform/packages/apps/Settings
Settings' SpaActivity.startSpaActivityForApp now rejects an intent data scheme-specific part that does not match a Java-style package name regex before putting it into the SPA navigation destination string. For malformed values it returns false and launches no activity. - CVE-2025-32345 · platform/packages/apps/Settings
In Settings, ContentProtectionTogglePreferenceController.updateState now disables the Content Protection main switch for every non-admin user (!UserManager.isAdminUser()) instead of only for guest users (UserManager.isGuestUser()). - CVE-2025-32346 · platform/packages/services/Telephony
In VoicemailSettingsActivity.onActivityResult, the contact URI returned by a picker activity is now validated with ComponentCaller.checkContentUriPermission(FLAG_GRANT_READ_URI_PERMISSION) against the component that delivered the result, instead of only comparing the user ID encoded in the URI with the Phone app's own user ID; denial now logs an EventLog entry and throws SecurityException. - CVE-2025-32347 · platform/packages/apps/Settings
BiometricEnrollIntroduction now strips the MultiBiometricEnrollHelper extras (EXTRA_SKIP_PENDING_ENROLL, EXTRA_ENROLL_AFTER_FACE, EXTRA_ENROLL_AFTER_FINGERPRINT) from its launch intent in onStart() whenever the calling package is not Settings itself, so PendingIntent extras supplied by external packages are dropped during enrollment. - CVE-2025-32349 · platform/frameworks/base
WindowManager now forces the default Animation_Toast style on TYPE_TOAST windows from sessions without mCanAddInternalSystemWindow, and uses a fixed short alpha fade instead of the window's own exit animation when a non-system overlay is forcibly hidden, so an app can no longer control how long its overlay stays on screen during a forced hide. - CVE-2025-32350 · platform/frameworks/base
Removes android:exported="true" from SystemUI's ControlsActivity manifest entry and adds SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS to the window of the dialog created by ControlsSettingsDialogManager, so non-system windows are not drawn on top of it. - CVE-2025-48522 · platform/frameworks/base
AssociationRequest.Builder.setDisplayName now rejects display names longer than 1024 characters with an IllegalArgumentException. Before, it accepted an app-supplied string of any length, and that string is shown in the CompanionDeviceManager confirmation UI. - CVE-2025-48523 · platform/packages/apps/Contacts
Removes the branch in SelectAccountActivity.onCreate that silently returned the sole writable account as RESULT_OK. When one or more accounts exist, the account selection dialog is now always shown, so the vCard import flow no longer picks the account automatically. - CVE-2025-48524 · platform/packages/modules/Wifi
WifiPermissionsUtil.isSystem() now returns false early when the calling uid is an SDK sandbox uid (on T+), instead of deriving system-app status from the ApplicationInfo flags of the supplied package name. - CVE-2025-48526 · platform/packages/modules/IntentResolver
ChooserActivity now gives the adapter for the non-launched (cross-profile) profile a sanitized copy of the payload intents instead of the caller's original intents. In the copy, package and component are cleared, and so are the selector's package and component. - CVE-2025-48527 · platform/packages/apps/Settings
Settings' Notification History screen now replaces the title and text of history, snoozed and dismissed notifications with the generic "notification_hidden_text" string for any profile that is securely locked and has LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS disabled, instead of rendering the full content. - CVE-2025-48528 · platform/frameworks/base
Reverts the "Fix biometric prompt appearing above shade" change in SystemUI's AuthContainerView. The BiometricPrompt window moves back from TYPE_APPLICATION_OVERLAY to TYPE_KEYGUARD_DIALOG, and the panel interaction detector is enabled unconditionally again. - CVE-2025-48529 · platform/frameworks/opt/telephony
Removes the shared-preference storage, readback and channel migration of the voicemail ringtone URI in frameworks/opt/telephony, so TelephonyManager#setVoicemailRingtoneUri becomes a no-op and getVoicemailRingtoneUri only returns the voicemail NotificationChannel sound. - CVE-2025-48531 · platform/packages/apps/Settings
Settings' CredentialStorage now identifies the caller of its install flow with ActivityManager.getLaunchedFromPackage(getActivityToken()) instead of Activity.getCallingPackage() when deciding whether the caller is com.android.certinstaller. - CVE-2025-48532 · platform/packages/providers/MediaProvider
MediaProvider.markMediaAsFavorite no longer applies a caller-supplied ContentValues from the call extras. It now reads only a boolean IS_FAVORITE extra and builds the ContentValues itself, and the MediaStore client helper now sends that boolean instead of EXTRA_CONTENT_VALUES. - CVE-2025-48534 · platform/packages/modules/CellBroadcastService
CellBroadcastHandler.getDefaultCBRPackageName now queries broadcast receivers with PackageManager.MATCH_SYSTEM_ONLY instead of flags 0, so non-system packages can no longer be selected as the default CellBroadcastReceiver package. - CVE-2025-48535 · platform/packages/apps/Settings
In Settings' AppRestrictionsFragment, the custom restrictions Intent supplied by an app is no longer launched as received after vetting. Settings now launches a copy pinned to the exact component and package that passed the resolveActivity/package check, and a second commit makes that same copy the object that is resolved. - CVE-2025-48537 · platform/frameworks/base
ZenModeConditions.evaluateRule now maps condition ids to built-in system ConditionProviderServices only for system-owned or manual rules, rejects non-system rules whose component is in the "android" package, and tracks subscriptions by (Uri, ComponentName) pairs instead of by Uri alone. - CVE-2025-48538 · platform/frameworks/base
Extends the protected-package check in PackageManagerService's package-hiding path so that, in addition to "android", the SystemUI package (resolved via PackageManagerInternal.getSystemUiServiceComponent()) can no longer be hidden. - CVE-2025-48539 · platform/packages/modules/Bluetooth
In AclArbiter::SendPacketToPeer (system/stack/arbiter/acl_arbiter.cc), the failure-path warning log now reads the length from the rust::Vec argument (buffer.size()) instead of from the BT_HDR p_buf, which L2CA_SendFixedChnlData may already have freed. - CVE-2025-48540 · platform/frameworks/native
Three small commits to libs/binder/RpcState.cpp make RPC Binder terminate the session (session->shutdownAndWait(false)) on error paths that previously only returned an error code and left the session alive. The paths are: a TRANSACT command received when a non-ANY CommandType was expected; a bad object-table span in an incoming transaction; and CommandData allocation failure in processTransact and waitForReply. - CVE-2025-48541 · platform/packages/apps/Settings
FaceSettings now only honours the hw_auth_token, sensor id, challenge and EXTRA_USER_ID intent extras when the activity's initial calling package is the Settings app itself; for any other (or unknown) caller it ignores them and uses the current user. - CVE-2025-48542 · platform/frameworks/base
Adds per-account storage accounting to AccountManagerService. Once an account's estimated user-data and auth-token storage exceeds 30,000,000 divided by the number of accounts, new user-data writes are dropped silently and auth-token writes return false. Passwords longer than 1,000,000 characters are rejected on account add and on password change. - CVE-2025-48543 · platform/art
Adds an instantiability check to three ART JNI object creation entry points in jni_internal.cc (AllocObject, NewObjectV and NewObjectA, per the matching CheckJNI call sites). Creating an instance of an abstract class or interface through them now throws java.lang.InstantiationException. The fix also relaxes the CheckJNI helper so it only rejects array classes. - CVE-2025-48545 · platform/frameworks/base
AccountManagerService.isSystemUid() now returns false immediately for SDK sandbox UIDs instead of deriving system status from the packages that PackageManager associates with that UID. - CVE-2025-48546 · platform/frameworks/base
SafeActivityOptions now rejects with a SecurityException any activity start whose ActivityOptions carry setLaunchWindowingMode(WINDOWING_MODE_PINNED), pointing callers to ActivityOptions#makeLaunchIntoPip instead. - CVE-2025-48547 · platform/packages/modules/Permission
PermissionController now stops a package's one-time permission session on revoke only when no remaining permission of that package is still granted as one-time, and the Kotlin helper that makes this decision is rewritten so its grant and one-time checks evaluate correctly. - CVE-2025-48548 · platform/frameworks/av (audiopolicy service
Makes audioserver's silencing of a recording client match the AppOps op state. startRecording now returns the exact permission result (granted/soft/hard denied). startInput un-silences a client only when the op was granted. finishRecording is called only for clients that were not silenced. Sources that do not need the record op are checked against their own op instead of having their result ignored. Companion frameworks/base changes fix AppOps attribution-chain preflight and cleanup, and the SystemUI mic indicator suppression logic. - CVE-2025-48549 · platform/frameworks/av (audiopolicy service
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. - CVE-2025-48550 · platform/frameworks/base
Adds package-name validation to both SlicePermissionManager.PkgUser constructors so that a malformed package string is rejected with IllegalArgumentException instead of being accepted. - CVE-2025-48551 · platform/packages/modules/IntentResolver
The Sharesheet "edit image" action in IntentResolver's ChooserActivity is now launched as the user that launched the sharesheet instead of always as the personal profile user. - CVE-2025-48552 · platform/frameworks/base
Wraps the three Settings.Global proxy writes in DevicePolicyManagerService.saveGlobalProxyLocked in a try/catch, so an exception from SettingsProvider while applying a device admin's global proxy no longer aborts the caller (for example the removal of an ActiveAdmin). - CVE-2025-48553 · platform/frameworks/base
DevicePolicyManagerService.handlePackagesChanged now re-parses the device admin metadata of an active admin's receiver (via a new DeviceAdminInfo) after a package change and removes the admin if the package, receiver or metadata is missing or malformed; DeviceAdminInfo's metadata parser additionally converts OutOfMemoryError into XmlPullParserException so that failure is catchable. - CVE-2025-48554 · platform/frameworks/base
DevicePolicyManagerService now re-parses an active admin's device-admin metadata whenever its package changes and drops the admin if the metadata is malformed, and DeviceAdminInfo converts an OutOfMemoryError raised while parsing that metadata into an XmlPullParserException so callers can handle it. - CVE-2025-48556 · platform/frameworks/base
NotificationChannel.setId() and setConversationId() now pass their string arguments through the existing getTrimmedString() helper so mId, mParentId and mConversationId are capped at MAX_TEXT_LENGTH instead of being stored unbounded. - CVE-2025-48558 · platform/frameworks/base
BatteryService now resolves the ACTION_REQUEST_SHUTDOWN intent it fires on low battery or over-temperature to an explicit component whose owning uid holds android.permission.SHUTDOWN. Before, it launched the implicit intent from the system process, so any activity with a matching intent-filter could resolve. - CVE-2025-48559 · platform/frameworks/base
AppOpsService.verifyAndGetBypass no longer always accepts attribution tags for the root UID: a tag is now valid only when the proxy package is null or a system package. finishProxyOperation now passes the proxy identity into verification, so unverified tags from non-system proxies are not treated as valid on the finish path. - CVE-2025-48560 · platform/frameworks/base
Moves the ACCESSIBILITY_MOTION_EVENT_OBSERVING permission check in AbstractAccessibilityServiceConnection out of the property-setting code that ran under a cleared Binder identity, and into the service-info update method before Binder.clearCallingIdentity(). The check is now evaluated against the calling accessibility service instead of system_server, and requested observed motion event sources are reset to 0 when the caller lacks the permission. - CVE-2025-48562 · platform/frameworks/base
PrintSpooler's save-to-PDF path now opens the destination content URI in write-truncate mode ("wt") instead of the default mode, so that overwriting an existing file gets a truncated output stream. - CVE-2025-48563 · platform/frameworks/base
Adds an onNullBinding() override to RemoteFillService that calls unbind(), so system_server no longer stays bound, with BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS, to an autofill service whose onBind() returned null.
Bulletin revisions
| Version | Date | Notes |
|---|---|---|
| 1.0 | September 2, 2025 | Bulletin published |
| 1.1 | September 8, 2025 | Updated Issue List |
| 1.2 | September 11, 2025 | Updated AOSP Links |
| 2.0 | September 15, 2025 | Updated Issue List |
| 2.1 | December 2, 2025 | Updated Issue List |
| 2.2 | December 8, 2025 | AOSP Links updated |
- 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).