GuardDog 3.0؛ موتور امتیازدهی ریسک تازه برای شکار پکیجهای مخرب
خلاصهٔ کاملتر
به گفتهٔ تیم امنیت Datadog، ابزار متنباز GuardDog که از ۲۰۲۲ برای شناسایی پکیجهای مخرب PyPI و بعد npm ساخته شده، حالا به نسخهٔ ۳.۰ رسیده با تغییرهای اساسی. طبق مقاله، بزرگترین تغییرها تو موتور اسکن، سیستم امتیازدهی ریسک و ایزولهسازیِ خود فرایند اسکنه.
اولین تغییر، کوچ از Semgrep به YARAست. نویسنده میگه Semgrep برای ساخت دیتکشنهای دقیق SAST عالیه، ولی برای اسکن بدافزار در مقیاس بالا چند تا مشکل داشت: روی فایلهای بزرگ حافظهٔ زیادی مصرف میکرد، روی پکیجهای پرفایل کند بود (چون برای هر اسکن یه پروسهٔ جدید میساخت) و قوانینشون بیشازحد خاص بودن و روی نمونههای مشخص overfit میشدن. برای همین قوانین رو به YARA منتقل کردن که با کتابخانهٔ کارآمد yara-python اجرا میشه.
ولی به گفتهٔ نویسنده، موتور قوانین فقط بخشی از مشکل بود. GuardDog 2.0 برای هر تطبیقِ قانون یه finding نشون میداد، بدون اولویتبندی، همبستگی یا اطمینان از اینکه پکیج واقعاً مخربه. مشکل اینجاست که قوانین GuardDog heuristic هستن، یعنی سیگنالهای ضعیف، نه اثبات قطعیِ بدخواهی.
برای طراحی موتور ریسک نسخهٔ ۳، تیم یه قدم عقب رفت و به آناتومیِ یه پکیج مخرب فکر کرد: متادیتای غیرعادی (اسمی شبیه یه پکیج محبوب یا نسخههای خیلی بالا برای dependency confusion)، بردار اجرا (اسکریپتهای pre/post-install)، دسترسی به اعتبارنامهها، خارجکردن داده (exfiltration) و ماندگاری. نتیجه این بود که پکیجهای مخرب معمولاً ویژگیهای شناساییشونده رو در چند مرحله از چرخهٔ حمله نشون میدن.
پس GuardDog 3.0 دو نوع قانون YARA اجرا میکنه: قوانینی که قابلیتها رو شناسایی میکنن (مثل تماس شبکهای خروجی یا دسترسی به کلیپبورد؛ که لزوماً مخرب نیستن) و قوانینی که نشانگرهای تهدید رو پیدا میکنن (مثل اسم دامنههای مشکوک یا روتینهای deobfuscation). بعد این دو لایه رو ترکیب میکنه تا جاهایی رو پیدا کنه که پکیج هم میتونه و هم انگار داره کار مخرب انجام میده. امتیاز نهایی روی مقیاس ۱۰ گزارش میشه: زیر ۵ کمریسک، بین ۵ تا ۷ مشکوک و بالای ۷ بهاحتمال زیاد مخرب.
یه اضافهٔ مهم دیگه، سندباکس داخلیه. نویسنده با صداقت میگه خودِ کدی که تیم مینویسه هم میتونه باگ داشته باشه و در گذشته آسیبپذیریهایی گزارش شده که میتونستن با یه پکیج ساختگی، اجرای کد از راه دور روی ماشین اسکنکننده بدن. برای همین سندباکس Nono رو از طریق nono-py تو فرایند اسکن یکپارچه کردن؛ بهصورت پیشفرض و بدون پیشنیاز، فرایند اسکن با دسترسی محدودِ شبکه و فایلسیستم ایزوله اجرا میشه. نمونهٔ سادهشدهٔ اعمال سندباکس روی فرایند اکسترکت اینشکلیه:
def apply_sandbox():
caps = nono.CapabilitySet()
for path in _get_common_read_paths():
caps.allow_path(path, nono.AccessMode.READ)
caps.block_network()
nono.apply(caps)برای سنجش کیفیت، تیم precision و recall رو اندازه گرفته (که ذاتاً با هم در کشمکشن) و برای ترکیبشون از F1 و MCC استفاده کرده. دیتاستِ ارزیابی هم مجموعهٔ متنباز خودشون با بیش از ۲۷ هزار پکیج مخربِ واقعیه؛ ولی چون خیلی از اینها تقریباً تکراریان، اول با الگوریتم TLSH خوشهبندی و بعد نمونهگیری میشن تا نتیجه سوگیری نکنه. نصبش هم سادهست (با pip یا uv) و میشه هر پکیج npm یا PyPI یا حتی فایل requirements.txt و package.json رو اسکن کرد. نویسنده در پایان میگه GuardDog از LLM استفاده نمیکنه و یه ابزار تحلیل ایستاست، ولی میتونه لایهٔ اول triage قبل از سپردن بررسی عمیقتر به یه LLM باشه.
نکات کلیدی:
- GuardDog 3.0 برای شناسایی پکیجهای مخرب npm و PyPI از Semgrep به YARA کوچ کرد
- موتور ریسک تازه بهجای نمایش هر تطبیق قانون، یه امتیاز نهایی از احتمال مخرببودن میده (مقیاس ۱۰)
- امتیاز از ترکیب قوانین «قابلیت» و «نشانگر تهدید» و کاملبودن زنجیرهٔ حمله ساخته میشه
- سندباکس داخلی Nono خودِ فرایند اسکن رو با دسترسی محدود ایزوله میکنه
- ارزیابی با precision/recall و F1/MCC روی دیتاست متنبازِ خوشهبندیشدهٔ ۲۷ هزارتایی انجام میشه




