CVE-2026-13900
Overview
Changed Functions
| Function | Change | Notes |
|---|---|---|
ifchromecast/browser/cast_web_view_default.cc |
modified |
Files Changed
chromecast/browser/cast_web_view_default.cc
Patch
From cd5d2199e71d78b426b945225527d2f5c778eb43 Mon Sep 17 00:00:00 2001
From: Simeon Anfinrud <sanfin@chromium.org>
Date: Wed, 06 May 2026 13:25:12 -0700
Subject: [PATCH] [chromecast] Fix Potential navigation provenance laundering in CastWebViewDefault::OpenURLFromTab
Update OpenURLFromTab to use LoadURLWithParams, passing a correctly initialized
LoadURLParams object that preserves the provenance from OpenURLParams.
Bug: 502374993
Test: Compiled and passed unit tests.
Change-Id: I29064d479988e7b08e9fa1f63974aeecf849e1ac
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7765507
Auto-Submit: Simeon Anfinrud <sanfin@chromium.org>
Reviewed-by: Sandeep Vijayasekar <sandv@google.com>
Commit-Queue: Simeon Anfinrud <sanfin@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1626414}
---
diff --git a/chromecast/browser/cast_web_view_default.cc b/chromecast/browser/cast_web_view_default.cc
index 7e1601b4..e3cdc0da 100644
--- a/chromecast/browser/cast_web_view_default.cc
+++ b/chromecast/browser/cast_web_view_default.cc
@@ -175,8 +175,9 @@
DCHECK_EQ(source, web_contents_.get());
// We don't want to create another web_contents. Load url only when source is
// specified.
- auto navigation_handle = source->GetController().LoadURL(
- params.url, params.referrer, params.transition, params.extra_headers);
+ content::NavigationController::LoadURLParams load_params(params);
+ auto navigation_handle =
+ source->GetController().LoadURLWithParams(load_params);
if (navigation_handle_callback && navigation_handle) {
std::move(navigation_handle_callback).Run(*navigation_handle);
Original Bug Report
Potential navigation provenance laundering in CastWebViewDefault::OpenURLFromTab
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.
Overview: CastWebViewDefault::OpenURLFromTab drops navigation provenance data by calling a 4-argument LoadURL overload, causing renderer-initiated navigations to be treated as browser-initiated. This potentially allows a compromised Chromecast renderer to spoof navigation headers and bypass Fetch Metadata protections. Because Chromecast disables Site Isolation, attackers could exploit this to steal sensitive cross-origin data.
Affected files:
chromecast/browser/cast_web_view_default.cc
Estimated timestamp from git blame: 2024-03-28
Description
There is a potential navigation provenance laundering vulnerability in the Chromecast browser implementation. CastWebViewDefault::OpenURLFromTab in chromecast/browser/cast_web_view_default.cc serves as the WebContentsDelegate::OpenURLFromTab implementation. When a renderer process initiates a navigation via an OpenURL IPC, it routes to this delegate method.
The implementation incorrectly passes the navigation to the controller using the 4-argument LoadURL overload:
auto navigation_handle = source->GetController().LoadURL(
params.url, params.referrer, params.transition, params.extra_headers);
This specific LoadURL method (in NavigationControllerImpl) creates a default LoadURLParams object where is_renderer_initiated is hardcoded to false and initiator_origin is std::nullopt. Crucially, while the provenance is discarded, the renderer-supplied params.extra_headers are forwarded. This causes the browser to treat an untrusted renderer-initiated navigation as a highly trusted, browser-initiated navigation (e.g., as if the user typed it into the omnibox).
Potential Exploitation Steps
Note: These are suggested steps based on static code analysis. Our tooling does not yet have the ability to run code or produce a working proof-of-concept.
If an attacker compromises a renderer process in a Chromecast (cast_shell) environment, they could potentially exploit this bug to steal cross-origin data through the following sequence:
- Craft IPC payload: The compromised renderer constructs a
blink::mojom::OpenURLParamsIPC payload targeting a sensitive cross-origin GET endpoint (e.g.,https://bank.com/api/data). - Spoof Headers: The attacker includes a spoofed
Originheader in theextra_headersfield. - Bypass Browser Validation: The browser receives the IPC. Because the navigation is laundered into a “browser-initiated” navigation by
CastWebViewDefault, security checks inAddAdditionalRequestHeaders(which normally strip unexpectedOriginheaders on renderer-initiated GET requests) are bypassed. The spoofedOriginheader remains intact. - Bypass Fetch Metadata: The Network Service computes the
Sec-Fetch-Siteheader. Becauseinitiator_originis nowstd::nullopt, it is treated as a user-initiated top-level navigation, and the network service emitsSec-Fetch-Site: noneinstead ofcross-site. - Server Response: The target server receives the request with a trusted
OriginandSec-Fetch-Site: none. Believing it to be a legitimate, user-initiated navigation, it bypasses CSRF and resource isolation protections and returns sensitive data. - Data Theft: Strict Site Isolation is globally disabled on Chromecast (
CastContentBrowserClient::ShouldEnableStrictSiteIsolationreturnsfalse). Consequently, the browser may reuse the existing (compromised) renderer process for the new cross-origin document. The attacker’s persistent code in the compromised process can then read the sensitive response directly from process memory.
Suggested Fix
Update CastWebViewDefault::OpenURLFromTab to use LoadURLWithParams and pass a correctly initialized LoadURLParams object that preserves the provenance from OpenURLParams.
content::NavigationController::LoadURLParams load_params(params);
auto navigation_handle = source->GetController().LoadURLWithParams(load_params);
Evaluated with Chrome root at commit: 096fc8fdbfacf2546485756d03f160a3d04fcc9b
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.