Low watch CVSS 4.2 chrome Spoofing 📄 Reporter bug report 🔧 Commit mapped

Overview

Low
Severity
4.2
CVSS
No
Exploited ITW
Fixed
Fix Status
ImpactIncorrect security UI in Omnibox
DescriptionIncorrect security UI in Omnibox
ComponentOmnibox
Sub-componentUI>Browser>Omnibox
Bug ClassSpoofing
Action tierwatch — logic/policy bug — security-relevant, no memory-unsafety
Computed by PatchGap's deterministic exploitability ruler from the fixing commit. patch-now = RCE-class & attacker-reachable in a default config, or exploited in the wild; watch = real security signal below that bar; noise = no security relevance.
Tracker442636157
Fix commit649828b3c37c (chromium/src) +7/-1
CWECWE-306
CVSS vectorCVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:N/A:L
CISA KEVNot listed
CreditedKhalil Zhani
Reported2025-09-03 (per vendor advisory)
Fix landed2025-09-04 (public git)
Disclosed2025-10-28
Patch gap54 days — fix public in source before the advisory

Background

`CompositorViewHolder`
the Android Java view that hosts Chrome’s compositor and watches the current Tab through an anonymous TabObserver (mTabObserver). It tracks touch gestures to decide whether content is “in motion” (updateInMotion()).
`mNumGestureActiveTouches`
a counter raised on gesture-begin acks and lowered by onGestureEnd(). The commit message says a non-zero value “suppresses captures until the gesture ends”.
Captures
on Android, browser UI such as the toolbar/omnibox is drawn by the compositor from captured bitmaps. While captures are suppressed, the composited UI can lag behind the real state (inferred from the commit message; the capture code itself is not in the diff).
Unbalanced acks
a gesture-begin with no matching end, or the reverse. The commit names two causes: switching tabs between acks, and a renderer crash.

Root Cause Analysis

CompositorViewHolder trusted that every gesture begin would be matched by exactly one onGestureEnd() on the same tab. If the tab changed or the renderer crashed mid-gesture, the end ack never arrived. mNumGestureActiveTouches then stayed above zero, so the holder kept treating content as in motion and kept suppressing captures. In the other direction, an extra onGestureEnd() could push the count below zero, since the old code did a plain mNumGestureActiveTouches--. The advisory classifies this as incorrect Omnibox security UI. A plausible link is that suppressed captures leave the composited toolbar/omnibox showing stale content, such as a previous URL or security state (inferred; the diff does not include the capture or omnibox code).

The fix restores the invariant in three ways. It resets the counter to 0 on onCrash(Tab). It resets it to 0 when a new non-null tab is attached and observed. It clamps onGestureEnd() at 0 with Math.max(mNumGestureActiveTouches - 1, 0).

Key insight
A gesture counter that gates when security-relevant UI captures are taken was never resynchronized when the event stream that balanced it was cut off by a tab switch or crash. The fix resets it at those boundaries and stops it from going negative.

Attack Path

  1. Start a touch gesture The user touches the page, and a gesture-begin ack raises mNumGestureActiveTouches in CompositorViewHolder.
  2. Break the begin/end pairing Before the gesture-end ack arrives, the renderer crashes or the active tab changes. Page-driven ways to force either are (inferred), and the commit names these two causes.
  3. Counter stays non-zero With no matching onGestureEnd(), the counter stays positive, updateInMotion() keeps reporting motion, and captures stay suppressed indefinitely.
  4. Stale browser UI is shown The compositor keeps showing an outdated toolbar/omnibox capture, so the user may see a URL or security indicator that does not match the content on screen (inferred).

Impact Assessment

The result is at most a misleading omnibox/toolbar display on Chrome for Android. This is a UI-integrity issue, with no memory corruption and no new process privileges. Reaching it needs the Android build, a real touch gesture from the user, and a crash or tab switch landing between gesture acks, which is a timing condition. How reliably ordinary web content can arrange this is not shown by the patch (inferred). The vendor rates this Low severity (“Incorrect security UI in Omnibox”), and the provided metadata includes no exploited-in-the-wild statement.

Changed Functions

FunctionChangeNotes
if
chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
modified

Files Changed

  • chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java

Audit Directions

  • Counters fed by cross-process acks
    Look for begin/end, show/hide or acquire/release counters updated from renderer acks (gesture, scroll, fling, IME, fullscreen) that are not reset when the observed tab, WebContents or renderer process changes.
  • Suppression flags guarding security UI
    Audit every condition that defers updating the toolbar, URL bar or security indicators, such as “in motion”, “animating” or “capture pending”. Confirm each one has a guaranteed exit on crash, navigation and tab swap.
  • Observer swap without state reset
    When code calls removeObserver on the old tab and addObserver on a new one, check that per-tab state stored on the holder is reset as well, not kept across the switch.
From 649828b3c37c0b4b23f61857c6c0398e7ee590e8 Mon Sep 17 00:00:00 2001
From: Patrick Noland <[email protected]>
Date: Thu, 04 Sep 2025 13:57:15 -0700
Subject: [PATCH] Reset active gesture count on tab change or crash

The active gesture count suppresses captures until the gesture ends.
This value can become invalid if we don't receive a balanced number of
acks for gesture begins and ends. Two ways that can happen are changing
tabs between acks or crashes; regardless, it's safe to reset the value
in both these cases.

Bug: 442636157, 434751393
Change-Id: Idb6be4ed8b53bdc2e2f594db01813c2e13c52801
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6917456
Reviewed-by: Sky Malice <[email protected]>
Commit-Queue: Patrick Noland <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1511136}
---

diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
index 551d47c..aef02b8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
@@ -318,6 +318,11 @@
                 }
 
                 @Override
+                public void onCrash(Tab tab) {
+                    mNumGestureActiveTouches = 0;
+                }
+
+                @Override
                 public void onDidFinishNavigationInPrimaryMainFrame(
                         Tab tab, NavigationHandle navigation) {
                     if (!navigation.isSameDocument() && navigation.hasCommitted()) {
@@ -337,7 +342,7 @@
 
                 @Override
                 public void onGestureEnd() {
-                    mNumGestureActiveTouches--;
+                    mNumGestureActiveTouches = Math.max(mNumGestureActiveTouches - 1, 0);
                     updateInMotion();
                 }
             };
@@ -1541,6 +1546,7 @@
             mHasKeyboardGeometryChangeFired = false;
             if (mTabVisible != null) mTabVisible.removeObserver(mTabObserver);
             if (tab != null) {
+                mNumGestureActiveTouches = 0;
                 tab.addObserver(mTabObserver);
                 mCompositorView.onTabChanged();
             }
Loading diff…

Original Bug Report

reported by [email protected]

Chrome on Android: URL spoof triggered by address bar position Change

Steps to reproduce the problem

  1. Open the test case page and tap the “Try it” button.
  2. Keep your finger pressed inside the page until an alert dialog appears.
  3. Try to move the address bar to the bottom, then dismiss the alert dialog.

Problem Description

When moving the Chrome address bar to the bottom of the screen, the URL displayed in the address bar changes to google.com/csi, but the actual page content does not correspond to this URL. This mismatch between the visible URL and page content can mislead users into believing they are on a trusted site when they are not, potentially enabling URL spoofing attacks. This behavior poses a security risk by undermining user trust in the address bar’s accuracy.

This issue appears to be similar to Issue 437147699, which also involves URL spoofing vulnerabilities related to address bar inconsistencies.

Summary

Chrome on Android: URL spoof triggered by address bar position Change

Additional Data

Category: Security
Chrome Channel: Canary
Regression: N/A \

View on issue tracker