April 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 | 21 | 21 | 0 | 0 | android-security-14.0.0_r19 |
| Android 15 | 20 | 20 | 0 | 0 | android-security-15.0.0_r7 |
| Android 16 (pre-release, 16-next) | 0 | 0 | 0 | 0 | none |
| Android 17 (pre-release, 17-next) | 0 | 0 | 0 | 0 | none |
The bulletin also has 31 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_r19 adds the fix for 19 CVEs: CVE-2024-49720, CVE-2024-49730, CVE-2025-22416, CVE-2025-22417, CVE-2025-22418, CVE-2025-22419, CVE-2025-22421, CVE-2025-22422, CVE-2025-22423, CVE-2025-22427, CVE-2025-22428, CVE-2025-22429, CVE-2025-22431, CVE-2025-22433, CVE-2025-22434, CVE-2025-22435, CVE-2025-22438, CVE-2025-22439, CVE-2025-26416.
android-security-15.0.0_r7 adds the fix for 17 CVEs: CVE-2024-49720, CVE-2025-22416, CVE-2025-22417, CVE-2025-22419, CVE-2025-22421, CVE-2025-22422, CVE-2025-22423, CVE-2025-22427, CVE-2025-22428, CVE-2025-22429, CVE-2025-22430, CVE-2025-22431, CVE-2025-22433, CVE-2025-22434, CVE-2025-22435, CVE-2025-22439, CVE-2025-26416.
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-2024-40653 | 14 (r17), 15 (r5) | 2025-02-03 | 57 |
| CVE-2024-49722 | 15 (r5) | 2025-02-03 | 57 |
| CVE-2024-49728 | 14 (r17), 15 (r5) | 2025-02-03 | 57 |
Fixed, by a probable match
None this month.
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_r19
Show the list
Android 15: 6 fixes in android-security-15.0.0_r7
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-2024-40653 · platform/packages/services/Telecomm
Telecom's ConnectionServiceWrapper now schedules a 15 second timeout when it asks a bound ConnectionService to create a connection or conference. If the app never completes creation, the request is failed with DisconnectCause.ERROR. Per the commit message, this lets Telecom unbind the service instead of keeping it bound indefinitely. - CVE-2024-49720 · platform/packages/modules/Permission
Adds PackageManager.FLAG_PERMISSION_ONE_TIME to the set of flags that the role controller treats as a user choice, so role (re-)evaluation no longer overrides a permission the user chose to grant only once, and clears that flag when a role grant gives a permission that was not previously granted. - CVE-2024-49722 · platform/frameworks/base
Makes SettingsLib's EditUserPhotoController launch the avatar picker with an explicit component (package and class from new config resources) instead of an implicit AVATAR_PICKER_ACTION intent when the avatarSync flag path is taken, and then removes the guarding fixAvatarCrossUserLeak flag so the fix is unconditional. - CVE-2024-49728 · platform/packages/modules/Bluetooth
Adds a check in Bluetooth OPP's BluetoothOppSendFileInfo.generateFileInfo that rejects content URIs whose authority carries a user-id prefix for a user other than the current one. Such URIs now return SEND_FILE_INFO_ERROR and are not opened. - CVE-2024-49730 · platform/packages/providers/MediaProvider
Changes MediaProvider FuseDaemon's MAX_READ_SIZE from a fixed 128 KiB to FUSE_MAX_MAX_PAGES (256) * getpagesize(). Per the commit message, the goal is to make the zero_addr buffer as large as the largest single request. - CVE-2025-22416 · platform/frameworks/base
ChooserActivity now checks, through IUriGrantsManager.checkGrantUriPermission_ignoreNonSystem, that the launching caller has read access to the URI behind any URI-type Icon in the caller-supplied ChooserTarget array. If the check fails, the icon is removed from that target. - CVE-2025-22417 · platform/frameworks/base
In Transition.finishTransition (services/core/java/com/android/server/wm/Transition.java), the ActivityRecordInputSink (touch-blocking) state of visible participant activities is now written into each activity's pending transaction and flushed via scheduleAnimationLocked(), instead of being applied immediately through a freshly created standalone SurfaceControl.Transaction, to fix a race that could leave the state stale. - CVE-2025-22418 · platform/packages/apps/Settings
Settings' RingtonePreference now sets a target package on the ringtone picker intent by calling setPackage() with a new string resource (config_sound_picker_package_name, default com.android.soundpicker), so it no longer sends an implicit ACTION_RINGTONE_PICKER intent. - CVE-2025-22419 · platform/packages/services/Telephony
Adds WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS to the activity window in onCreate of 18 Telephony (com.android.phone) settings, SIM PIN, FDN, SIM contacts and emergency dialer activity classes so non-system overlay windows are not shown over them. - CVE-2025-22421 · platform/frameworks/base
SystemUI stops embedding notification title/text/ticker in the accessibility content description of status bar notification icons, passing an empty string instead so only the app name is included. - CVE-2025-22422 · platform/frameworks/base (android.hardware.biometrics BiometricPrompt/PromptInfo
SystemUI's AuthController now dismisses a BiometricPrompt owned by Settings' ConfirmDeviceCredentialActivity when the top activity has a different class name. It does this by carrying the owning activity's class name in PromptInfo and comparing it with the top task's component, instead of comparing package names only. - CVE-2025-22423 · platform/external/dng_sdk
dng_ifd::ParseTag in external/dng_sdk now aborts tag parsing (returns false) when CheckTagCount reports an invalid tag count for three tags, instead of ignoring the result and continuing to process the out-of-range count. - CVE-2025-22427 · platform/packages/apps/Settings
Removes the onResume/onPause overrides in Settings' NotificationAccessConfirmationActivity that passed the system-only flag SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS to Window.addFlags/clearFlags (public flag namespace), leaving only the correct onCreate handling of that flag. - CVE-2025-22428 · platform/packages/apps/Settings
Settings' AppInfoBase now checks INTERACT_ACROSS_USERS_FULL against the UID that launched the hosting activity (from ActivityManager getLaunchedFromUid) instead of against the package name from SettingsActivity.getInitialCallingPackage(). - CVE-2025-22429 · platform/frameworks/base
Changes Parcel.readArrayMap to report the number of LazyValue entries through an int[] out-parameter that is updated as each value is read. BaseBundle.initializeFromParcelLocked therefore sees the correct count in its finally block even when readArrayMap throws partway, and no longer recycles a Parcel that LazyValue entries still reference. - CVE-2025-22430 · platform/frameworks/base
Adds ACCESS_FINE_LOCATION permission enforcement to the hidden system API ITrustManager.isInSignificantPlace(), which previously had no permission check on its binder implementation. - CVE-2025-22431 · platform/frameworks/base
AppOpsService stops treating a proxy-supplied attribution tag as valid when the proxied package is a non-app uid (shell, system, etc.) unless the proxy is a system app or absent, requires the next AttributionSource in a chain to also be trusted, and re-checks remaining restrictions before resuming a paused op when one restriction is lifted. - CVE-2025-22433 · platform/frameworks/base (core/java/com/android/internal/app/IntentForwarderActivity.java) and platform/packages/modules/IntentResolver (java/src/com/android/intentresolver/IntentForwarderActivity.java)
IntentForwarderActivity.canForward now runs the cross-profile forwarding check (ACTION_CHOOSER rejection plus IPackageManager.canForwardTo) on both the forwarded intent and its selector, instead of checking only the selector when one is present. - CVE-2025-22434 · platform/frameworks/base
Adds isUserSetupComplete() and !keyguardOn conditions to the Meta+I keyboard shortcut in PhoneWindowManager so showSystemSettings() is no longer invoked while the keyguard is showing or before user setup completes. - CVE-2025-22435 · platform/packages/modules/Bluetooth
Adds a check in avdt_msg_ind (system/stack/avdt/avdt_msg.cc) that drops an incoming AVDTP response or reject whose signal id does not match the command currently pending on the CCB (p_ccb->p_curr_cmd->event), or that arrives when no command is pending. This prevents type confusion when the response is parsed. - CVE-2025-22438 · platform/frameworks/native
In InputDispatcher::afterKeyEventLockedInterruptable, take a std::shared_ptr<EventEntry> copy and a local copy of hasForegroundTarget() from the DispatchEntry before the lock is released for policy calls, so the KeyEntry stays valid and the DispatchEntry is no longer dereferenced even if a concurrent removeInputChannel drains the connection's waitQueue and deletes the DispatchEntry. - CVE-2025-22439 · platform/packages/apps/DocumentsUI
DocumentsUI's file picker now runs the existing restricted-initial-path check (/Android/data, /Android/obb, /Android/sandbox) on the restored last-accessed DocumentStack. If the stack's top document is restricted, the picker falls back to the default location. - CVE-2025-26416 · platform/external/skia
In Skia's BMP decoder, SkBmpStandardCodec::initializeSwizzler now chooses the swizzler's destination format based on xformOnDecode() instead of colorXform(). The swizzler's output pixel format now matches the buffer that decodeRows actually writes into.
Bulletin revisions
| Version | Date | Notes |
|---|---|---|
| 1.0 | April 7, 2025 | Bulletin published |
| 1.1 | April 8, 2025 | AOSP links added |
| 1.2 | April 22, 2025 | Updated CVE table |
| 1.3 | February 25, 2026 | Updated CVE table |
- 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).