← Back to Feed CACHED · 2026-07-01 06:32:00 · CACHE_KEY CVE-2026-14148
CVE-2026-14148 · CWE-843 · Disclosed 2026-06-30

Type Confusion in CSS in Google Chrome prior to 150

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

A parser that misreads one CSS object as another and coughs up bytes it shouldn't

CVE-2026-14148 is a type confusion (CWE-843) in Chrome's CSS engine — likely in Blink's style resolution or computed-style paths. When the renderer treats a CSS-derived object as the wrong class, reads land on adjacent memory the attacker did not allocate, and the contents can be reflected back through side channels (paint timing, computed-style readback, canvas taint boundaries, or SVG filter feedback). All Chromium builds prior to 150.0.7871.47 are affected — Chrome stable, Chrome Beta on the same trunk, Edge (pending Microsoft's re-spin), Brave, Opera, Vivaldi, and Electron 33/34-line runtimes.

Google's MEDIUM (6.5) rating is defensible and slightly generous. The CVSS vector explicitly rules out integrity and availability — this is C:H/I:N/A:N, a pure confidentiality read — and requires user interaction (visiting a hostile page). It is *not* a renderer RCE, it is *not* a sandbox escape, and it does not chain to code execution on its own. Treat it as an info-leak primitive that raises the value of any future RCE that needs an ASLR bypass, not as a standalone crisis.

"Info-leak in Chrome CSS with UI:R and no integrity/availability impact — ship it in the next stable channel push."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Lure user to attacker-controlled page

The attacker needs the victim to load hostile HTML/CSS in a Chromium renderer. Delivery is any of: phishing link, malvertising bid won on an ad exchange, compromised third-party JS, or an iframe embedded on a trusted site. Weaponized delivery kits: EvilGinx3, Gophish, or a plain Cloudflare Worker hosting the payload.
Conditions required:
  • User running Chrome/Edge/Brave/Electron < 150.0.7871.47
  • Ability to render attacker HTML/CSS (JS not strictly required for CSS-only triggers)
Where this breaks in practice:
  • Enterprise DNS/URL filtering (Umbrella, Zscaler, Netskope) blocks known-bad staging
  • Ad-blockers and enterprise content filters kill most malvertising paths
  • SmartScreen / Safe Browsing shows an interstitial on flagged domains
Detection/coverage: Proxy logs will show the fetch; EDR will not — no process activity beyond normal browsing.
STEP 02

Trigger the CSS type confusion

Payload page serves crafted CSS (likely abusing custom properties, @property registrations, or a specific selector/computed-style interaction) that forces Blink's style engine to reinterpret one object as another type. Public triggers will appear on Chromium bug tracker once the restriction lifts (typically 14 weeks post-fix) and in Project Zero or Sergei Glazunov style writeups.
Conditions required:
  • Renderer executes the CSS parse/apply cycle
  • No site isolation exception for the origin
Where this breaks in practice:
  • v8/Blink hardening (--enable-features=MemorySaver and site-per-process) constrains what can be read
  • Renderer sandbox contains the leak to the renderer process address space only
Detection/coverage: Not visible to host EDR. Renderer crashes (if trigger is unstable) will show up in chrome://crashes and enterprise Crash Reporter telemetry.
STEP 03

Exfiltrate leaked bytes via side channel

Attacker reads back the out-of-bounds data through a JS-observable channel: getComputedStyle, CanvasRenderingContext2D pixel readback if colors are influenced, PerformanceObserver timing, or SVG filter feedback loops. Bytes are POSTed to the C2. Typical toolchain: bespoke JS in the payload, no off-the-shelf framework needed.
Conditions required:
  • JavaScript execution in the same origin (or an iframe that can observe the leaked state)
  • Leaked bytes must land in an observable structure
Where this breaks in practice:
  • Cross-Origin-Opener-Policy / Cross-Origin-Embedder-Policy on sensitive targets prevents cross-origin observation
  • Site isolation ensures leaked bytes belong to the attacker's own renderer — not to mail.google.com running in a different process
Detection/coverage: Unusual outbound POSTs to newly-registered domains from browser processes — visible in NGFW/proxy logs with TLS inspection.
STEP 04

Chain into a full RCE (theoretical, out of scope for this CVE alone)

On its own this bug does not give code execution. A capable attacker pairs it with a *separate* renderer RCE (a v8 JIT bug or a WebAssembly bug) that needs an infoleak to defeat ASLR. Frameworks that would consume this primitive: Metasploit browser_autopwn2 style chains, or a custom exploit like those historically shipped by NSO/Intellexa in one-click packages.
Conditions required:
  • A separately-weaponized renderer RCE
  • A separately-weaponized sandbox escape
Where this breaks in practice:
  • Requires two more zero-days at similar quality
  • Chromium's V8 sandbox and Windows Renderer AppContainer add friction
Detection/coverage: Post-exploitation behavior (child processes, LOLBIN abuse) shows up on EDR — the leak itself does not.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo confirmed exploitation as of 2026-07-01. Not tagged as exploited in Google's release note — contrast with the exists in the wild wording Chrome uses when TAG sees active abuse.
Proof-of-conceptNone public. Chromium bug entry is still restricted; historical pattern is disclosure ~14 weeks after stable ships.
EPSSNew CVE — EPSS not yet scored. Comparable Chrome CSS type-confusion bugs historically land in the 0.1–1% range in the first 30 days.
KEV statusNot listed on CISA KEV as of 2026-07-01.
CVSS vectorCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N — network attack, low complexity, user interaction required, unchanged scope, confidentiality-only impact. No integrity or availability loss.
Affected versionsChromium < 150.0.7871.47. Downstream: Edge, Brave, Opera, Vivaldi, Electron on the 150-branch, Chrome Android, ChromeOS LTS pending backport.
Fixed versionsChrome Stable 150.0.7871.47 (Win/Mac/Linux). Edge, Brave, Opera to follow within 3–10 days per historical cadence.
Exposure / scanning dataNot scanner-relevant — client-side bug. Enterprise footprint = essentially 100% of endpoints running Chromium-family browsers.
Disclosure date2026-06-30 — coordinated release with Chrome Stable channel update.
ReporterAttribution not yet published in the release note. Historically these come from Google Project Zero, Man Yue Mo (GitHub Security Lab), or external researchers via Chrome VRP.
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to MEDIUM (5.8/10)

Verdict held at MEDIUM because the single most decisive factor is the CVSS impact profile: confidentiality-only read (C:H/I:N/A:N) with required user interaction and no known chain to RCE or sandbox escape. It is a useful primitive for a future exploit chain, not a standalone breach vector.

HIGH MEDIUM severity classification
HIGH Client-side blast radius scoping
MEDIUM Absence of in-the-wild exploitation (early days)
LOW Technical trigger specifics — bug tracker still restricted

Why this verdict

  • Confidentiality-only, no code execution: the vector locks out integrity and availability. Without a paired RCE, the attacker gets bytes, not a shell.
  • User interaction required (UI:R): a human has to visit the page. Drive-by via malvertising is possible but attritional — every URL filter, ad-blocker, and Safe Browsing hit is compounding downward pressure.
  • Site isolation contains the leak: post–Spectre Chromium runs each site in its own renderer process, so the attacker leaks memory from *their own* renderer, not from okta.com in the next tab.
  • Role multiplier — endpoint browser on user workstations: chain succeeds → attacker gets an ASLR-bypass primitive scoped to their own renderer. Blast radius = one browser tab's process memory. No fleet, identity, or supply-chain amplification.
  • Role multiplier — Electron apps embedding Chromium (Slack, Teams, VS Code, 1Password, Discord): more concerning because Electron apps often defer patching and sometimes run with elevated node integration. Still confidentiality-only, but the *value* of leakable memory (session tokens, secrets in memory) is higher. Bumps this out of LOW territory.
  • No KEV listing, no public PoC, no in-the-wild reports as of 2026-07-01 — no basis for emergency handling.

Why not higher?

Escalating to HIGH would require either evidence of active exploitation (there is none) or a documented chain to renderer RCE / sandbox escape (this CVE is a leak primitive only). The C:H/I:N/A:N vector is the ceiling; you cannot get to HIGH on confidentiality alone for a client-side bug that requires the user to visit the page.

Why not lower?

Downgrading to LOW would ignore that Chromium runs on essentially every enterprise endpoint and that infoleaks are the standard ASLR-defeat building block in modern browser exploit chains. Any threat actor holding a renderer RCE zero-day is a customer for this bug the moment a PoC lands. That is enough to keep it in the 30-day mitigation window rather than the backlog.

05 · Compensating Control

What to do — in priority order.

  1. Push Chrome 150.0.7871.47 via enterprise management — Use Chrome Browser Cloud Management, Intune, Jamf, or SCCM to force-update. Chrome auto-update handles most of the fleet, but locked-down enterprise images often disable it. Deploy within 30 days per the noisgate mitigation SLA for HIGH-adjacent MEDIUM — sooner is better given Chrome's exploit-chain history.
  2. Update Edge, Brave, Opera, Vivaldi as their Chromium re-spins ship — Downstream Chromium browsers inherit this bug. Track vendor advisories for 3–10 days after the Chrome release and cascade updates. Add the browser inventory to your patch dashboard if it is not already there.
  3. Enumerate and update Electron applications — Slack desktop, Teams desktop, VS Code, 1Password desktop, Discord, Notion, and many internal tools embed Chromium. Query your software inventory (Intune, Kandji, osquery deb_packages/apps table) for Electron-based apps and check each vendor's release notes for the 150-line uplift. Electron patches lag Chrome by weeks — this is the long tail.
  4. Enforce Safe Browsing Enhanced Protection via policy — Set SafeBrowsingProtectionLevel=2 in Chrome enterprise policy. Blocks the majority of malvertising and phishing staging domains before the page renders. Zero performance cost, one policy toggle.
  5. Deploy uBlock Origin Lite or enterprise ad-blocker fleet-wide — Malvertising is the realistic drive-by delivery path for UI:R browser bugs. An enforced ad-blocker collapses the attackable ad-exchange surface. ExtensionInstallForcelist in Chrome policy.
What doesn't work
  • EDR / AV signatures — the exploit runs entirely inside the browser renderer sandbox. No process creation, no LOLBIN, nothing for EDR heuristics to grab.
  • Network IDS/IPS signatures on the payload — the trigger is CSS, trivially obfuscated and served over TLS. Signature-based inspection is theater here.
  • Disabling JavaScript site-wide — breaks the modern web and does not actually stop CSS-only trigger variants. Users will re-enable it or route around your proxy.
  • MFA — this is a memory-read bug in the renderer, not a credential attack. MFA is irrelevant to the exploit path.
06 · Verification

Crowdsourced verification payload.

Run on the target Windows host (or push via RMM/Intune script) as the logged-in user or SYSTEM. Reads the installed Chrome version from the registry and file metadata. Invoke: powershell -ExecutionPolicy Bypass -File Check-CVE-2026-14148.ps1. No elevated privileges required for the per-user Chrome install; use SYSTEM for machine-wide installs.

noisgate-verify.ps1
POWERSHELLREAD-ONLYSAFE
#!/usr/bin/env pwsh
# Check-CVE-2026-14148.ps1
# Verifies Chrome build against the fixed version 150.0.7871.47
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN

$FixedVersion = [Version]'150.0.7871.47'
$Paths = @(
    "$env:ProgramFiles\Google\Chrome\Application\chrome.exe",
    "$env:ProgramFiles(x86)\Google\Chrome\Application\chrome.exe",
    "$env:LocalAppData\Google\Chrome\Application\chrome.exe"
)

$Found = $false
$Worst = $null

foreach ($p in $Paths) {
    if (Test-Path $p) {
        $Found = $true
        try {
            $v = [Version](Get-Item $p).VersionInfo.ProductVersion
            Write-Host "Found Chrome at $p -> $v"
            if (-not $Worst -or $v -lt $Worst) { $Worst = $v }
        } catch {
            Write-Host "Could not read version from $p"
        }
    }
}

if (-not $Found) {
    Write-Host 'UNKNOWN: Chrome not installed at standard paths'
    exit 2
}

if ($Worst -lt $FixedVersion) {
    Write-Host "VULNERABLE: installed $Worst < fixed $FixedVersion"
    exit 1
} else {
    Write-Host "PATCHED: installed $Worst >= fixed $FixedVersion"
    exit 0
}
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: confirm Chrome auto-update is enabled fleet-wide and push 150.0.7871.47 through your enterprise management stack — the noisgate mitigation SLA for this MEDIUM verdict is 30 days, and the noisgate remediation SLA closes at 365 days but you should easily hit both inside a week for a browser update. Cascade to Edge/Brave/Opera as their Chromium re-spins land over the following 10 days. The long tail is Electron apps (Slack, Teams, VS Code, 1Password, Discord) — inventory them this week and track their upstream bumps; that queue will drag into the 30–90 day window. No emergency change window required, no KEV, no in-the-wild reports — but do not let this slip into the backlog because infoleak primitives are exactly what turns a future renderer RCE into a full compromise.

Sources

  1. Chrome Releases blog (stable channel updates)
  2. Chromium security release notes
  3. NVD entry (CVE-2026-14148)
  4. CWE-843: Access of Resource Using Incompatible Type
  5. CISA KEV catalog
  6. FIRST EPSS
  7. Chrome Enterprise policy reference (SafeBrowsingProtectionLevel, ExtensionInstallForcelist)
  8. Chromium site isolation documentation
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.