12
در واکنش به موج اخیر حملات زنجیره تأمین علیه اکوسیستم NPM، شرکت گیتهاب اعلام کرد که در npm 12 مکانیزم اجرای اسکریپتهای وابستگیها بهطور اساسی تغییر میکند؛ بهطوری که این اسکریپتها دیگر هنگام اجرای
install بهصورت پیشفرض اجرا نخواهند شد. این تغییر کلیدی در npm 12 با هدف مسدودسازی مسیرهای سوءاستفاده از اجرای خودکار اسکریپتها و کاهش ریسک آلودهسازی محیطهای توسعه به بدافزار و کدهای مخرب اعمال شده است.
دلیل اصلی تغییر سیاست امنیتی npm 12
در ماههای اخیر، چندین رخداد امنیتی مهم در اکوسیستم NPM گزارش شده است که عمدتاً به گروه TeamPCP و بدافزار Shai-Hulud نسبت داده میشوند. در این حملات، مهاجمان از اجرای خودکار اسکریپتهای وابستگیها هنگام اجرای npm install سوءاستفاده کرده و از طریق این مسیر موفق شدند تعداد زیادی از توسعهدهندگان را به بدافزار آلوده کنند؛ مسئلهای که بهعنوان یکی از دلایل اصلی تغییرات امنیتی این اکوسیستم مطرح شده است. طبق توضیحات شرکت گیتهاب، در نسخه npm 12 که انتظار میرود در ماه جولای منتشر شود، اجرای اسکریپتها بهصورت پیشفرض غیرفعال خواهد شد. بهعبارت دقیقتر، دستور npm install دیگر اسکریپتهای preinstall، install و postinstall مربوط به وابستگیها را اجرا نمیکند، مگر اینکه این اسکریپتها بهصورت صریح و مشخص در پروژه مجاز شده باشند. در نتیجه، مدل اعتماد به اجرای اسکریپتها از حالت اجرای خودکار به یک مدل مبتنی بر تأیید صریح و کنترلشده تغییر میکند.تأثیر تغییرات بر node-gyp و فایلهای binding.gyp
این تغییر تنها به اسکریپتهای نصب محدود نمیشود و بیلدهای سطح سیستمی مبتنی بر node-gyp را نیز تحت تأثیر قرار میدهد؛ از جمله پکیجهایی که دارای فایل binding.gyp هستند اما برای آنها اسکریپت نصب بهصورت صریح و مشخص تعریف نشده است. همچنین اسکریپتهای prepare در وابستگیهای مبتنی بر گیت (git)، فایل (file) و لینک (link) نیز مشمول این محدودیت خواهند شد. نکته مهم اینجاست که در حملات اخیر موسوم به Shai-Hulud Miasma، از یک فایل binding.gyp دستکاریشده برای اجرای کد مخرب استفاده شده بود؛ مسئلهای که دلیل اصلی طراحی npm 12 برای مسدودسازی چنین مسیرهای سوءاستفادهای را روشن میکند.روش بررسی تأثیر تغییرات روی پروژهها
توسعهدهندگان برای ارزیابی تأثیر تغییرات آینده بر پروژههای خود میتوانند دستور زیر را اجرا کنند:npm approve-scripts --allow-scripts-pending
این دستور مشخص میکند کدام پکیجها دارای اسکریپتهای اجرایی هستند. در ادامه، توسعهدهنده میتواند پکیجهای مورد اعتماد را تأیید کرده و سایر موارد را مسدود کند. نتیجه این فرآیند بهصورت یک لیست مجاز (Allowlist) در فایل package.json ذخیره میشود.
پس از ثبت این تغییر در مخزن (کامیت)، کاربرانی که از نسخه 11.16.0 یا بالاتر NPM استفاده میکنند، در صورت اجرای اسکریپتها در جریان نصب، هشدارهای امنیتی دریافت خواهند کرد؛ قابلیتی که فرآیند ارتقا به npm 12 را شفافتر و قابل پیشبینیتر میکند.
محدودیت جدید npm 12 برای وابستگیهای گیت و URLهای راه دور
گیتهاب اعلام کرده است که وابستگیهای مبتنی بر گیت، چه بهصورت مستقیم و چه غیرمستقیم، دیگر در زمان اجرای npm install بهطور پیشفرض پردازش و دریافت (Resolve)نخواهند شد، مگر اینکه بهصورت صریح در پروژه مجاز شده باشند. این تغییر در واقع یک مسیر بالقوه برای اجرای کد را مسدود میکند؛ مسیری که در آن فایل .npmrc موجود در یک وابستگی مبتنی بر گیت میتوانست تنظیمات اجرایی گیت را تغییر دهد و حتی در شرایطی که گزینه –ignore-scripts فعال بود نیز منجر به بازنویسی (Override) فایل اجرایی گیت و در نهایت اجرای کد شود. بهطور مشابه، از این پس در npm 12 وابستگیهایی که از URLهای راه دور دریافت میشوند نیز بهصورت پیشفرض پردازش و دریافت نخواهند شد. این محدودیت شامل پکیجهای فشرده HTTPS Tarball، چه بهصورت مستقیم و چه غیرمستقیم میشود. با این حال، توسعهدهندگان در صورت نیاز میتوانند با استفاده از فلگ –allow-remote این نوع وابستگیها را بهطور صریح فعال کنند؛ قابلیتی که از نسخه 11.15.0 در دسترس قرار گرفته است.توصیه گیتهاب برای آمادهسازی توسعهدهندگان
گیتهاب برای آمادهسازی جهت ارتقا به npm 12 یک فرآیند مرحلهای پیشنهاد میدهد:- ابتدا به نسخه 11.16.0 یا بالاتر NPM ارتقا دهید.
- سپس نصب معمول پروژه را اجرا کنید و هشدارهای نمایشدادهشده را بررسی نمایید.
- در ادامه از دستور npm approve-scripts –allow-scripts-pending استفاده کنید. با این دستور، پکیجهای دارای اسکریپت شناسایی میشوند.
- فقط پکیجهای مورد اعتماد را تأیید (Approve) کرده و سایر موارد را مسدود کنید.
- در نهایت، فایل بهروزرسانیشده json را در مخزن ثبت (کامیت) کنید.