Android security tags, read closely by Lightrion

CVE-2025-48535 AI-generated analysis

platform/packages/apps/Settings, users/AppRestrictionsFragment (app restrictions UI for restricted users)

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.

In Settings' AppRestrictionsFragment, the custom restrictions Intent supplied by an app is no longer launched as received after vetting. Settings now launches a copy pinned to the exact component and package that passed the resolveActivity/package check, and a second commit makes that same copy the object that is resolved.

Root cause

RestrictionsResultReceiver.onReceive takes an Intent from the broadcast result extras (Intent.EXTRA_RESTRICTIONS_INTENT, supplied by the target app). If the fragment is resumed and invokeIfCustom is set, it calls assertSafeToStartCustomActivity(restrictionsIntent). That method resolved the intent with mPackageManager.resolveActivity(intent, MATCH_DEFAULT_ONLY) and checked that the resolved activityInfo.packageName equals the expected packageName, but it returned nothing. The caller then called startActivityForResult(new Intent(restrictionsIntent), requestCode) on a fresh copy of the untrusted intent, and never set the vetted component or package on that copy. The check and the launch therefore ran on different Intent objects, and the launch did not carry the verified component. As a result, the activity that Settings (a highly privileged app) actually started was not guaranteed to be the one that passed the package check.

How the fix works

Completeness

Behavior changes

Per major

Unknowns

Back to September 2025 · Findings