در یک حمله پیچیده به زنجیره تأمین (Supply Chain Attack)، مهاجمان با سوءاستفاده از قابلیت Trusted Publishing در مخزن npm، موفق شدند یک لودر (Loader) شناسناشده به نام GHAPPIER را از طریق یک بسته معتبر توزیع کنند. نکته قابل توجه در این عملیات، داشتن Provenance معتبر برای نسخه مخرب بود که باعث شد این بسته از فیلترهای امنیتی عبور کند.
جزئیات عملیات و مکانیسم نفوذ
طبق گزارشهای منتشر شده، مهاجمان موفق شدند برای مدت ۱۰۵ دقیقه به حساب نگهدارنده (Maintainer) بسته @dforge-core/dforge-mcp دسترسی پیدا کنند. در این بازه زمانی، ابتدا نسخه 0.2.20 منتشر شد که منجر به شکست در نصب گردید، اما بلافاصله نسخه 0.2.21 حاوی لودر مخرب منتشر شد و به مدت حدود ۳۵ دقیقه به عنوان آخرین نسخه در دسترس قرار گرفت.
تحلیلها نشان میدهد که مهاجم از پیش دسترسی Push به شاخه main را داشته است. احتمال میرود این دسترسی از طریق عفونی شدن سیستم توسعهدهنده توسط یک افزونه یا بسته مخرب به دست آمده باشد. مهاجم با تغییر تنها سه خط کد، گردش کار (Workflow) انتشار را فعال کرد و سپس آن را بازنویسی نمود تا انتشار بسته به صورت خودکار و بدون نیاز به مداخله انسانی (Unattended) انجام شود.
چالشهای شناسایی و تایید اصالت
این حمله از طریق GitHub Actions و با استفاده از OIDC Trusted Publishing اجرا شده است. از آنجایی که رجیستری npm به هویت CI مخزن اعتماد دارد، دسترسی Push عملاً به دسترسی Publish تبدیل شد. این موضوع باعث شد نسخه مخرب، امضاهای npm audit را با موفقیت پشت سر بگذارد. در واقع، Provenance تنها تایید میکند که آرتیفکت در کجا ساخته شده است، اما صادقانه بودن کد منبع را تضمین نمیکند.
تحلیل فنی لودر و Payload
لودر GHAPPIER تنها یک خط کد در یک فایل ۹۹ کیلوبایتی بود که یک زنجیره چهار مرحلهای را فعال میکرد. هدف نهایی این زنجیره، ایجاد یک Remote Shell با کاربرد عام بود که پس از اجرا، خود را از روی دیسک پاک میکرد. نکته کلیدی این است که این کد هنگام اجرای MCP Server فعال میشد، نه در لحظه نصب (Install time)، بنابراین سیستمهایی که بسته را نصب کرده اما اجرا نکرده بودند، دچار آلودگی نشدند.
ارتباط با PolinRider و تحلیل نهایی
ردپاهای GHAPPIER در ۶۵ مخزن عمومی و ۲۲ حساب کاربری ردیابی شده است. همچنین یک Payload ثانویه در یکی از مخازن قربانیان، دقیقاً با کمپین PolinRider مطابقت داشت. این بدافزار پیکربندی خود را از طریق یک تراکنش خالی شبکه اتریوم (Ethereum) دریافت میکند تا هیچ دامنه یا هاستی برای مسدود کردن توسط تیمهای امنیتی باقی نماند. برخی تحلیلگران PolinRider را به گروههای APT کره شمالی نسبت میدهند، هرچند این موضوع به طور قطعی تایید نشده است.
توصیههای امنیتی برای SOC و مهندسین امنیت
- Pinning: نسخهی بسته مذکور را روی 0.2.22 تثبیت کنید.
- Lockfile Analysis: هرگونه ارجاع به نسخه 0.2.21 در Lockfileها را به عنوان یک شاخص ابتلا (IoC) در نظر بگیرید.
- Monitoring: بر روی تغییرات در بلوکهای Trigger مربوط به Release Workflowها نظارت دقیق داشته باشید، زیرا تغییرات سریع در این بخش میتواند نشانه آمادهسازی برای انتشار بدافزار باشد.