Skip to main content
Live Webinar with SANS (June 25)— Agentic CTI Automation for Fun & ProfitRegister Free
Mallory
MediumPublic exploit

HashDoS in Node.js V8 string hashing via predictable integer-like string collisions

IdentifiersCVE-2026-21717CWE-400

CVE-2026-21717 is a denial-of-service weakness in the V8 engine as shipped with affected Node.js releases. V8's internal string hashing mechanism hashes integer-like strings to their numeric value, which makes collisions trivially predictable rather than effectively unpredictable. An attacker can supply large numbers of crafted integer-like strings that collide in V8's internal string table, causing pathological lookup and insertion behavior and substantially increasing CPU consumption. The most common trigger described in the available material is application code that calls JSON.parse() on attacker-controlled input, because JSON parsing automatically internalizes short strings into the affected hash table. The issue affects Node.js 20.x, 22.x, 24.x, and 25.x.

Share:
For your environment

Are you exposed to this one?

Mallory correlates every CVE against your assets, your vendors, and active adversary campaigns. Know which vulnerabilities matter for you, not just which ones are loud.

ANALYST BRIEF

Impact, mitigation & remediation

What it means. What to do now. Patch path, mitigations, and the assume-compromise checklist.

Impact

What an attacker gets, and what they’ve been doing with it.

Successful exploitation causes significant performance degradation of the target Node.js process through asymmetric resource consumption, i.e., a classic HashDoS condition. The primary impact is denial of service or severe service slowdown rather than memory corruption or code execution. In practical terms, a remote attacker may be able to tie up CPU resources and reduce throughput or responsiveness of APIs and services that parse attacker-controlled JSON or otherwise cause attacker-supplied integer-like strings to be interned by V8.

Mitigation

If you can’t patch tonight, do this now.

If immediate patching is not possible, reduce exposure by limiting or rejecting untrusted JSON and other attacker-controlled inputs containing large numbers of distinct integer-like property names or strings; enforce strict request body size, field count, and parsing limits; apply rate limiting and upstream request filtering/WAF controls to endpoints that invoke JSON.parse() on untrusted data; and isolate or autoscale exposed parsing services to reduce denial-of-service impact. These are compensating controls only and do not remove the underlying flaw.

Remediation

Patch, then assume compromise.

Upgrade Node.js to a patched release that includes the V8 fix for CVE-2026-21717. The provided content identifies patched Node.js releases as v20.20.2, v22.22.2, v24.14.1, and v25.8.2. Where applicable, move to a newer maintained release line that contains the corrected V8 behavior.
PUBLIC EXPLOITS

Exploits

2 valid exploits after Mallory filtered fakes, detection scripts, and README-only repos.

VALID 2 / 2 TOTALView more in app
CVE-2026-21717MaturityPoCVerified exploit

This repository is a standalone proof-of-concept for CVE-2026-21717, a claimed Node.js/V8 predictable string-hash collision issue leading to denial of service. It is not part of a known exploit framework. The repository contains two substantive code files: poc.js, which is the actual exploit demonstration, and hash_slot_guesser.zig, which is an analysis/helper tool for understanding and predicting V8 hash slot behavior. The main exploit capability is CPU-exhaustion DoS. poc.js constructs a large adversarial JSON payload whose data array contains many crafted integer-like strings intended to collide in V8's internalized string hash table. It first builds a long probing chain using values derived from a base value (1234) and a modulus/capacity of 2^19, then appends 2^17 repetitions of the target value to force repeated expensive lookups through that chain. The script serializes the structure with JSON.stringify({ data: payload }) and immediately calls JSON.parse(string), measuring elapsed time with process.hrtime(). The comments indicate this can drive a single parse operation to roughly 44 seconds of CPU time. There is no reverse shell, code execution, persistence, or data theft; the effect is denial of service through algorithmic complexity. The Zig file, hash_slot_guesser.zig, is not the exploit delivery mechanism but a supporting research utility. It implements simplified V8 hash computation for integer-index-like strings, predicts initial probe slots for given capacities, searches for colliding numeric strings, models quadratic probing chains, and includes an interactive/demo main routine. Its purpose is to explain and help generate collision candidates rather than directly attack a remote target. There are no hardcoded remote IPs, domains, API endpoints, or C2 locations in the exploit code. The attack is conceptually network-deliverable because the malicious JSON would be sent to any application endpoint that accepts attacker-controlled JSON and parses it. However, the repository does not include a client/server harness or a specific vulnerable URL path. The README explicitly states the common trigger is any endpoint that calls JSON.parse() on untrusted input. Repository structure is minimal: README.md documents the vulnerability and usage; poc.js is the runnable PoC; hash_slot_guesser.zig is a helper/research tool; package.json provides minimal Node metadata; .nvmrc pins a Node version; .gitignore excludes generated artifacts and dependencies. Overall, this is a credible PoC repository demonstrating an algorithmic-complexity DoS against vulnerable Node.js/V8 JSON parsing behavior.

