گروه Slow Pisces، گروه تهدید منتسب به کره شمالی که در حمله بزرگ به Bybit در فوریه ۲۰۲۵ نقش داشته، با یک کمپین مخرب جدید در حال هدف قراردادن توسعهدهندگان و انتشار بدافزار سرقت اطلاعات تحت پوشش یک چالش برنامهنویسی است.
فعالیت این کمپین توسط بخش Unit 42 شرکت Palo Alto Networks به گروه هکری Slow Pisces نسبت داده شدهاست؛ گروهی که با نامهای Jade Sleet، PUKCHONG، TraderTraitor و UNC4899 نیز شناخته میشود. گروه Slow Pisces پیشتر هم توسعهدهندگان، بهویژه در حوزه رمزارز، را هدف قرار داده و از طریق LinkedIn به بهانه فرصت شغلی به آنها نزدیک شده و با ارسال یک فایل PDF حاوی جزییات پروژه، قربانی را به باز کردن پروژه آلوده در GitHub تشویق میکند.
در ژوئن سال 2024، شرکت Mandiant (متعلق به Google) روش کاری مهاجمان را اینگونه تشریح کرد:
ابتدا یک فایل PDF بیخطر با شرح شغل احتمالی در LinkedIn ارسال میشود. در صورت ابراز علاقه قربانی، یک فرم ارزیابی مهارت به او داده میشود که در آن از او خواسته میشود یک پروژه Python دستکاریشده را از GitHub دانلود و اجرا کند.
این پروژه، در ظاهر قیمت ارزهای دیجیتال را نمایش میدهد؛ اما درواقع به یک سرور راهدور متصل شده و در صورت برقرار بودن شرایط خاص، پیلود مرحله دوم را دریافت میکند.

زنجیره چندمرحلهای حمله
مطابق مستندات Unit 42، این زنجیره حمله چندمرحلهای نیز همین مسیر را دنبال میکند و پیلود مخرب تنها به اهداف اعتبارسنجیشده احتمالا بر اساس آدرس IP، موقعیت جغرافیایی، زمان و هدرهای درخواست HTTP ارسال میشود.
مرحله ۱:
گروه Slow Pisces در ابتدا با جعل هویت استخدامکنندگان در لینکدین، با اهداف مخرب ارتباط برقرار کرده و برای آنها یک فایل PDF بیخطر شامل شرح شغل ارسال میکند. در صورتی که افراد مورد نظر درخواست شغل میدادند، مهاجمان یک چالش کدنویسی شامل چندین وظیفه را در قالب یک برگه سوال برای آنها ارسال میکنند.

مشاهده شده است که Slow Pisces هویت چندین شرکت، عمدتاً در حوزه ارزهای دیجیتال را جعل کرده و در این طعمهها از آنها استفاده میکند. برگه سوال شامل وظایف عمومی توسعه نرمافزار و یک «پروژه واقعی» است که لینکی به یک مخزن GitHub در خود دارد.

مرحله ۲:
Slow Pisces پروژههایی را بهعنوان چالش کدنویسی در قالب مخازن GitHub در اختیار اهداف قرار میداد. این مخازن شامل کدهایی برگرفته از پروژههای متنباز بودند، از جمله برنامههایی برای مشاهده و تحلیل:
- دادههای بازار بورس
- آمار لیگهای فوتبال اروپا
- اطلاعات آبوهوا
- قیمت ارزهای دیجیتال
این گروه بیشتر از پروژههای Python و JavaScript استفاده کرده است که احتمالا بر اساس نوع درخواست (فرانتاند یا بکاند) انتخاب میشود. در این کمپین، مخازن مبتنی بر Java نیز دیده شده، اما بسیار محدود بودهاند. این الگو نشان میدهد که مهاجمان احتمالا مخازن را بر اساس زبان برنامهنویسی مورد علاقه هدف بهصورت اختصاصی ایجاد میکردند. بنابراین احتمال وجود مخازن کشفنشده در زبانهای دیگر هم وجود دارد.
مرحله ۳:
این مرحله برای مخزن Python بررسی شده است. در صورتی که چالش مربوط به JavaScript باشد، روش مهاجمان در این مرحله اندکی متفاوت خواهد بود. در اواخر ۲۰۲۴، این گروه از پروژهای به نام “Stocks Pattern Analyzer” استفاده کرد که از یک مخزن معتبر گرفته شده بود.

بیشتر کدهای این مخزن بیخطر هستند. هنگام اجرای پروژه طبق دستورالعمل چالش، دادهها از سه آدرس زیر دریافت میشود:
- hxxps://en.wikipedia[.]org/wiki/List_of_S%26P_500_companies
- hxxps://en.wikipedia[.]org/wiki/Currency_pair
- hxxps://en.stockslab[.]org/symbols/sp500
دو آدرس اول از ویکیپدیا و سومی از دامنه تحت کنترل Slow Pisces است. این روش (ترکیب منابع معتبر با یک منبع مخرب) از الگوهای رایج این گروه در پروژههای Python آنهاست.
این گروه میتواند به راحتی بدافزار را مستقیم در مخزن قرار دهد یا از توابع داخلی eval یا exec در پایتون برای اجرای کد از سرور C2 استفاده کند؛ اما این روش قابل شناسایی است. بهجای قرار دادن مستقیم بدافزار در مخزن یا استفاده از توابع eval و exec، Slow Pisces از عدم دنباله سازی داده های YAML برای اجرای پیلود استفاده میکند. این کار باعث میشود کدهای مخرب در نگاه اول مشکوک به نظر نرسند.

