CVE-2026-11261
Overview
Files Changed
chrome/browser/chrome_content_browser_client_receiver_bindings.cc
Patch
From f1cf2f24ebff9b5fe9a075e90d85af7e4df00792 Mon Sep 17 00:00:00 2001
From: Lei Zhang <thestig@chromium.org>
Date: Wed, 08 Apr 2026 09:09:54 -0700
Subject: [PATCH] [PDF] Only bind pdf::mojom::PdfHost for PDF renderers
Only allow renderers that legitimately need PdfHost interface access to
bind to it.
Bug: 499262832
Change-Id: Ie41c30b902bdedff49cd720b8bef2d4aa7c0a949
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7735798
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1611565}
---
diff --git a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
index 2856642..13d6a92 100644
--- a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
+++ b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
@@ -544,14 +544,16 @@
},
&render_frame_host));
#if BUILDFLAG(ENABLE_PDF)
- associated_registry.AddInterface<pdf::mojom::PdfHost>(base::BindRepeating(
- [](content::RenderFrameHost* render_frame_host,
- mojo::PendingAssociatedReceiver<pdf::mojom::PdfHost> receiver) {
- pdf::PDFDocumentHelper::BindPdfHost(
- std::move(receiver), render_frame_host,
- std::make_unique<ChromePDFDocumentHelperClient>());
- },
- &render_frame_host));
+ if (render_frame_host.GetProcess()->IsPdf()) {
+ associated_registry.AddInterface<pdf::mojom::PdfHost>(base::BindRepeating(
+ [](content::RenderFrameHost* render_frame_host,
+ mojo::PendingAssociatedReceiver<pdf::mojom::PdfHost> receiver) {
+ pdf::PDFDocumentHelper::BindPdfHost(
+ std::move(receiver), render_frame_host,
+ std::make_unique<ChromePDFDocumentHelperClient>());
+ },
+ &render_frame_host));
+ }
#endif // BUILDFLAG(ENABLE_PDF)
#if !BUILDFLAG(IS_ANDROID)
associated_registry.AddInterface<search::mojom::EmbeddedSearchConnector>(
Original Bug Report
Cross-origin content spoofing in Lens via unguarded PdfHost
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 security team.
Overview: A compromised subframe can bind the unguarded PdfHost interface to inject a malicious PDF helper. Contextualization features incorrectly use this helper, attributing attacker-controlled bytes to the main frame’s URL.
Affected files:
chrome/browser/chrome_content_browser_client_receiver_bindings.cccomponents/pdf/browser/pdf_document_helper.ccchrome/browser/ui/lens/lens_search_contextualization_controller.ccchrome/browser/ui/contextual_search/tab_contextualization_controller.cc
Estimated timestamp from git blame: 2025-09-08
Root Cause
Initial logic and frame tree registrations are validated. The pdf::mojom::PdfHost interface is registered unconditionally for all RenderFrameHosts in chrome_content_browser_client_receiver_bindings.cc without origin or MIME type restrictions.
Potential Vulnerability Mechanism
- A compromised subframe establishes its context and binds
pdf::mojom::PdfHost, injecting aPDFDocumentHelper. - Standard contextualization processing is applied when the user interacts with Google Lens or Tab Contextualization on the main page.
- The pipeline jumps directly to
PDFDocumentHelper::MaybeGetForWebContents(). This method iterates over all frames and immediately returns the attacker’s injected helper. - The contextualization controllers extract the attacker’s payload via
GetPdfBytes(), completely bypassing legitimate main-frame text extraction. - The final payload is constructed in
LensOverlayQueryController::CreatePageContentPayload(), directly combining the attacker’s bytes with the main frame’s URL, effectively spoofing the trusted origin to the AI backend.
Note: These are potential steps as our tooling agent cannot execute live code to provide a working PoC.
Suggested Fix
Modify MaybeGetForWebContents() to only return a PDFDocumentHelper if it belongs to the primary main frame. Alternatively, require the contextualization controllers (like LensSearchContextualizationController and TabContextualizationController) to explicitly verify that the main frame’s MIME type is application/pdf before entering the PDF extraction path, similar to the existing logic in PageContextFetcher.
Evaluated with Chrome root at commit: ff3d2b74fa39431785bd60e51463b08fcc71ee33
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.