هایمدال: قرنطینهٔ چندروزه برای وابستگیهای کامپوزر
خلاصهٔ کاملتر
بیشتر ریلیزهای مخربِ کامپوزر ظرف یکی دو روز از انتشار گزارش و حذف میشن، و هایمدال — پلاگینی از Encore Digital Group — از همین واقعیت استفاده میکنه: به پروژهات میگه صبر کنه. یه تعداد روز تعیین میکنی و پلاگین اجازه نمیده هیچ نسخهای جوونتر از اون نصب بشه. اسمش هم از نگهبان اساطیر نورس گرفته شده که پل ورودی اسگارد رو نگهبانی میکرد؛ اینجا اون پل، مسیر بین Packagist و پوشهٔ vendor/ توئه.
تنظیماتش زیر کلید extra.heimdall تو composer.json میشینه. کلید minimum_age تعداد روز رو میگیره و با trusted میتونی برای وندورها یا پکیجهای مشخص استثنا بسازی — چون یه قانون یکدست روی همهٔ وابستگیها بالاخره اذیتت میکنه: هم پکیجهای خودت رو یه هفته معطل میکنه، هم همون وصلهٔ امنیتیای که امروز لازم داری:
{
"extra": {
"heimdall": {
"minimum_age": 7,
"trusted": { "vendors": ["encoredigitalgroup"], "packages": ["acme/widgets"] }
}
}
}هر چیزی که با یه وندور مورد اعتماد جور دربیاد یا تو trusted.packages باشه از بررسی سن رد میشه و بقیه باید صبر کنن. هایمدال کارش رو روی رویداد PluginEvents::PRE_POOL_CREATE انجام میده، یعنی قبل از اینکه حلکنندهٔ وابستگیها شروع کنه: نسخههای زیادیتازه از استخر کاندیداها حذف میشن و حلکننده اصلاً اونها رو نمیبینه، پس نتیجه یه نصب عادیه نه خطایی بعد از واقعه. برای نادیدهگرفتن موقتی سیاست هم composer install --no-plugins کافیه. نیازمندیها: PHP 8.4 به بالا و Composer 2.0 به بعد.
نویسنده این رویکرد رو با سیاستهای خود کامپوزر مقایسه میکنه: کامپوزر ۲.۱۰ یه بلوک policy برای هشدارهای امنیتی، پکیجهای رهاشده و نسخههای فلگشده بهعنوان بدافزار اضافه کرد و Packagist هم تشخیص بدافزار Aikido رو وصل کرد و جلوی بازنویسی بیسروصدای نسخههای پایدار با re-tag رو گرفت. ولی همهٔ اینها به این وابستهان که اول یه نفر بفهمه چیزی خرابه؛ هایمدال به هیچکدوم نیاز نداره و فقط تاریخ انتشار رو میبینه.
خودِ کامپوزر هم قراره همین کارو بکنه: مستندات پیکربندی نام minimum-release-age رو رزرو کرده و PR شمارهٔ ۱۲۶۹۲ از ویکتور یوپشوباکا یه سیاست cooldown دقیقاً برای همین اضافه میکنه که فعلاً برای کامپوزر ۲.۱۱ نشونهگذاری شده. به گفتهٔ نویسنده، هایمدال زودتر به این نقطه میرسوندت و اگه روی آخرین نسخهٔ کامپوزر نیستی هم از ۲.۰ به بعد کار میکنه.
نکات کلیدی:
- سیاست حداقل سن نسخه، بدون نیاز به advisory یا فلگ بدافزار — فقط بر اساس تاریخ انتشار
- تنظیم با minimum_age زیر extra.heimdall و استثنا با trusted.vendors و trusted.packages
- فیلتر روی PRE_POOL_CREATE انجام میشه، پس حلکننده نسخههای تازه رو اصلاً نمیبینه
- نیازمند PHP 8.4+ و Composer 2.0+؛ خاموشکردن موقتی با --no-plugins
- کامپوزر ۲.۱۱ قراره سیاست مشابهی به اسم minimum-release-age داشته باشه




