DevShield أداة مستقلة للمطورين من Anankelis لفحص تثبيت تبعيات npm وpip. وهي مكملة لإضافة متصفح Proxia؛ ولا تحتاج إليها لاستخدام Proxia.
i
DevShield هو نقطة التحقق أداة: لا يحمي إلا عمليات التثبيت التي تمررها عبره. أما أمر
npm ci يُشغّل بجانبه فلا يراه. تعزّز أمان CI ومسار العمل المحلي المعتمد — وليس «ثبّته لتصبح آمنًا في كل مكان».
التثبيت
احصل على DevShield ودليله.
تواصل مع ANANKELIS أو مسؤول النظام للحصول على الحزمة المناسبة لبيئتك ودليل تثبيتها.
يشغّل DevShield أمرك ويطبّق بوابات التحقق التي فعّلتها، ومع
--audit-log) يكتب سجل JSONL محليًا. كل بوابة تعمل افتراضيًا بوضع
warn (غير إتلافي)؛ وترفعها إلى block
أو fail حين تريد تعزيز الحماية.
كل منها مستقلة وغير إتلافية افتراضيًا. ومعًا تغطي أكثر مسارات هجمات التثبيت شيوعًا.
// 1 · التنفيذ
برامج دورة الحياة
--scripts-mode warn|block|fail
block يعطّل برامج التثبيت النصية في npm (يضيف
--ignore-scripts); fail يرفض (الخروج 21) قبل إنشاء العملية. ويتحقق أيضًا من npx / npm exec /
pnpm dlx بوصفه تنفيذًا لشفرة عشوائية. pip: تحذير فقط.
الطبقة التي توقف حمولات من نمط Shai-Hulud / Axios.
// 2 · السلامة
حالة ملف القفل
--preflight-lockfile [--lockfile-mode warn|fail]
ينبّه إلى ملف قفل npm مفقود أو دون تجزئات (أو يرفضه، الخروج 22)، أو إلى أمر يعدّل
ملف القفل (npm install) بدلًا من احترامه (npm ci). هذا تحقق من الحالة، لا كشف للتلاعب — إذ يتحقق npm بالفعل من التجزئات. pip: أفضل جهد، وتحذير فقط.
// 3 · الأسرار
فحص أولي للأسرار
--preflight-secrets [--preflight-mode warn|fail]
يبلغ عن متغيرات البيئة والملفات التي تحمل أسرارًا (.env،
.npmrc، .pypirc…) قبل تشغيل التثبيت —
دون طباعة القيم مطلقًا. fail ← خروج 20.
// 4 · الشبكة
وكيل للخروج الشبكي
--egress-proxy [--egress-mode warn|enforce]
وكيل محلي (127.0.0.1) تمر عبره عملية التثبيت. enforce
يمنع (403) أي اتصال بمضيف خارج قائمة السماح. دون اعتراض MITM: المنع حسب المضيف، لا حسب المحتوى مطلقًا.
warn يسجل كل شيء؛ وفشل الربط في وضع enforce يؤدي إلى الخروج 23 (الرفض عند الفشل).
الأوضاع · scripts-mode
الوضع
الأثر
DEVSHIELD_MODE
warnافتراضي
يعمل دون تغيير؛ ويسجل حدث lifecycle_scripts .
تدقيق فقط
block
يعطّل البرامج النصية لـnpm (يضيف --ignore-scripts + npm_config_ignore_scripts). pip / npx: تحذير فقط.
enforce
fail
يخرج 21 قبل إنشاء العملية إذا كانت البرامج النصية ستُشغّل. الأمر غير المعروف ← مرفوض (الرفض عند الفشل).
enforce
!
تنبيه حول التغطية:block جرى التحقق من تعطيل البرامج النصية في npm. يتجاهل yarn Berry (v2+) npm_config_* ولا يحترم --ignore-scripts؛ تحقق قبل الاعتماد عليه لـpnpm/yarn.
رموز الخروج
رمز لكل رفض — قابل للاستخدام في برامج CI.
الرمز
المعنى
0
شُغّلت العملية الفرعية؛ ولم ترفض أي بوابة.
رمز العملية الفرعية
يُمرر من الأمر المغلّف.
20
--preflight-mode fail: اكتُشف خطر أسرار.
21
--scripts-mode fail: كانت برامج دورة الحياة ستُشغّل.
22
--lockfile-mode fail: خطر في حالة ملف القفل.
23
--egress-mode enforce: تعذّر بدء الوكيل (الرفض عند الفشل).
فشل كتابة سجل التدقيق (125) · فشل تنفيذ الأمر (127).
الاعتماد · CI أولًا
نقطة الارتكاز الأعلى قيمة.
هناك تقع هجمات سلسلة التوريد فعلًا، وهو موقع مركزي يستحيل نسيانه. بدّل سطرًا واحدًا واجعل البناء يرفض التنفيذ عند وجود خطر:
# .github/workflows/ci.yml — بناء مُحصّن
- run: |
devshield run --profile npm \
--scripts-mode fail \
--preflight-lockfile --lockfile-mode fail \
--preflight-secrets --preflight-mode fail \
--egress-proxy --egress-mode enforce \
--audit-log devshield-audit.jsonl \
-- npm ci
- run: devshield audit read --audit-log devshield-audit.jsonl # السجل في سجل البناء
نقاط ارتكاز أخرى: أحد أسماء الصدفة البديلة
(alias npm='devshield run … -- npm') للاستخدام المحلي الشفاف؛ وهدف
Makefile / just مشترك للفريق؛ و حاوية تطويرالخاصة بـ
postCreateCommand.
سجل التدقيق
سجل JSONL محلي قابل للقراءة.
devshield audit read --audit-log <file> # ملخص لكل حدثdevshield audit trace --audit-log <file> --context-id <id> # أمر واحد وخروجه الشبكي
الأحداث: command_run، lifecycle_scripts،
secret_preflight، lockfile_preflight،
egress_observation. كل شيء محلي؛ ولا يُنقل أي شيء.
صراحة · ما ليس DevShield
احتواء، لا عصا سحرية.
// النطاق
عمليات التثبيت الممررة فقط
لا اعتراض شامل على مستوى النظام. أمر npm ci مباشر لا يُرى. يقترب اسم الصدفة البديل من ذلك، لكنه اختياري ويمكن تجاوزه.
// الطبيعة
احتواء، لا تحقق من السلامة
--scripts-mode يوقف التنفيذ والتسريب؛ ولن يخبرك أن حزمة استُبدلت. يتحقق npm من السلامة عند التثبيت بالفعل.
// الشبكة
المضيف، لا المحتوى
يمنع الوكيل حسب المضيف:المنفذ، دون MITM. لا يستطيع التمييز بين تنزيل و publish على مضيف مدرج في قائمة السماح. github.com يبقى مسموحًا افتراضيًا.
// الإتلاف
لا حماية لنظام الملفات
أي postinstall يمحو الملفات لا يُوقف إلا إذا عُطلت البرامج النصية (block/fail). ولا يفيد التحكم الشبكي هنا.
استخدم DevShield من أجل تعزيز أمان CI ومسار العمل المحلي المعتمد، مع تثبيت ملف القفل والتحقق من منشأ الحزم — وليس بوصفه «ثبّته لتصبح آمنًا في كل مكان».