Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
POC-CVE-2026-102282 — CVE-2026-102282: تصعيد صلاحيات محلي (LPE) في adm-zip عبر الحفاظ على SUID/SGID أثناء استخراج الأرشيف (تم إصلاحه في 0.6.1) | Kitploit
أدوات/GitHubGitHub/ahmed-elmahgob/poc-cve-2026-102282
أدوات دفاعيةتصعيد الامتيازاتالتحليل الثابتماسحات الثغرات الأمنيةتحليل الثغرات الأمنيةالاستغلالأمن سلسلة التوريدالتعلم والتعليمالاستجابة للحوادث

الأكثر شعبية

عرض الكل →

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

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

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

عرض جميع الأدوات →
GitHubahmed-elmahgob/poc-cve-2026-102282

POC-CVE-2026-102282

CVE-2026-102282: تصعيد صلاحيات محلي (LPE) في adm-zip عبر الحفاظ على SUID/SGID أثناء استخراج الأرشيف (تم إصلاحه في 0.6.1)

عرض المستودع
منذ 21س 7دلم تتم المراجعة بعد
مشاركة

CVE-2026-102282 — الحفاظ على setuid/setgid في adm-zip أثناء الاستخراج

CVE GHSA CVSS 3.1

إسناد أذونات غير صحيح في حزمة npm adm-zip. يمكن للاستخراج أن يحتفظ ببتات setuid وsetgid وsticky من ملف zip غير موثوق عندما يكون keepOriginalPermission مُفعَّلاً، مما يسمح بزرع ملف تنفيذي setuid مملوك لـ root على القرص من أرشيف يوفره المهاجم: تصعيد صلاحيات محلي.

الحزمةadm-zip (npm)
النظام البيئيNode.js
CVECVE-2026-102282
التنبيهGHSA-j5f4-cc29-5x44
CWECWE-732 إسناد أذونات غير صحيح لمورد حرج
CVSS v3.17.1 High — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
المتأثرة< 0.6.1 (آخر إصدار متأثر معروف: <= 0.6.0)
المُصلَحة0.6.1 (11 سبتمبر 2026)
تاريخ النشرتنبيه المشرف 11 سبتمبر 2026؛ قاعدة بيانات تنبيهات GitHub 29 سبتمبر 2026

يحتوي هذا المستودع على التقرير، وأداة للتحقق من إصدار التبعية، واختبار سلوكي آمن، وإثبات مفهوم مكتفٍ ذاتيًا مبني حول ملف تحقق حميد لا يفعل سوى طباعة سياق بيانات اعتماده.

الإصدارات المتأثرة

كل إصدار قبل 0.6.1 متأثر، بما في ذلك 0.6.0.

النطاقالحالة
>= 0 و < 0.6.1متأثر
<= 0.6.0آخر إصدار متأثر معروف
>= 0.6.1مُصلَح

لا يمكن الوصول إلى الخلل إلا عندما تكون جميع الشروط التالية صحيحة:

  • يمرر المستدعي keepOriginalPermission=true إلى extractAllTo() أو extractAllToAsync() أو extractEntryTo().
  • تعمل العملية التي تستخرج الأرشيف بصلاحيات root، أو كمستخدم آخر ذي هوية أكثر امتيازًا من الحساب الذي يشغّل الملف المستخرج لاحقًا.
  • الأرشيف غير موثوق (رفع، أو قطعة أثرية مُجلَبة، أو مدخل بناء، أو أرشيف تبعية).

الاستخراج الافتراضي يترك العَلَم مُعطَّلاً وغير متأثر. الاستخراج كمستخدم غير ذي امتيازات يمكنه مع ذلك تطبيق بتات الوضع، لكن الملف الناتج يملكه نفس المستخدم، فلا يعبر حدود الامتيازات.

الخلل

توجد بتات وضع Unix في الـ 16 بت العلوية من سمات الملف الخارجية لمدخل zip. ينسخ adm-zip تلك البتات إلى المسار المستخرج.

الموقعالدور
headers/entryHeader.js — fileAttrيقرأ وضع Unix من السمات الخارجية
adm-zip.js — extractAllTo، extractAllToAsync، extractEntryToيستخدم fileAttr عندما يكون keepOriginalPermission صحيحًا
util/utils.js — chmodSync داخل مساعد كتابة الملفيطبّق ذلك الوضع على المسار المُنشأ للتو
استخراج المجلدات في adm-zip.jsيطبّق نفس الوضع على المجلدات المستخرجة

في 0.6.0 وما قبلها، يقوم fileAttr بإخفاء السمة المُزاحة باستخدام 0xfff (0o7777). يحتفظ هذا القناع بالبتات الخاصة الثلاث إلى جانب بتات rwx المعتادة، ولا شيء في مسار الكتابة يمسح 0o7000 قبل chmod:

// headers/entryHeader.js (<= 0.6.0)
get fileAttr() {
    return (_attr || 0) >> 16 & 0xfff;
}
  • setuid (0o4000)
  • setgid (0o2000)
  • sticky (0o1000)

المُحفِّز

يمرر الاستخراج الوضع الذي يتحكم به الأرشيف مباشرة إلى نظام الملفات:

// adm-zip.js
const fileAttr = keepOriginalPermission ? entry.header.fileAttr : undefined;
filetools.writeFileTo(entryName, content, overwrite, fileAttr);

// util/utils.js
self.fs.chmodSync(path, attr || 0o666);

لاحظ توقيع الاستدعاء في 0.6.x: extractAllTo(targetPath, overwrite, keepOriginalPermission) يأخذ قيمة منطقية حرفية كوسيطه الثالث. تمرير كائن خيارات مثل { keepOriginalPermission: true } يُحوَّل بصمت إلى false، مما يحجب الثغرة في اختبار بدلاً من إظهارها. كلا سكربتات PoC في هذا المستودع تمرر true مباشرة.

الإصلاح

الإصلاح هو الالتزام 6a63c339 (v0.6.1). يحتفظ fileAttr الآن ببتات rwx التسع فقط:

get fileAttr() {
    return (_attr || 0) >> 16 & 0o777;
}

كيف يعمل

  1. يخزّن مدخل zip وضع Unix في سماته الخارجية (المكان القياسي، مُزاحًا 16 بت).
  2. مع keepOriginalPermission=true، يقرأ الاستخراج ذلك الوضع عبر fileAttr ويمرره إلى chmod.
  3. لأن القناع هو 0o7777، تنجو بتات setuid وsetgid وsticky.
  4. إذا عمل ذلك chmod بصلاحيات root، يصبح الملف الجديد مملوكًا لـ root ويمكنه حمل setuid. تشغيل لاحق من مستخدم أقل امتيازًا ينفّذ كود مالك الملف بصلاحيات root.
  5. ينطبق نفس المسار على المجلدات. يحتفظ مجلد setgid بوراثة المجموعة للملفات المُنشأة داخله لاحقًا.

مع ترك العَلَم على وضعه الافتراضي، لا يطبّق الاستخراج وضع الأرشيف، ولا تُكتب البتات الخاصة.

إثبات المفهوم

كل شيء موجود تحت poc/. الحمولة المرفقة هي verify.c، وهو برنامج حميد يطبع uid/gid الحقيقي والفعال، وفي وضعه الافتراضي، يفتح صدفة بالهوية الفعالة. لا يستمر، ولا يخفي، ولا يفعل أي شيء يتجاوز إظهار سياق بيانات الاعتماد.

الملفالغرض
poc/verify.cحمولة تحقق setuid حميدة
poc/build-archive.jsيحزم ملفًا في zip يحمل مدخله الوضع 0o4755
poc/extract.jsيستخرج أرشيفًا باستخدام keepOriginalPermission=true، كما يفعل تطبيق متأثر
poc/run-demo.shتشغيل شامل: بناء، استخراج بصلاحيات root، تشغيل كمستخدم المستدعي

تشغيله

git clone <this repo> && cd CVE-2026-102282
npm install [email protected]        # the version under test
sudo apt install gcc             # if needed

./poc/run-demo.sh                # uses /var/tmp/cve-2026-102282-demo
./poc/run-demo.sh /path/to/out   # or a custom output directory

المخرجات المتوقعة مقابل 0.6.0:

== 3. extract as root with keepOriginalPermission ==
adm-zip version: 0.6.0
extracted /var/tmp/cve-2026-102282-demo/exploit.zip into /var/tmp/cve-2026-102282-demo/extracted
== 4. result on disk ==
4755 -rwsr-xr-x root:root
== 5. run as the unprivileged user (user) ==
uid=1000(user) ... 
[*] real  uid=1000 gid=1000
[*] eff.  uid=0 gid=0
[+] SUID active: effective uid 0 differs from real uid 1000

المخرجات المتوقعة مقابل 0.6.1:

== 4. result on disk ==
755 -rwxr-xr-x root:root
== 5. run as the unprivileged user (user) ==
uid=1000(user) ...
[*] real  uid=1000 gid=1000
[*] eff.  uid=1000 gid=1000
[-] effective and real ids match: no SUID context

تحذيرات للعرض التجريبي:

  • يجب أن يكون مجلد الاستخراج على نظام ملفات غير مُثبَّت بخيار nosuid؛ يحذّر السكربت عند اكتشاف خيار التثبيت هذا.
  • يرفض السكربت العمل كـ root مجرد (شغّله عبر sudo من حسابك الخاص حتى يكون لدى الخطوة 5 حساب غير root للانتقال إليه).
  • التنظيف يزيل بت setuid ويحذف مجلد المخرجات عند الخروج.

الاختبار السلوكي

يتحقق scripts/behavior-test.js من نسخة adm-zip المثبتة مباشرة، دون root ودون حمولة: يبني مدخل zip في الذاكرة يحمل 0o4755، ويستخرجه باستخدام keepOriginalPermission=true، ويتحقق مما إذا كان بت setuid قد نجا.

npm install [email protected] && node scripts/behavior-test.js   # -> exit 1, VULNERABLE
npm install [email protected] && node scripts/behavior-test.js   # -> exit 0, not vulnerable

التأثير

تصعيد صلاحيات محلي للتطبيقات وخطوط الأنابيب التي تستخرج ملفات zip غير موثوقة بصلاحيات root مع keepOriginalPermission=true.

تنزيل الأداة