Android security tags, read closely by Lightrion

CVE-2026-49881 AI-generated analysis

platform/packages/services/Telecomm (InCallController) and platform/frameworks/base (core/res/AndroidManifest.xml), Telecom InCallService binding

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

Removes InCallController.serviceClassExists and the 'android.telecom.CLASS_EXISTENCE_CHECK' metadata check from Telecom. That code loaded a third-party package's code inside Telecom during InCallService enumeration (CONTEXT_INCLUDE_CODE | CONTEXT_IGNORE_SECURITY, then getClassLoader and Class.forName). The fix also drops the now-unused metadata from ConnectivityCallListenerService in the framework manifest.

Root cause

InCallController.getInCallServiceComponents() enumerated InCallService components with queryIntentServices(GET_META_DATA | MATCH_DISABLED_COMPONENTS). For any entry whose ServiceInfo.metaData had 'android.telecom.CLASS_EXISTENCE_CHECK' = true, it called serviceClassExists(). That method called mContext.createPackageContextAsUser(serviceInfo.packageName, CONTEXT_INCLUDE_CODE | CONTEXT_IGNORE_SECURITY, userHandle), then packageContext.getClassLoader() and Class.forName(serviceInfo.name, false, classLoader). The app that declared the InCallService controlled both the metadata flag and the package, so Telecom loaded that app's code into its own process. Per the commit message, this allowed arbitrary code execution in system_server through a custom AppComponentFactory. In the diff, the check is the first statement inside the 'serviceInfo != null' block of the loop.

How the fix works

Completeness

Behavior changes

Per major

Unknowns

Back to September 2026 · Findings