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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-42089 — مساعدة محلية لتثبيت الحزم تثق كثيرًا في أسماء الحزم المقدمة من المستدعي. في بيئة yeoman-environment، يمكن تثبيت المولدات المفقودة دون تأكيد المستخدم، مما يحول بيانات المشروع الخاضعة لسيطرة المهاجم إلى مسار لتثبيت الحزم وتنفيذ التعليمات البرمجية. | Kitploit
أدوات/GitHubGitHub/0xmrma/cve-2026-42089
تحليل الثغرات الأمنيةتحليل الكودالاستغلالأمن سلسلة التوريدالأوراق والأبحاثالتعلم والتعليم
GitHub0xmrma/cve-2026-42089

CVE-2026-42089

مساعدة محلية لتثبيت الحزم تثق كثيرًا في أسماء الحزم المقدمة من المستدعي. في بيئة yeoman-environment، يمكن تثبيت المولدات المفقودة دون تأكيد المستخدم، مما يحول بيانات المشروع الخاضعة لسيطرة المهاجم إلى مسار لتثبيت الحزم وتنفيذ التعليمات البرمجية.

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

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2026-42089

أداة مساعدة لتثبيت الحزم المحلية وثقت كثيرًا في أسماء الحزم المقدمة من المتصل. في yeoman-environment، كان من الممكن تثبيت المولدات المفقودة دون تأكيد المستخدم، مما يحول بيانات المشروع الخاضعة لسيطرة المهاجم إلى مسار لتثبيت الحزم وتنفيذ الأكواد.

مقدمة

وجدت هذه المشكلة أثناء مراجعة generator-jhipster مع سؤال أمني بسيط في ذهني:

هل يمكن لبيانات المشروع الخاضعة لسيطرة المهاجم أن تجعل أداة المطور تجلب وتنفذ كودًا من طرف ثالث قبل أن يطلب المستخدم ذلك صراحةً؟

في هذه الحالة، كانت الإجابة نعم.

ما بدا في البداية كمشكلة في JHipster تحول إلى جذر أعمق في yeoman-environment.

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

أصبحت تلك المشكلة CVE-2026-42089.

yeoman-environment: yeoman-environment على GitHub
الحزمة: yeoman-environment (npm)
CVE: CVE-2026-42089

أثر هذا على yeoman-environment، طبقة التشغيل وراء تدفق تحميل المولدات وتهيئتها في Yeoman. يصف المشروع الرسمي هذا المكون بأنه المسؤول عن دورة حياة المولد واكتشافه، واعتبارًا من 26 يونيو 2026، أدرجت صفحة الحزمة على npm 1,466,426 تنزيلًا أسبوعيًا، مما يجعل هذه حزمة منتشرة على نطاق واسع في النظام البيئي لأدوات JavaScript.

photo0

سلسلة الهجوم

تكوين المشروع الخاضع لسيطرة المهاجم -> أسماء حزم المولدات المقدمة من المتصل -> yeoman-environment يقوم بتثبيت الحزم المفقودة بصمت -> الأداة السفلية تحمل كود المولد المثبت -> تثبيت الحزم وتنفيذ الأكواد أثناء تهيئة CLI


ما يفعله yeoman-environment

yeoman-environment هو طبقة التشغيل وتحميل المولدات وراء الأدوات المبنية على Yeoman.

من بين أمور أخرى، يتعامل مع:

  • البحث عن المولدات
  • إدارة المستودع المحلي
  • تثبيت الحزم للمولدات المفقودة
  • تسجيل وتحميل المولدات

وهذا يعني أنه يقع مباشرة على حد الثقة.

السؤال ذو الصلة ليس ما إذا كان Yeoman "مجرد أداة محلية".

السؤال ذو الصلة هو ما إذا كان الإدخال غير الموثوق يمكن أن يؤثر على سلوك تثبيت الحزم وتحميل الأكواد.

في هذه الحالة، كان بإمكانه ذلك.


لماذا كان هذا السطح يستحق النظر

لم أكن أبحث عن تلف الذاكرة أو أخطاء الانهيار فقط هنا.

الهدف الأقوى كان سطح التمديدات وحل الحزم.

أي نظام يقوم بـ:

  • قبول أسماء حزم من طبقة أخرى،
  • تثبيتها تلقائيًا،
  • وجعلها متاحة للتحميل

