Node.js V8 文字列ハッシュの予測可能な衝突によるサービス拒否(DoS)の脆弱性
V8の文字列ハッシュ機構における重大な脆弱性により、攻撃者はNode.jsアプリケーションに深刻なパフォーマンス低下を引き起こすことができます。整数のような文字列は数値にハッシュされるため、ハッシュ衝突を簡単に予測できます。V8の内部文字列テーブルで多数の衝突を引き起こす悪意のある入力を細工することで、攻撃者はパフォーマンスを著しく低下させたり、サービス拒否を引き起こしたりすることができます。
この脆弱性は、V8の文字列インターン化プロセスに起因します。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)
)
]);
};
このリポジトリは教育および研究目的のみで提供されています。悪意のある目的や、所有していない、または明示的なテスト許可を得ていないシステムに対してこのコードを使用しないでください。