High CVSS 4.3 chrome Policy Bypass 📄 Reporter bug report 🔧 Commit mapped

Overview

High
Severity
4.3
CVSS
No
Exploited ITW
Fixed
Fix Status
ImpactInsufficient policy enforcement in Navigation
DescriptionInsufficient policy enforcement in Navigation
ComponentNavigation
Bug ClassPolicy Bypass
Tracker526541544
Fix commit85fede76fe07 (chromium/src) +5/-3
CWECWE-602
CVSS vectorCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N
CISA KEVNot listed
CreditedGoogle
Reported2026-06-22 (per vendor advisory)
Fix landed2026-06-23 (public git)
Disclosed2026-07-08
Patch gap15 days — fix public in source before the advisory

Files Changed

  • content/browser/renderer_host/navigation_request.cc
From 85fede76fe078d4ea9622a0c37b81c6852b0cf93 Mon Sep 17 00:00:00 2001
From: Alex Moshchuk <[email protected]>
Date: Tue, 23 Jun 2026 14:10:35 -0700
Subject: [PATCH] Restore CHECK for CanAccessOrigin().

The CanAccessOrigin() check in
NavigationRequest::GetOriginForURLLoaderFactoryAfterResponse() was
always a CHECK to begin with and was incorrectly downgraded to a DCHECK
in https://chromium-review.googlesource.com/c/chromium/src/+/7748832.

Note: there was always an ongoing trickle of known crashes resulting
from this check (going back to at least 2020), and this is tracked is
issues such as https://crbug.com/469092870 and
https://crbug.com/463029421. These reports will probably reappear once
this CL lands and might be seen as a new spike; please avoid reverting
this CL due to that, as this check turns potential security problems
into stability ones, so it's important to keep.

Bug: 526541544
Change-Id: Ib077b83303fb8633d60b773a30529900008b62a7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7986809
Commit-Queue: Alex Moshchuk <[email protected]>
Reviewed-by: Charlie Reis <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1651274}
---

diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index f638782..5bd7686 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -9722,14 +9722,16 @@
   //   policy of the process being used. This is because the content is loaded
   //   from the MHTML archive within the process. There are no data loaded from
   //   the network.
+  //
+  // Note: This is a security-critical check that needs to be a CHECK rather
+  // than a DCHECK, and it should never be reverted, even if there are crashes
+  // in the wild.
   if (HasRenderFrameHost() &&
       !GetRenderFrameHost()->ShouldBypassSecurityChecksForErrorPage(this) &&
       !IsForMhtmlSubframe()) {
     int process_id = GetRenderFrameHost()->GetProcess()->GetDeprecatedID();
     auto* policy = ChildProcessSecurityPolicyImpl::GetInstance();
-    // TODO(https://crbug.com/526541544): CHECK-exclusion: Convert to CHECK once
-    // we are sure this isn't hit.
-    DCHECK(policy->CanAccessOrigin(
+    CHECK(policy->CanAccessOrigin(
         process_id, origin,
         ChildProcessSecurityPolicyImpl::AccessType::kCanCommitNewOrigin));
   }
Loading diff…

Original Bug Report

reported by [email protected]

[DCHECK-to-CHECK] NavigationRequest::GetOriginForURLLoaderFactoryAfterResponse, failing DCHECK(policy->CanAccessOrigin(

This bug is part of the project: http://go/check-content-navigation (Systematic Conversion of DCHECKs to CHECKs in Core Navigation).

This specific DCHECK was previously upgraded to a CHECK, but had to be reverted back to a DCHECK because it was reached in the wild (which occurred in about 15% of the converted instances).

This bug is tracked to resolve this specific invariant failure so we can eventually upgrade it back to a CHECK.

Context:

  • File: content/browser/renderer_host/navigation_request.cc:9730
  • Function: NavigationRequest::GetOriginForURLLoaderFactoryAfterResponse
  • Source Link
   9725:   if (HasRenderFrameHost() &&
   9726:       !GetRenderFrameHost()->ShouldBypassSecurityChecksForErrorPage(this) &&
   9727:       !IsForMhtmlSubframe()) {
   9728:     int process_id = GetRenderFrameHost()->GetProcess()->GetDeprecatedID();
   9729:     auto* policy = ChildProcessSecurityPolicyImpl::GetInstance();
=> 9730:     // TODO(https://crbug.com/526541544): CHECK-exclusion: Convert to CHECK once
   9731:     // we are sure this isn't hit.
   9732:     DCHECK(policy->CanAccessOrigin(
   9733:         process_id, origin,
   9734:         ChildProcessSecurityPolicyImpl::AccessType::kCanCommitNewOrigin));
   9735:   }
   9736: 
   9737:   return origin;
View on issue tracker