تخطَّ إلى المحتوى

أمن سلسلة التوريد

تجيب سياسة الاستبعاد عن سؤال واحد: مَن بنى هذا؟ وهي لا تقول شيئاً عن سؤال ثانٍ لا يقلّ أهمية لمن يعتمدون على ما تبنيه: هل هو آمن — وهل يظلّ آمناً؟ فالاعتمادية ذات المصدر النظيف قد تحمل مع ذلك ثغرة حرجة، والحزمة التي كانت آمنة يوم تثبيتها تتقادم مع الإفصاح عن ثغرات (CVE) جديدة ضدها. لذلك يُمسك الكتالوج خطّاً ثانياً، بالانضباط نفسه الذي للخط الأول: مفحوص آلياً، يفشل بشكل صارم، وقابل لأن تتحقق منه بنفسك بدل أن تقبله ثقةً.

المُشغِّلما الذي يُنفَّذ
كل pull requestمراجعة اعتماديات الفرق (diff) + OSV-Scanner + Grype، مع فشل صارم أمام ثغرة حرجة قابلة للمعالجة. تُرفع النتائج إلى تبويب Security.
كل ليلة (03:00 UTC)إعادة فحص لمجموعة الاعتماديات المثبّتة مقابل قواعد بيانات الإرشادات الحالية — حتى يُكتشَف CVE أُفصِح عنه بعد تثبيت اعتمادية دون أي commit جديد. وتفتح ثغرة حرجة حديثة الإفصاح تذكرة متابعة.
كل بناء لفرع mainقائمة مكوّنات برمجية (SBOM، بصيغتَي CycloneDX وSPDX) وإثبات مصدر بناء موقّع للموقع المنشور.

هذا مستقلّ عن —ومُضاف إلى— تطبيق المصدر: يفحص محرّك الاستبعاد المِلكية وتدفّق البيانات؛ بينما يفحص هذا الثغرات المعروفة. ولا يحلّ أحدهما محلّ الآخر.

OSV-Scanner (ماسح Google فوق قاعدة البيانات المفتوحة OSV.dev) هو البوابة الأساسية. ويعمل Grype (من Anchore، مدعوماً بقاعدة بيانات ثغرات مختلفة) كتحقّق متقاطع مستقلّ. التوافق بين ماسحات الثغرات منخفض على نحو معروف، لذا فالرأي الثاني مقصود لا زائد. ويفحص كلاهما كل الأنظمة البيئية التي يحتويها المشروع (npm وPyPI وcrates وGo وغيرها)، بما في ذلك الاعتماديات غير المباشرة.

احجب عند الحرجة، مع توفّر إصلاح

Section titled “احجب عند الحرجة، مع توفّر إصلاح”

يُحجَب البناء عند حرجة فقط — تماشياً مع فلسفة «احجب لا تحذّر» في المشروع، وتفادياً لإرهاق التنبيهات الذي يقوّض بصمت بوابةً يُفترَض بالناس أن يثقوا بها. أما HIGH وما دونها فتُتابَع ولا تَحجب. وتُطلَق البوابة فقط حين يتوفّر إصلاح: فالثغرة الحرجة بلا تصحيح يُبلَّغ عنها لكنها لا تستطيع تعطيل البناء إلى ما لا نهاية. وحين تكون الثغرة الحرجة غير قابلة للاستغلال هنا فعلاً، أو بلا إصلاح، تُدوَّن السبب كسجلّ OpenVEX قابل للقراءة آلياً تحت security/vex/ — فالاستثناء لا يُسمح به إلا حين يُبرَّر علناً، لا بخفض السقف أبداً.

قائمة مكوّنات وإثبات مصدر يمكنك التحقق منهما

Section titled “قائمة مكوّنات وإثبات مصدر يمكنك التحقق منهما”

يُصدر كل بناء قائمة مكوّنات برمجية بصيغتَي CycloneDX وSPDX، ويُثبت مصدر بناء القطعة المنشورة. لست مضطراً لتصديقنا أن الموقع الذي تراه خرج من هذا المصدر: فالإثبات قابل للتحقق عبر gh attestation verify أو cosign أو slsa-verifier. الأدلة موجودة هناك مباشرة — المعيار نفسه الذي يلتزم به الكتالوج مع التراخيص.

خط الإنتاج نفسه سطح هجوم

Section titled “خط الإنتاج نفسه سطح هجوم”

إن ما يفحص هجمات سلسلة التوريد هو نفسه هدف لسلسلة التوريد. لذا يُثبَّت كل GitHub Action على SHA كامل لالتزام (commit)، لا على وسم متحرّك قد يعيد مشرفٌ توجيهه؛ ويجعل محلّل ساكن (zizmor) البناءَ يفشل إن تسلّل أي إجراء غير مثبَّت؛ ويُقسّى كل مشغّل CI بمراقبة الصادر من الشبكة. كما أننا عمداً لا نستخدم Trivy — فقد جرى اختراق إجرائه الشائع في هجوم سلسلة توريد في مارس 2026 (CVE-2026-33634)، إذ أُعيد دفعه قسراً إلى برمجية خبيثة تسرق بيانات الاعتماد. ومعاملة الماسح كسطح هجوم ليست وسواساً؛ إنها الدرس.

Terminal window
# فحص الثغرات لكل الأنظمة البيئية، تعاوديًّا (OSV-Scanner من Google)
osv-scanner scan source --recursive .
# تحقّق متقاطع مستقلّ (Grype من Anchore)
grype dir:.
# توليد قائمة مكوّنات برمجية (Syft من Anchore)
syft scan dir:. -o cyclonedx-json

وبوابة CRITICAL نفسها هي scripts/osv-critical-gate.sh، أما الوصفة المحمولة لإضافة كل هذا إلى مشروعك أنت فتأتي كمهارة الوكيل supply-chain-security.