
Preuve de concept pour CVE-2026-21717, une vulnérabilité de collision de hachage de chaînes V8 dans Node.js provoquant un déni de service via des charges utiles JSON spécialement conçues.
Vulnérabilité de collision prévisible du hachage de chaînes V8 de Node.js conduisant à un déni de service
Une vulnérabilité critique dans le mécanisme de hachage de chaînes de V8 permet aux attaquants de provoquer une grave dégradation des performances dans les applications Node.js. Les chaînes de type entier sont hachées selon leur valeur numérique, ce qui rend les collisions de hachage trivialement prévisibles. En concevant une entrée malveillante qui provoque de nombreuses collisions dans la table de chaînes interne de V8, un attaquant peut considérablement dégrader les performances ou provoquer un déni de service.
La vulnérabilité provient du processus d'internalisation des chaînes de V8. Lors de l'analyse JSON, les chaînes courtes sont automatiquement internalisées dans une table de hachage. Les chaînes de type entier entrent en collision de manière prévisible car elles sont hachées selon leur valeur numérique, ce qui permet aux attaquants de forcer des chaînes de sondage quadratique qui dégradent gravement les performances.
Le déclencheur le plus courant est tout point de terminaison qui appelle JSON.parse() sur une entrée contrôlée par l'attaquant, car l'analyse JSON internalise automatiquement les chaînes courtes dans la table de hachage concernée.
Ce dépôt contient une preuve de concept démontrant la vulnérabilité :
# Utilisez une version de Node.js affectée par CVE-2026-21717
nvm use
npm install
node poc.js
La PoC crée une charge utile avec :
JSON.parse()JSON.parse() sur l'entrée non fiable// Limiter la taille de la charge utile
app.use(express.json({ limit: '100kb' }));
// Ajouter un délai d'expiration pour l'analyse
const parseWithTimeout = (str, timeout = 1000) => {
return Promise.race([
Promise.resolve(JSON.parse(str)),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Parse timeout')), timeout)
)
]);
};
Ce dépôt est destiné uniquement à des fins éducatives et de recherche. N'utilisez pas ce code à des fins malveillantes ou contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas l'autorisation explicite de tester.