Chrome · Notifications
CVE-2026-17987
Logic Error in Notifications
Overview
Low
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Changed Functions
| Function | Change | Notes |
|---|---|---|
TEST_Fcontent/browser/renderer_host/render_frame_host_impl_unittest.cc |
modified |
Files Changed
content/browser/renderer_host/render_frame_host_impl.cccontent/browser/renderer_host/render_frame_host_impl_unittest.cc
Patch
From 4ae79680fd4013a566bbcd140ed53bffbe76eee9 Mon Sep 17 00:00:00 2001 From: Tzarial <[email protected]> Date: Thu, 25 Jun 2026 05:36:33 -0700 Subject: [PATCH] [agy][content] Block PDF NotificationService PDF renderers are isolated and must not access storage, passwords, or other sensitive data for the PDF document's origin. However, the eager/lazy interface binding path for blink.mojom.NotificationService on RenderFrameHostImpl was not gated by any PDF check. This allowed a compromised PDF renderer to bind the service and read or spoof notifications. This CL prevents PDF renderers from binding the NotificationService on the BrowserInterfaceBroker path. If a PDF renderer attempts to bind it, the browser now terminates the renderer using mojo::ReportBadMessage. We verify this fix with a new unit test in render_frame_host_impl_unittest.cc. Test: content_unittests --gtest_filter=RenderFrameHostImplTest.NotificationServiceBlockedForPdf Change-Id: I2c896bfb98f061cde36b5b2587b1c98d62d62c46 Fixed: 519988071 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7988818 Commit-Queue: Tzarial <[email protected]> Reviewed-by: Arthur Sonzogni <[email protected]> Cr-Commit-Position: refs/heads/main@{#1652349} --- diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 869a73d3..5d6980e0 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc @@ -14799,6 +14799,11 @@ void RenderFrameHostImpl::CreateNotificationService( mojo::PendingReceiver<blink::mojom::NotificationService> receiver) { + if (GetSiteInstance()->GetSiteInfo().is_pdf()) { + mojo::ReportBadMessage( + "PDF renderers may not bind blink.mojom.NotificationService"); + return; + } GetProcess()->CreateNotificationService( GetGlobalId(), RenderProcessHost::NotificationServiceCreatorType::kDocument, diff --git a/content/browser/renderer_host/render_frame_host_impl_unittest.cc b/content/browser/renderer_host/render_frame_host_impl_unittest.cc index c1680ec5c..7051409 100644 --- a/content/browser/renderer_host/render_frame_host_impl_unittest.cc +++ b/content/browser/renderer_host/render_frame_host_impl_unittest.cc @@ -13,6 +13,7 @@ #include "build/buildflag.h" #include "components/input/timeout_monitor.h" #include "content/browser/renderer_host/navigation_controller_impl.h" +#include "content/browser/site_instance_impl.h" #include "content/common/content_navigation_policy.h" #include "content/common/features.h" #include "content/public/browser/cors_origin_pattern_setter.h" @@ -27,6 +28,8 @@ #include "content/test/test_render_frame_host.h" #include "content/test/test_render_view_host.h" #include "content/test/test_web_contents.h" +#include "mojo/public/cpp/test_support/fake_message_dispatch_context.h" +#include "mojo/public/cpp/test_support/test_utils.h" #include "net/base/features.h" #include "net/base/isolation_info.h" #include "net/base/network_isolation_partition.h" @@ -44,6 +47,7 @@ #include "third_party/blink/public/common/runtime_feature_state/runtime_feature_state_read_context.h" #include "third_party/blink/public/common/storage_key/storage_key.h" #include "third_party/blink/public/mojom/favicon/favicon_url.mojom.h" +#include "third_party/blink/public/mojom/notifications/notification_service.mojom.h" #include "third_party/blink/public/mojom/webauthn/authenticator.mojom.h" #include "url/gurl.h" #include "url/origin.h" @@ -1826,4 +1830,26 @@ .is_secure_context_root); } +TEST_F(RenderFrameHostImplTest, NotificationServiceBlockedForPdf) { + UrlInfo url_info( + UrlInfoInit(GURL("https://foo.com/document.pdf")) + .WithEmbedderIsolationInfo(EmbedderIsolationInfo::CreateForPdf())); + scoped_refptr<SiteInstanceImpl> pdf_instance = + SiteInstanceImpl::CreateForUrlInfo(GetBrowserContext(), url_info, + /*is_guest=*/false, + /*is_fenced=*/false, + /*is_fixed_storage_partition=*/false); + std::unique_ptr<TestWebContents> pdf_web_contents = + TestWebContents::Create(GetBrowserContext(), pdf_instance); + TestRenderFrameHost* pdf_rfh = pdf_web_contents->GetPrimaryMainFrame(); + + mojo::FakeMessageDispatchContext fake_dispatch_context; + mojo::test::BadMessageObserver bad_message_observer; + mojo::Remote<blink::mojom::NotificationService> service; + pdf_rfh->CreateNotificationService(service.BindNewPipeAndPassReceiver()); + + EXPECT_EQ("PDF renderers may not bind blink.mojom.NotificationService", + bad_message_observer.WaitForBadMessage()); +} + } // namespace content
Loading diff…
Regression Test / PoC
shipped with the fix
diff --git a/content/browser/renderer_host/render_frame_host_impl_unittest.cc b/content/browser/renderer_host/render_frame_host_impl_unittest.cc
index c1680ec5c..7051409 100644
--- a/content/browser/renderer_host/render_frame_host_impl_unittest.cc
+++ b/content/browser/renderer_host/render_frame_host_impl_unittest.cc
@@ -13,6 +13,7 @@
#include "build/buildflag.h"
#include "components/input/timeout_monitor.h"
#include "content/browser/renderer_host/navigation_controller_impl.h"
+#include "content/browser/site_instance_impl.h"
#include "content/common/content_navigation_policy.h"
#include "content/common/features.h"
#include "content/public/browser/cors_origin_pattern_setter.h"
@@ -27,6 +28,8 @@
#include "content/test/test_render_frame_host.h"
#include "content/test/test_render_view_host.h"
#include "content/test/test_web_contents.h"
+#include "mojo/public/cpp/test_support/fake_message_dispatch_context.h"
+#include "mojo/public/cpp/test_support/test_utils.h"
#include "net/base/features.h"
#include "net/base/isolation_info.h"
#include "net/base/network_isolation_partition.h"
@@ -44,6 +47,7 @@
#include "third_party/blink/public/common/runtime_feature_state/runtime_feature_state_read_context.h"
#include "third_party/blink/public/common/storage_key/storage_key.h"
#include "third_party/blink/public/mojom/favicon/favicon_url.mojom.h"
+#include "third_party/blink/public/mojom/notifications/notification_service.mojom.h"
#include "third_party/blink/public/mojom/webauthn/authenticator.mojom.h"
#include "url/gurl.h"
#include "url/origin.h"
@@ -1826,4 +1830,26 @@
.is_secure_context_root);
}
+TEST_F(RenderFrameHostImplTest, NotificationServiceBlockedForPdf) {
+ UrlInfo url_info(
+ UrlInfoInit(GURL("https://foo.com/document.pdf"))
+ .WithEmbedderIsolationInfo(EmbedderIsolationInfo::CreateForPdf()));
+ scoped_refptr<SiteInstanceImpl> pdf_instance =
+ SiteInstanceImpl::CreateForUrlInfo(GetBrowserContext(), url_info,
+ /*is_guest=*/false,
+ /*is_fenced=*/false,
+ /*is_fixed_storage_partition=*/false);
+ std::unique_ptr<TestWebContents> pdf_web_contents =
+ TestWebContents::Create(GetBrowserContext(), pdf_instance);
+ TestRenderFrameHost* pdf_rfh = pdf_web_contents->GetPrimaryMainFrame();
+
+ mojo::FakeMessageDispatchContext fake_dispatch_context;
+ mojo::test::BadMessageObserver bad_message_observer;
+ mojo::Remote<blink::mojom::NotificationService> service;
+ pdf_rfh->CreateNotificationService(service.BindNewPipeAndPassReceiver());
+
+ EXPECT_EQ("PDF renderers may not bind blink.mojom.NotificationService",
+ bad_message_observer.WaitForBadMessage());
+}
+
} // namespace content
Loading diff…
Original Bug Report
The reporter's bug is still restricted on the tracker. Chrome de-restricts security bugs ~30–90 days after the fix ships; a later run will backfill it here.
References
On This Page