← Back to Feed CACHED · 2026-05-17 09:42:19 · cache_key CVE-2025-29912
CVE-2026-10980 · CWE-20 · Disclosed 2026-06-04

Insufficient validation of untrusted input in DevTools in Google Chrome prior to 149

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
01 · The Real Story

This is a spare key hidden behind a door you already had to break open

CVE-2026-10980 is an input-validation flaw in Chrome DevTools affecting desktop Chrome versions before 149.0.7827.53 on Linux and 149.0.7827.53/.54 on Windows/macOS. The user-supplied title is truncated, but the crucial phrase is there: it says the bug allowed a remote attacker who had compromised something already. That strongly implies this is not a standalone one-click browser compromise; it is a follow-on primitive in a chain, most plausibly after renderer compromise or equivalent browser foothold.

In raw CVSS terms, a browser bug with network reachability and user interaction lands in the middle of the pack. In real enterprise operations, the prior-compromise requirement is the whole story: if the attacker must already own a browser sub-process or comparable state, this is post-initial-access inside the browser, not your first domino. Wide install base keeps it out of LOW, but no KEV entry, no active exploitation evidence, a tiny EPSS, and the chaining requirement pull it down from the supplied 6.5/MEDIUM baseline to a lower-end MEDIUM.

"This is a browser-chain helper, not a clean initial-access bug—patch it, but don't let it cut the line"
02 · The Attack Path

4 steps from start to impact.

STEP 01

Deliver the lure page

The attacker needs to get a user onto attacker-controlled or attacker-influenced web content. The page itself is not enough to cash in CVE-2026-10980; it is the setup stage for a broader browser exploit chain. Typical weaponization here would be a phishing link, malvertising redirect, or compromised site.
Conditions required:
  • User browses to attacker-controlled content
  • Chrome desktop version is below 149.0.7827.53/.54
Where this breaks in practice:
  • Requires user interaction (UI:R)
  • Enterprise web filtering, DNS filtering, email security, and browser isolation reduce reach
  • By itself this flaw does not provide code execution
Detection/coverage: Web proxies, SWG, DNS telemetry, and email gateways can often see the delivery stage; vulnerability scanners generally only confirm Chrome version, not exploitability.
STEP 02

Gain prior browser foothold

The title fragment says the attacker had already 'compromised' a prerequisite component. In practice that means CVE-2026-10980 likely needs a separate renderer exploit, sandbox-adjacent state, or equivalent browser foothold before DevTools becomes useful. This is the decisive friction point: the attacker must already be partway through a successful browser compromise chain.
Conditions required:
  • A separate exploit or weakness yields renderer/process compromise first
  • The prerequisite bug is also reachable in the victim's browsing session
Where this breaks in practice:
  • This is a chain requirement, not a standalone path
  • Modern Chrome sandboxing, site isolation, exploit mitigations, and EDR increase failure rate
  • Many campaigns never get past the first-stage renderer exploit
Detection/coverage: EDR, browser crash telemetry, exploit protection, and sandbox-alerting may catch the precursor exploit; scanners do not assess this prerequisite.
STEP 03

Abuse DevTools input-validation weakness

Once the attacker has the prerequisite browser foothold, they can leverage malformed or attacker-controlled input reaching DevTools to affect integrity. The supplied CVSS (C:N/I:H/A:N) supports that reading: this is mainly about modifying behavior or trust boundaries, not broad data theft or availability loss. DevTools is not usually exposed as an internet-facing service; it is a local browser component reachable only through the compromised browser state.
Conditions required:
  • DevTools-relevant code path is reachable from the already-compromised browser context
  • Victim is running a vulnerable Chrome build
Where this breaks in practice:
  • No evidence this step is independently reachable from the network
  • Impact is integrity-focused and likely confined to browser/user context
  • Enterprise users rarely expose remote debugging interfaces in managed fleets
Detection/coverage: Little direct signature coverage. You are mostly relying on browser hardening, exploit mitigations, and telemetry around suspicious Chrome child-process behavior.
STEP 04

Convert browser integrity impact into useful post-exploitation

The attacker still has to turn the DevTools-side integrity win into something operationally valuable: session abuse, policy bypass, or a cleaner path to follow-on compromise. That final conversion depends heavily on what the first-stage compromise already achieved. In a managed enterprise browser with strong identity controls, this is meaningful but not automatically catastrophic.
Conditions required:
  • Attacker can act within the victim's browser/user context
  • High-value authenticated sessions are present
Where this breaks in practice:
  • Blast radius is usually one browser profile or one user session at a time
  • MFA, conditional access, device trust, and session binding can limit monetization
  • No direct evidence of wormability or fleet-wide unauthenticated exploitation
