Android security tags, read closely by Lightrion

CVE-2025-48564 AI-generated analysis

platform/frameworks/base (core: IntentForwarderActivity, PackageManager/ApplicationPackageManager) and platform/packages/modules/IntentResolver (IntentForwarderActivity, cross-profile intents checker)

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.

IntentForwarderActivity now resolves the forwarded intent's MIME type once and passes that single string to both the IPackageManager.canForwardTo check and a new hidden PackageManager.resolveActivityAsUser(Intent, String resolvedType, flags, userId) overload, so the type used for the cross-profile check is the same as the type used for target resolution; the frameworks/base copy also uses getLaunchedFromPackage() for the privileged skip-consent check, and both copies sanitize the intent selector on the resolver path.

Root cause

In IntentForwarderActivity.onCreate, the forwarding decision and the target resolution each derived the intent's type on their own. canForwardInner called intent.resolveTypeIfNeeded(contentResolver) and passed the result to IPackageManager.canForwardTo, which per index search enforces INTERACT_ACROSS_USERS_FULL in ComputerEngine.canForwardTo. After that, mInjector.resolveActivityAsUser(newIntent, MATCH_DEFAULT_ONLY, targetUserId) went through ApplicationPackageManager.resolveActivityAsUser, which called intent.resolveTypeIfNeeded(mContext.getContentResolver()) again before mPM.resolveIntent. The commit message states that 'allowing the intent to declare its own type can lead to a security vulnerability if the intent changes its type after the IntentForwarder#canForward check'. Two related gaps were fixed in the same change: the privileged EXTRA_SKIP_USER_CONFIRMATION path identified the caller with getCallingPackage() instead of getLaunchedFromPackage(), and on the path that hands intentReceived to the resolver via startActivityAsCaller only the outer intent was sanitized, not its selector.

How the fix works

Completeness

Behavior changes

Per major

Unknowns

Back to September 2026 · Findings