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
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.
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. |
Sources.
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.
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()