زنجیره وابستگی npm یک ریسک امنیتی است — و توسعهدهندگان میتوانند این خطر را کاهش دهند

ابعاد مشکل
حمله به پکیج ua-parser-js در سال ۲۰۲۱ نشان داد که یک پکیج npm آلوده تا کجا میتواند نفوذ کند. این کتابخانه بیش از ۸ میلیون دانلود هفتگی داشت و به عنوان یک transitive dependency در پروژههای فیسبوک، اپل، آمازون و مایکروسافت استفاده میشد. مهاجمان حساب نگهدارنده پکیج را تصاحب کردند و نسخههای مخربی منتشر کردند که حاوی crypto miner و credential stealer بودند. این پکیج به مدت ۴ ساعت در دسترس بود تا اینکه npm آن را حذف کرد.
خرابکاری عمدی در پکیجهای colors.js و faker.js در سال ۲۰۲۲ توسط نگهدارنده آن، ماراک اسکوایرز، بیش از ۱۹۰۰۰ پکیج وابسته را تحت تأثیر قرار داد. در پشتدر XZ Utils در سال ۲۰۲۴، مهاجم دو سال صرف مهندسی اجتماعی صبورانه کرد تا تقریباً موفق شد کد خود را در توزیعهای اصلی لینوکس جا بزند. یک برنامه Node.js معمولی در محیط تولید بیش از ۱۰۰۰ transitive dependency دارد — کدی که تیم شما هرگز آن را بررسی نکرده است.
چگونه درخت وابستگیها به سطح حمله تبدیل میشوند
یک پروژه ساده create-react-app بیش از ۱۴۰۰ پکیج تولید میکند. از این تعداد، شاید ۲۰ تا ۳۰ تا را تیم شما بررسی کرده است. بقیه transitive dependency هستند که در پایپلین build و باندل نهایی اجرا میشوند. typosquatting هم یک بردار دیگر اضافه میکند — npm ماهانه حدود ۱۵۰۰۰ پکیج مخرب را مسدود میکند، اما همچنان انواع دیگری از آنها عبور میکنند.
ابزارهایی که ریسک را کاهش میدهند
Socket.dev به جای بررسی صرف CVE hashes، رفتار پکیج را تحلیل میکند (دسترسی جدید به شبکه، کد مبهم، اسکریپتهای نصب). این ابزار حملات زنجیره تأمین را که دیتابیسهای CVE عقب میافتند، کشف میکند. Snyk در سطح رایگان ریپازیتوریهای عمومی را پوشش میدهد. این ابزارها را در pull request checks ادغام کنید، نه فقط اسکنهای دورهای.
در CI به جای npm install از npm ci استفاده کنید. این دستور دقیقاً از lockfile نصب میکند و از بهروزرسانی هر چیزی خودداری میکند. وابستگیهای حیاتی را به نسخه دقیق pin کنید و برای مدیریت بهروزرسانیهای صریح به جای بهروزرسانی خودکار خاموش از Renovate Bot استفاده کنید.
SLSA Provenance و npm Attestations
npm در می ۲۰۲۳ قابلیت provenance attestations را اضافه کرد. پکیجهایی که با provenance منتشر میشوند، پکیج npm را به workflow GitHub Actions و commit مبدأ که آن را ساخته است متصل میکنند. با دستور npm audit signatures میتوانید این موارد را تأیید کنید. از ابتدای ۲۰۲۶ حدود ۸٪ از ۱۰٬۰۰۰ پکیج برتر npm با provenance منتشر میشوند.
نکات عملی
- این هفته Socket.dev یا Snyk را به عنوان PR gate در CI اضافه کنید.
- در پایپلاین CI به npm ci تغییر دهید و package-lock.json را commit کنید.
- وابستگیهای حیاتی را به نسخه دقیق pin کنید و برای مدیریت بهروزرسانی صریح از Renovate Bot استفاده کنید.
- روی وابستگیهای کلیدی دستور npm audit signatures را اجرا کنید.
- به همه اسکریپتهای بارگذاری شده از CDN در HTML خود SRI hashes اضافه کنید.
- سرمایه