CVE-2026-113115
Overview
Changed Functions
| Function | Change | Notes |
|---|---|---|
ifui/views/widget/desktop_aura/desktop_window_tree_host_win.cc |
modified |
Files Changed
ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
Patch
From c8691b2528de4c404152ee4089cfa9472094f37d Mon Sep 17 00:00:00 2001
From: Maryia Mankevich <mmaryia@google.com>
Date: Fri, 25 Sep 2026 10:11:02 -0700
Subject: [PATCH] Allow security surfaces to retain their z-order level on Windows
When StackAbove(params.parent) is called in
DesktopWindowTreeHostWin::Init(), the underlying SetWindowPos()
call can cause kSecuritySurface widgets (like the Autofill popup)
to lose their top-level z-order and end up behind an HTML form
popup.
Do not call StackAbove(params.parent) for kSecuritySurface widgets,
similar to how TYPE_MENU is handled in https://crrev.com/c/5023030.
Tested manually on Windows and confirmed that this fixes the bug.
Bug: 514018015
Change-Id: Ic6942d15fa7fa1ef00a6d6348056c70ceda3c36e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8461223
Reviewed-by: Keren Zhu <kerenzhu@chromium.org>
Commit-Queue: Maryia Mankevich <mmaryia@google.com>
Cr-Commit-Position: refs/heads/main@{#1704879}
---
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
index d90f1f4..8afd9e7 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
@@ -304,9 +304,10 @@
window()->Show();
// Stack immediately above its parent so that it does not cover other
- // root-level windows, with the exception of menus, to allow them to be
- // displayed on top of other windows.
- if (params.parent && params.type != views::Widget::InitParams::TYPE_MENU) {
+ // root-level windows, with the exception of menus and security surfaces, to
+ // allow them to be displayed on top of other windows.
+ if (params.parent && params.type != views::Widget::InitParams::TYPE_MENU &&
+ z_order_ != ui::ZOrderLevel::kSecuritySurface) {
StackAbove(params.parent);
}
}
Original Bug Report
TOCTOU in Autofill popup overlap detection for HTML form popups on Windows
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. Please see https://chromium.googlesource.com/chromium/src/+/main/docs/security/ai-generated-security-bugs-faq.md for more information.
Overview: A compromised renderer can potentially bypass Autofill’s overlap checks by repositioning an HTML form popup after the initial check has occurred. On Windows, these popups are implemented as separate native windows, and existing visibility defenses fail to detect occlusion by these external windows. This creates a potential clickjacking vector to trick users into accepting Autofill suggestions without informed consent.
Affected files:
chrome/browser/ui/views/autofill/popup/popup_view_views.ccchrome/browser/ui/views/autofill/popup/popup_view_utils.cccontent/browser/renderer_host/render_widget_host_impl.ccchrome/browser/ui/autofill/autofill_popup_hide_helper.ccchrome/browser/ui/views/autofill/popup/popup_row_view.cc
Estimated timestamp from git blame: 2026-03-04
Summary
A potential Time-of-Check Time-of-Use (TOCTOU) vulnerability exists in the Autofill popup’s overlap detection mechanism on Windows. When an Autofill popup is displayed, the browser performs a one-shot check to ensure it is not occluded by renderer-created HTML form popups (like <select> menus). However, a compromised renderer can move its popup after this check is completed. Because the browser does not continuously monitor the bounds of these native windows or account for their occlusion in the suggestion acceptance logic, an attacker can occlude Autofill suggestions with deceptive content.
Technical Details
The defense mechanism in PopupViewViews::DoUpdateBoundsAndRedrawPopup (chrome/browser/ui/views/autofill/popup/popup_view_views.cc) invokes BoundsOverlapWithHtmlFormPopup(), which snapshots the current bounds of renderer-owned HTML form popup widgets. If no intersection is detected at that moment, the Autofill suggestions are shown.
A compromised renderer can potentially exploit this by:
- Creating a popup widget initially positioned off-screen.
- Triggering Autofill suggestions. The browser’s one-shot check sees no overlap.
- Calling the Mojo method
PopupWidgetHost::SetPopupBoundsto move the popup directly over the Autofill suggestions after the initial check.
On Windows, these popups are separate native windows (HWNDs). The browser’s secondary defense, PopupRowView::IsViewVisibleEnough() (chrome/browser/ui/views/autofill/popup/popup_row_view.cc), relies on views::View::GetVisibleBounds(). This method only calculates visibility within the internal Views hierarchy of a single widget and cannot detect occlusion by external native windows. Consequently, the renderer can paint arbitrary content over the Autofill suggestion, tricking the user into an unintended interaction.
Potential Attack Steps
- Gain code execution in a sandboxed renderer process.
- Create an HTML form element (e.g.,
<select>) that opens a native popup window. - Position the popup off-screen via
SetPopupBoundsbefore it is audited. - Trigger an Autofill suggestion on a sensitive field (e.g., a credit card input).
- Wait for the 500ms safety period (
kIgnoreEarlyClicksOnSuggestionsDuration) to elapse. - Reposition the popup to occlude the Autofill suggestion with a deceptive “Confirm” button.
- When the user clicks the deceptive button, the renderer quickly moves its popup away, causing the subsequent
mouseupevent to fall through to the Autofill suggestion, which is then accepted because the visibility check fails to detect the prior occlusion.
Suggested Fix
- Continuous Monitoring: The Autofill UI should register as an observer for the
aura::Windowof any active HTML form popups associated with the tab. Any change in the bounds of these windows should trigger a re-evaluation of the Autofill popup’s overlap status. - Enhanced Visibility Checks: Modify
PopupRowView::IsViewVisibleEnough()to incorporate Aura-level occlusion tracking (aura::WindowOcclusionTracker), which is capable of detecting when a window is covered by other native windows, rather than relying solely onGetVisibleBounds().
Evaluated with Chrome root at commit: 1a8d40fc44df2088d5945c0bf53584038aa1614a
Results so far have been promising, but there can be wrong deductions. Feel free to adjust as follows:
- If you are familiar with the severity guidelines, you may adjust the severity.
- If this is a false positive, and there’s no work to be done, please close as WAI.
- If there is work to do here but not a vulnerability, please change the issue type to Task/Bug/FR.
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.