← Back to Feed CACHED · 2026-05-17 09:42:19 · cache_key CVE-2025-29912
CVE-2026-5873 · CWE-125 · Disclosed 2026-04-08

Out of bounds read and write in V8 in Google Chrome prior to 147

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

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.

"Still HIGH: browser-wide drive-by reach outweighs the sandbox, but this is not a drop-everything zero-day."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Land the victim on attacker-controlled HTML

The delivery mechanism is the usual client-side playbook: phishing, malicious ad inventory, compromised sites, or chat-delivered links. The weaponized tool is simply a crafted HTML/JavaScript payload rendered by V8; no auth and no network adjacency are needed.
Conditions required:
  • 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
Where this breaks in practice:
  • 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
Detection/coverage: Version scanners can identify vulnerable browsers reliably; network detection of the exploit itself is weak unless the campaign is already known.
STEP 02

Trigger the V8 out-of-bounds primitive

The payload drives V8 into an out-of-bounds read/write state using crafted script behavior. The weaponized component is a custom V8 exploit chain, usually JavaScript plus heap grooming and often WebAssembly for reliability.
Conditions required:
  • Exploit must match the vulnerable V8 behavior in the installed build
  • Modern browser mitigations must be bypassed well enough to gain renderer code execution
Where this breaks in practice:
  • 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
Detection/coverage: There is little preventative signature coverage here beyond browser protections and exploit-behavior telemetry from EDR/browser security tooling.
STEP 03

Gain code execution in the renderer sandbox

Per the vendor and NVD description, the result is arbitrary code execution inside a sandbox. That still matters: sandboxed code can access page content, session context, rendered secrets, and browser-local attack surface.
Conditions required:
  • Successful memory corruption exploit
  • Browser sandbox remains the current boundary
Where this breaks in practice:
  • 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
Detection/coverage: EDR may see anomalous child-process or memory behavior if the exploit chain gets noisy; pure in-renderer activity can be low-signal.
STEP 04

Monetize inside-browser access or chain onward

From the renderer, the attacker can target cookies, tokens, page data, or enterprise SaaS sessions, or attempt a sandbox escape with a separate local/Chrome bug. The practical 'tool' here is the post-exploitation logic embedded in the page or a second-stage browser exploit.
Conditions required:
  • Useful browser session state exists
  • Attacker goal is browser data theft or a chained endpoint compromise
Where this breaks in practice:
  • 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
Detection/coverage: CASB, IdP anomaly detection, and EDR may catch unusual token reuse or follow-on process activity; vulnerability scanners do not cover this stage.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo public exploitation evidence found in the reviewed vendor/NVD/CISA sources; not currently a known active zero-day based on those sources.
KEV statusNot listed in CISA KEV as reviewed via the Known Exploited Vulnerabilities Catalog.
EPSS0.00111 (~0.111%) from your intel block, which is low for immediate exploitation likelihood.
Proof-of-concept availabilityNo 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 vectorCVSS: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 versionsChrome 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 versionsGoogle 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 timelineCVE published 2026-04-08; Chrome desktop fix shipped 2026-04-07; NVD shows later enrichment on 2026-04-13.
Reporter / researcherVendor release notes say reported by Google on 2026-03-25; Chromium issue reference is 496301615.
Scanning / exposure dataShodan/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.
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to HIGH (8.1/10)

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.

HIGH Affected-version cutoff and fixed-version mapping
MEDIUM Real-world exploitation likelihood without public PoC or KEV evidence
HIGH Severity downgrade pressure from sandbox containment

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.

05 · Compensating Control

What to do — in priority order.

  1. 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.
  2. 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.55 or equivalent unpatched Chromium derivatives. For a HIGH verdict, get that control live within 30 days.
  3. 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.
  4. 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.
What doesn't work
  • 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.
06 · Verification

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.

noisgate-verify.py
PYTHONREAD-ONLYSAFE
#!/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())
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning, treat this as a fleet browser hygiene priority, not an incident-response fire drill: inventory Chrome/Chromium/Edge versions, force auto-update, and isolate or restrict stale browsers. Because this is a HIGH noisgate rating, the noisgate mitigation SLA is within 30 days for compensating controls such as enforced auto-update, stale-version blocking, and browser isolation for high-risk users; the noisgate remediation SLA is within 180 days for full patch compliance, though in practice you should finish this in your normal monthly browser rollout rather than letting it age.

Sources

  1. Google Chrome Releases - Stable Channel Update for Desktop
  2. NVD - CVE-2026-5873
  3. Google Chrome Releases - Stable Channel Update for ChromeOS / ChromeOS Flex
  4. Debian Security Tracker - CVE-2026-5873
  5. Ubuntu Security - CVE-2026-5873
  6. Microsoft Edge Security Release Notes
  7. CISA Known Exploited Vulnerabilities Catalog
  8. Feedly CVE Card - CVE-2026-5873
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.