Detection/coverage: Look for suspicious session reuse, abnormal Chrome process ancestry, browser policy violations, and identity telemetry showing impossible or unusual session behavior.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo known public in-the-wild exploitation in the sources reviewed, and not listed in CISA KEV as of the checked catalog.
Proof-of-concept availabilityNo public PoC located. Chrome notes also warn that bug details may remain restricted until users are updated, which usually suppresses immediate weaponization visibility.
EPSS0.00021 (~0.021%), extremely low. That aligns with a bug that is hard to operationalize as a standalone enterprise intrusion path.
KEV statusNot KEV-listed. No CISA due date because it is absent from the catalog.
CVSS vectorCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:N — remote reach plus user interaction, integrity-heavy, but no confidentiality or availability impact in the base model.
Vendor severity discrepancyThe prompt supplies MEDIUM / 6.5, but Google's June 2, 2026 Chrome release note groups CVE-2026-10980 in the High section of the bulletin. I treat the user-supplied CVSS as the numeric baseline and the Chrome label as qualitative context.
Affected versionsDesktop Chrome before 149.0.7827.53 on Linux and before 149.0.7827.53/.54 on Windows and macOS.
Fixed versionsUpgrade to 149.0.7827.53 (Linux) or 149.0.7827.53/.54 (Windows/macOS) or later. On managed fleets, rely on vendor channel updates rather than distro package names for Chrome proper.
Exposure realityChrome is ubiquitous in enterprise, but DevTools is not an internet-facing service. Reachability is through the victim's browsing session, and the title fragment implies a prior browser compromise prerequisite.
Timeline / reportingPrompt says disclosed 2026-06-04. Google shipped Chrome 149 stable on 2026-06-02, and the Chrome note attributes this issue as reported by Google on 2026-05-16.
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to MEDIUM (4.4/10)

The single biggest downgrade factor is the apparent prior-compromise requirement embedded in the title: this does not read like an initial foothold bug, it reads like a browser exploit-chain helper. That sharply narrows both the exposed population and the number of real attackers who can convert it into enterprise-impacting compromise.

MEDIUM Severity reassessment from the truncated title and available vendor release metadata
HIGH Patch floor and affected-version identification
HIGH No KEV listing and no public exploitation evidence observed

Why this verdict

  • Chaining requirement cuts hard: the title says the attacker had already "compromised" a prerequisite component, which makes this post-initial browser exploitation rather than a clean standalone web bug
  • User interaction required: the CVSS includes UI:R, so this still depends on getting users onto malicious content
  • Blast radius is usually one browser context: even successful exploitation is typically bounded to the victim's browser/user session, not unauthenticated fleet-wide takeover
  • Threat intel is cold: no KEV, no public PoC found, and EPSS is effectively near-zero
  • Wide deployment prevents a LOWER bucket: Chrome is everywhere, so even chain-only browser bugs deserve patch attention in normal lifecycle hygiene

Why not higher?

There is no public evidence here of active exploitation, no KEV listing, and no sign this can be driven as a one-bug remote compromise. Most importantly, the attack path appears to require a prior browser compromise stage, which is compounding downward pressure on severity in a real enterprise patch queue.

Why not lower?

This still lands on an extremely common endpoint application with daily attacker reach through browsing. If an attacker already has the precursor browser foothold, an integrity-impacting follow-on bug inside Chrome can still improve reliability, bypasses, or session abuse enough to matter at scale.

05 · Compensating Control

What to do — in priority order.

  1. Enforce rapid browser auto-update — Make sure managed Chrome channels are pinned to stable and forced to update without excessive user deferral. For a MEDIUM noisgate verdict there is no mitigation SLA; use this as standard hygiene and complete the actual patch inside the 365-day remediation window, though browsers should normally move much faster operationally.
  2. Reduce risky web exposure — Apply SWG/DNS filtering, block newly seen domains where possible, and route high-risk users through browser isolation or stricter web controls. This helps on the delivery step, which is the one reachable stage before the exploit chain needs a much harder prior compromise.
  3. Harden Chrome with enterprise policy — Disable unnecessary developer features, restrict remote debugging usage, and enforce security policies through Google enterprise templates. This does not fix the bug, but it trims odd DevTools-adjacent workflows and reduces attacker room to maneuver while you patch.
  4. Watch for browser exploit signals — Collect Chrome version inventory, crash spikes, suspicious child-process trees, and identity anomalies tied to browser sessions. Because this looks like a chain element, your best early warning is often the precursor exploit or the follow-on session abuse rather than the CVE itself.
What doesn't work
  • A network perimeter scanner will not tell you whether the bug is practically exploitable; this is an endpoint browser issue, not an internet-facing daemon
  • MFA alone does not stop the browser-side exploit chain; it may reduce post-exploitation session value, but it does not neutralize the vulnerability
  • WAF rules are largely irrelevant here because the vulnerable component is the client browser, not your server-side application stack