open-flawDisclosed Mar 31, 2026markdownzignetworkweb
CVE-2026-21717MaturityPoCVerified exploit

This is a small standalone JavaScript proof-of-concept repository for CVE-2026-21717, a claimed Node.js/V8 string hashing collision denial-of-service issue. The repository contains 5 files: minimal project metadata (.nvmrc, .gitignore, package.json), a README with vulnerability explanation and mitigation guidance, and a single executable PoC script (poc.js). The exploit is not tied to a framework. The core logic is entirely in poc.js. It constructs a large array of integer-like strings using a quadratic-probing-inspired sequence based on constants MOD=2^19, CHN=2^17, and REP=2^17. First, it generates many distinct numeric strings intended to occupy collision-related positions in V8's internal string table; then it appends repeated instances of a chosen target value ('1234') to force repeated lookups through the collision chain. The script serializes this structure into JSON with JSON.stringify({ data: payload }) and immediately parses it with JSON.parse(string), measuring elapsed time with process.hrtime(). The intended effect is extreme CPU consumption during parsing due to predictable collisions in V8 string internalization. There are no hardcoded remote URLs, IPs, sockets, or C2-style endpoints in the exploit code. The network aspect is conceptual rather than implemented: the README and comments explain that an attacker would send the generated JSON body to any remote application endpoint that accepts attacker-controlled JSON and invokes JSON.parse() or equivalent parsing. As such, the exploit capability is denial of service via resource exhaustion, not code execution or persistence. Operationally, this repository is a proof of concept rather than a weaponized exploit. It demonstrates local reproduction of the expensive parse path and provides enough detail for defenders or researchers to understand the attack pattern: large attacker-supplied JSON, integer-like string keys/values, predictable collisions, and CPU amplification. The README also identifies likely real-world exposure points as web/API endpoints that parse untrusted JSON and recommends mitigations such as patching Node.js, limiting payload size, rate limiting, and adding parsing timeouts.

dajneem23Disclosed Mar 31, 2026javascriptmarkdownnetwork
EXPOSURE SURFACE

Affected products & vendors

Products and vendors Mallory has correlated with this vulnerability. Open in Mallory to drill down to specific CPE configurations and version ranges.

VendorProductType
NodejsNodejsapplication
Rocky LinuxNodejs24application
Rocky LinuxRocky Linuxoperating_system

Vendor-confirmed product mapping. Mallory continuously reconciles this list against your asset inventory.

What this page doesn’t show

The version that knows your environment.

This page is what’s public. Mallory adds the parts that aren’t: which of your assets are affected, which adversaries are exploiting it right now, which detections to deploy, and what to do tonight.
Exposure mapping

Query your assets running an affected version, and investigate the blast radius.

Threat actor evidence

Every observed campaign linking this CVE to a named adversary.

Associated malware

Malware families riding this exploit, with evidence and IOCs.

Detection signatures

YARA, Sigma, Snort, and vendor rules, auto-deployed to your SIEM.

Vendor-by-vendor mapping

Cross-references every affected SKU, including bundled OEM variants.

Social activity5

Community discussion across Reddit, Mastodon, and other social sources.