Node.js V8 字符串哈希可预测碰撞漏洞导致拒绝服务
V8 字符串哈希机制中的一个严重漏洞允许攻击者对 Node.js 应用程序造成严重的性能下降。整数字符串会被哈希为其数值,使得哈希碰撞极易被预测。通过构造恶意输入,在 V8 内部字符串表中引发大量碰撞,攻击者可以显著降低性能或造成拒绝服务。
该漏洞源于 V8 的字符串驻留(internalization)过程。当进行 JSON 解析时,短字符串会被自动驻留到哈希表中。整数字符串因其哈希值为其数值而可预测地发生碰撞,使攻击者能够强制产生二次探测链,从而严重降低性能。
最常见的触发点是任何对攻击者可控输入调用 JSON.parse() 的端点,因为 JSON 解析会自动将短字符串驻留到受影响的哈希表中。
本仓库包含一个演示该漏洞的概念验证:
# 使用受 CVE-2026-21717 影响的 Node.js 版本
nvm use
npm install
node poc.js
PoC 会创建一个包含以下内容的载荷:
JSON.parse() 操作导致约 44 秒以上的 CPU 时间消耗JSON.parse()// 限制载荷大小
app.use(express.json({ limit: '100kb' }));
// 为解析添加超时
const parseWithTimeout = (str, timeout = 1000) => {
return Promise.race([
Promise.resolve(JSON.parse(str)),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Parse timeout')), timeout)
)
]);
};
本仓库仅供教育和研究目的使用。请勿将此代码用于恶意用途,或针对您不拥有或未经明确许可测试的系统。