DEV Community

Cover image for كيفية تأمين تبعيات NPM: دليل شامل لأمن سلسلة التوريد لمطوري API
Yusuf Khalidd
Yusuf Khalidd

Posted on • Originally published at apidog.com

كيفية تأمين تبعيات NPM: دليل شامل لأمن سلسلة التوريد لمطوري API

ملخص سريع

ارتفعت هجمات سلسلة توريد NPM إلى أكثر من 3000 حزمة ضارة في عام 2024 وحده، وأثبت اختراق Axios في مارس 2026 أن حتى الحزم العشرة الأولى ليست آمنة. يغطي هذا الدليل كل طبقة دفاع يحتاجها مطورو واجهة برمجة التطبيقات: فرض ملفات القفل (lockfile enforcement)، وحظر نصوص ما بعد التثبيت (postinstall script blocking)، والتحقق من المصدر (provenance verification)، وأدوات التحليل السلوكي (behavioral analysis tools)، والخيارات المعمارية التي تقلل من سطح الهجوم الخاص بك.

جرّب Apidog اليوم

مقدمة

لم يكن هجوم سلسلة توريد Axios في 31 مارس 2026 أول اختراق لـ npm. ولن يكون الأخير. ولكن مع 83 مليون تنزيل أسبوعي ونشر أداة الوصول عن بعد (RAT) عبر حساب مشرف واحد تم اختراقه، كان هذا أقوى إنذار تلقاه نظام JavaScript البيئي.

إليك ما يجعل هذا مختلفًا عن نصيحة "تحديث تبعياتك" المعتادة: تجاوز هجوم Axios كل دفاع تقليدي. لم يكن الكود الخبيث موجودًا في Axios نفسها. بل تم حقنه عبر تبعية شبحية أطلقت خطاف ما بعد التثبيت (postinstall hook). لم تساعد ملفات القفل إذا قمت بتشغيل npm install أثناء فترة الهجوم. ولم يساعد تثبيت الإصدار إذا لم تكن قد ثبته بعد.

يتعرض مطورو واجهة برمجة التطبيقات بشكل خاص. فسكربتات الاختبار، وخطوط أنابيب CI/CD، والخوادم الوهمية (mock servers)، وعملاء HTTP كلها تسحب من npm. يمكن لحزمة واحدة مخترقة في مجموعة أدواتك أن تسرب مفاتيح API وبيانات اعتماد قاعدة البيانات ورموز السحابة من جهاز التطوير الخاص بك.

💡

يلغي Apidog أحد نواقل الهجوم الرئيسية من خلال توفير عميل HTTP مدمج لاختبار واجهة برمجة التطبيقات، لذلك لا تحتاج إلى Axios أو node-fetch أو got في مكدس الاختبار الخاص بك. قم بتنزيل Apidog مجانًا لتقليل سطح اعتماد npm الخاص بك مع اتباع استراتيجيات الدفاع أدناه.
Enter fullscreen mode Exit fullscreen mode

يغطي هذا الدليل سبع طبقات من الحماية، من النظافة الأساسية لملفات القفل إلى التحليل السلوكي المتقدم.

الطبقة 1: فرض ملفات القفل

لماذا تهم ملفات القفل

يسجل ملف القفل (lockfile) الإصدار الدقيق لكل حزمة وتبعيتها الانتقالية في وقت التثبيت. بدون ملف قفل، يحل npm install أحدث إصدار يطابق نطاق semver الخاص بك. إذا كان package.json الخاص بك يقول "axios": "^1.14.0" ووجد إصدار خبيث 1.14.1 في السجل، فستحصل على الإصدار الخبيث.

القواعد

التزم دائمًا بملف القفل الخاص بك. سواء كان package-lock.json (npm)، أو yarn.lock (Yarn)، أو pnpm-lock.yaml (pnpm)، أو bun.lock (Bun)، فإنه ينتمي إلى التحكم في الإصدار.

استخدم التثبيتات المجمدة في CI/CD. لا تقم أبدًا بتشغيل npm install في بيئات التشغيل الآلي. استخدم ما يعادل ملف القفل المجمد:

