
مختبر معزول لاختبارات الانحدار وضوابط الأمان لـ CVE-2026-59891 في @sigstore/oci
مشروع تمرين عملي معزول وتدقيق للقراءة فقط (read-only) يقارن الإصدار الفعلي المُصاب والإصدار المُصحَّح من @sigstore/oci باستخدام المدخلات نفسها، ويفحص شروط التعرّض حسب البيئة.
مُبلِّغ CVE الخاص بهذا المشروع هو gyubin02.
ملخّص مخصص للتوظيف والمقابلات: حالة أتمتة إدارة ثغرة CVE-2026-59891
يكمن جوهر ثغرة CVE-2026-59891 في الخلط بين أسماء المضيفين (hostname) الذي يحدث عند اختيار بيانات اعتماد السجل (Registry).
0.7.0: يمكنه اختيار بيانات اعتماد ghcr.io لمجرد أن السلسلة cr.io موجودة داخل سلسلة النص ghcr.io.0.7.1: يطبّع hostname ثم يختار فقط بيانات الاعتماد المطابقة تمامًا.يقوم هذا المستودع أولًا بالتحقق تلقائيًا من سيناريوهين لاختيار بيانات الاعتماد.
ghcr.io بينما الهدف هو cr.iocr.io مطابقة تمامًا للهدفيجب أن يختار الإصدار المُصاب بيانات الاعتماد بشكل خاطئ في السيناريو الأول، بينما يجب أن يرفضها الإصدار المُصحَّح. وفي السيناريو الثاني السليم، يجب أن ينجح كلا الإصدارين.
أضفنا إلى ذلك مقارنة ديناميكية تستخدم سجل mock مؤقتًا (للاستخدام لمرة واحدة) على العنوان 127.0.0.1 بدلًا من سجل خارجي حقيقي. يرسل الإصدار المُصاب 0.7.0 طلبين محليًا، ويُلاحَظ ظهور ترويسة Authorization اصطناعية في الطلب الثاني بعد تحدي المصادقة. أما الإصدار المُصحَّح 0.7.1 فيُرفض في مرحلة اختيار بيانات الاعتماد، فيكون عدد الطلبات صفرًا. لا تتضمن النتائج قيم الترويسة، بل فقط ما إذا كان ظهورها قد لوحظ وعدد الطلبات.
تقرأ أداة cve-2026-59891-audit البيانات الوصفية (metadata) فقط من ملف package-lock.json الخاص بالمشروع المستهدف ومن إعداد Docker المحدَّد صراحةً، وتُميّز ما يلي:
@sigstore/oci المتأثر ورقم إصدارهللتنفيذ المباشر باستخدام بيانات (fixture) اصطناعية:
npm run audit:demo
لفحص مشروع Node.js آخر:
npm run audit:project -- \
--project ../target-project \
--docker-config ../review-copy/config.json \
--image cr.io/example/demo \
--destination-trust unknown \
--format markdown \
--output reports/cve-2026-59891.md
يجب تحديد --destination-trust بأحد الخيارات التالية:
trusted: يؤكد أن الوجهة (destination) مقيدة بالكود وبقائمة السماح (allowlist)untrusted: يؤثر الإدخال الخارجي أو إدخال سير العمل (workflow) على الوجهةunknown: لم يتم تأكيد ذلك بعدتنقسم نتائج التقييم إلى: exposure_conditions_met وpotential_exposure وaffected_component_only وnot_detected وindeterminate. وحتى نتيجة not_detected هي مجرد نتيجة ضمن نطاق المدخلات المسجَّل فقط، ولا تعني "آمن" أو "الامتثال للوائح".
~/.docker/config.json الحقيقي ولا يعدّله.HOME مخصصًا معزولًا وقيمًا وهمية بلا قيمة حقيقية:
lab-user / LAB_ONLY_FAKE_TOKEN.HOME وعلامة المختبر والقيم الوهمية جميعها صحيحة.fetch.127.0.0.1 المحدد الذي خصصه نظام التشغيل. ويُحظر طلبات
HTTP الخارجية أو الموجهة إلى منافذ أخرى، وDNS resolver، وTLS، وUDP،
وfetch العامة وWebSocket.--docker-config في واجهة الفحص CLI، ولا تستنتج الأداة وجود
الملف من HOME أو DOCKER_CONFIG.نظرًا لأن الحزمة المُصابة تُثبَّت عمدًا، فقد مُنع نشر المشروع كحزمة npm عبر إعداد "private": true. لا يجوز استخدامه كاعتمادية في كود الإنتاج. ولهذا، فإن إبلاغ npm audit عن الإصدار 0.7.0 هو نتيجة متوقعة، وقد وُثِّق نطاق هذا الاستثناء وأسبابه في SECURITY.md.
المتطلبات: Node.js 22.22.2+ أو 24.15.0+ أو 26 فما فوق. الإصدار الموصى به مُثبَّت في ملف .nvmrc.
npm ci --ignore-scripts
npm test
npm run demo
npm run dynamic:demo
npm run audit:fixture
npm run audit:demo
npm run evidence
النتائج الأساسية المتوقعة من npm run demo:
0.7.0 collision credential-selected
0.7.1 collision credential-rejected
0.7.0 exact credential-selected
0.7.1 exact credential-selected
Regression result: PASS
النتائج الأساسية المتوقعة من npm run dynamic:demo:
{
"vulnerable": {
"packageVersion": "0.7.0",
"credentialSelection": "credential-selected",
"requestCount": 2,
"authorizationObserved": true,
"digestVerified": true,
"networkPolicy": "exact-loopback-only"
},
"fixed": {
"packageVersion": "0.7.1",
"credentialSelection": "credential-rejected",
"requestCount": 0,
"authorizationObserved": false,
"digestVerified": false,
"networkPolicy": "exact-loopback-only"
},
"regressionResult": "PASS"
}
يبلغ إجمالي الاختبارات الآلية 34 اختبارًا. ينشئ npm run evidence 7 ملفات في المجمل: 6 مخرجات خاضعة للفحص، بالإضافة إلى SHA256SUMS للتحقق من سلامتها.
هذا المشروع تقييم رقابي (control) تعليمي محدود. تُثبت نتائج loopback اختلافات السلوك في البيئة الاصطناعية فقط، ولا تُثبت تعرّض بيانات الاعتماد أو اختراقها أو فعالية الضوابط في بيئة مؤسسية حقيقية. ولا تعني أهلية CISA أو شهادة ISMS-P أو امتثال منظمة معينة للوائح. حارس Node API (guard) هو طبقة دفاع لمسار التنفيذ المرصود للاعتماديات المُقفلة، وليس نطاق شبكة (network namespace) على مستوى نظام التشغيل أو جدار حماية.
توجد الوثائق التفصيلية حول النطاق والاختبارات والمخاطر والضوابط في docs/، وينشئ npm run evidence سجل تنفيذ قابلًا لإعادة الإنتاج وملف manifest بصيغة SHA-256.
npm-shrinkwrap.json ذا أولوية أعلى، فإنها تفشل دون أن تفترض أن
الوضع آمن.