يستحق فحصًا دقيقًا.

هذا صحيح بشكل خاص عندما يمكن للمستهلك السفلي استخلاص أسماء الحزم هذه من بيانات محلية للمشروع.

هذا هو بالضبط النوع من الأماكن حيث يمكن أن يصبح التكوين العادي بهدوء حدًا أمنيًا.

كان ذلك المكان المناسب للبحث.


الحد الذي ركزت عليه

أعدت إنتاج السلوك أولاً من خلال generator-jhipster.

المسار المهم كان:

  • ملف .yo-rc.json محلي يعلن عن حزمة مخطط (blueprint)
  • JHipster يقرأ هذا الإدخال أثناء تهيئة CLI
  • تُمرر حزم المخططات المفقودة إلى مسار التثبيت في Yeoman
  • Yeoman يقوم بتثبيتها بصمت
  • المنطق السفلي يستورد وحدات CLI الخاصة بالمخطط

وهذا يعني أنه حتى الأمر البسيط مثل:

root@kitploit:~
jhipster --help

كان بإمكانه الوصول إلى تثبيت الحزم قبل اكتمال الأمر المطلوب.

هذا فشل حقيقي في حد الثقة.

ساعد المشغل السفلي في كشفه، لكن السلوك الافتراضي غير الآمن كان في Yeoman.


السبب الجذري

الخلل كان بسيطًا.

في yeoman-environment، كانت الطريقة الضعيفة هي:

root@kitploit:~
async installLocalGenerators(packages) {
    const entries = Object.entries(packages);
    const specs = entries.map(([packageName, version]) => `${packageName}${version ? `@${version}` : ''}`);
    const installResult = await this.repository.install(specs);
    const failToInstall = installResult.find(result => !result.path);
    if (failToInstall) {
        throw new Error(`Fail to install ${failToInstall.pkgid}`);
    }
    await this.lookup({ packagePaths: installResult.map(result => result.path) });
    return true;
}

تلك الطريقة قامت بتثبيت أسماء الحزم المقدمة من المتصل مباشرةً عبر:

root@kitploit:~
this.repository.install(specs)

دون مطالبة المستخدم أولاً.

هذا هو الثغرة الأساسية.

لماذا هذا قابل للاستغلال

لأن أسماء الحزم لا يجب أن تأتي من مصدر موثوق.

إذا اشتقها مستهلك سفلي من بيانات مشروع يتحكم فيها المهاجم، فإن سلسلة الاستغلال تكون مباشرة:

  • المهاجم يتحكم في أسماء الحزم بشكل غير مباشر
  • الأداة السفلية تمررها إلى Yeoman
  • Yeoman يقوم بتثبيتها بصمت
  • الكود السفلي يستمر مع الحزمة المثبتة حديثًا والمتاحة للتحميل

هذا ليس مجرد "حدث تثبيت حزمة".

هذا هو إدخال غير موثوق يعبر إلى مصرف تثبيت الحزم دون حد موافقة صريحة.


ما يجعل هذه مشكلة أمنية، وليس مجرد سلوك أداة

التمييز المهم هو التثبيت الصامت من إدخال غير موثوق.

هناك فرق حقيقي بين:

  • مستخدم يقرر صراحة تثبيت حزمة، و
  • إطار يقوم بتثبيت حزمة بصمت لأن بيانات محلية جعلت متصلًا يطلبها

هذا التمييز مهم أكثر عندما تصبح الحزمة قابلة للتحميل فورًا بعد ذلك.

المشكلة لم تكن أن المولدات من طرف ثالث موجودة.

المشكلة كانت أن Yeoman تعامل أسماء الحزم المقدمة من المتصل على أنها قابلة للتثبيت افتراضيًا دون تأكيد المستخدم.

هذا يجعل افتراضات الثقة السفلية غير الآمنة أسوأ بشكل ملموس.

هذا هو بالضبط سبب إضافة الإصلاح لبوابة تأكيد.


الإثبات العملي (PoC)

استخدمت طبقتين من الإثبات لأنهما أظهرتا كلاً من السبب الجذري والتأثير السفلي الحقيقي.

PoC 1: مشغل سفلي أصلي

استخدم الإثبات الأول generator-jhipster غير معدّل.

