CVE-2026-106326
Overview
Files Changed
chrome/android/java/src/org/chromium/chrome/browser/media/MediaLauncherActivity.java
Patch
From 944f71b690626ff076eb8317e9108edd24e9240b Mon Sep 17 00:00:00 2001
From: Ted Meyer <tmathmeyer@chromium.org>
Date: Mon, 31 Aug 2026 19:43:39 -0700
Subject: [PATCH] [MediaLauncher] Only allow content:// and file://
disallow access to non-system local files for local media launching and
playback.
Fixed: 511745101
Change-Id: If884b9a9a88716a08c196f8f1a0bdee5aed2e58c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8333327
Auto-Submit: Ted (Chromium) Meyer <tmathmeyer@chromium.org>
Commit-Queue: Syed AbuTalib <lowkey@google.com>
Commit-Queue: Ted (Chromium) Meyer <tmathmeyer@chromium.org>
Reviewed-by: Syed AbuTalib <lowkey@google.com>
Cr-Commit-Position: refs/heads/main@{#1689552}
---
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaLauncherActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaLauncherActivity.java
index d66fdad..4bc4abc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaLauncherActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaLauncherActivity.java
@@ -87,6 +87,10 @@
return getContentResolver().getType(uri);
}
+ if (!uriScheme.equals(ContentResolver.SCHEME_FILE)) {
+ return null;
+ }
+
// Otherwise, use the file extension.
String filteredUri = filterURI(uri);
String fileExtension = MimeTypeMap.getFileExtensionFromUrl(filteredUri);
Original Bug Report
Bypass of chrome:// restrictions via MediaLauncherActivity confused deputy
Project Fortify, an experimental security project, has identified the following potential security issue. If you’re a feature owner CC-ed on this bug, please do your best to review these reports without the Chrome Security team. Please see https://chromium.googlesource.com/chromium/src/+/main/docs/security/ai-generated-security-bugs-faq.md for more information.
Overview: A confused deputy vulnerability in MediaLauncherActivity potentially allows a malicious local app to navigate Chrome to restricted internal chrome:// URLs. By passing a crafted URI to the exported MediaLauncherActivity, an attacker can bypass intent filtering, upgrade the intent to trusted status, and evade the unsafe URL checks.
Affected files:
chrome/android/java/src/org/chromium/chrome/browser/media/MediaLauncherActivity.javachrome/android/java/src/org/chromium/chrome/browser/media/MediaViewerUtils.javachrome/android/java/src/org/chromium/chrome/browser/IntentHandler.javachrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.javachrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java
Estimated timestamp from git blame: 2026-01-21
Summary
A potential logic flaw in Chrome for Android allows an attacker-controlled application to bypass the internal URL security defense. This defense is designed to prevent external applications from navigating to internal schemes, protecting sensitive URLs such as chrome://settings or chrome://flags.
The vulnerability stems from a confused-deputy pattern where MediaLauncherActivity processes an untrusted intent, validates its media type using a bypassable method, and then re-dispatches it as a ’trusted’ intent originating from Chrome itself.
Technical Details
- Entry Point:
MediaLauncherActivityis an exported activity (android:exported="true") reachable by explicit intents from any installed application. It is enabled at runtime on specific devices like Android Go or enterprise-managed profiles. - MIME Type Validation Bypass: When
MediaLauncherActivityreceives an intent, it checks if the data URI is a valid media type. For a URI likecustomtab://x.mp4?chrome://settings, the scheme is notcontent://, so it extracts the file extension. The Android framework’sMimeTypeMap.getFileExtensionFromUrl()strips the query parameter and extracts.mp4. This matchesvideo/mp4, bypassing the media check. - Privilege Escalation:
MediaViewerUtils.getMediaViewerIntent()prepares a navigation intent based on the attacker’s data. It callsIntentUtils.addTrustedIntentExtras(intent). Since the intent targets Chrome itself (viaChromeLauncherActivity), Chrome’s internalPendingIntentauthentication token is attached, marking the intent as trusted. - Defense Bypass: The intent is dispatched to
IntentHandler.IntentHandler.getUrlForCustomTab()extracts the navigation URL. For thecustomtab://scheme, it returns the decoded query component. Forcustomtab://x.mp4?chrome://settings, this yieldschrome://settings.LaunchIntentDispatchercallsshouldIgnoreIntentUrl(). Because the intent contains the trustedPendingIntenttoken,wasIntentSenderChrome(intent)returns true.shouldIgnoreIntentUrlperforms an early return if the sender is Chrome, skipping theintentHasUnsafeUrl()check which is the primary defense against unauthorizedchrome://navigations.
- Navigation: The Custom Tab attempts to load the media, but because the scheme is not
file://,CustomTabIntentDataProviderdoes not override the URL. Thechrome://settingsURL is loaded.
Impact
This vulnerability potentially allows an installed malicious application to force Chrome to navigate to any internal chrome://, chrome-native://, or about: URL. This bypasses the security boundary intended to keep these pages unreachable from external apps, exposing sensitive WebUI surfaces.
Potential Reproduction Steps
Note: These are suggested steps based on source code analysis; we do not have a working PoC.
- On an Android device where
MediaLauncherActivityis enabled, install a malicious app. - The malicious app sends an explicit intent to
org.chromium.chrome.browser.media.MediaLauncherActivity. - Set the intent action to
ACTION_VIEWand the data toUri.parse("customtab://x.mp4?chrome://settings/clearBrowserData"). - Execute
startActivity(intent). - Observe that Chrome launches and navigates to the
chrome://settings/clearBrowserDatapage without user interaction.
Suggested Fix
Add a security check within MediaLauncherActivity.onCreate() to validate incoming intents before processing them. By calling IntentHandler.shouldIgnoreIntent(input, false), Chrome will evaluate the target URL against its unsafe URL list, effectively blocking chrome:// payloads originating from external sources before they are repackaged as trusted intents.
Evaluated with Chrome root at commit: eca8648a4e1cdfdda68c495a6003059fed641955
Results so far have been promising, but there can be wrong deductions. If this proves to be a false positive, please close as WAI; data from false positives will be used to improve accuracy over time. And please feel free to reach out to me directly if you have concerns or feedback on the project.