Chrome · Payments
CVE-2026-87474
UAF in Payments
Overview
High
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Files Changed
chrome/browser/ui/web_modal/browser_window_modal_dialog_delegate.cc
Patch
From f93f6b65c55222664e2c3672a11dc3ee6f81eaec Mon Sep 17 00:00:00 2001 From: Keren Zhu <[email protected]> Date: Tue, 01 Sep 2026 17:08:27 -0700 Subject: [PATCH] Defer ExitFullscreen when blocking WebContents for modal dialogs When BrowserWindowModalDialogDelegate::SetWebContentsBlocked is called upon showing a modal dialog (e.g. via ShowWebModalDialogViews or TabDialogManager::ShowDialog), it drops HTML fullscreen for the tab. Calling ExitFullscreen synchronously can trigger direct WndProc calls (e.g., WM_WINDOWPOSCHANGED on Windows). This can lead to the WebContents and caller objects (e.g., dialog controllers, PaymentRequestState) being destroyed synchronously while modal dialog presentation is still on the stack, resulting in use-after-free crashes. This CL posts a task to the UI thread to defer the call to ExitFullscreen() using a WeakPtr, ensuring the current synchronous dialog presentation call frame completely unwinds before fullscreen exit occurs. TAG=agy CONV=bce8c045-c1e7-4d88-a581-ff5b1f83ff3c Bug: 553700283, 540138836, 553128689, 554558968, 553129531 Change-Id: I48e11121ff1a9e33c05705df1869bd749f05b6ee Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8328511 Reviewed-by: Allen Bauer <[email protected]> Reviewed-by: Thomas Lukaszewicz <[email protected]> Commit-Queue: Keren Zhu <[email protected]> Cr-Commit-Position: refs/heads/main@{#1690328} --- diff --git a/chrome/browser/ui/web_modal/browser_window_modal_dialog_delegate.cc b/chrome/browser/ui/web_modal/browser_window_modal_dialog_delegate.cc index 96c238d..fd0a7db0 100644 --- a/chrome/browser/ui/web_modal/browser_window_modal_dialog_delegate.cc +++ b/chrome/browser/ui/web_modal/browser_window_modal_dialog_delegate.cc @@ -4,6 +4,7 @@ #include "chrome/browser/ui/web_modal/browser_window_modal_dialog_delegate.h" +#include "base/functional/bind.h" #include "base/types/to_address.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/devtools/devtools_ui_controller.h" @@ -20,6 +21,8 @@ #include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings_types.h" #include "components/web_modal/web_contents_modal_dialog_host.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents.h" DEFINE_USER_DATA(BrowserWindowModalDialogDelegate); @@ -73,7 +76,14 @@ if (content_settings->GetContentSetting( url, url, ContentSettingsType::AUTOMATIC_FULLSCREEN) != CONTENT_SETTING_ALLOW) { - web_contents->ExitFullscreen(true); + // Defer exiting fullscreen to prevent synchronous window management + // messages (e.g. direct WndProc calls on Windows) from destroying the + // WebContents or callers while modal dialog presentation is on the + // stack. + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&content::WebContents::ExitFullscreen, + web_contents->GetWeakPtr(), + /*will_cause_resize=*/true)); } } }
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