بررسی باگ امنیتی در دینو ۲.۶؛ وقتی محدودیت زمانی وابستگیها کار نمیکند
قابلیت جدید دینو ۲.۶ برای کنترل سن وابستگیهای نرمافزاری، در مواجهه با بازههای زمانی ماهانه و سالانه دچار خطا میشود و امنیت زنجیره تأمین را به خطر میاندازد.
امنیت در زنجیره تأمین نرمافزار به یکی از دغدغههای اصلی توسعهدهندگان تبدیل شده است. یکی از راهکارهای مقابله با حملات تزریق کد در نسخههای جدید، ایجاد فاصله زمانی میان انتشار یک نسخه و استفاده از آن در پروژه است. دینو در نسخه ۲.۶ قابلیتی به نام min-dep-age معرفی کرد تا از نصب بستههایی که هنوز از زمان انتشار آنها مدت مشخصی نگذشته است، جلوگیری کند. اما آزمایشهای اخیر نشان میدهد این ابزار در محاسبات زمانی خود دچار ایرادات جدی است.
چرا سن وابستگیها در امنیت اهمیت دارد؟
بسیاری از حملات بدافزاری به مخازن نرمافزاری مانند npm، در ساعات اولیه انتشار یک نسخه جدید رخ میدهند. هکرها با دسترسی به حساب کاربری توسعهدهندگان محبوب، نسخهای مخرب منتشر میکنند. اگر ابزاری داشته باشید که اجازه ندهد بستههای با سن کمتر از ۳۰ روز نصب شوند، شانس شناسایی و حذف آن بدافزار توسط جامعه برنامهنویسان پیش از ورود به سیستم شما افزایش مییابد. دینو با درک این نیاز، پرچم (Flag) جدیدی را برای مدیریت این موضوع اضافه کرد.
آزمایش عملی روی ۲۰ بسته محبوب npm
برای بررسی دقت این قابلیت، ۲۰ بسته پرکاربرد در اکوسیستم جاوا اسکریپت مورد آزمایش قرار گرفتند. هدف این بود که ببینیم آیا دینو واقعاً مانع نصب نسخههای بسیار جدید میشود یا خیر. در تنظیمات آزمایش، حداقل سن وابستگی روی ۳۰ روز (۳۰d) قرار گرفت. نتیجه در نگاه اول امیدوارکننده بود. دینو توانست ۱۲ مورد از این ۲۰ بسته را متوقف کند. برای مثال، در مورد ابزار تست vitest، دینو اجازه نصب آخرین نسخه را نداد و به طور خودکار به یک نسخه پایدار قدیمیتر بازگشت که بیش از یک ماه از انتشار آن میگذشت.
این رفتار برای تیمهای مهندسی که به دنبال ثبات هستند، یک امتیاز بزرگ محسوب میشود. تصور کنید در یک شرکت ایرانی مشغول توسعه یک سامانه مالی هستید. استفاده از آخرین نسخه یک کتابخانه نمودارگیری که تنها ۲ ساعت از انتشار آن میگذشت، میتواند ریسکهای پیشبینی نشدهای داشته باشد. با این قابلیت، خیالتان راحت است که سیستم فقط از نسخههای امتحانپسداده استفاده میکند.
باگی که محاسبات زمانی را بیاثر میکند
مشکل اصلی زمانی آشکار شد که واحد زمان از روز به ماه یا سال تغییر کرد. طبق مستندات، کاربر باید بتواند بازههایی مثل ۱ ماه (۱m) یا ۱ سال (۱y) را تعریف کند. با این حال، در آزمایشهای فنی مشخص شد که اگر مقدار ورودی بر حسب ماه یا سال باشد، دینو بدون هیچ هشداری این محدودیت را نادیده میگیرد.
در واقع، وقتی پارامتر را روی ۱ سال تنظیم میکنید، دینو به جای اینکه فقط نسخههای قدیمیتر از یک سال را بپذیرد، آخرین نسخه موجود را نصب میکند. این یعنی ابزار امنیتی شما عملاً غیرفعال شده است، بدون اینکه پیامی مبنی بر خطا در ساختار دستور دریافت کنید. این نوع باگهای خاموش خطرناکترین نوع ایرادات در ابزارهای زیرساختی هستند، زیرا کاربر تصور میکند تحت محافظت است.
پیامدهای نادیده گرفتن بازههای طولانی
این نقص فنی نشان میدهد که پیادهسازی فعلی در نسخه ۲.۶ دینو، تنها بر پایه واحد روز (days) کار میکند. برای توسعهدهندگانی که در پروژههای حساس فعالیت میکنند، تکیه بر این قابلیت برای بازههای طولانیتر از چند هفته، ریسک امنیتی به همراه دارد. انتظار میرود در بهروزرسانیهای بعدی، تیم توسعه دینو منطق محاسبات زمانی را اصلاح کند تا واحدهای بزرگتر نیز به درستی پردازش شوند.
در حال حاضر، بهترین استراتژی برای کاربران دینو این است که تنها از واحد روز برای تعیین سن وابستگیها استفاده کنند. مثلاً به جای نوشتن ۱ ماه، از عدد ۳۰ روز استفاده کنید تا مطمئن شوید فیلتر امنیتی به درستی اعمال میشود.
نقش هوش مصنوعی در مدیریت وابستگیها
مدیریت دستی این محدودیتها در پروژههای بزرگ با صدها وابستگی، فرسایشی است. هوش مصنوعی نهال با ارائه دستیارهای هوشمند، میتواند به تیمهای توسعه کمک کند تا الگوهای بهروزرسانی خود را تحلیل کنند. ایجنتهای هوشمند میتوانند به جای یک عدد ثابت، بر اساس تاریخچه امنیت هر بسته، زمان قرنطینه مناسبی را پیشنهاد دهند. در بستر فارسی و تومانی نهال، دسترسی به این ابزارهای تحلیلی برای شرکتهای ایرانی سادهتر شده است تا بدون درگیری با پیچیدگیهای فنی، امنیت کد خود را ارتقا دهند.
استفاده از تکنولوژیهای جدید همیشه با چالشهای اولیه همراه است. شناخت دقیق محدودیتهای ابزارهایی مثل دینو، اولین قدم برای ساخت یک زیرساخت نرمافزاری مستحکم است.
منبع: dev.to