06 · Verification

Crowdsourced verification payload.

Run this on the target endpoint or via your EDR/script runner, not from an auditor workstation. Invoke with python3 check_chrome_cve_2026_10980.py on macOS/Linux or py check_chrome_cve_2026_10980.py on Windows; no admin rights are usually required, but the script must be able to execute the local Chrome binary or read its version from standard install paths.

noisgate-verify.py
PYTHONREAD-ONLYSAFE
#!/usr/bin/env python3
# check_chrome_cve_2026_10980.py
# Exit codes:
#   0 = PATCHED
#   1 = VULNERABLE
#   2 = UNKNOWN

import os
import platform
import re
import shutil
import subprocess
import sys
from typing import Optional, Tuple

TARGET = (149, 0, 7827, 53)


def parse_version(text: str) -> Optional[Tuple[int, int, int, int]]:
    m = re.search(r'(\d+)\.(\d+)\.(\d+)\.(\d+)', text)
    if not m:
        return None
    return tuple(int(x) for x in m.groups())


def run_cmd(cmd):
    try:
        p = subprocess.run(cmd, capture_output=True, text=True, timeout=10)
        out = (p.stdout or '') + '\n' + (p.stderr or '')
        return out.strip()
    except Exception:
        return ''


def check_linux() -> Optional[Tuple[int, int, int, int]]:
    candidates = [
        shutil.which('google-chrome'),
        shutil.which('google-chrome-stable'),
        shutil.which('chromium-browser'),
        shutil.which('chromium'),
        '/opt/google/chrome/chrome',
        '/usr/bin/google-chrome',
        '/usr/bin/google-chrome-stable',
    ]
    for path in candidates:
        if path and os.path.exists(path):
            out = run_cmd([path, '--version'])
            ver = parse_version(out)
            if ver:
                return ver
    return None


def check_macos() -> Optional[Tuple[int, int, int, int]]:
    candidates = [
        '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
        os.path.expanduser('~/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'),
    ]
    for path in candidates:
        if os.path.exists(path):
            out = run_cmd([path, '--version'])
            ver = parse_version(out)
            if ver:
                return ver
    return None


def check_windows() -> Optional[Tuple[int, int, int, int]]:
    envs = [
        os.environ.get('ProgramFiles'),
        os.environ.get('ProgramFiles(x86)'),
        os.environ.get('LocalAppData'),
    ]
    candidates = []
    for base in envs:
        if not base:
            continue
        candidates.append(os.path.join(base, 'Google', 'Chrome', 'Application', 'chrome.exe'))

    for path in candidates:
        if os.path.exists(path):
            out = run_cmd([
                'powershell', '-NoProfile', '-Command',
                f"(Get-Item '{path}').VersionInfo.ProductVersion"
            ])
            ver = parse_version(out)
            if ver:
                return ver
            out = run_cmd([path, '--version'])
            ver = parse_version(out)
            if ver:
                return ver
    return None


def compare(ver, target):
    if ver < target:
        return -1
    if ver > target:
        return 1
    return 0


def main():
    system = platform.system().lower()
    version = None

    if 'linux' in system:
        version = check_linux()
    elif 'darwin' in system:
        version = check_macos()
    elif 'windows' in system:
        version = check_windows()
    else:
        print('UNKNOWN: unsupported OS')
        sys.exit(2)

    if not version:
        print('UNKNOWN: Google Chrome not found or version unreadable')
        sys.exit(2)

    print('Detected Chrome version: %s' % '.'.join(map(str, version)))

    cmp_result = compare(version, TARGET)
    if cmp_result < 0:
        print('VULNERABLE')
        sys.exit(1)
    else:
        print('PATCHED')
        sys.exit(0)


if __name__ == '__main__':
    main()
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: treat this as standard browser patch hygiene, not an emergency outage drill. For a MEDIUM verdict there is no noisgate mitigation SLA — go straight to the 365-day remediation window under the noisgate remediation SLA, but because Chrome is broadly deployed and auto-updatable you should still push managed clients to 149.0.7827.53/.54 or later in the next regular browser wave, verify version drift across the fleet, and reserve true fast-lane effort for Chrome flaws with KEV status, public exploitation, or clean standalone RCE characteristics.

Sources

  1. Chrome Releases 2026 index
  2. Chrome Stable Channel Update for Desktop (June 2, 2026)
  3. Chrome Early Stable Update for Desktop (May 29, 2026)
  4. Chrome Security Page
  5. CISA Known Exploited Vulnerabilities Catalog
  6. FIRST EPSS model documentation
  7. Canadian Centre for Cyber Security advisory AV26-544
  8. GovCERT.HK alert A26-06-08
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.