В сентябре 2025 года исследователи из GMO Cybersecurity by Ierae, Inc. обнаружили продолжающуюся вредоносную кампанию, в которой злоумышленники используют уязвимость в архитектуре GitHub для распространения малвари под видом официальных установщиков популярных инструментов для разработчиков. Эта атака, получившая название GPUGate, сочетает в себе технику захвата репозитория с изощренным использованием GPU-интерфейса OpenCL для противодействия анализу. Основной целью кампании стали пользователи из Европейского союза и Японии, ищущие инструменты для разработки.
Описание
Механизм атаки основан на особенности GitHub, позволяющей пользователю создать форк публичного репозитория, внести изменения в свою копию, а затем просматривать эти изменения через исходный репозиторий с помощью хэша коммита. Это создает ложное впечатление, что коммит принадлежит официальному проекту, хотя у злоумышленника нет прямых прав на запись. В данном случае атакующие создали форк официального репозитория GitHub Desktop, изменили ссылку для скачивания в файле README, чтобы она вела на вредоносный установщик, и зафиксировали это изменение. Полученный хэш коммита, видимый в пространстве имен официального репозитория, затем продвигался через платную рекламу в поисковых системах.
Хотя GitHub заявил о начале работ по устранению этой проблемы еще в сентябре 2025 года, по состоянию на конец декабря воспроизвести атаку все еще возможно. Злоумышленники создают одноразовые учетные записи, и даже их удаление не стирает вредоносные коммиты из сети репозиториев, что затрудняет отслеживание и очистку. Пользователи, перешедшие по рекламной ссылке и скачавшие файл GitHubDesktopSetup-x64.exe, на самом деле получали многоступенчатый загрузчик вредоносного ПО.
На поверхности этот исполняемый файл выглядит как обычное приложение на C++, однако его отладочная информация указывает на то, что это однофайловое .NET-приложение. Такие приложения содержат все свои зависимости в одном исполняемом файле-хосте. Вредоносная полезная нагрузка скрыта в оверлее файла. Встроенное .NET-приложение, выступающее в роли загрузчика, содержит два зашифрованных ресурса и использует хитрую технику для их расшифровки.
Ключевой особенностью этого загрузчика является злоупотребление API OpenCL, предназначенным для выполнения вычислений на графическом процессоре. Функция GenerateKey() загружает библиотеку OpenCL.dll, расшифровывает исходный код OpenCL-ядра и пытается его скомпилировать и выполнить. На первый взгляд, ядро должно генерировать ключ для расшифровки основной полезной нагрузки на основе имени устройства GPU. Однако код содержит преднамеренные ошибки, такие как передача некорректных аргументов в clSetKernelArg, что гарантирует сбой выполнения ядра. В результате функция всегда возвращает нулевой ключ.
Этот прием служит двойной цели. Во-первых, он затрудняет динамический анализ в песочницах и виртуальных машинах, где зачастую отсутствуют драйверы GPU или среда выполнения OpenCL, что приводит к преждевременному сбою выполнения. Во-вторых, он вводит в заблуждение аналитиков при статическом анализе, заставляя их искать сложный GPU-ключ, в то время как реальный ключ тривиален. Для полного понимания поведения исследователям пришлось отлаживать код на физической машине с дискретной видеокартой.
Используя нулевой ключ и такой же вектор инициализации, загрузчик расшифровывает основную .NET-полезную нагрузку с помощью AES-128-CBC. Этот следующий этап пытается загрузить дополнительный код с удаленного сервера. Хотя сервер был отключен, данные телеметрии показывают, что он использовал Windows Script Host для запуска VBScript, который, в свою очередь, исполнял PowerShell-стагер.
PowerShell-стагер обеспечивает устойчивость (persistence) в системе. Он копирует себя в автозагрузку, создает исключения в Microsoft Defender для ключевых каталогов и устанавливает задание в планировщике задач Windows с подозрительным именем WinSvcUpd. Затем он загружает ZIP-архив с вредоносного домена, распаковывает его и выполняет содержащиеся там исполняемые файлы. В некоторых образцах стагера были обнаружены комментарии на русском языке.
Внутри загруженного архива находится легитимный исполняемый файл Control-Binary32.exe и набор DLL. Одна из них, Qt5Network.dll, была модифицирована. Ее легитимный код остался нетронутым, но в стандартную цепочку инициализации была вставлена вредоносная функция. Эта функция читает зашифрованную полезную нагрузку из файла Prangshound.hzj, расшифровывает ее простым добавлением ключа к каждому двойному слову и внедряет в память с помощью техники, известной как module stomping (подмена модуля). А именно, она копирует основную часть расшифрованного кода в секцию .text легитимной системной библиотеки vssapi.dll, меняет права доступа на выполнение и передает управление по заданному смещению.
Эта конечная полезная нагрузка идентифицируется как HijackLoader. Она перечисляет запущенные процессы, вычисляет хэши их имен и проверяет наличие процессов, связанных с антивирусами AVG и Avast. При обнаружении она вводит задержку выполнения. Затем загрузчик читает и расшифровывает финальную конфигурацию из второго файла Kraekgriesfid.xvs. HijackLoader известен как гибкий загрузчик, часто используемый для развертывания таких угроз, как стилер LummaC2.
Данная кампания наглядно демонстрирует, как киберпреступники используют доверие к платформам вроде GitHub и сложности анализа среды выполнения для эффективных атак. Разработчики, обладающие доступом к критически важным активам, представляют собой особо привлекательную цель. Эксперты GMO Ierae настоятельно рекомендуют пользователям скачивать установочные файлы исключительно со страниц официальных релизов проектов, а также проявлять повышенную осторожность при взаимодействии с платной поисковой рекламой.
Индикаторы компрометации
IPv4 Port Combinations
- 45.59.124.94:443
URLs
- https://21gweweqax.online/api.php
- https://21ow.icu/arasa.php
- https://appsiauer.online/api.php
- https://git-desktop.app/git
- https://git-desktop.it.com/git
- https://gitpage.app/
- https://kololjrdtgted.click/zip.php
- https://lofiufueyer.blog/aps.php
- https://oqiwquwqey.xyz/zipep.php
- https://poiwerpolymersinc.online/api.php
- https://polwique.blog/fils.php
- https://sleeposeirer.online/zip.php
- https://slepseetwork.online/api.php
SHA1
- 3b3e14cec9f2c7f9567bb1a50ece12d4eb337305
- 629f3ab77b0c6840618029d39869d078f8a5a694
- 636f5d478fa774635da5b25ecb842822ab444009
- 747971b32010ff652a6bd698fb57ece5287b9234
- a48188b0d5bdc3e8728cb37619cc51f7392b086f
- e24d78ebb3c7302cc6aa8e2231f847a53e1345f2
SHA256
- 2299b795169494d3717140bf34ea4574b6a9d7d8aecf77fd9ca932925373a23f
- 2a1c127683dba19399cc6516d5700d4e756933889dad156cd62b992aaf732816
- 58f897d4369a4c667b2f40a6703c7ae42912a10186d81c6eaa7809513da86a51
- 6f9a1286f950da68e81bfe3e6c7655df00558df4d50289bf84df79c7d5073a2e
- 719a726d54161a1a95cf69f3001b74fe15661b83d995b89bcca5ecc8e792e2eb
- 731f03daacb38f70bf2178f2ab100b68fc189c9c8da19cc2be24d31d35e799b1
- 75deee7af25dc4f772661f17be4938c1980a703a785dc32274bf1647f8133cec
- 79384ef76740962757d617bc056bf8a45b2ef8f1e1587632b36830e2fc6ab21a
- 8cd7d9ccea98ad6a3dfb4767e574349c9fd5678150c629661574ddd45e40cd37
- 95974060b0dfc45401d15ef9d07392b338fb7af2e3f623eb85b0ef5d1f5759d5
- 95d51ee9c58f789213cedac7e82c7ba064364d9e5c8ca76ad27a5e53537f9fdf
- a46170be7cca7d8bcecf3da4caf035ec24f758eba45936ed802c1a03beab1c0a
- ad07ffab86a42b4befaf7858318480a556a2e7c272604c3f1dcae0782339482e
- b967ade09a9338320e0db4e5da11a2ac396950f0eed689b28bd31686b7baf018
- be503f616edacac10689b63ba39c4b5d791fcf365bc80a0c8bc27c2c3d3cb2a4
- dbe1ec81fe1cb7f0249f47ed83be1b80ac99b2ae726a19b2083cb6fb585515d9
- e252bb114f5c2793fc6900d49d3c302fc9298f36447bbf242a00c10887c36d71
- e5c01a6f3d85c469e16857d92d9f0a1b01d14b0f0dad7df94b1afa6dc1ff4490
- ec89c0ffc755eafc61bbf3b9106e0d9d7cbfaa9e70fbe17d9e4fbb9a7d38be64
- ed1811c16a91648fe60f5ee7d69fe455d0a3855eebb2f3d56909b7912de172fd
- efcf5fe467f0ba8f990bcdfc063290b2cf3e8590455e6c7c8fe0f7373a339f36
- f3a914a46795021afd35b6c54a3c64ffedf33fbc3398dea84e6f71dc2d3ae198
YARA
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | rule MAL_Loader_WIN_1 { meta: description = "Generic rule to detect the single-file malicious installer" author = "GMO Cybersecurity by Ierae, Inc" strings: // .NET single-file bundle marker (sfbm) // 4 bytes (non-zero), 4 bytes (any), 32-byte fixed tail $sfbm = { ?? ?? ?? ?? ?? ?? ?? ?? 8B 12 02 B9 6A 61 20 38 72 7B 93 02 14 D7 A0 32 13 F5 B9 E6 EF AE 33 18 EE 3B 2D CE 24 B3 6A AE } $a1 = "No OpenCL platforms found" ascii wide $a2 = "No OpenCL GPU devices found" ascii wide $a3 = "Failed to create context" ascii wide $a4 = "Failed to create command queue" ascii wide $a5 = "Failed to create program" ascii wide $a6 = "Failed to build program" ascii wide $a7 = "Failed to create kernel" ascii wide $a8 = "generate_key" ascii wide condition: uint16(0) == 0x5a4d and (#sfbm > 0 and for any i in (1..#sfbm): ( uint8(@sfbm[i]) > 0 and uint8(@sfbm[i]+1) > 0 and uint8(@sfbm[i]+2) > 0 and uint8(@sfbm[i]+3) > 0 )) and (all of ($a*)) } |