حملات زنجیره تأمین (Supply Chain Attack) نوعی حمله سایبری هستن که مهاجم بجای هدف قرار دادن مستقیم یک سازمان یا کاربر نهایی، از طریق تأمینکنندگان نرمافزار، کتابخانهها، ابزارهای توسعه، یا زیرساختهای مرتبط به سیستم هدف نفوذ میکنه. در این روش، مهاجم یک مؤلفه، مانند یک بروزرسانی نرمافزاری، کتابخانه کد، یا وابستگیهای پروژه رو آلوده میکنه تا در نهایت به کاربران نهایی یا سازمانهای وابسته حمله کنه.
این حملات چیز جدیدی نیستن و بارها و به روشهای مختلفی انجام شدن. مثلا قبلا هکرها از این روش برای آلوده کردن بسته های پایتونی httpslib و colorslib و libhttps استفاده کردن. همچنین حمله ی هکرهای روسی از طریق Solarwinds هم جزء حملات معروف در این دسته هستش. با این حال برای اولین بار، هکرها رفتن سراغ پیاده سازی این حمله، روی اکوسیستم گولنگ (Golang).
معمولا در دنیای متن باز ما یک اصطلاحی داریم بنام Mirror Proxy که در حقیقت یک سرور واسطهای هستش که نسخهی کش شده از محتوای اصلی رو ذخیره و به کاربران ارائه میده، بدون اینکه درخواست مستقیماً به منبع اصلی ارسال بشه.
یکی از این Mirror Proxyها در اکوسیستم گولنگ، Go Module Mirror هستش که بستههای متنباز موجود در GitHub و سایر منابع رو کش میکنه تا دانلودها سریعتر انجام بشن و همچنین از سازگاری این بستهها با سایر بخشهای اکوسیستم Go اطمینان حاصل میکنه.
بطور پیشفرض، زمانیکه شخصی از ابزارهای خط فرمان در Go برای دانلود یا نصب بستهها استفاده میکنه، درخواستها از طریق این سرویس مسیریابی میشن. در توضیحات این سرویس در سایت، اشاره شده که این پروکسی توسط تیم Go ارائه شده و توسط گوگل اجرا میشه.
طبق اعلام شرکت امنیتی Socket در روز دوشنبه، از نوامبر 2021، سرویس Go Module Mirror یک نسخه آلوده به بکدور از یک ماژول پرکاربرد رو میزبانی میکرده. این فایل از تکنیکی به نام Typosquatting استفاده کرده. روشی که در اون فایلهای مخرب با نامهایی مشابه فایلهای قانونی و پرکاربرد ایجاد میشن و در مخازن محبوب قرار میگیرن. اگه شخصی هنگام فراخوانی فایل از طریق خط فرمان، تایپ اشتباهی داشته باشه یا تغییر جزئی در نام اصلی ایجاد کنه، بجای فایل واقعی، فایل مخرب رو دریافت میکنه. این روش در حملات فیشینگ مرتبط با نام دامنه هم رایجه.
ماژول مخرب با نام boltdb-go/bolt منتشر شده، که نسخهی تغییریافته از ماژول اصلی boltdb/bolt محسوب میشه. بسته BoltDB بطور گسترده در اکوسیستم Go مورد استفاده قرار میگیره، بطوریکه 8,367 بسته دیگه به اون وابسته هستن. استفاده وسیع از اون در هزاران پروژه، BoltDB رو به یکی از ماژولهای برجسته و مورد اعتماد در جامعه Go تبدیل کرده.
بسته مخرب ابتدا در GitHub ظاهر شد، اما بعداً نسخه اون به ورژن اصلی و قانونی برگردونده شد. با این حال، در آن زمان Go Module Mirror نسخه بکدوردار رو کش کرده و اونو برای سه سال در سرویس خودش ذخیره داشته.
محققان Socket اعلام کردن: موفقیت این حمله به طراحی سرویس Go Module Proxy وابسته بود، سرویسی که برای بهبود عملکرد و دسترس پذیری، اولویت رو به کش کردن میده. زمانیکه یک نسخه از ماژول در کش ذخیره بشه، همچنان از طریق Go Module Proxy در دسترس باقی میمونه، حتی اگه منبع اصلی بعداً تغییر کنه. در حالیکه این طراحی برای کاربردهای قانونی مفید، مهاجم از اون سوءاستفاده کرده تا کد مخرب رو توزیع کنه، حتی پس از اعمال تغییرات در مخزن اصلی.
موارد دیگه ای هم برای جذب توسعهدهندگان به این بسته طراحی شده بود. یکی از اونا این بود که فایل README همراه با boltdb-go/bolt کپی شده از نسخه اصلی و قانونی بود. مورد دیگه این بود که بسته اصلی در گیتهاب آرشیو شده. توسعهدهندگان معمولاً فورکهای فعال رو به نسخههای قدیمی تر ترجیح میدن. برخی دیگه ممکنه فریب بخورن و تصور کنن که این بسته مخرب، نسخه اصلی و قانونی است.
این حمله یکی از اولین موارد ثبتشده سوءاستفاده از قابلیت کش دائمی ماژولهای Go Module Mirror است. تاکنون مورد مشابهی بطور عمومی گزارش نشده بود، اما این حادثه نشون میده که لازم است آگاهی بیشتری در مورد تاکتیکهای پرسیست مشابه ایجاد بشه.
عملکرد بکدور:
بسته boltdb-go/bolt نسخهی آلوده شده از بستهی قانونی BoltDB است که یک بکدور برای دسترسی از راه دور رو درون عملکردهای عادی دیتابیس مخفی کرده.
کد مخرب طوری طراحی شده که بطور مداوم به C2 در آدرس مبهم شدهی زیر متصل بشه:
پس از برقراری اتصال، به دستورات دریافتی گوش میده، اونارو روی سیستم میزبان اجرا میکنه و خروجی رو به مهاجم ارسال میکنه. این کار به یک کاربر غیرمجاز، دسترسی کامل از راه دور به هر سیستمی که این بسته رو اجرا کنه، میده.
آدرس IP سرور که روی Hetzner Online (AS24940) میزبانی میشد، از اعتبار بالایی برخوردار بود. محققان Socket مشکوکن که زیرساخت این حمله بطور خاص برای این کمپین ایجاد شده تا از شناسایی جلوگیری کنه.
محققا گفتن که برخلاف بدافزارهای معمولی که بصورت تصادفی توزیع میشن، این بکدور طوری طراحی شده که در محیطهای توسعه مورد اعتماد پنهان بشه، که این امر احتمال آلوده شدن گسترده قبل از کشف شدن رو افزایش میده.
کد زیر در فایل db.go، بخشی از کد مخرب هستش که برای برقراری ارتباط و فعالسازی بکدور استفاده میشده:
کدهای زیر که از فایل cursor.go گرفته شده، نشون دهنده مقادیر مبهم شده توسط بازیگر تهدید هستش:
این مقادیر توسط ()r_ از حالت مبهم خارج میشن:
مقدار مبهم شده:
در مثال بالا، مقدار 5 به . تبدیل میشه و مقدار 6 و 7 حذف میشن. خروجی نهایی بصورت زیر خواهد بود:
همونطور که مشاهده میکنید، ویژگیهای مخرب در چندین فایل داخل بستهی boltdb-go/bolt پراکنده شدن تا از شناسایی جلوگیری بشه. فایل db.go اتصال بکدور رو شروع میکنه. فایل cursor.go بطور مخفیانه ثابتهای مبهم شده ای رو تعریف میکنه که در مراحل بعدی به یک آدرس IP تبدیل میشن. تابع ()r_ آدرس C2 مهاجم رو بطور داینامیک بازسازی میکنه تا ابزارهای معمولی تحلیل استاتیک نتونن به راحتی زیرساخت مخرب رو شناسایی کنن.
بکدور زمانی فعال میشه که یک توسعهدهنده تابع Open رو فراخوانی کنه. این عملکرد باعث ایجاد یک اتصال TCP به آدرس C2 میشه، جایی که در انتظار دریافت و اجرای دستورات مهاجم هستش.
یک روال بازنشانی داخلی نیز تعبیه شده تا در صورت کرش کردن یا از کار افتادن بکدور، بصورت خودکار مجدداً اجرا بشه و دسترسی به سیستم آلوده را بطور مداوم حفظ کنه.
توالی رویدادهای حمله:
محققان توالی رویدادهای این حمله رو بصورت زیر شرح دادن:
- مهاجم یک مخزن جعلی در GitHub ایجاد میکنه با نام: github.com/boltdb-go/bolt
- اونا نسخهای آلوده به بکدور (v1.3.1) رو منتشر کردن که شامل یک مکانیزم دسترسی مخفی از راه دور بود.
- سرویس Go Module Mirror این نسخه رو دریافت و کش کرد تا برای نصبهای آینده ذخیره بشه.
- مهاجم مخزن GitHub رو تغییر داد و نسخه v1.3.1 رو با یک نسخه تمییز جایگزین کرد.
- بازرسان انسانی که GitHub رو بررسی میکردن، فقط نسخه تمیز رو مشاهده کردن.
- با وجود اینکه مخزن GitHub ایمن به نظر میرسید، سرویس Go Module Mirror همچنان نسخه مخرب v1.3.1 رو به توسعهدهندگان ارائه میداد.
- محققا بسته مخرب رو شناسایی کرده و در تاریخ 30 ژانویه 2025 درخواست حذف اونو از Go Module Mirror ارسال کردن، و سپس دوباره در 3 فوریه 2025 این درخواست رو تکرار کردن.
- همچنین، مخزن GitHub و حساب مرتبط با اونو به GitHub گزارش دادن تا برای بررسی بیشتر و حذف شدن اقدام بشه (3 فوریه 2025).
- با اینکه در زمان کشف، مخزن GitHub تمیز شده بود، اما نسخه کش شده که از طریق Go Module Proxy ارائه میشد، همچنان مخرب باقی مونده بود. این موضوع نشون میده که رفتار کش کردن ماژولها در Go یک ریسک امنیتی است، چون به مهاجمان اجازه میده پس از کش شدن بسته، ردپای خودشون رو مخفی کنن.
بیانیه گوگل:
گوگل در خصوص این موضوع بیانیه داده:
این ماژول از سرویس Go Module Proxy و GitHub حذف شده و به پایگاه داده آسیبپذیریهای Go اضافه شده تا افرادی که ممکن است تحت تأثیر قرار گرفته باشن، از اون مطلع بشن. ما در حال رفع این مشکل از طریق روشهایی مانند تحلیل قابلیتها (Capability Analysis) با ابزار Capslock و مقایسه دادهها با سرویس deps.dev هستیم. ما از تیم Socket و مشارکتکنندگان تیم Go که این ماژول رو شناسایی و برای رفع اون اقدام کردن، قدردانی میکنیم. ما به همکاری خود با صنعت ادامه خواهیم داد تا آگاهی درباره مسائل امنیتی رایج در پروژههای متنباز رو افزایش بدیم و از ابتکاراتی مانند SLSA و OpenSSF برای بهبود امنیت پشتیبانی میکنیم.
نتیجه گیری:
این تحقیق یک هشدار مهم درباره اهمیت بررسی دقیق کدها قبل از اجرای اونا روی دستگاههای عملیاتی ارائه میده. این فرآیند شامل موارد زیر:
- بررسی صحت و یکپارچگی بسته قبل از نصب،
- تحلیل وابستگیهای بسته برای شناسایی هرگونه رفتار غیرعادی،
- استفاده از ابزارهای امنیتی که کدهای نصبشده رو در سطحی عمیق تر بررسی میکنن.
منابع: