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

نمذجة التهديدات لخطوط الأنابيب

18 دقيقة الدرس 2 من 28

نمذجة التهديدات لخطوط الأنابيب

خط أنابيب التسليم ليس مجرد أداة أتمتة مريحة — بل هو بيئة تنفيذ عالية الامتيازات تمتلك وصول قراءة/كتابة إلى الكود المصدري والأسرار الإنتاجية وسجلات القطع الأثرية والبنية التحتية السحابية. المهاجمون الذين يخترقون خط الأنابيب لا يحتاجون إلى استغلال تطبيقك — بل يصبحون أنت. هجمات سلسلة التوريد على SolarWinds وCodecov و3CX شاركت جميعها نمطًا واحدًا: وجد المهاجم ثغرةً في نظام التسليم واستخدمها كنقطة إدراج، لا التطبيق نفسه.

نمذجة التهديدات تُحول تلك المخاطر المجردة إلى ضوابط محددة وقابلة للتنفيذ. يطبق هذا الدرس نسخةً خفيفة من STRIDE — مضبوطة لأنظمة التسليم — لإحصاء منهجي لمن يستطيع إدراج ماذا وأين، وكيف يمكن سد كل ثغرة.

لماذا STRIDE-Lite وليس STRIDE الكاملة؟

صُممت STRIDE الكلاسيكية (الانتحال، التلاعب، الإنكار، كشف المعلومات، الحرمان من الخدمة، رفع الامتيازات) لمكونات البرمجيات التفاعلية. خطوط الأنابيب لها سطح تهديد أضيق لكن عواقب أعلى بكثير لكل هجوم ناجح. تُدمج STRIDE-Lite الفئات الست في ثلاثة محاور مهيمنة تتوافق مباشرةً مع تشريح خط الأنابيب:

  • الحقن (Injection) — يُدرج المهاجم كودًا أو أوامر خبيثة في تدفق خط الأنابيب (يغطي التلاعب + الانتحال)
  • التسريب (Exfiltration) — تتسرب الأسرار أو الكود المصدري أو طوبولوجيا الشبكة الداخلية إلى الخارج (يغطي كشف المعلومات)
  • رفع الامتيازات (Privilege Escalation) — يُستخدم رمز مميز أو دور أو عداء خط الأنابيب للحصول على وصول يتجاوز النطاق المقصود (يغطي رفع الامتيازات)

الحرمان من الخدمة والإنكار حقيقيان لكنهما ثانويان؛ عالجهما عبر مراقبة SLO وتسجيل التدقيق الذي يُغطيه دروس لاحقة.

Pipeline Threat Surface: Injection, Exfiltration, Privilege Escalation entry points Source Repo git push / PR CI Runner build + test Artifact Registry image / package CD / Deploy k8s / cloud API Prod cluster INJECTION malicious PR dep confusion INJECTION script injection action poisoning EXFILTRATION secrets in build logs env var leak PRIV ESC over-scoped token IRSA mis-config مفتاح: Injection (كود/أوامر تُدرج في التدفق) Exfiltration (بيانات تغادر حدود خط الأنابيب) Privilege Escalation (رمز/دور يُستخدم بما يتجاوز نطاقه)
فئات التهديدات الثلاث الرئيسية مُعيَّنة على مراحل خط الأنابيب. كل عقدة هي أصل ونقطة دخول في آنٍ واحد.

فئة التهديد الأولى — الحقن: من يستطيع إدراج كود؟

الحقن هو الفئة الأكثر استغلالًا في هجمات خطوط الأنابيب لأن مهمة خط الأنابيب الأساسية هي تشغيل كود من المستودع. السؤال هو: كود من، وتحت أي مستوى ثقة؟

طلبات السحب الخبيثة

سينفذ GitHub Actions وGitLab CI تعريفات خط الأنابيب من أي فرع، بما في ذلك تلك المفتوحة من مساهمين خارجيين عبر Fork PRs. يمكن للمهاجم فتح PR يعدّل ملف سير العمل لتسريب secrets.PROD_AWS_KEY في طلب HTTP صادر. المُشغِّل pull_request_target خطير بشكل خاص — يعمل في سياق الفرع الأساسي (مع الأسرار) لكنه يسحب كود الـFork.

لا تستخدم أبدًا pull_request_target مع خطوة تسحب كود الـPR إلا إذا حددت نطاقه بوضوح. وثّق فريق GitHub Security Lab العديد من الهجمات الحقيقية على مشاريع مفتوحة المصدر شهيرة (حزم PyPI وnpm) من خلال هذا التكوين الخاطئ وحده.

الارتباك في التبعيات والتضليل بالأسماء المشابهة

