Android security tags, read closely by Lightrion

CVE-2025-48565 AI-generated analysis

platform/frameworks/base, core/java/com/android/internal/app/IntentForwarderActivity (cross-profile intent forwarding), plus PackageManager / ApplicationPackageManager hidden API

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

IntentForwarderActivity now resolves the intent MIME type once and passes that same string to both the IPackageManager.canForwardTo cross-profile check and the target-user activity resolution (via a new hidden PackageManager.resolveActivityAsUser(Intent, String resolvedType, ...) overload), uses getLaunchedFromPackage() instead of getCallingPackage() for the privileged skip-user-consent check, and (after a follow-up on 14) sanitizes intent selectors (package, component, nested selector) in every sanitizeIntent call.

Root cause

In IntentForwarderActivity.onCreate the cross-profile check canForward -> canForwardInner computed the type with intent.resolveTypeIfNeeded(contentResolver) and passed it to IPackageManager.canForwardTo; afterwards mInjector.resolveActivityAsUser(newIntent, MATCH_DEFAULT_ONLY, targetUserId) went through ApplicationPackageManager.resolveActivityAsUser, which independently called intent.resolveTypeIfNeeded(...) again. The commit message states the intent can change its type after the canForward check, so the type authorized for forwarding is not necessarily the type used for resolution in the other user. Additionally, launchResolverActivityWithCorrectTab sanitized only intentReceived and not its selector, and the managed-profile path computed callingPackage via getCallingPackage() for the EXTRA_SKIP_USER_CONFIRMATION privileged-caller decision.

How the fix works

Completeness

Behavior changes

Per major

Unknowns

Back to September 2026 · Findings