گیتهاب اجرای خودکار اسکریپتهای نصب npm رو خاموش میکنه
خلاصهٔ کاملتر
گیتهاب قراره پیشفرضهای npm رو عوض کنه طوری که دستور install دیگه اسکریپتها رو بهصورت خودکار اجرا نکنه؛ قابلیتی که معمولاً پکیجهای مخرب مثل کرم بدنام Shai-Hulud ازش سوءاستفاده میکردن. به گفتهٔ Leo Balter که نگهدار این پروژهست، اسکریپتهای چرخهٔ عمر نصب بزرگترین سطح اجرای کد توی اکوسیستم npm هستن: هر بار که npm install میزنی، اسکریپتهای همهٔ وابستگیهای زنجیرهای اجرا میشن، پس یه پکیج آلوده در هر جای درخت وابستگی میتونه کد دلخواه رو روی دستگاه توسعهدهنده یا روی runnerهای CI اجرا کنه.
توی npm 12 که برای جولای برنامهریزی شده، سه پیشفرض امنیتمحور عوض میشه. اسکریپتهایی که برای preinstall، install یا postinstall تنظیم شدن دیگه اجرا نمیشن مگه اینکه با allow-scripts صریحاً اجازه داده بشه. فلگ allow-git که وابستگیها رو از URLهای راه دور میکشه، پیشفرض خاموش میشه و یه مسیر حمله رو میبنده که توش یه فایل .npmrc مخرب میتونست اجرای کد دلخواه به دست بیاره. در نهایت allow-remote هم پیشفرض none میشه و دانلود وابستگی از URLهای راه دور رو کامل مسدود میکنه.
هنوزم میشه با یه allowlist توی فایل package.json اجازهٔ اجرای اسکریپتها رو داد، و این اجازه بهصورت پیشفرض به نسخهٔ نصبشدهٔ پکیج پین میشه. نویسنده میگه اینها تغییرات شکننده هستن و Balter توصیه میکنه توسعهدهندهها برای هر پکیجی که الان نصب شده و به اسکریپت نیاز داره، اجازه رو فعال کنن تا فوراً در برابر اسکریپتهای جدید و غیرمنتظره محافظت بشن، و بعد یکییکی بررسی کنن و برای اونهایی که لازم ندارن اجازه رو لغو کنن.
بعضی پکیجها برای کار کردن به تأیید اسکریپت نیاز دارن؛ مثل ماژولهای native که موقع نصب کامپایل میشن، ابزارهای تست مثل Playwright و Puppeteer که باینریهاشون رو با postinstall میگیرن، و Electron که موتور مرورگر Chromium رو برای اپهای دسکتاپ چندسکویی بستهبندی میکنه. این قابلیتها از نسخهٔ npm 11.10.0 که فوریه اومد در دسترس بودن، ولی بهشکل فلگهای اختیاری، نه پیشفرض. همون نسخه min-release-age رو هم معرفی کرد که جلوی نصب نسخههایی از پکیج رو که تازهتر از یه تعداد روز مشخص هستن میگیره؛ یه محافظ در برابر پکیجهای مخرب تازهمنتشرشده.
این تغییرات همهٔ مشکلات امنیتی npm رو حل نمیکنه. به گفتهٔ یکی از توسعهدهندهها، حالا بدافزار میتونه از اسکریپت نصب به خود ماژول منتقل بشه که اون هم بالاخره اجرا میشه. یه نظر رایج دیگه اینه که بهتره از pnpm استفاده بشه که پیشفرضهای امنتری داره. ولی اجماع کلی اینه که این تغییرات امنیت npm رو بهتر میکنن و خیلی هم دیر شدن؛ توی pull request اومده که npm تنها مدیر پکیج بزرگیه که هنوز اسکریپتهای نصب وابستگی رو پیشفرض اجرا میکنه، در حالی که pnpm نسخهٔ ۱۰ به بالا، Yarn Berry، Bun و Deno همگی این کارو مسدود کردن.
نکات کلیدی:
- از npm 12 (جولای) دستور install دیگه اسکریپتهای نصب رو خودکار اجرا نمیکنه
- این همون سطح حملهایه که کرم Shai-Hulud ازش سوءاستفاده میکرد
- سه پیشفرض جدید: allow-scripts، allow-git خاموش، و allow-remote روی none
- پکیجهایی مثل Playwright، Puppeteer و Electron به اجازهٔ صریح نیاز دارن
- این قابلیتها از npm 11.10.0 بهصورت اختیاری بودن و حالا پیشفرض میشن




