CVE-2026-79225
Overview
Background
- Renderer debug URLs
- special URLs such as
javascript:,chrome://crash,chrome://killand similar that instruct the renderer to perform debug actions, and which are gated because they can be triggered programmatically. - DevTools access policy
- an enterprise/profile setting that can block DevTools for a page; when DevTools is blocked, debug URLs are supposed to be blocked too.
- `ENABLE_DEVTOOLS_FRONTEND`
- a build flag indicating the DevTools frontend is compiled in; it can be false even on non-Android desktop builds and is generally false where DevTools is not shipped.
- `IS_ANDROID`
- a build flag that is true on Android builds.
Root Cause Analysis
The changed function (the enclosing name is not in the hunk; from the file it is ChromeContentBrowserClient::ShouldBlockRendererDebugURL (inferred)) decides whether a renderer debug URL should be blocked, and it contains a block that consults the DevTools access policy: “If devtools access is blocked for the page, debug URLs should also be blocked.”
Pre-patch, that block was compiled under #if !BUILDFLAG(IS_ANDROID), meaning the DevTools-blocked-implies-debug-URL-blocked check was simply skipped on Android.
As a result, on Android a debug URL could be permitted even when DevTools access was blocked for the page, an incorrect authorization.
The fix changes the guard to #if BUILDFLAG(ENABLE_DEVTOOLS_FRONTEND) and moves the devtools_window.h include under the same flag, so the policy check now runs on Android (where DevTools frontend is enabled) and correctly ties debug-URL blocking to DevTools blocking, while excluding builds that lack the DevTools frontend entirely.
!IS_ANDROID), excluding Android entirely; the fix re-conditions it on ENABLE_DEVTOOLS_FRONTEND so the check runs wherever DevTools exists, including Android.Attack Path
- Target an Android profile with DevTools blocked A page runs in a context where the DevTools access policy blocks DevTools for that page, which should also block debug URLs.
- Invoke a renderer debug URL The page attempts to navigate to or trigger a renderer debug URL that the debug-URL handler evaluates.
- Skip the policy check on Android
Because the DevTools-blocked check was compiled out under
#if !BUILDFLAG(IS_ANDROID), the handler does not consult the DevTools policy on Android and fails to block the debug URL. - Debug action proceeds
The debug URL is honored despite the DevTools/debug restriction, violating the intended authorization (the concrete downstream effect is not shown in the diff)
(inferred).
Impact Assessment
Files Changed
chrome/browser/chrome_content_browser_client.cc
Audit Directions
- Platform-conditional security checksSearch for
#if !BUILDFLAG(IS_ANDROID)(or other platform guards) wrapping authorization or policy checks; verify the platform exclusion is intentional rather than accidentally disabling enforcement. - Feature-flag vs platform-flag mismatchLook for checks that depend on a subsystem (e.g., DevTools) but are gated on a platform flag instead of the subsystem’s own capability flag (e.g.,
ENABLE_DEVTOOLS_FRONTEND). - Debug/privileged URL gatingAudit all decision points that permit
javascript:/chrome://debug URLs to ensure each consults the relevant access policies uniformly across every platform.
Patch
From ea3598ed49db149f49fea869b5cb4d1bde0de32e Mon Sep 17 00:00:00 2001 From: Ryo Hashimoto <[email protected]> Date: Thu, 16 Jul 2026 09:24:51 -0700 Subject: [PATCH] android: Block renderer debug URL if DevTools is not allowed BUG=533059149 Change-Id: I5315837844c3d801778762a5fea5465a0c3d9d96 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8068618 Reviewed-by: Danil Somsikov <[email protected]> Commit-Queue: Ryo Hashimoto <[email protected]> Cr-Commit-Position: refs/heads/main@{#1663171} --- diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 7a8f0d2..9c1c3cc 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc @@ -549,7 +549,6 @@ #include "chrome/browser/actor/actor_keyed_service.h" #include "chrome/browser/actor/actor_keyed_service_factory.h" #include "chrome/browser/devtools/chrome_devtools_manager_delegate.h" -#include "chrome/browser/devtools/devtools_window.h" #include "chrome/browser/digital_credentials/digital_identity_provider_desktop.h" #include "chrome/browser/direct_sockets/chrome_direct_sockets_delegate.h" #include "chrome/browser/indigo/onboarding/indigo_onboarding_dialog.h" @@ -640,6 +639,10 @@ #include "components/captive_portal/content/captive_portal_url_loader_throttle.h" #endif +#if BUILDFLAG(ENABLE_DEVTOOLS_FRONTEND) +#include "chrome/browser/devtools/devtools_window.h" +#endif + #if BUILDFLAG(ENABLE_EXTENSIONS_CORE) #include "chrome/browser/extensions/chrome_content_browser_client_extensions_part.h" #include "chrome/browser/extensions/chrome_extension_cookies.h" @@ -7790,7 +7793,7 @@ const GURL& url, content::BrowserContext* context, content::RenderFrameHost* render_frame_host) { -#if !BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(ENABLE_DEVTOOLS_FRONTEND) // If devtools access is blocked for the page, debug URLs should also be // blocked for the page. Profile* profile = Profile::FromBrowserContext(context);