Android security tags, read closely by Lightrion

CVE-2025-48583 AI-generated analysis

platform/frameworks/base, core/java/android/os (Bundle / Parcel lazy-value handling)

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 (7 corrections). Verify against the commit before relying on it.

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.

Root cause

In core/java/android/os/BaseBundle.java, if a bundle owned its lazy values (mOwnsLazyValues), BaseBundle called recycleParcel(), which calls Parcel.recycle(), in two places: when the lazy-value refcount mLazyValues reached zero in unwrapLazyValueFromMapLocked, and in clear(). recycle() puts the Parcel object back into the static sOwnedPool/sHolderPool, so a later obtain() can hand the same instance out again. The bundle only held the parcel through a WeakReference (mWeakParcelledData). According to the commit message, recycling the parcel once all lazy values are consumed may lead to several UAF issues. The material does not show which remaining references see the reused instance. On Android 14, the code also asserted with Preconditions.checkState that the weak reference was still non-null when the refcount hit zero ("Parcel recycled earlier than expected").

How the fix works

Completeness

Behavior changes

Per major

Unknowns

Back to December 2025 · Findings