This is a second lock behind a door the attacker already had to kick open
CVE-2026-10911 is a Chrome Media input-validation flaw fixed in Chrome 149 for desktop and Android. The vendor text and CVSS shape strongly imply a *post-renderer-compromise* path: a remote attacker first lands code execution or equivalent control in the renderer, then uses crafted media handling to cross a trust boundary and escalate impact. Affected versions are Chrome releases prior to 149.0.7827.53 on Linux and 149.0.7827.53/54 on Windows/Mac; Android received the same fixes in 149.0.7827.59.
Google rating it High is internally consistent with Chromium's own severity guidance for renderer-compromise-to-sandbox-escape style bugs. For enterprise patch triage, though, that is still too hot if you read it like an initial-access RCE. The decisive friction is that the attacker must already have *won stage one* inside Chrome's renderer, which sharply narrows real-world reach, keeps EPSS tiny, and makes this much more valuable as an exploit-chain component than as a stand-alone enterprise fire drill.
4 steps from start to impact.
Land code in the renderer
- Victim runs vulnerable Chrome prior to 149.0.7827.53/54
- Attacker has a separate renderer compromise primitive
- User visits attacker-controlled or attacker-influenced content
- Requires chaining with another vulnerability or equivalent renderer compromise
- Modern exploit mitigations, site isolation, and sandboxing raise chain complexity
- Email gateways, web filtering, and browser hardening can stop stage-one delivery before this CVE matters
Trigger Media parsing from the compromised renderer
- Renderer can invoke the affected Media code path
- Crafted media content reaches the vulnerable parser or IPC boundary
- The vulnerable path may not be reachable from every page or every codec/container combination
- Bug details were still restricted at release, which slows commodity weaponization
Cross the sandbox boundary
- Exploit must survive Chrome sandboxing and process isolation
- Target platform-specific mitigations must not break reliability
- Sandbox escapes are harder to make reliable than renderer-only bugs
- Platform differences across Windows, macOS, and Linux reduce one-size-fits-all exploitation
Convert browser compromise into endpoint impact
- Successful stage-two exploit
- Useful post-exploitation path on the endpoint
- Least-privilege endpoints, EDR, application control, and browser profile isolation limit payoff
- A successful exploit still lands with user-context constraints unless chained again
The supporting signals.
| In-the-wild status | No public evidence of active exploitation found. It is not in CISA KEV, and Chromium states bug details may remain restricted until most users are patched. |
|---|---|
| KEV status | Not KEV-listed as of this assessment. That materially lowers urgency versus Chrome bugs that arrive with same-week exploitation pressure. |
| Proof-of-concept availability | No public PoC located in this review. Public search turned up no credible GitHub or researcher release tied to CVE-2026-10911; issue details are still effectively opaque from the public side. |
| EPSS | 0.00066 from the user-supplied intel block; that is very low and consistent with a hard-to-weaponize chain component. I did not independently confirm the percentile from FIRST's live API in this session. |
| CVSS vector | CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:H/I:H/A:H — read this as *internet-reachable only in theory*, but with high complexity, user interaction, and a changed scope boundary-crossing outcome. |
| Affected versions | Google's release note says desktop Chrome before 149.0.7827.53 on Linux and 149.0.7827.53/54 on Windows/Mac. Android picked up the corresponding security fixes in 149.0.7827.59. |
| Fixed versions | Desktop fixed in 149.0.7827.53 (Linux) and 149.0.7827.53/54 (Windows/Mac); Android fixed in 149.0.7827.59. I found no authoritative distro-style backport advisory for this Chrome client issue beyond Google's release channels. |
| Scanning/exposure reality | Shodan/Censys/FOFA are basically irrelevant here. This is a client-side browser vulnerability, not a server you can enumerate on the public internet. Your exposure question is fleet version coverage, kiosk/VDI laggards, and auto-update health. |
| Disclosure timing | There is a date mismatch worth noting: Google shipped the stable fix on 2026-06-02, while your intel says disclosed 2026-06-04. That likely reflects downstream record publication after the patch shipped. |
| Reporter / origin | The stable-channel advisory credits Google as the reporter and references Chromium issue 495819067. |
noisgate verdict.
The single biggest reason this lands at MEDIUM is that it appears to require a compromised renderer first, which makes it a post-initial-compromise chain component rather than an enterprise-scale initial-access event. That prerequisite dramatically reduces the reachable population of successful attacks even though the end-state impact could be severe inside a mature exploit chain.
Why this verdict
- Down one full band for attacker position: this is not unauthenticated remote code execution by itself; the attacker appears to need prior renderer compromise, which implies stage-one success already happened.
- Down again for reachable population: every enterprise has Chrome, but only a tiny slice of attacks will have both a working stage-one renderer exploit and the right stage-two media path for this CVE.
- Down for threat intel: no KEV, no public PoC found, and the supplied EPSS is extremely low (
0.00066), all of which argue against emergency patch prioritization.
Why not higher?
If this were a stand-alone browser RCE or a Chrome bug with confirmed in-the-wild chaining, it would stay in HIGH or climb beyond it operationally. But the prerequisite of prior renderer compromise is a major practical brake, and the current threat intel does not show broad weaponization pressure.
Why not lower?
This is still a browser boundary-crossing bug in one of the most widely deployed user applications on the planet. Once paired with a renderer bug, the blast radius can jump from tab compromise to materially worse endpoint impact, so treating it as mere backlog hygiene would understate the chain value.
What to do — in priority order.
- Validate Chrome auto-update health — Because this is MEDIUM, there is no mitigation SLA — go straight to the 365-day remediation window. Still, verify that managed Windows, macOS, Linux, VDI, and kiosk channels are actually ingesting Chrome 149+ so this does not linger in frozen images or broken update rings.
- Harden browser exploit paths — Use existing browser-hardening baselines, exploit protection, and EDR memory-exploit coverage to reduce the odds of the required stage-one renderer compromise. There is no noisgate mitigation SLA for a MEDIUM finding, so use this as a routine hardening check rather than an emergency change.
- Focus on unmanaged edge cases — Prioritize kiosks, VDI gold images, contractor laptops, and Linux workstations that often miss Chrome update policy. Those are the places where client-side browser CVEs survive longest, even when mainstream endpoints auto-update normally.
- Watch for browser-to-host pivots — Tune EDR hunts for
chrome-spawned child processes, suspicious downloads, abnormal credential access, and exploit-protection alerts. This does not replace patching, but it is the best compensating visibility for a browser exploit-chain component while updates roll through normal maintenance.
- Perimeter scanning won't help much; this is a client-side browser flaw, so external exposure scanners do not tell you who is at risk.
- A WAF is largely irrelevant because the vulnerable component runs on the endpoint and the attacker can deliver content over normal browsing paths, not just your web apps.
- Email filtering alone is insufficient; even perfect mail controls do nothing if the first-stage renderer exploit arrives through general web traffic or an ad/script supply chain.
Crowdsourced verification payload.
Run this on the target endpoint or through your software-distribution/remote-exec tooling, not from an auditor workstation. Invoke it as python3 check_cve_2026_10911.py with standard user rights; it reads the local Chrome version from common install paths and prints VULNERABLE, PATCHED, or UNKNOWN.
#!/usr/bin/env python3
# check_cve_2026_10911.py
# Determine whether local Google Chrome is vulnerable to CVE-2026-10911
# Fixed desktop versions:
# Linux: 149.0.7827.53+
# Windows: 149.0.7827.53/54+
# macOS: 149.0.7827.53/54+
# Exit codes:
# 0 = PATCHED
# 1 = VULNERABLE
# 2 = UNKNOWN
import os
import platform
import re
import shutil
import subprocess
import sys
FIXED = (149, 0, 7827, 53)
def parse_version(text):
m = re.search(r'(\d+)\.(\d+)\.(\d+)\.(\d+)', text)
if not m:
return None
return tuple(int(x) for x in m.groups())
def version_ge(a, b):
return a >= b
def run_cmd(cmd):
try:
p = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, timeout=10)
out = (p.stdout or '') + '\n' + (p.stderr or '')
return out.strip()
except Exception:
return ''
def find_linux_version():
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 c in candidates:
if c and os.path.exists(c):
out = run_cmd([c, '--version'])
v = parse_version(out)
if v:
return c, v
return None, None
def find_macos_version():
app = '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
if os.path.exists(app):
out = run_cmd([app, '--version'])
v = parse_version(out)
if v:
return app, v
mdls_target = '/Applications/Google Chrome.app'
if os.path.exists(mdls_target):
out = run_cmd(['mdls', '-name', 'kMDItemVersion', mdls_target])
v = parse_version(out)
if v:
return mdls_target, v
return None, None
def find_windows_version():
candidates = [
os.path.join(os.environ.get('ProgramFiles', r'C:\Program Files'), 'Google', 'Chrome', 'Application', 'chrome.exe'),
os.path.join(os.environ.get('ProgramFiles(x86)', r'C:\Program Files (x86)'), 'Google', 'Chrome', 'Application', 'chrome.exe'),
os.path.join(os.environ.get('LocalAppData', ''), 'Google', 'Chrome', 'Application', 'chrome.exe'),
]
for c in candidates:
if c and os.path.exists(c):
try:
import winreg # type: ignore
# Best-effort file version via PowerShell fallback
except Exception:
pass
out = run_cmd(['powershell', '-NoProfile', '-Command', f"(Get-Item '{c}').VersionInfo.ProductVersion"]) if shutil.which('powershell') else ''
v = parse_version(out)
if v:
return c, v
out = run_cmd([c, '--version'])
v = parse_version(out)
if v:
return c, v
return None, None
def main():
system = platform.system().lower()
path = None
version = None
if 'linux' in system:
path, version = find_linux_version()
elif 'darwin' in system:
path, version = find_macos_version()
elif 'windows' in system:
path, version = find_windows_version()
else:
print('UNKNOWN - unsupported operating system')
sys.exit(2)
if not version:
print('UNKNOWN - Google Chrome version not found')
sys.exit(2)
version_str = '.'.join(str(x) for x in version)
if version_ge(version, FIXED):
print(f'PATCHED - found {version_str} at {path}')
sys.exit(0)
else:
print(f'VULNERABLE - found {version_str} at {path}; fixed is 149.0.7827.53 or later')
sys.exit(1)
if __name__ == '__main__':
main()
If you remember one thing.
Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.