This is a booby-trapped brochure, not a skeleton key to the enterprise
CVE-2026-11304 is a use-after-free bug in Chrome's embedded PDF renderer, PDFium. Affected builds are Google Chrome desktop versions prior to 149.0.7827.53 on Linux and prior to 149.0.7827.53/54 on Windows and macOS, and exploitation requires getting a user to open attacker-controlled PDF content in a vulnerable browser. The public description says the flaw may allow heap corruption via a crafted PDF file; it does not publicly claim a sandbox escape or guaranteed full host compromise.
The 8.8 HIGH score is a classic CVSS overstatement for browser bugs because it assumes worst-case impact once the bug triggers, but it ignores the real-world chain: user interaction, client-side reachability, Chrome sandboxing, and the lack of observed exploitation. More importantly, Google/Chrome itself labeled this issue with Chromium security severity: Low, which is a strong signal that the vendor does not view the public bug as an easy or high-value standalone enterprise break.
4 steps from start to impact.
Deliver crafted PDF content
- Unauthenticated remote attacker can reach the user
- Target uses Chrome below
149.0.7827.53 - Target opens or previews attacker-controlled PDF content
- This is user-interaction required (
UI:R), so no wormable server-side path exists - Modern email gateways, Safe Browsing, attachment detonation, and browser download reputation all reduce delivery success
- Many enterprise users do not habitually open unsolicited PDFs in Chrome
Trigger PDFium memory corruption
- Victim renders the PDF in vulnerable Chrome
- Attacker's document reaches the affected PDFium code path
- Exploit is reliable across the target OS/build/channel
- Public details are sparse and the Chromium issue remains restricted
- Use-after-free bugs in hardened browser code often need careful allocator and version-specific reliability work
- Chrome ships with modern exploit mitigations including sandboxing and memory-hardening controls
Gain code execution in the renderer context
- The memory corruption is shaped into controlled execution rather than a crash
- Target defenses do not terminate or isolate the process before payload execution
- The public record does not claim an unsandboxed RCE path
- EDR, exploit protection, and Chrome crash/mitigation behavior can break many real-world exploit attempts
- Impact may remain confined to a renderer context without a second bug
Escape sandbox or steal session data
- Attacker has or pairs this bug with a sandbox escape or strong in-browser objective
- The victim's endpoint controls fail to stop follow-on activity
- No public evidence ties this CVE to an in-the-wild chain
- A second bug or strong post-exploitation path is typically required for major blast radius
- Enterprise EDR usually has a better chance of seeing the second-stage activity than the initial PDF bug
149.0.7827.53/54. For a MEDIUM verdict there is no mitigation SLA — go straight to the 365-day remediation window, but in practice browser updates should happen much faster because the operational cost is low.chrome/chromium crashes involving PDF rendering, especially if they correlate with downloaded PDFs, phish campaigns, or child-process anomalies. Failed exploit attempts often show up as noisy browser instability before they show up as confirmed compromise.- Perimeter network scanning does not help; this is not a server-side listening service with a remotely testable socket.
- MFA does not stop exploitation of the PDF parser; it may help with later account abuse, but not with triggering the bug.
- Generic vulnerability scanners usually cannot prove exploitability for this class of client-side browser issue; version inventory is the real control.
The supporting signals.
| In-the-wild status | No public evidence of active exploitation found in reviewed sources; this CVE is not in CISA KEV. |
|---|---|
| KEV status | Not listed in the CISA Known Exploited Vulnerabilities Catalog as reviewed. |
| EPSS | 0.00068 as supplied in the intel block — very low predicted near-term exploitation probability. FIRST documents EPSS as a 30-day exploitation likelihood estimate, not an impact score. |
| Proof-of-concept availability | No public PoC or exploit repository located in reviewed search results. The Chromium bug link exists, but details appear restricted, which is normal for fresh Chrome bugs. |
| Vendor vs scoring authority | Google/Chrome labels the issue Chromium security severity: Low, while CISA-ADP attached CVSS 8.8 HIGH. That mismatch is the core reason to downgrade. |
| CVSS vector meaning | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H captures remote delivery and required user interaction, but it assumes worst-case impact after trigger and does not price in sandbox friction. |
| Affected versions | Chrome desktop prior to 149.0.7827.53 on Linux and prior to 149.0.7827.53/54 on Windows/macOS per Google's June 2, 2026 stable-channel update. |
| Fixed versions | Upgrade to 149.0.7827.53 or later on Linux and 149.0.7827.53/54 or later on Windows/macOS. Reviewed sources did not provide a clean distro-backport matrix for this exact CVE. |
| Exposure/scanning reality | Shodan/Censys/FOFA-style exposure data is not meaningful here because this is a client-side browser parser issue, not an internet-exposed listening service. |
| Disclosure and reporting | Publicly disclosed on 2026-06-05 in the supplied intel; NVD shows the CVE received from Chrome on 2026-06-04 and references the Chrome stable release from 2026-06-02. The Chrome release notes list it as reported by Google on 2026-04-20. |
Sources.
Why this verdict
- Downgrade for attacker position: the attacker is remote but must still convince a user to open a crafted PDF, which makes this a delivery problem, not a straight reachable service bug.
- Downgrade for real-world blast radius: successful exploitation most plausibly lands in a sandboxed browser process, not instant unconstrained host takeover.
- Downgrade for threat evidence: no KEV, no public exploitation, and a very low EPSS all argue against emergency-tier prioritization.
- Downgrade for vendor assessment: Chrome itself called the bug Low severity, while the
8.8comes from scoring enrichment logic that predictably inflates browser memory-corruption cases. - Hold at MEDIUM, not LOW: Chrome is ubiquitous, PDFs are common lures, and use-after-free bugs can become valuable when paired with a second-stage exploit chain.
Why not higher?
There is no public evidence that CVE-2026-11304 is being used in the wild, and the published record does not claim a sandbox escape. The enterprise damage path depends on multiple compounding prerequisites: user action, exploit reliability against a hardened browser, and likely a second-stage escape or follow-on objective.
Why not lower?
This is still a memory-corruption bug in an extremely common client application, and PDF workflows are normal enough that users will render attacker-controlled documents. Even when a standalone bug is not emergency-grade, the reachable population is large enough that it should not be treated as mere backlog trivia.
Crowdsourced verification payload.
Run this on the target host or via your software-distribution/EDR live response tooling. Invoke it as python3 check_chrome_cve_2026_11304.py with standard user rights; it attempts to auto-detect Chrome on Windows, macOS, and Linux and prints VULNERABLE, PATCHED, or UNKNOWN.
#!/usr/bin/env python3
# Check local Google Chrome version for CVE-2026-11304 exposure
# Exit codes:
# 0 = PATCHED
# 1 = VULNERABLE
# 2 = UNKNOWN / could not determine
import os
import platform
import re
import subprocess
import sys
from shutil import which
FIXED = (149, 0, 7827, 53)
def parse_version(text):
if not text:
return None
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, 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 detect_windows():
candidates = [
[r'C:\Program Files\Google\Chrome\Application\chrome.exe', '--version'],
[r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe', '--version'],
]
local_appdata = os.environ.get('LOCALAPPDATA')
if local_appdata:
candidates.append([os.path.join(local_appdata, 'Google', 'Chrome', 'Application', 'chrome.exe'), '--version'])
for cmd in candidates:
if os.path.exists(cmd[0]):
out = run_cmd(cmd)
v = parse_version(out)
if v:
return v, cmd[0]
ps = which('powershell') or which('pwsh')
if ps:
script = r"""
$paths = @(
'HKLM:\Software\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe',
'HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe',
'HKCU:\Software\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe'
)
foreach ($p in $paths) {
try {
$item = Get-ItemProperty -Path $p -ErrorAction Stop
if ($item.'(default)') { Write-Output $item.'(default)'; break }
} catch {}
}
"""
out = run_cmd([ps, '-NoProfile', '-Command', script])
exe = out.strip().splitlines()[0] if out.strip() else ''
if exe and os.path.exists(exe):
ver = parse_version(run_cmd([exe, '--version']))
if ver:
return ver, exe
return None, None
def detect_macos():
paths = [
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
os.path.expanduser('~/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'),
]
for p in paths:
if os.path.exists(p):
out = run_cmd([p, '--version'])
v = parse_version(out)
if v:
return v, p
return None, None
def detect_linux():
names = ['google-chrome', 'google-chrome-stable', 'chromium', 'chromium-browser']
for name in names:
exe = which(name)
if exe:
out = run_cmd([exe, '--version'])
v = parse_version(out)
if v:
return v, exe
extra_paths = [
'/opt/google/chrome/chrome',
'/usr/bin/google-chrome',
'/usr/bin/google-chrome-stable',
'/snap/bin/chromium',
]
for p in extra_paths:
if os.path.exists(p):
out = run_cmd([p, '--version'])
v = parse_version(out)
if v:
return v, p
return None, None
def compare_versions(found, fixed):
if found < fixed:
return -1
if found > fixed:
return 1
return 0
def main():
system = platform.system().lower()
if 'windows' in system:
version, source = detect_windows()
elif 'darwin' in system:
version, source = detect_macos()
else:
version, source = detect_linux()
if not version:
print('UNKNOWN: could not determine local Chrome/Chromium version')
sys.exit(2)
print(f'DETECTED: {source} -> {".".join(map(str, version))}')
cmp = compare_versions(version, FIXED)
if cmp < 0:
print('VULNERABLE')
sys.exit(1)
else:
print('PATCHED')
sys.exit(0)
if __name__ == '__main__':
main()