npm میخواد اسکریپتهای نصب رو پیشفرض مسدود کنه
خلاصهٔ کاملتر
npm تنها مدیر بستهی بزرگیه که هنوز اسکریپتهای نصب وابستگیها رو بهصورت پیشفرض اجرا میکنه. pnpm نسخه ۱۰ به بعد، Yarn Berry، Bun، و Deno همه این رفتار رو مسدود کردن. حالا یک RFC (پیشنهاد رسمی تغییر) با شماره ۸۶۸ میخواد این خلأ امنیتی رو در npm هم برطرف کنه.
چرا الان؟ چند حملهی جدی این موضوع رو فوری کرد. کِرم Shai-Hulud در سپتامبر ۲۰۲۵ از طریق یک postinstall مخرب، توکنهای نگهداران بستهها رو دزدید و بیش از ۵۰۰ بسته npm رو آلوده کرد. در همون ماه، بستههای معروفی مثل chalk و debug هم از طریق اکانتهای هکشدهی نگهدارانشون، کدی برای خالی کردن کیفپولهای Web3 تزریق کردن. در مارس ۲۰۲۶ هم بستهی محبوب Axios از این طریق آلوده شد — جالب اینجاست که بستهی مخرب حتی در کد Axios ایمپورت نشده بود و فقط از طریق postinstall اجرا میشد.
ایدهی اصلی RFC اینه که یه فیلد جدید به اسم allowScripts به package.json اضافه بشه تا توسعهدهنده صراحتاً مشخص کنه کدوم بستهها مجاز به اجرای اسکریپت نصب هستن. برای مدیریت این لیست هم دو دستور جدید معرفی شده:
- npm approve-scripts : بسته رو به لیست مجاز اضافه میکنه (بهصورت پیشفرض با پین کردن نسخه)
- npm deny-scripts : بسته رو بهصورت صریح مسدود میکنه
مثلاً اگه بخوای فقط نسخهی مشخصی از esbuild مجاز باشه، میشه نوشت: "allowScripts": { "esbuild@0.20.0": true }. با این کار اگه نسخه به ۰.۲۰.۱ ارتقا پیدا کنه، بسته دوباره نیاز به تأیید داره.
فاز اول پیادهسازی که الان در حال توسعهست، هنوز اسکریپتها رو مسدود نمیکنه. بعد از هر npm install، یه هشدار گروهبندیشده نشون میده که کدوم بستهها اسکریپتهای تأییدنشده دارن. فاز دوم خواهد بود که اسکریپتها واقعاً مسدود بشن.
البته بعضی بستهها — مثل canvas، sharp، و sqlite3 — هنوز برای ساخت افزونههای native به اسکریپت نصب نیاز دارن، و این RFC این موارد رو حذف نمیکنه، فقط اجرایشون رو opt-in میکنه. یه نگرانی که در بحثها مطرح شد اینه که اگه اسکریپت نصب یه بستهی خارجی رو دانلود کنه (مثل یه فایل اجرایی از اینترنت)، پین کردن نسخه بهتنهایی کافی نیست — اما نویسندهی RFC استدلال میکنه که این مشکل جداست و باید در RFC مستقلی بررسی بشه.
نکات کلیدی:
- npm تنها مدیر بستهی بزرگه که هنوز اسکریپتهای نصب رو بهصورت پیشفرض اجرا میکنه
- این RFC پاسخی به حملات واقعی اخیر (۲۰۲۵–۲۰۲۶) از طریق postinstall مخربه
- فیلد allowScripts در package.json جایگزین رفتار پیشفرض میشه
- دستورهای npm approve-scripts و npm deny-scripts مدیریت لیست مجاز رو ساده میکنن
- فاز اول فقط هشدار میده؛ مسدودسازی واقعی در فاز بعدی خواهد بود
- بستههای native مثل sharp و sqlite3 همچنان پشتیبانی میشن




