This is a cracked windshield on every company car, but the airbag still works
CVE-2026-5873 is a V8 memory-safety bug: an out-of-bounds read/write reachable from attacker-controlled web content. Affected builds are Google Chrome before 147.0.7727.55 on Linux and before 147.0.7727.55/56 on Windows and macOS; downstream Chromium-based products picked up the same Chromium fixes later, including ChromeOS browser 147.0.7727.115 and Microsoft Edge 147.0.3912.60 as part of their April 2026 releases.
Google's HIGH 8.8 rating is directionally right, but the raw CVSS overstates end-host impact for enterprise triage because successful code execution lands inside the browser sandbox, not straight on the OS. The downgrade pressure is real: user interaction is required, exploit reliability for modern V8 is non-trivial, and there's no KEV listing or public exploitation evidence in the sources reviewed. The upgrade pressure is also real: Chrome/Edge are everywhere, the attack path is just 'get a user onto a page,' and browser bugs chain well with credential theft, session hijack, or a later sandbox escape.
4 steps from start to impact.
Land the victim on attacker-controlled HTML
- Victim uses vulnerable Chrome/Chromium-derived browser build
- Victim opens or is redirected to attacker-controlled content
- JavaScript execution is permitted for the target page
- Safe Browsing, URL filtering, DNS filtering, and email protections kill a chunk of delivery attempts
- Ad/script blocking and browser hardening can reduce reachable exploit surface
- This is still *user-driven* exposure, not server-side unauthenticated reachability
Trigger the V8 out-of-bounds primitive
- Exploit must match the vulnerable V8 behavior in the installed build
- Modern browser mitigations must be bypassed well enough to gain renderer code execution
- No public PoC was identified in reviewed sources
- Chrome's exploit mitigations, allocator behavior, and continual version churn make one-shot weaponization harder than CVSS suggests
- Exploit reliability drops fast across minor browser updates
Gain code execution in the renderer sandbox
- Successful memory corruption exploit
- Browser sandbox remains the current boundary
- No direct host compromise from this CVE alone
- Site isolation and sandboxing sharply limit blast radius versus a native RCE on the endpoint
- Many follow-on objectives need a second bug or credential theft opportunity
Monetize inside-browser access or chain onward
- Useful browser session state exists
- Attacker goal is browser data theft or a chained endpoint compromise
- Without a sandbox escape, OS-level persistence and full endpoint takeover are not guaranteed
- Credentialless browsing sessions or short-lived tokens reduce payoff
- Conditional access, re-auth prompts, and EDR reduce downstream success
The supporting signals.
| In-the-wild status | No public exploitation evidence found in the reviewed vendor/NVD/CISA sources; not currently a known active zero-day based on those sources. |
|---|---|
| KEV status | Not listed in CISA KEV as reviewed via the Known Exploited Vulnerabilities Catalog. |
| EPSS | 0.00111 (~0.111%) from your intel block, which is low for immediate exploitation likelihood. |
| Proof-of-concept availability | No public GitHub/technical PoC was identified in the reviewed sources. Treat that as absence of evidence, not evidence of absence for private exploit development. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H — remote over the web, no auth, but user interaction required and execution remains in-browser. |
| Affected versions | Chrome before 147.0.7727.55 on Linux and before 147.0.7727.55/56 on Windows/macOS per Chrome Releases; NVD models affected Chrome versions <147.0.7727.55. |
| Fixed versions | Google fixed it in Chrome 147.0.7727.55/56; ChromeOS carried the browser fix in 147.0.7727.115; Debian backported fixes to 147.0.7727.55-1~deb12u1 and 147.0.7727.55-1~deb13u1; Edge incorporated Chromium fixes in 147.0.3912.60. |
| Disclosure timeline | CVE published 2026-04-08; Chrome desktop fix shipped 2026-04-07; NVD shows later enrichment on 2026-04-13. |
| Reporter / researcher | Vendor release notes say reported by Google on 2026-03-25; Chromium issue reference is 496301615. |
| Scanning / exposure data | Shodan/Censys/FOFA-style internet exposure is not the right lens here because this is a client-side browser bug, not a remotely enumerable listening service. The exposure question is endpoint fleet prevalence, and that population is usually massive in enterprise. |
noisgate verdict.
The decisive factor is reachability at enterprise scale: nearly every user browses untrusted content, so the exposed population is huge even though the bug is client-side. I kept it in HIGH because browser ubiquity offsets a lot of the downward pressure from sandboxing; I did not push it to CRITICAL because this CVE alone stops at renderer-sandbox execution and lacks active exploitation evidence.
Why this verdict
- Wide exposure baseline: Chrome/Edge are standard enterprise software, so the reachable population is enormous even though this is not internet-facing server software.
- Step 1 needs only browsing: attacker position is unauthenticated remote, but the prerequisite implies only that a user loads attacker content; that is common enough to preserve HIGH.
- Step 3 is the main brake: successful execution lands inside the browser sandbox, which materially narrows blast radius versus native endpoint RCE; that is the largest downward adjustment from the vendor's 8.8.
- No exploitation amplifier: no KEV listing, no public in-the-wild note in reviewed sources, and your EPSS is low; that removes the 'drop everything now' pressure.
- Still chain-friendly: V8 memory corruption is premium bug class, and browser session theft or later sandbox-escape chaining keeps the business risk above MEDIUM.
Why not higher?
This is not a one-bug workstation takeover. The documented impact is code execution inside a sandbox, and there is no public evidence in the reviewed sources of active exploitation, KEV inclusion, or a broadly available PoC. Those are exactly the things that would push a browser bug from routine-high into emergency-critical territory.
Why not lower?
Calling this MEDIUM would underweight how often users hit attacker-controlled web content and how broadly Chrome-derived browsers are deployed. An unauthenticated remote attacker can target this at scale with nothing more exotic than a page view, and browser-process compromise is still enough for credential, token, and session abuse.
What to do — in priority order.
- Force browser auto-update — Enforce Chrome/Edge automatic updates through enterprise policy and verify devices are actually consuming them. For a HIGH verdict, deploy this control within 30 days to shrink the vulnerable population even before every lagging endpoint is fully remediated.
- Block obsolete browser versions — Use MDM, EDR posture, or conditional-access-style controls where available to flag or restrict endpoints running Chrome
<147.0.7727.55or equivalent unpatched Chromium derivatives. For a HIGH verdict, get that control live within 30 days. - Isolate high-risk web access — Push remote browser isolation or hardened browsing profiles to admins, finance, help desk, and frequent external-content users. For a HIGH verdict, stage this compensating measure within 30 days where full patch uniformity is slow.
- Tighten browser hardening — Reduce exploit reliability by keeping Safe Browsing on, minimizing risky extensions, and enforcing modern browser security settings. This is not a substitute for patching, but for a HIGH verdict it is worth deploying within 30 days to cut opportunistic exploitation.
- A WAF does not protect desktop browsers from arbitrary malicious sites; the vulnerable parser is on the endpoint.
- Perimeter vulnerability scanning will miss the real exposure because browsers are client software, not enumerated listening services.
- MFA alone does not stop renderer compromise or browser-session theft once a user is already on the malicious page.
Crowdsourced verification payload.
Run this on the target endpoint or via your software-distribution/EDR script runner. Invoke with python3 check_cve_2026_5873.py on Windows, macOS, or Linux; no admin rights are normally required, but local filesystem access to browser install paths is needed. The script checks common Chrome, Chromium, and Edge locations and prints VULNERABLE, PATCHED, or UNKNOWN.
#!/usr/bin/env python3
# check_cve_2026_5873.py
# Determine whether locally installed Chrome/Chromium/Edge builds are vulnerable to CVE-2026-5873.
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
import os
import platform
import re
import shutil
import subprocess
import sys
from typing import List, Optional, Tuple
TARGET_CHROME = (147, 0, 7727, 55)
TARGET_EDGE = (147, 0, 3912, 60) # Chromium fixes incorporated by Edge release notes
def parse_version(s: str) -> Optional[Tuple[int, ...]]:
m = re.search(r'(\d+)\.(\d+)\.(\d+)\.(\d+)', s)
if not m:
return None
return tuple(int(x) for x in m.groups())
def version_ge(found: Tuple[int, ...], target: Tuple[int, ...]) -> bool:
max_len = max(len(found), len(target))
f = found + (0,) * (max_len - len(found))
t = target + (0,) * (max_len - len(target))
return f >= t
def run_version(cmd: List[str]) -> Optional[str]:
try:
out = subprocess.check_output(cmd, stderr=subprocess.STDOUT, text=True, timeout=5)
return out.strip()
except Exception:
return None
def windows_candidates() -> List[Tuple[str, List[str]]]:
pf = os.environ.get('ProgramFiles', r'C:\Program Files')
pfx86 = os.environ.get('ProgramFiles(x86)', r'C:\Program Files (x86)')
local = os.environ.get('LOCALAPPDATA', '')
return [
('chrome', [os.path.join(pf, 'Google', 'Chrome', 'Application', 'chrome.exe')]),
('chrome', [os.path.join(pfx86, 'Google', 'Chrome', 'Application', 'chrome.exe')]),
('chrome', [os.path.join(local, 'Google', 'Chrome', 'Application', 'chrome.exe')]),
('edge', [os.path.join(pf, 'Microsoft', 'Edge', 'Application', 'msedge.exe')]),
('edge', [os.path.join(pfx86, 'Microsoft', 'Edge', 'Application', 'msedge.exe')]),
('chromium', [os.path.join(pf, 'Chromium', 'Application', 'chrome.exe')]),
('chromium', [os.path.join(pfx86, 'Chromium', 'Application', 'chrome.exe')]),
]
def mac_candidates() -> List[Tuple[str, List[str]]]:
return [
('chrome', ['/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', '--version']),
('edge', ['/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge', '--version']),
('chromium', ['/Applications/Chromium.app/Contents/MacOS/Chromium', '--version']),
]
def linux_candidates() -> List[Tuple[str, List[str]]]:
cmds = []
for name, kind in [
('google-chrome', 'chrome'),
('google-chrome-stable', 'chrome'),
('chromium', 'chromium'),
('chromium-browser', 'chromium'),
('microsoft-edge', 'edge'),
('microsoft-edge-stable', 'edge'),
]:
path = shutil.which(name)
if path:
cmds.append((kind, [path, '--version']))
return cmds
def collect_candidates() -> List[Tuple[str, List[str]]]:
system = platform.system().lower()
if system == 'windows':
out = []
for kind, parts in windows_candidates():
exe = parts[0]
if os.path.exists(exe):
out.append((kind, [exe, '--version']))
return out
if system == 'darwin':
return [(k, c) for k, c in mac_candidates() if os.path.exists(c[0])]
return linux_candidates()
def assess(kind: str, ver: Tuple[int, ...]) -> str:
if kind in ('chrome', 'chromium'):
return 'PATCHED' if version_ge(ver, TARGET_CHROME) else 'VULNERABLE'
if kind == 'edge':
return 'PATCHED' if version_ge(ver, TARGET_EDGE) else 'VULNERABLE'
return 'UNKNOWN'
def main() -> int:
candidates = collect_candidates()
if not candidates:
print('UNKNOWN - no supported Chrome/Chromium/Edge installation found in common paths')
return 2
results = []
for kind, cmd in candidates:
raw = run_version(cmd)
if not raw:
continue
ver = parse_version(raw)
if not ver:
results.append((kind, raw, 'UNKNOWN'))
continue
status = assess(kind, ver)
results.append((kind, '.'.join(map(str, ver)), status))
if not results:
print('UNKNOWN - browser found but version could not be read')
return 2
for kind, ver, status in results:
print(f'{kind.upper()} {ver} => {status}')
if any(status == 'VULNERABLE' for _, _, status in results):
print('VULNERABLE')
return 1
if all(status == 'PATCHED' for _, _, status in results):
print('PATCHED')
return 0
print('UNKNOWN')
return 2
if __name__ == '__main__':
sys.exit(main())
If you remember one thing.
Sources
- Google Chrome Releases - Stable Channel Update for Desktop
- NVD - CVE-2026-5873
- Google Chrome Releases - Stable Channel Update for ChromeOS / ChromeOS Flex
- Debian Security Tracker - CVE-2026-5873
- Ubuntu Security - CVE-2026-5873
- Microsoft Edge Security Release Notes
- CISA Known Exploited Vulnerabilities Catalog
- Feedly CVE Card - CVE-2026-5873
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.