Press enter or click to view image in full size
It finally happened. For years, security researchers have joked about the complexity of the web stack, but the hyperbolic nightmare has become reality: The CSS has been compromised.
Google has issued an emergency security update for the Chrome browser to address a critical vulnerability that is currently under active attack. The flaw, tracked as CVE-2026–2441, is a high-severity “Use-After-Free” (UAF) bug found not in the JavaScript engine, but in the way Chrome parses Cascading Style Sheets (CSS).
This marks Google’s first Zero-Day patch of 2026, signaling a sophisticated start to the year for browser security. While Google is keeping the specific exploit chain close to the chest to prevent copycats, we have enough information from the patch diffs and security community analysis to construct a technical deep dive into what went wrong.
Here is everything you need to know about how a simple font style rule can compromise a system, and why you need to update immediately.
Severity: High (CVSS 8.8)
Status: Active Exploitation (Zero-Day)
Discoverer: Shaheen Fazim (Reported Feb 11, 2026)
Affected Versions: Chrome versions prior to 145.0.7632.75 (Windows/macOS) and 144.0.7559.75 (Linux).
According to the National Vulnerability Database (NVD), the flaw allows a remote attacker to “execute arbitrary code inside a sandbox via a crafted HTML page.” In plain English: visiting a website with malicious CSS can allow a hacker to break out of the browser’s safety restrictions and run commands on your computer.
Press enter or click to view image in full size
To understand how this hack works, we first need to understand the underlying bug: Use-After-Free (UAF).
Chrome’s rendering engine is written in C++, a powerful but “memory unsafe” language. In C++, the programmer is responsible for managing memory manually. You ask the computer for memory to store data, and you are responsible for freeing that memory when you are done.
The “Cat and Dog” Analogy
Imagine memory management like walking a pet.
If an attacker is clever, they don’t just replace the Dog with a Cat; they replace it with malicious code instructions. When the browser pulls that “dangling pointer,” it executes the attacker’s code instead of the browser’s code.
So, how does this apply to CSS? The vulnerability resides in how Chrome handles Font Feature Value Maps.
Join Medium for free to get updates from this writer.
In modern CSS, developers can use the @font-feature-values rule to define specific styles (like swashes, historical ligatures, or boldness) for specific font families. It looks something like this:
/* A standard CSS implementation of font features */
@font-feature-values "MyCustomFont" {
@styleset {
fancy-style: 1;
retro-style: 4;
}
}
body {
font-family: "MyCustomFont";
font-variant-alternates: styleset(fancy-style);
}Under the hood, Chrome has to parse this. It creates a “Map” — a data structure that holds these rules so the browser can look them up later. The browser then iterates (loops) over this map to apply the styles to the text on your screen.
The exploit takes advantage of a flaw in how Chrome iterates over this map.
When the browser processes these font features, it loops through the list of rules. However, the vulnerability exists because the code was using a direct reference to the map entries while iterating, without accounting for the fact that the map itself could be modified during the process.
Here is a simplified, conceptual representation of the flawed C++ logic:
// GLOBAL POINTERS (The Leash)
FontFeatureMap* global_map_ptr;
void ProcessFontFeatures(FontFeatureMap& map) {
// THE BUG: Iterating using a reference (&)
// The code points directly to the live memory address
for (auto& rule : map) { // ... complex processing happens here ...
// ATTACK SCENARIO:
// If an attacker can trigger a script or event here
// that deletes the 'map' or the 'rule' we are currently looking at...
ApplyStyle(rule); // <--- CRASH!
// 'rule' refers to memory that was just freed.
// This is the Use-After-Free.
}
}
The attacker creates a web page that sets up this map, starts the processing loop, and then immediately triggers a JavaScript event that deletes the map mid-loop.
Because the loop is using a reference (auto& rule), it is still pointing to the memory address where the rule used to be. The attacker then rushes to fill that empty memory slot with their own malicious data. When the loop continues to ApplyStyle(rule), it executes the attacker’s payload.
Google’s patch for CVE-2026–2441 is elegant in its simplicity. Instead of pointing to the potentially volatile map during iteration, the patch forces the browser to create a copy of the data before working on it.
By “moving” the data into a new, temporary structure, it doesn’t matter if the original map is deleted in the background. The loop is working on a safe snapshot.
Press enter or click to view image in full size
void ProcessFontFeatures(FontFeatureMap& map) {
// THE FIX: Make a copy/move first
// We create a local version that can't be touched by external deletion
FontFeatureMap safe_copy = std::move(map); // Now we iterate over the safe copy
for (auto& rule : safe_copy) {
ApplyStyle(rule);
// Even if the original 'map' is deleted elsewhere,
// 'safe_copy' still exists in our local scope.
}
}
This vulnerability highlights the “eternal war” of browser security. Browsers are tasked with the impossible: downloading arbitrary, untrusted code (HTML, CSS, Media) from the internet and executing it at lightning speeds.
Because performance is king, engines like Blink (Chrome) and V8 (Chrome’s JS engine) are written in C++. While fast, C++ allows for memory errors like Use-After-Free.
Why not Rust?
This is a common question. Rust is a modern programming language designed to make Use-After-Free bugs impossible at the compiler level. Mozilla Firefox, for example, wrote their CSS engine (called Stylo) in Rust for exactly this reason.
Google is slowly integrating Rust into Chromium, but rewriting millions of lines of legacy C++ code is a monumental task that will take a decade. Until then, bugs like CVE-2026–2441 will continue to surface.
This is not a theoretical drill. The “Active Exploitation” tag means threat actors are currently using this bug to infect targets.
Update Instructions:
The CSS may have been hacked, but your browser doesn’t have to be. Update today.