إذا شغّل خط الأنابيب npm install أو pip install من سجل عام واسم حزمتك يطابق اسم حزمة داخلية خاصة، يمكن للمهاجم نشر حزمة عامة خبيثة برقم إصدار أعلى. مدير الحزم يُحل الإصدار العام أولًا — وهذا هو الارتباك في التبعيات. خرق Codecov اتبع نمطًا مشابهًا ضد عداء CI نفسه.

تسميم الـActions والـOrbs من جهات خارجية

كل uses: some-vendor/action@main في سير عمل GitHub Actions هو نقطة تنفيذ كود عن بُعد. إذا اختُرق مستودع تلك الـAction، فكذلك كل خط أنابيب يشير إليها بوسم قابل للتغيير. المرجع @main أو @v3 غير ثابت.

# خاطئ — وسم قابل للتغيير، يمكن أن تتغير الـAction دونك - uses: actions/checkout@v4 # صحيح — تثبيت على SHA الدقيق لالتزام الـAction - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 # أتمتة تثبيت SHA عبر جميع سير العمل: pip install pip-audit # لتبعيات Python # للـactions، استخدم: npx pin-github-action .github/workflows/*.yml # أو استخدم Renovate / Dependabot لإبقاء SHAs محدثة

فئة التهديد الثانية — التسريب: ماذا يتسرب وإلى أين؟

الأسرار المُحقنة في متغيرات البيئة هي متجه التسريب الأكثر شيوعًا. خط الأنابيب الذي يطبع متغيرات البيئة على الإخراج القياسي، أو اختبار يسجل رؤوس الطلبات التي تحتوي على رأس Authorization، قد يُسرِّب بيانات اعتماد إلى سجلات البناء التي يمكن لأي شخص لديه وصول إلى المستودع قراءتها.

المتجه الثاني هو نظام ملفات العداء. عدّاءات CI هي آلات افتراضية مؤقتة، لكن إذا كان العداء ذاتي الاستضافة ومشتركًا عبر مهام، يمكن لمهمة خبيثة قراءة ~/.aws/credentials أو /tmp/token-* أو بيانات اعتماد مؤقتة من مساحة عمل مهمة سابقة دون أي امتيازات مرفوعة.

# اكتشاف الأسرار في سجلات البناء — شغّل كخطوة CI قبل أي إخراج # استخدام truffleHog في CI - name: Scan for leaked secrets in git history run: | docker run --rm -v "$PWD:/repo" \ trufflesecurity/trufflehog:latest \ git file:///repo --only-verified --fail # اكتشاف تسريب متغيرات البيئة في مخرجات الاختبار # gitleaks كفحص pre-push / CI - name: Gitleaks scan uses: gitleaks/gitleaks-action@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITLEAKS_LICENSE: ${{ secrets.GITLEAKS_LICENSE }}
تُعيد GitHub Actions تلقائيًا الأسرار المسجلة من مخرجات السجل — لكن فقط إذا كانت مسجلة كأسرار. القيمة التي تُمرر كمتغير بيئة عادي (مثل env: MY_KEY: ${{ steps.get-token.outputs.token }}) لا تُعاد. استخدم دائمًا سياق secrets للقيم الحساسة، واستدعِ add-mask للرموز المُولَّدة ديناميكيًا: echo "::add-mask::$DYNAMIC_TOKEN".

فئة التهديد الثالثة — رفع الامتيازات: ماذا يستطيع العداء المخترق أن يفعل؟

رموز خط الأنابيب هي أكثر بيانات الاعتماد إفراطًا في الامتيازات في معظم المنظمات الهندسية. رمز سير عمل GitHub Actions مع permissions: write-all يمكنه دفع فروع والموافقة على PRs وتعديل إعدادات المستودع وإنشاء إصدارات — كل ذلك من عداء يمكن لكود PR أي مساهم التأثير فيه. على AWS، دور IAM لـCD pipeline مع AdministratorAccess يحوّل اختراق خط الأنابيب إلى استيلاء كامل على حساب السحابة.

# فرض أقل امتياز لرمز GitHub Actions على مستوى سير العمل # اضبط الافتراضي على للقراءة فقط، ثم امنح الكتابة فقط حيث يلزم permissions: contents: read # يمكنه السحب — لا شيء آخر بشكل افتراضي jobs: deploy: permissions: contents: read id-token: write # OIDC لمصادقة AWS فقط — لا مفاتيح طويلة الأمد steps: - uses: aws-actions/configure-aws-credentials@v4 with: role-to-assume: arn:aws:iam::123456789012:role/DeployRole aws-region: us-east-1 # سياسة الدور تسمح فقط بـs3:PutObject لحاوية النشر # وecs:UpdateService — لا شيء آخر