أنشأت مشروعًا مع ملف .yo-rc.json جذري يشير إلى حزمة مخطط لم تكن مثبتة مسبقًا، ثم نفذت:

root@kitploit:~
jhipster --help

هذا تسبب في قيام JHipster بتمرير المخطط المفقود إلى تدفق تثبيت المولدات المحلية في Yeoman قبل اكتمال المساعدة.

النتيجة المهمة كانت:

  • أمر بريء المظهر وصل إلى سلوك حل الحزم وتثبيتها
  • البيانات الوصفية للمشروع المحلية كانت كافية لتشغيل مسار التثبيت

هذا أثبت حالة المشغل الحقيقية بوضوح.

PoC 2: مسار تنفيذ حزمة مسيطر عليه

استخدم الإثبات الثاني مستودعًا محليًا مسيطرًا عليه وحزمة مصممة لإظهار آثار جانبية في وقت الاستيراد بأمان.

كان ذلك مهمًا لأنني أردت إظهار القصة الأقوى:

  • البيانات الوصفية للمشروع المحلية تؤثر على اختيار الحزمة
  • Yeoman يقوم بتثبيت الحزمة بصمت
  • المنطق السفلي يقوم بتحميل وحدات CLI للمخطط المثبت
  • يصبح تنفيذ الأكواد قابلاً للوصول أثناء التهيئة

كانت هذه أقوى سلسلة أدلة لأنها نقلت المشكلة إلى ما بعد:

"محاولة تثبيت غير متوقعة"

وإلى:

"مسار التحميل السفلي للكود مع التثبيت هو بالفعل قابل للوصول"

هذه هي النقطة التي يصبح فيها فشل حد الثقة أصعب بكثير في تجاهله.


لماذا تم اختيار PoCs بهذه الطريقة

يثبت PoC الأول سلوك التثبيت الصامت.

يثبت PoC الثاني لماذا هذا السلوك مهم.

كان هذا التقسيم مهمًا.

تقرير يتوقف عند:

"يمكن تثبيت حزمة"

أضعف من تقرير يظهر:

  • الإدخال الخاضع لسيطرة المهاجم يصل إلى مسار التثبيت
  • التثبيت يحدث دون تأكيد
  • المنطق السفلي يجعل تنفيذ الأكواد قابلاً للوصول

تلك هي القصة الكاملة.


النطاق المتأثر

أثناء معالجة الاستشارة والمراجعة المحلية، تم تتبع السلوك إلى إدخال installLocalGenerators() في:

root@kitploit:~
yeoman-environment 2.9.0

وبالتالي فإن النطاق المتأثر كان:

root@kitploit:~
>= 2.9.0 و < 6.0.1

الإصدار المُصلَح كان:

root@kitploit:~
6.0.1

تحليل الإصلاح

الإصلاح كان صحيحًا وبسيطًا.

في 6.0.1، تم تغيير installLocalGenerators() لإضافة خطوة تأكيد قبل التثبيت ما لم يتم طلب التثبيت القسري صراحةً.

الشكل المُصلَح بدا كالتالي:

