Android security tags, read closely by Lightrion

CVE-2025-48566 AI-generated analysis

platform/frameworks/base, cross-profile intent forwarding (com.android.internal.app.IntentForwarderActivity, android.content.pm.PackageManager / android.app.ApplicationPackageManager)

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

IntentForwarderActivity now resolves the received intent's MIME type once and passes that same string both to the IPackageManager.canForwardTo check and to a new PackageManager.resolveActivityAsUser(Intent, String resolvedType, ...) overload. It also sanitizes the received intent's selector and uses getLaunchedFromPackage() instead of getCallingPackage() for the privileged skip-consent check.

Root cause

In core/java/com/android/internal/app/IntentForwarderActivity.java, canForwardInner computed resolvedType itself with intent.resolveTypeIfNeeded(contentResolver). The later mInjector.resolveActivityAsUser(newIntent, MATCH_DEFAULT_ONLY, targetUserId) went through ApplicationPackageManager.resolveActivityAsUser, which called intent.resolveTypeIfNeeded(mContext.getContentResolver()) again. So the type was derived from the intent twice. Per the commit message, an intent that changes its type after the IntentForwarder#canForward check is checked against one type and resolved with another. The same class had two more issues. First, the path that forwards intentReceived to the resolver (the sanitizeIntent(intentReceived) block before startActivityAsCaller) sanitized only the top-level intent and not intentReceived.getSelector(). Second, the privileged skip-user-consent decision used getCallingPackage() rather than getLaunchedFromPackage().

How the fix works

Completeness

Behavior changes

Per major

Unknowns

Back to September 2026 · Findings