الإحصاء المنهجي — جدول حدود الثقة في خط الأنابيب

مخرج نمذجة التهديدات العملية ليس وثيقة عروض تقديمية — بل جدول يسرد كل تجاوز لحدود الثقة في خط أنابيبك، والجهة التي يمكنها تشغيله، وأسوأ تأثير ممكن، والضابط الذي يسده. إليك نموذجًا مُعبَّأ لخط أنابيب GitHub Actions + AWS نموذجي:

Pipeline Trust Boundary Table: entry points, actors, impact, controls نقطة الحد / الدخول الجهة الفاعلة التهديد أسوأ تأثير الضابط PR من Fork مساهم خارجي حقن عبر سير العمل تسريب الأسرار pull_request (بلا أسرار) (تعديل .github/workflows) + موافقات إلزامية Action من طرف ثالث مورد / مشرف OSS اختراق مستودع الـAction RCE في العداء تثبيت على SHA الالتزام (uses: vendor/action@main) + تحديثات Dependabot تثبيت npm / PyPI مؤلف حزمة خبيثة ارتباك تبعيات / تضليل باب خلفي في البناء lockfile + فحص SCA (جلب من سجل عام) + نطاق سجل خاص مخرج سجل البناء أي قارئ للمستودع سر في stdout/stderr تسريب بيانات الاعتماد سياق secrets + add-mask (متغير بيئة / تفصيل السجل) + فحص gitleaks في CI دور/رمز IAM لـCD عداء مخترق بيانات اعتماد سحابية مفرطة استيلاء كامل على الحساب OIDC + دور أقل امتياز (مفتاح طويل الأمد في env) + لا مفاتيح طويلة الأمد عداء ذاتي الاستضافة مؤلف PR خبيث الوصول لنظام ملفات مشترك تحرك جانبي عدّاءون مؤقتون (ARC) (مضيف مشترك دائم) + سياسة خروج الشبكة الضوابط المعروضة هي تخفيفات الخط الأول. الدفاع في العمق يتطلب جميع الطبقات.
جدول حدود ثقة خط الأنابيب: كل صف يمثل نقطة عبور، وجهتها الفاعلة، والتهديد، وأسوأ تأثير، والضابط الأساسي.

تشغيل نموذج التهديد — الأسئلة الأربعة

لا تحتاج إلى أداة نمذجة تهديدات للبدء. اعمل من خلال هذه الأسئلة الأربعة لكل مكوِّن جديد تضيفه إلى خط الأنابيب:

  1. ماذا يتلقى هذا المكوِّن كمدخلات؟ — هل هذه المدخلات مُتحقق منها؟ هل يمكن لجهة خارجية التأثير فيها؟
  2. ما بيانات الاعتماد التي يحملها أو ينتجها؟ — هل هي محدودة النطاق في الحد الأدنى المطلوب؟ هل تنتهي صلاحيتها؟
  3. ما الذي يمكنه الكتابة إليه أو تنفيذه؟ — هل يمكن للمخرج أن ينتشر إلى الإنتاج دون بوابة بشرية؟
  4. ما الذي يُسجَّل، ومن يستطيع قراءته؟ — هل يحتوي السجل على أي شيء لا ينبغي لقارئ رؤيته؟
الهدف من نمذجة تهديدات خط الأنابيب ليس وثيقة نمذجة تهديدات مثالية — بل قائمة مرتبة حسب الأولوية من الضوابط للتطبيق. أجرِ هذا التمرين في وقت تصميم النظام (قبل البناء)، وعند مراجعة الـPR (عند إضافة مهمة أو Action جديدة)، وكل ربع سنة (مع ظهور أنماط هجوم جديدة). أظهر خرق XZ Utils 2024 أن حتى نظام بناء التبعية هو سطح هجوم لخط الأنابيب.

ربط النموذج بالضوابط

كل تهديد يتوافق مباشرةً مع أداة أو تكوين محدد يُقدَّم في بقية هذا البرنامج التعليمي: تهديدات الحقن تُعالَج بـSAST (الدرس 3) وفحص SCA (الدرس 4) والتوقيع/التحقق (الدرس 8). تهديدات التسريب تُعالَج بفحص الأسرار (الدرس 9). تهديدات رفع الامتيازات تُعالَج بفحص الحاويات وIaC (الدرس 6) وإثبات مصدر SBOM (الدرس 7). نمذجة التهديدات ليست تمرينًا قائمًا بذاته — بل الخريطة التي تُخبرك لماذا تُشغِّل كل ماسح ضوئي.