# npm
npm ci

# yarn
yarn install --frozen-lockfile

# pnpm
pnpm install --frozen-lockfile

# bun
bun install --frozen-lockfile
Enter fullscreen mode Exit fullscreen mode

npm ci يحذف مجلد node_modules ويثبت فقط من ملف القفل. إذا لم يتطابق ملف القفل مع package.json، يفشل التثبيت.

راجع فروقات ملف القفل في طلبات السحب. إذا تم تعديل package-lock.json في Pull Request، تحقق من التغييرات. أي تبعيات جديدة، أو تغييرات إصدارات، أو تغييرات في عنوان URL للسجل تستحق التدقيق. استخدم أدوات مثل Socket.dev لمراجعة تغييرات ملف القفل تلقائيًا.

فجوة ملف القفل

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

الطبقة 2: تعطيل سكربتات ما بعد التثبيت

نقطة الهجوم الأساسية

استخدم هجوم Axios، وهجوم ua-parser-js، وهجوم event-stream، وغيرهم نفس الأسلوب: سكربت postinstall يُشغّل أثناء npm install، وينفذ كود عشوائي قبل أي مراجعة أو تدخل أمني.

حظر السكربتات عالميًا

في .npmrc:

ignore-scripts=true
Enter fullscreen mode Exit fullscreen mode

أو عبر CLI:

npm config set ignore-scripts true
Enter fullscreen mode Exit fullscreen mode

هذا يمنع جميع سكربتات دورة الحياة (preinstall، install، postinstall، prepare) من التنفيذ أثناء تثبيت الحزم.

التعامل مع الحزم التي تحتاج سكربتات

بعض الحزم (مثل bcrypt، sharp، sqlite3) تتطلب سكربتات للتجميع:

الخيار 1: تشغيل السكربتات انتقائيًا بعد التثبيت

npm ci --ignore-scripts
npm rebuild bcrypt sharp
Enter fullscreen mode Exit fullscreen mode

الخيار 2: قائمة سماح (npm 10+)

أنشئ ملف .scriptsrc.json:

{
  "allowScripts": {
    "bcrypt": true,
    "sharp": true
  }
}
Enter fullscreen mode Exit fullscreen mode

الخيار 3: استخدام الثنائيات المسبقة التجميع

تحقق إذا كانت تبعياتك توفر ثنائيات مسبقة التجميع لتقليل الحاجة للسكربتات.

تحذير PackageGate

ثغرة "PackageGate" (2026): يمكن للتبعيات المستندة إلى Git تنفيذ كود حتى مع تعطيل سكربتات دورة الحياة. إذا كنت تعتمد على Git URLs، احرص على استخدام تجزئات التزام محددة ومراجعة محتويات المستودع.

الطبقة 3: تثبيت الإصدارات الدقيقة

توقف عن استخدام نطاقات SemVer

الافتراضي في npm install --save هو:

{
  "axios": "^1.14.0"
}
Enter fullscreen mode Exit fullscreen mode

يفضل التثبيت الدقيق:

{
  "axios": "1.14.0"
}
Enter fullscreen mode Exit fullscreen mode

اضبط إعدادات npm افتراضيًا:

# .npmrc
save-exact=true
save-prefix=''
Enter fullscreen mode Exit fullscreen mode

استخدم التجاوزات (overrides) للتبعيات العابرة

تحكم في إصدارات التبعيات الانتقالية باستخدام:

{
  "overrides": {
    "axios": "1.14.0",
    "plain-crypto-js": "npm:empty-npm-package@1.0.0"
  }
}
Enter fullscreen mode Exit fullscreen mode

Yarn:

{
  "resolutions": {
    "axios": "1.14.0"
  }
}
Enter fullscreen mode Exit fullscreen mode

pnpm:

{
  "pnpm": {
    "overrides": {
      "axios": "1.14.0"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

المقايضة

ستحتاج لتحديث الإصدارات يدويًا. هذه حماية مقابل تحديثات تلقائية قد تُدخل إصدارات ضارة.

الطبقة 4: التحقق من مصدر الحزمة

ماذا يعني المصدر

مصدر npm يربط الحزمة بمصدرها وبيئة بنائها عبر توقيعات Sigstore. عند التفعيل، توفر الحزمة دليلاً على:

  • المستودع المصدر
  • نظام CI/CD
  • الـ commit الذي أطلق البناء

كيفية التحقق من المصدر

npm audit signatures
Enter fullscreen mode Exit fullscreen mode

الحزم المنشورة يدويًا غالبًا لا تملك مصدرًا. إصدارات Axios الخبيثة افتقرت لمصدر OIDC.

تمكين المصدر لحزمك الخاصة

في GitHub Actions:

- uses: actions/setup-node@v4
  with:
    node-version: 20
    registry-url: https://registry.npmjs.org
- run: npm publish --provenance
  env:
    NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
Enter fullscreen mode Exit fullscreen mode

وفي .npmrc:

provenance=true
Enter fullscreen mode Exit fullscreen mode

القيود

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

الطبقة 5: استخدام أدوات التحليل السلوكي

ما وراء فحص الثغرات الأمنية

الأدوات الكلاسيكية (npm audit, Snyk) تكتشف CVEs فقط. أدوات التحليل السلوكي تكشف السلوك الضار حتى لو لم يُبلّغ عنه بعد.

Socket.dev

Socket.dev يحلل سلوك الحزم أثناء التثبيت والتشغيل، مثل:

  • طلبات الشبكة أثناء التثبيت
  • الوصول لنظام الملفات خارج الدليل
  • تنفيذ أوامر Shell
  • جمع متغيرات البيئة

لقطة شاشة لتقارير Socket.dev توضح سلوك الحزمة

تكامل GitHub: يعلّق على Pull Requests عند ظهور سلوكيات مشبوهة.

# تثبيت Socket CLI
npm install -g @socketsecurity/cli

# فحص مشروعك
socket scan
Enter fullscreen mode Exit fullscreen mode

Snyk

Snyk لإدارة الثغرات الأمنية المعروفة.

# تثبيت Snyk CLI
npm install -g snyk

# اختبار مشروعك
snyk test
Enter fullscreen mode Exit fullscreen mode

لقطة شاشة لتقارير Snyk

نهج متعدد الطبقات

شغّل جميع الأدوات في CI/CD:

# الأساس
npm audit

# التحليل السلوكي
socket scan

# إدارة الثغرات الأمنية
snyk test
Enter fullscreen mode Exit fullscreen mode

أي نتيجة حرجة يجب أن توقف البناء.

الطبقة 6: تقليل سطح التبعية الخاص بك

السؤال الأعمق

كل تبعية قرار ثقة. مشروع Node.js المتوسط يحتوي على مئات التبعيات الانتقالية. قللها قدر الإمكان.

تدقيق شجرة التبعية

# عد إجمالي التبعيات
npm ls --all | wc -l

# تحقق من التكرارات
npm ls --all | sort | uniq -c | sort -rn | head -20
Enter fullscreen mode Exit fullscreen mode

اسأل لكل تبعية:

  • هل البديل الأصلي متوفر في Node.js؟
  • هل تضيف عشرات التبعيات الانتقالية؟
  • هل يمكن تضمينها مباشرة (vendor) في مشروعك؟

بدائل أصلية للحزم الشائعة

الحزمة البديل الأصلي متوفر منذ
axios, node-fetch, got fetch (عام) Node.js 18
uuid crypto.randomUUID() Node.js 19
dotenv --env-file Node.js 20.6
chalk util.styleText() Node.js 21.7
glob fs.glob() Node.js 22
path-to-regexp واجهة برمجة تطبيقات نمط URL الأصلية Node.js 23

لاختبار API تحديدًا

اختبار واجهة برمجة التطبيقات غالبًا يعتمد على عدة مكتبات (عميل HTTP، التحقق، Mock server، إلخ). كل واحدة تضيف سطح هجوم.

شرح بياني يوضح كيف يحل Apidog محل العديد من أدوات اختبار واجهة برمجة التطبيقات.

Apidog يوفر:

  • عميل HTTP مدمج (بدون تبعيات npm)
  • تحققات واختبارات مرئية
  • سيناريوهات اختبار آلية مع تكامل CI/CD
  • Mock server بدون مكتبات طرف ثالث
  • توثيق واجهة برمجة التطبيقات تلقائيًا

انقل سير عمل اختبار API إلى Apidog لتقليل التبعيات.

الطبقة 7: مراقبة الشبكة ووقت التشغيل

حظر النطاقات السيئة المعروفة

بعد أي هجوم، احجب النطاقات الخبيثة على مستوى الشبكة:

# أضف إلى /etc/hosts
echo "0.0.0.0 sfrclak.com" | sudo tee -a /etc/hosts
Enter fullscreen mode Exit fullscreen mode

في CI/CD، قيد الاتصالات الصادرة فقط على سجلات npm، Git، وجهات النشر.

استخدم StepSecurity Harden-Runner لـ CI/CD

يراقب Harden-Runner سير عمل GitHub Actions في الوقت الفعلي:

  • مراقبة الشبكة الصادرة
  • تتبع العمليات
  • مراقبة سلامة الملفات
  • تنبيه للسلوك غير الطبيعي
# GitHub Actions
- uses: step-security/harden-runner@v2
  with:
    egress-policy: audit  # أو 'block' للوضع الصارم
Enter fullscreen mode Exit fullscreen mode

مراقبة عمليات وقت التشغيل

على أجهزة التطوير، استخدم أدوات EDR لرصد العمليات الفرعية المشبوهة التي يولدها Node.js مثل osascript, cscript, python3 عند تثبيت npm.

تكوين .npmrc الموصى به

ملف .npmrc محسن أمنيًا:

# تثبيت الإصدارات الدقيقة
save-exact=true
save-prefix=

# تعطيل سكربتات دورة الحياة
ignore-scripts=true

# تمكين المصدر للنشر
provenance=true

# استخدام السجل الرسمي
registry=https://registry.npmjs.org/

# طلب المصادقة الثنائية للنشر
auth-type=web

# مستوى تدقيق العتبة
audit-level=moderate
Enter fullscreen mode Exit fullscreen mode

اجعله جزءًا من مستودعك ليستخدمه كل الفريق.

مثال على مسار أمان CI/CD

سير عمل GitHub Actions يفرض جميع الطبقات:

name: Secure Build
on: [push, pull_request]

jobs:
  security-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: step-security/harden-runner@v2
        with:
          egress-policy: audit

      - uses: actions/setup-node@v4
        with:
          node-version: 22

      # الطبقة 1+2: ملف قفل مجمد، بدون سكربتات
      - run: npm ci --ignore-scripts

      # الطبقة 3: التحقق من عدم وجود إصدارات غير متوقعة
      - run: npm ls --all > deps.txt

      # الطبقة 4: التحقق من المصدر
      - run: npm audit signatures

      # الطبقة 5: التحليل السلوكي
      - run: npx socket scan

      # الطبقة 5: فحص الثغرات الأمنية
      - run: npx snyk test

      # الطبقة 1: التدقيق الأساسي
      - run: npm audit --audit-level=moderate

      # إعادة بناء التبعيات الأصلية المسموح بها فقط
      - run: npm rebuild sharp bcrypt
Enter fullscreen mode Exit fullscreen mode

ماذا سيأتي بعد ذلك لأمان npm

المصدر الإلزامي للحزم الشائعة

npm تدرس فرض مصادقة المصدر للحزم ذات التنزيل العالي لمنع النشر اليدوي الخطر.

الموافقة على الإصدار من شخصين

قد تتطلب الحزم الشائعة تصديق مشرف ثانٍ عند النشر، بحيث لا يكون حساب واحد كافيًا للاختراق.

تحديد نطاق أذونات وقت التشغيل

Deno يقيّد الأذونات افتراضيًا. Node.js تستكشف نماذج أذونات مشابهة لتقييد وصول السكربتات.

تقارب مديري الحزم

نموذج العزل الصارم في pnpm (الحزم تصل فقط لتبعياتها المعلنة) يقلل سطح الهجوم. npm تتجه لاعتماد صرامة مشابهة.

الأسئلة الشائعة

ما هو هجوم سلسلة التوريد في npm؟

هجوم سلسلة التوريد في npm يستهدف تبعيات البرامج وليس تطبيقك مباشرة. المهاجم يخترق حسابات مشرفي الحزم أو يحقن كود خبيث في حزم شائعة، أو ينشر حزم "typosquat" بأسماء مشابهة. عند تثبيت أو تحديث التبعيات، قد يُنفذ الكود الخبيث على جهازك أو في CI/CD.

هل npm audit كافٍ للحماية من هجمات سلسلة التوريد؟

لا. npm audit يتحقق من CVEs فقط. هجمات صفر يوم مثل Axios لا تظهر في القاعدة عند حدوثها. استخدم أدوات تحليل سلوكي مثل Socket.dev بالإضافة إلى npm audit.

هل يجب أن أتوقف عن استخدام npm بالكامل؟

لا. npm يظل أكبر نظام بيئي للحزم، ومعظم الحزم آمنة. قلل التعرض بتثبيت الإصدارات الدقيقة، وفرض ملفات القفل، وحظر السكربتات، وتقليل التبعيات إلى الحد الأدنى.

كيف يساعد Apidog في تقليل مخاطر سلسلة توريد npm؟

يوفر Apidog عميل HTTP مدمج، مشغل اختبار، Mock server، ومولد توثيق لواجهة برمجة التطبيقات. هذا يلغي الحاجة لحزم npm مثل Axios، node-fetch، Jest، Express (للمحاكاة)، ويقلل سطح الهجوم في سير العمل.

ما هو مصدر الحزمة (Package provenance) في npm؟

مصدر الحزمة يستخدم Sigstore لربط الحزمة المشفرة بمستودعها وبيئة البناء. تحقق منه بـ npm audit signatures. الحزم المنشورة يدويًا عادة تفتقر للمصدر.

كم عدد حزم npm الخبيثة؟

في 2024، تم تحديد أكثر من 3000 حزمة npm خبيثة. في 2025، منعت Sonatype أكثر من 120,000 هجوم برمجيات خبيثة في ربع واحد عبر npm وPyPI وغيرهم. معظمها "typosquats" لكن حتى الحزم الشائعة معرضة.

ما هي ثغرة PackageGate الأمنية؟

مجموعة ثغرات "صفر يوم" ظهرت في 2026 تؤثر على npm وpnpm وvlt وBun. يمكن أن تسمح لتبعيات Git بتنفيذ كود حتى مع تعطيل سكربتات دورة الحياة. إذا كنت تستخدم Git URLs، استخدم تجزئات محددة ومراجعة دقيقة.

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

  • فرض ملفات القفل أساس الحماية، لكنه لا يحمي من التثبيت الأول أثناء الهجوم.
  • عطّل سكربتات ما بعد التثبيت عالميًا باستخدام ignore-scripts=true في .npmrc.
  • ثبّت الإصدارات الدقيقة عبر save-exact=true لمنع مفاجآت semver.
  • تحقق من مصدر الحزمة بـ npm audit signatures لاكتشاف التحميلات اليدوية.
  • أضف Socket.dev (تحليل سلوكي) فوق Snyk (ثغرات معروفة) وnpm audit (خط أساس).
  • قلل عدد التبعيات بالاعتماد على واجهات Node.js الأصلية وأنظمة مثل Apidog.
  • راقب خروج شبكة CI/CD باستخدام StepSecurity Harden-Runner.

كل تبعية قرار ثقة. كلما قللت التبعيات، صغر سطح الهجوم. طبق طبقات تحقق متعددة لمنع التسلل. ابنِ دفاعك بعمق.

Top comments (0)