March 2026: 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 | 39 | 39 | 0 | 0 | android-security-14.0.0_r25 |
| Android 15 | 38 | 37 | 0 | 1 | android-security-15.0.0_r13 |
| Android 16 | 41 | 41 | 0 | 0 | android-security-16.0.0_r4 |
| Android 17 (pre-release, 17-next) | 0 | 0 | 0 | 0 | none |
The bulletin also has 63 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_r25 adds the fix for 29 CVEs: CVE-2025-32313, CVE-2025-48567, CVE-2025-48578, CVE-2025-48579, CVE-2025-48582, CVE-2025-48609, CVE-2025-48630, CVE-2025-48635, CVE-2025-48641, CVE-2025-48642, CVE-2025-48644, CVE-2025-48645, CVE-2025-48646, CVE-2025-64783, CVE-2025-64784, CVE-2025-64893, CVE-2026-0005, CVE-2026-0011, CVE-2026-0012, CVE-2026-0013, CVE-2026-0014, CVE-2026-0015, CVE-2026-0020, CVE-2026-0021, CVE-2026-0023, CVE-2026-0024, CVE-2026-0025, CVE-2026-0034, CVE-2026-0035.
android-security-15.0.0_r13 adds the fix for 28 CVEs: CVE-2025-32313, CVE-2025-48567, CVE-2025-48578, CVE-2025-48579, CVE-2025-48582, CVE-2025-48609, CVE-2025-48630, CVE-2025-48641, CVE-2025-48642, CVE-2025-48644, CVE-2025-48645, CVE-2025-48646, CVE-2025-64783, CVE-2025-64784, CVE-2025-64893, CVE-2026-0005, CVE-2026-0011, CVE-2026-0012, CVE-2026-0013, CVE-2026-0014, CVE-2026-0015, CVE-2026-0020, CVE-2026-0021, CVE-2026-0023, CVE-2026-0024, CVE-2026-0025, CVE-2026-0034, CVE-2026-0035.
android-security-16.0.0_r4 adds the fix for 33 CVEs: CVE-2025-32313, CVE-2025-48567, CVE-2025-48578, CVE-2025-48579, CVE-2025-48582, CVE-2025-48585, CVE-2025-48587, CVE-2025-48609, CVE-2025-48630, CVE-2025-48641, CVE-2025-48642, CVE-2025-48644, CVE-2025-48645, CVE-2025-48646, CVE-2025-48654, CVE-2025-64783, CVE-2025-64784, CVE-2025-64893, CVE-2026-0005, CVE-2026-0006, CVE-2026-0011, CVE-2026-0012, CVE-2026-0013, CVE-2026-0014, CVE-2026-0015, CVE-2026-0017, CVE-2026-0020, CVE-2026-0021, CVE-2026-0023, CVE-2026-0024, CVE-2026-0025, CVE-2026-0034, CVE-2026-0035.
Announced, with no public code
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-2026-0026 | 14 (r9) | 2024-06-03 | 636 |
| CVE-2025-48544 | 14 (r22), 15 (r10), 16 (r1) | 2025-09-02 | 180 |
| CVE-2024-43766 | 14 (r24), 15 (r12), 16 (r3) | 2025-12-01 | 90 |
| CVE-2025-48568 | 14 (r24), 15 (r12) | 2025-12-01 | 90 |
| CVE-2025-48574 | 14 (r24), 15 (r12), 16 (r3) | 2025-12-01 | 90 |
| CVE-2025-48577 | 14 (r24), 15 (r12), 16 (r3) | 2025-12-01 | 90 |
| CVE-2025-48602 | 14 (r24), 15 (r12), 16 (r3) | 2025-12-01 | 90 |
| CVE-2025-48619 | 14 (r24), 15 (r12), 16 (r3) | 2025-12-01 | 90 |
| CVE-2025-48631 | 14 (r24), 15 (r12), 16 (r3) | 2025-12-01 | 90 |
| CVE-2025-48634 | 14 (r24), 15 (r12), 16 (r3) | 2025-12-01 | 90 |
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: 8 fixes in android-security-14.0.0_r25
Show the list
Android 15: 8 fixes in android-security-15.0.0_r13
Show the list
Android 16: 9 fixes in android-security-16.0.0_r4
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-43766 · platform/packages/modules/Bluetooth
Makes the Bluetooth stack start LE link encryption as soon as an ACL connection to an already-bonded LE device is established (in StackAclBtmAcl::btm_establish_continue). Follow-up commits suppress spurious SMP failure handling, fix the order of the L2CAP link-state update and save the peer CSRK with the correct security level. - CVE-2025-32313 · platform/frameworks/native libbinder Parcel; platform/frameworks/base core (android.app.usage.UsageEvents
Fixes Parcel::appendFrom to decide whether to grow the buffer based on the current write position (mDataPos) instead of mDataSize, and adds validation in UsageEvents(Parcel) and NotificationHistory(Parcel) that a parcel-supplied position value does not exceed the rebuilt parcel's data size before it is applied with setDataPosition. - CVE-2025-48544 · platform/packages/providers/MediaProvider
Removes the internal Bundle extra MediaProvider#INCLUDED_DEFAULT_DIRECTORIES. In its place, an explicit Optional<List<String>> parameter is passed through getQueryBuilder, appendAccessCheckQuery and AccessChecker.getWhereForConstrainedAccess. As a result, only the FUSE directory-rename path supplies the default-directory access SQL, and the contents of an extras Bundle no longer affect it. - CVE-2025-48567 · platform/packages/providers/MediaProvider
MediaProvider now NFD-normalizes file paths and strips Unicode default-ignorable code points (e.g. zero-width space) before the regex-based private app directory (Android/data, Android/obb) checks in isPrivatePackagePathNotAccessibleByCaller and isUidAllowedAccessToDataOrObbPathForFuse. - CVE-2025-48568 · platform/frameworks/base
Makes user switching to a secure user wait for a SystemUI lock-now callback, and makes SystemUI reject keyguard exit animations whose going-away request was made for a user other than the current one. This keeps the keyguard from being dismissed across a user switch. - CVE-2025-48574 · platform/frameworks/base
DisplayPolicy.validateAddingWindowLw now enforces MANAGE_ACTIVITY_TASKS against the explicitly supplied callingPid/callingUid when a window requests PRIVATE_FLAG_INTERCEPT_GLOBAL_DRAG_AND_DROP, instead of calling ActivityTaskManagerService.enforceTaskPermission(), which reads the Binder calling identity that has already been cleared at that point. - CVE-2025-48577 · platform/frameworks/base
KeyguardViewMediator now re-checks the target user id at several points in the biometric-auth and keyguardDone/keyguardGoingAway dismissal chain. If the current user changed in between, it resets the keyguard instead of letting a pending dismissal started before the user switch complete. - CVE-2025-48578 · platform/packages/providers/MediaProvider
Makes MediaProvider restore the caller identity it had cleared before an exception propagates: in MediaProvider#updateInternal when ContentUris.parseId throws NumberFormatException, and (on 15/16) in MediaProvider#getResultForGetMediaUri when an unsupported document authority causes an IllegalArgumentException. - CVE-2025-48579 · platform/packages/providers/MediaProvider
MediaProvider now restores the cleared calling identity before rethrowing when ContentUris.parseId throws NumberFormatException in updateInternal (and, in the 15/16 commits, before throwing IllegalArgumentException for an unsupported authority in getResultForGetMediaUri), so these exceptions no longer leave MediaProvider's own identity in effect. - CVE-2025-48582 · platform/packages/providers/MediaProvider
MediaProvider now records the uid of the app that created a bulk create request inside the PendingIntent extras for PermissionActivity, and PermissionActivity uses that uid, instead of Activity.getCallingPackage(), to decide whether user consent is needed and to which package URI permissions are granted. - CVE-2025-48585 · platform/packages/modules/Profiling
ProfilingService now verifies, via PackageManager.getPackagesForUid, that the package name supplied by the client to addProfilingTriggers, removeProfilingTriggers and clearProfilingTriggers actually belongs to Binder.getCallingUid(), throwing SecurityException otherwise. - CVE-2025-48587 · platform/packages/modules/Profiling
Adds server-side validation of the trigger type in ProfilingService.addTrigger so that triggers with an unsupported type are rejected (IllegalArgumentException) instead of being stored, and makes the persisted-trigger load path skip such triggers. - CVE-2025-48602 · platform/frameworks/base
KeyguardViewMediator now drops any queued START_KEYGUARD_EXIT_ANIM message on user switch and, when the exit animation has been flagged as canceled, the post-traversal completion callback finishes the remote animation with the keyguard showing and forces the showing state instead of only logging and returning. - CVE-2025-48609 · platform/packages/providers/TelephonyProvider
MmsProvider.deleteDataRows now verifies that the file path read from a part/drm row's _data column canonically resolves under the provider's "parts" directory before calling File.delete(), reusing the same check openFile already performed. - CVE-2025-48619 · platform/frameworks/base
ContentProvider's binder Transport now sanitizes the file open mode string in openFile and openAssetFile, silently removing the truncate ('t') and append ('a') flags when the write ('w') flag is absent, before both the permission check and the call into the provider. - CVE-2025-48630 · platform/frameworks/native
SkiaRenderEngine::drawLayersInternal now clips the canvas to the layer bounds before drawing blur regions when no rounded-corner clip is present, so a client-supplied blur region larger than the layer can no longer draw blurred content outside the layer's bounds. - CVE-2025-48631 · platform/frameworks/base
Adds a hard 4096 px per-dimension limit in LocalImageResolver.onHeaderDecoded so that decoding of oversized images is aborted (RuntimeException, surfaced as IOException from resolveImage) instead of being attempted at the risk of exhausting device memory. - CVE-2025-48634 · platform/frameworks/base
Adds a permission-based sanitizer (sanitizePrivateFlags) to WindowManagerService relayout so that a client cannot newly set PRIVATE_FLAG_TRUSTED_OVERLAY / PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY without INTERNAL_SYSTEM_WINDOW, or PRIVATE_FLAG_INTERCEPT_GLOBAL_DRAG_AND_DROP without MANAGE_ACTIVITY_TASKS. - CVE-2025-48635 · platform/frameworks/base
TaskFragmentOrganizerController now refuses to register a TaskFragment organizer from a non-positive pid and only hands the real activity token to an organizer when both the activity's pid and uid match the organizer's, preventing an activity token from being leaked to another process. - CVE-2025-48641 · platform/hardware/st/nfc
In the ST NFC AIDL HAL (platform/hardware/st/nfc, aidl/Nfc.h), the static eventCallback and dataCallback now copy the static shared_ptr Nfc::mCallback into a local std::shared_ptr under a new static pthread mutex sCallbackLock and call sendEvent/sendData on that local strong reference, instead of null-checking and dereferencing the shared static directly. - CVE-2025-48642 · platform/packages/modules/Virtualization
Changes pvmfw's aarch64 data-cache maintenance from "dc cvau" (clean to Point of Unification) to "dc cvac" (clean to Point of Coherency) in the exit path jump_to_payload and in the flush_region helper, so that zeroed memory that could hold secrets reaches main memory. - CVE-2025-48644 · platform/frameworks/base
Caps the cumulative size of resolved InputMethodInfo metadata attributes at MAX_METADATA_SIZE_BYTES via a TypedArrayWrapper/MetadataReadBytesTracker in the InputMethodInfo constructor, and moves the IInputMethodManager list-returning IPCs (getInputMethodList, getEnabledInputMethodList, getEnabledInputMethodSubtypeList) to blob-backed InputMethodInfoSafeList/InputMethodSubtypeSafeList parcelables to avoid oversized Binder transactions. - CVE-2025-48645 · platform/frameworks/base
Wraps the pm.getText() call in DeviceAdminInfo.loadDescription in a try/catch that converts an OutOfMemoryError into a NotFoundException, so an oversized device-admin description resource no longer propagates an Error to the caller. - CVE-2025-48646 · platform/frameworks/base
In ActivityStarter's FLAG_ACTIVITY_FORWARD_RESULT trampoline handling, the fix no longer always copies sourceRecord.launchedFromPackage into callingPackage. It now does so only after PackageManagerInternal.getPackageUid shows the package belongs to the same app as callingUid (UserHandle.isSameApp). - CVE-2025-48654 · platform/frameworks/base
CompanionDeviceManagerService now disassociates every association that the AssociationStore reports as revoked during service start-up, so revoked associations no longer survive a reboot. - CVE-2025-64783 · platform/external/dng_sdk
Google fixed this High-severity information disclosure in external/dng_sdk by updating the whole bundled Adobe DNG SDK to version 1.7.1 build 2410 (61 files, about 2700 insertions) rather than with an isolated point fix. - CVE-2025-64784 · platform/external/dng_sdk (Adobe DNG SDK: DNG/TIFF/JXL parsing
Google fixed this High-severity information-disclosure issue in platform/external/dng_sdk by replacing the vendored Adobe DNG SDK with upstream version 1.7.1 build 2410 (61 files, +2721/-694). This is a wholesale update with many parser, stream and fingerprinting changes rather than a single targeted check. - CVE-2025-64893 · platform/external/dng_sdk (Adobe DNG SDK: DNG/TIFF parsing
The fix syncs platform/external/dng_sdk to Adobe DNG SDK 1.7.1 build 2410 (61 files, +2721/-694). Among many unrelated changes it adds a size cap on the new GainMapMetadata tag, rewrites the dng_opcode_GainMap::ProcessArea loop, adds new JXL chunked reader/writer classes with checked sizing, and encapsulates dng_fingerprint and dng_md5_printer. The material does not isolate which change closes the bulletin's information-disclosure bug. - CVE-2026-0005 · platform/frameworks/base
Adds IActivityTaskManager.rebuildSystemLockTaskPinnedMode() (gated by enforceTaskPermission) that re-applies the recents, task-change-listener, status bar and keyguard state of app pinned mode for the existing locked task, has SystemUI's KeyguardViewMediator call it when ATMS reports LOCK_TASK_MODE_PINNED, and makes KeyguardServiceDelegate keep the keyguard enabled flag across a keyguard service disconnect, so that the device stays in app pinned mode upon a SystemUI crash. - CVE-2026-0006 · platform/external/libopenapv (OpenAPV codec library). Per index search
The fix upgrades external/libopenapv as a whole, from upstream v0.1.13.1 to v0.2.0.0 (commit cf0a0e7a810e, bug 423894847). This replaces the APV bitstream/VLC code (src/oapv_vlc.c), the metadata handling (src/oapv_metadata.c), the bitstream reader/writer (src/oapv_bs.c) and the core codec (src/oapv.c) with newer upstream code, and changes the public API in inc/oapv.h. - CVE-2026-0011 · platform/frameworks/base
Makes Settings.enableSystemPackageLPw able to reuse the disabled PackageSetting of a shared-UID system app when its update is uninstalled. addPackageLPw now accepts the package even when registerExistingAppId fails for a shared-UID package, and the shared user app ID is restored on the reused setting, so the preloaded app is no longer re-scanned and installed as a new app with a possibly different UID. - CVE-2026-0012 · platform/frameworks/base
In SystemUI ExpandableNotificationRow.setHideSensitive, the decision to skip the hide-sensitive (public/private layout) animation and apply visibility and content alphas immediately is now taken also when the row is showing the public (redacted) layout and the showing layout did not change; before the fix this depended only on the `animated` flag (Android 14/15) or used a feature flag plus layout-unchanged (Android 16). - CVE-2026-0013 · platform/packages/apps/DocumentsUI
PickActivity.setupLayout now calls setSelector(null) on the copied "more apps" intent so a caller-supplied selector can no longer redirect the activity launch DocumentsUI performs on the caller's behalf. - CVE-2026-0014 · platform/frameworks/base
Adds an early `Process.isSdkSandboxUid(uid)` check to the attribution-tag validation helper in AppOpsService, so that for a non-null packageName the helper returns false for SDK sandbox UIDs instead of treating them as trusted/system. - CVE-2026-0015 · platform/frameworks/base
AppOpsService now only accepts proxied attribution tags from trusted proxies (flags without OP_FLAG_UNTRUSTED_PROXIED). It also checks that the proxy package really belongs to the proxy uid before treating it as system, stops the start dry run and finish paths from creating per-tag state, and finds the AttributedOp to finish by clientId and trust flag. - CVE-2026-0017 · platform/frameworks/base (services/core biometrics
When the new per-modality biometric settings keys (FACE_/FINGERPRINT_KEYGUARD_ENABLED, FACE_/FINGERPRINT_APP_ENABLED) are unset after an OTA, BiometricService and the Settings preference controllers now inherit the value of the legacy BIOMETRIC_KEYGUARD_ENABLED / BIOMETRIC_APP_ENABLED keys instead of falling back to the hard-coded default. - CVE-2026-0020 · platform/frameworks/base
Package manifest parsing now trims leading/trailing whitespace from <permission>, <permission-tree> and <permission-group> names in ParsedPermissionUtils, so a declared name is stored in trimmed form rather than as written in the manifest. - CVE-2026-0021 · platform/packages/apps/Settings
In packages/apps/Settings, AppInfoBase's caller permission check now, on devices with activity embedding (multi-pane) enabled, verifies that the SettingsActivity's initial calling package holds INTERACT_ACROSS_USERS_FULL instead of relying on getLaunchedFromUid, and the Settings$AppUsageAccessSettingsActivity intent-filter gets android:priority="1". - CVE-2026-0023 · platform/frameworks/base
In PackageInstallerService.java, the session creation path now always clears PackageManager.INSTALL_FROM_MANAGED_USER_OR_PROFILE from the caller-supplied params.installFlags, then adds it back only when DevicePolicyManagerInternal.isUserOrganizationManaged(userId) is true. - CVE-2026-0024 · platform/packages/providers/MediaProvider
MediaProvider's redaction decision for files opened via ContentResolver now also considers the UID passed in MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, so media opened by a picker on behalf of an app lacking ACCESS_MEDIA_LOCATION gets location metadata redacted. - CVE-2026-0025 · platform/frameworks/base
Notification.java now reads EXTRA_MESSAGES and EXTRA_HISTORIC_MESSAGES with getParcelableArrayFromBundle(..., Bundle.class) instead of extras.getParcelableArray(..., Parcelable.class), so the element type is restricted to Bundle and arbitrary Parcelable element types are no longer accepted. - CVE-2026-0026 · platform/frameworks/base
Adds an early return in PermissionManagerServiceImpl.removePermission() so that a non-dynamic permission is no longer removed from the permission registry after the "not allowed to modify non-dynamic permission" condition is detected. - CVE-2026-0034 · platform/frameworks/base
Two frameworks/base commits bound the per-user ManagedServices approval state: uninstalling a package now also removes its entries from mUserSetServices, and setPackageOrComponentEnabled refuses to add more than MAX_SERVICE_ENTRIES (100) entries per user to mApproved / mUserSetServices, returning a boolean so NotificationManagerService callers skip follow-up work when nothing changed. - CVE-2026-0035 · platform/packages/providers/MediaProvider
MediaProvider now rejects MediaStore CREATE_WRITE/DELETE/..._REQUEST calls with an IllegalArgumentException when any requested URI does not resolve to exactly one existing row at request time.
Bulletin revisions
| Version | Date | Notes |
|---|---|---|
| 1.0 | March 2, 2026 | Bulletin published |
| 1.1 | March 4, 2026 | AOSP Links Added |
| 1.2 | March 9, 2026 | Updated Issue List |
| 1.3 | March 10, 2026 | Updated Issue List |
| 1.4 | April 2, 2026 | Updated Issue List |
| 1.5 | April 17, 2026 | Updated Issue List |
| 1.6 | May 28, 2026 | Updated Issue List |
- 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).