root@kitploit:~
async installLocalGenerators(packages, forceInstall = false) {

ثم:

root@kitploit:~
const { aproveInstall } = await this.adapter.prompt({
    message: `الحزم التالية تحتاج إلى التثبيت في المستودع المحلي: ${specs.join(', ')}. هل تريد المتابعة؟`,
    type: 'confirm',
    name: 'aproveInstall',
    default: false,
});

إذا رفض المستخدم، يتم إلغاء التثبيت.

هذا هو الإصلاح الصحيح لأنه يعيد حدود الثقة المفقودة:

  • لم تعد أسماء الحزم المقدمة من المتصل مثبتة بصمت افتراضيًا
  • موافقة المستخدم الصريحة مطلوبة
  • لم يعد بإمكان الأدوات السفلية الاعتماد على الثقة الضمنية العرضية

هذا الإصلاح تم إدخاله في:

root@kitploit:~
78d2af7

عبر:

root@kitploit:~
PR #753

هذا هو بالضبط نوع المعالجة التي تريدها في مشكلة أمنية كهذه:

  • صغير
  • مباشر
  • سهل التبرير
  • مرتبط بمصرف الثغرة نفسه

الخطورة والتصنيف

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

السلوك الضعيف يمكن أن يؤدي إلى:

  • تثبيت حزمة يختارها المهاجم
  • وصول الشبكة إلى بنية الحزم من مسارات أوامر بريئة
  • قابلية الوصول إلى تحميل الكود السفلي
  • اختراق بيئة المطور في المستهلكين المتأثرين

متجه CVSS المرتبط بالمشكلة كان:

root@kitploit:~
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H

هذا منطقي لقصة الاستغلال السفلي:

  • سياق تنفيذ محلي
  • تعقيد منخفض
  • لا حاجة لصلاحيات مسبقة
  • تفاعل المستخدم مطلوب
  • تأثير قوي على السرية والنزاهة والتوفر بمجرد الوصول إلى مسار تنفيذ الحزمة

الإفصاح

بدأت هذه المشكلة كتقرير خاص ضد generator-jhipster، لأن هذا كان مسار المشغل الحقيقي الذي قمت بالتحقق منه مبدئيًا.

أثناء الفرز، أشار مشرفو JHipster إلى أن سلوك التثبيت التلقائي نفسه كان في yeoman-environment وأشاروا إلى الإصلاح المنبع.

أدى ذلك إلى التحول الصحيح:

  • تضييق السبب الجذري إلى Yeoman
  • معاملة JHipster كمستهلك سفلي متأثر
  • الإبلاغ عن المشكلة المنبع بشكل خاص

قام مشرفو Yeoman بمراجعة المشكلة، وتأكيد النطاق المتأثر، وتتبعها عبر استشارة خاصة.

تم تعيين التقرير لاحقًا:

CVE-2026-42089

كما وثقت تلك الاستشارة مسار المشغل السفلي الحقيقي عبر generator-jhipster.

كان هذا مثالًا جيدًا على لماذا يحتاج الإفصاح المنسق أحيانًا إلى خطوة إضافية:

  • أولاً تحديد المشغل العملي
  • ثم تحديد حدود الملكية الحقيقية

هنا، كان التكاثر السفلي مفيدًا، لكن الحزمة المنبع كانت المكان الصحيح لـ CVE.


ما يعلمه هذا الخلل بالفعل

الدرس الرئيسي هنا بسيط:

تثبيت الحزم هو حد أمني، حتى في أدوات المطور المحلية

العديد من الناس يقللون تلقائيًا من مشاكل مثل هذه لأنها تحدث في أدوات CLI.

هذا خطأ.

السؤال الحقيقي ليس ما إذا كانت الأداة محلية.

السؤال الحقيقي هو:

هل يمكن للإدخال غير الموثوق أن يجعل الأداة تجلب وتثق في الكود دون قرار مستخدم صريح؟

في هذه الحالة، نعم.

هذا هو الاستنتاج الحقيقي.

تعزز هذه المشكلة أيضًا شيئًا مهمًا حول أبحاث الثغرات الجيدة:

  • المنتج الأول الذي تقوم بتكاثره ليس دائمًا صاحب السبب الجذري الحقيقي
  • PoCs السفلية غالبًا ما تكون ما يجعل المخاطر واضحة
  • أخطاء حد الثقة المنبع هي حيث ينتمي الإصلاح الفعلي

كان هذا بالضبط شكل هذه CVE.


النقاط الرئيسية

  • مساعدات تثبيت الحزم هي حدود أمنية
  • أسماء الحزم المقدمة من المتصل لا ينبغي تثبيتها بصمت افتراضيًا
  • البيانات الوصفية للمشروع المحلية يمكن أن تصبح خطيرة عندما تؤثر على تحميل الإضافات
  • التكاثر السفلي في generator-jhipster كشف المشكلة بوضوح
  • السبب الجذري لا يزال ينتمي إلى yeoman-environment
  • إضافة بوابة تأكيد صريحة كان الإصلاح الصحيح

كلمات أخيرة

لم تكن هذه الثغرة حول حمولة مبهرجة.

كانت حول طرح سؤال حد الثقة الصحيح.

أداة سفلية تركت بيانات المشروع المحلية تؤثر على اختيار الحزمة. Yeoman قام بتثبيت الحزمة المفقودة دون تأكيد. بقية سلسلة تحميل الكود قامت بالباقي.

لهذا أصبحت CVE-2026-42089.

تم إصلاحها في yeoman-environment 6.0.1.

تنزيل الأداة