انتشار امن پکیج npm در ۲۰۲۶
خلاصهٔ کاملتر
تو مقالهی اویل مارشنز اومده که دیگه لازم نیست کسی مخصوصاً پکیج تو رو هدف بگیره؛ حملههای زنجیره تأمین npm نیمهخودکار شدن و مثل کرم از یه پکیج به پکیج بعدی میپرن. تو کمپین Shai-Hulud v2 بیش از ۵۰۰ پکیج تو یه روز آلوده شد و OpenAI هم از مسیر یه پکیج آلودهی TanStack ضربه خورد. نویسنده میگه با پیشرفت LLMها هزینهی این حملهها باز هم پایینتر میاد، پس هدف نباید محافظت صددرصدی باشه، باید هزینهی حمله رو بالا برد.
به گفتهٔ نویسنده چهار منبع خطر اصلی موقع انتشار وجود داره: پکیجهای داخل node_modules، اکشنهای شخصثالث تو .github/workflows، ابزارهای روی لپتاپ خودت، و اشتباههای امنیتی تو ورکفلوهای پیچیدهی CI. تو ماجرای tj-actions/changed-files مهاجم تگهای قدیمی رو دوباره منتشر کرد، و تیم Nx مشکل pull_request_target رو تو برنچ اصلی درست کرده بود ولی مهاجم روی یه برنچ قدیمی PR زد — برای همین نویسنده میگه بعد از رفع باگ امنیتی، برنچهای قدیمی رو پاک کنید.
npm Provenance بیشتر از کاربر محافظت میکنه تا از خودت: CI پکیج رو امضا میکنه و مشخص میشه از کدوم ورکفلو و کدوم کامیت ساخته شده. ولی نویسنده تأکید میکنه این فقط جواب میده که پکیج از خط لولهی درست اومده، نه اینکه خط لوله سالم بوده. تیکهی گمشده Staged Publishingه: CI بهجای npm publish از npm stage publish استفاده میکنه و انتشار تا وقتی خودت با کلید سختافزاری تأییدش نکنی نهایی نمیشه.
- name: Publish npm package
run: npm stage publish --ignore-scriptsبرای بستن بقیهی مسیرها، نویسنده پیشنهاد میکنه تو تنظیمات پکیج تو npmjs.com یه Trusted Publisher بسازی که به همون ریپو و فایل publish.yaml گره خورده باشه، فقط npm stage publish رو مجاز کنی و انتشار با توکن رو کامل ببندی. کنارش احراز هویت دومرحلهای (2FA) برای کل سازمان، اجازهی ساخت تگ فقط برای ادمینها، و پینکردن اکشنهای شخصثالث با هش کامیت بهجای تگ — چون تگی مثل @v7 تغییرناپذیر نیست و مهاجم میتونه جابهجاش کنه.
دو تا تنظیم دیگه هم کمک میکنه: با min-release-age سه روز صبر کنی تا نسخههای تازهی وابستگیها نصب بشن (بیشتر پکیجهای آلوده همون ساعتهای اول لو میرن)، و مهاجرت به npm 12، pnpm 10، yarn 4.14 یا bun که اسکریپتهای postinstall وابستگیها رو موقع نصب اجرا نمیکنن. نویسنده هم هشدار میده که از نمایش امنیت پرهیز کنید و ابزار رو فقط برای یه خطر واقعی اضافه کنید.
نکات کلیدی:
- حملههای زنجیره تأمین npm خودکار شدن؛ Shai-Hulud v2 تو یه روز بیش از ۵۰۰ پکیج رو آلوده کرد.
- Trusted Publisher رو فعال و انتشار با توکن رو غیرفعال کن.
- با npm stage publish انتشار رو مرحلهبندی کن و دستی با کلید سختافزاری تأیید کن.
- اکشنهای CI رو با هش کامیت پین کن و ورکفلوها رو با zizmor یا CodeQL لینت کن.
- نصب نسخههای تازه رو چند روز عقب بنداز و اجرای postinstall وابستگیها رو ببند.