در این مرحله، تابع fetch_symbols در کد پروژه، با ارسال یک درخواست HTTPS به سرور C2، دادهها را دریافت میکند. اگر Content-Type پاسخ application/json باشد، دادهها بهصورت عادی پردازش میشوند؛ اما در صورتی که Content-Type برابر application/yaml باشد، دادهها با استفاده از تابع ناامن yaml.load() از کتابخانه PyYAML پارس میشوند. این تابع برخلاف توصیه مستندات PyYAML که استفاده از yaml.safe_load() را پیشنهاد میکند، میتواند منجر به اجرای کد دلخواه مهاجم در قالب اشیای سریالشده Python گردد.
در سمت قربانی، تابع yaml.load() این داده را دریافت و تفسیر میکند که میتواند هر شی Python از جمله کدهای اجرایی را دنبالهسازی و اجرا کند. در نتیجه، پیلود مرحله اول پس از رمزگشایی، فایلی با نام __init__.py را در پوشه Public میسازد و ماژول RN Loader را اجرا میکند. این ماژول وظیفه دارد اطلاعات اولیه سیستم را جمعآوری کرده و پس از ارزیابی شرایط، بدافزار اصلی با نام RN Stealer را روی سیستم قربانی مستقر کند. شایان ذکر است که این تکنیک در پروژههای Python متعلق به این گروه، با الگوهایی نظیر !!python/object/apply:builtins قابل شناسایی است.
RN Loader
همانطور که گفته شد یک فایل جدید در مسیر ~/Public/__init__.py ایجاد میشود. پس از اجرا، این فایل خودش را پاک میکند و فقط در حافظه باقی میماند. این لودر، اطلاعات پایه سیستم قربانی را از طریق HTTPS به C2 در en.stockslab[.]org ارسال کرده و وارد یک حلقه دستورات (command loop) میشود.
کد | توضیحات |
0 | برای ۲۰ ثانیه منتظر میماند (خواب). |
1 | محتوای ارسالی را از حالت Base64 رمزگشایی کرده و در فایل init.dll برای ویندوز یا init برای سایر سیستمعاملها ذخیره میکند. |
2 | محتوای ارسالی را از حالت Base64 رمزگشایی کرده و با استفاده از تابع داخلی پایتون exec اجرا میکند. |
3 | محتوای ارسالی و یک پارامتر را از حالت Base64 رمزگشایی میکند. محتوا در فایل dockerd ذخیره شده و پارامتر بهعنوان docker-init ذخیره میشود. |
9 | اجرای بدافزار را متوقف میکند. |
دستورات این حلقه در جدول بالا آمده که از طریق گزینه ۲ بدافزار RN Stealer شناسایی شده است.
RN Stealer
این بدافزار ابتدا یک شناسه تصادفی برای قربانی ایجاد کرده و بهعنوان cookie در ارتباطات بعدی استفاده میکند. سپس کلید XOR را از C2 دریافت کرده تا اطلاعات را به شکل Base64 رمزگذاری و ارسال کند. تحلیل پیلود انواع توکنهای ارسالی زیر را شامل می شود:
- R0: درخواست کلید XOR
- R64: ارسال داده
- R128: ارسال داده فشردهشده
- R256: اتمام عملیات
ساختار توکن هایC2 مشاهدهشده در این بخش، مبنای نامگذاری RN Stealer قرار گرفته است. این بدافزار اطلاعات زیر را از سیستمهای macOS سرقت میکند:
- نام کاربری، نام سیستم و معماری
- اپلیکیشنهای نصبشده
- لیست دایرکتوری و محتوای پوشه Home
- فایل login.keychain-db حاوی رمزهای ذخیرهشده
- کلیدهای SSH
- تنظیمات AWS، Kubernetes و Google Cloud
- آیا ماندگاری مداوم لازم است یا خیر.
مشاغل مربوط به Javascript
در سناریوی مربوط به متقاضیان موقعیتهای JavaScript نیز، قربانیان تشویق میشوند پروژهای با عنوان Cryptocurrency Dashboard را از GitHub دانلود کنند. این پروژه از استراتژی مشابهی بهره میبرد؛ بهنحوی که سرور C2 تنها در صورتی پیلودهای اضافی را ارائه میدهد که قربانی واجد شرایط خاصی باشد. هرچند ماهیت دقیق این پیلود در حال حاضر ناشناخته است.
در این پروژه، مهاجمان از ابزار Embedded JavaScript (EJS) برای قالببندی دادهها استفاده کرده و پاسخهای سرور C2 را مستقیماً به تابع ejs.render() ارسال میکنند. مشابه استفاده از yaml.load() در پروژه Python، این تکنیک نیز به Slow Pisces امکان میدهد کد دلخواه را از طریق C2 اجرا کند؛ بهطوریکه این فرآیند به طور معمول تنها در صورت در اختیار داشتن پیلود معتبر قابل مشاهده است.
گروههای مرتبط
Jade Sleet یکی از چندین گروه کره شمالی است که از فرصت شغلی جعلی بهعنوان بردار توزیع بدافزار استفاده میکند. دیگر گروهها در این حوزه عبارتند از:
- Operation Dream Job
- Contagious Interview
- Alluring Pisces
به گفته Unit 42، این گروهها در عملیاتهای خود همپوشانی ندارند؛ اما استفاده از بردارهای نفوذ اولیه مشابه قابلتوجه است.
گروه Slow Pisces در زمینه امنیت عملیاتی نسبت به دیگران متمایز است زیرا ارسال پیلود مخرب در هر مرحله بهشدت محافظت میشود، در حافظه باقی میماند و ابزارهای مراحل بعدی فقط در صورت نیاز مستقر میشوند.