В мае 2025-го Microsoft Digital Crimes Unit совместно с DOJ прихлопнули инфраструктуру Lumma Stealer - и на рынке инфостилеров образовалась дыра. Свято место пусто не бывает: в эту дыру тут же влез Vidar - наследник Arkei Stealer, который, по данным Acronis TRU, получил серьёзные обновления и неожиданный вектор доставки: сотни фейковых GitHub-репозиториев. Я разберу механику этих кампаний изнутри - от структуры подставных репозиториев до конкретных YARA-правил и Sigma-запросов, которые помогут ловить Vidar в вашей инфраструктуре.
Почему GitHub стал вектором распространения malware
GitHub - это то, что в threat intelligence называют «inherent trust signal». Домен github.com не блокируется корпоративными прокси, файлы из GitHub Releases не вызывают подозрений у большинства EDR при первичной загрузке, а механика платформы (звёзды, форки, issues) создаёт иллюзию легитимности проекта. По сути - идеальная площадка для раздачи малвари.По данным Acronis Threat Research Unit, после ликвидации Lumma Stealer именно Vidar стал одним из самых активно распространяемых инфостилеров, а его операторы развернули сотни фейковых репозиториев. Русскоязычное ИБ-сообщество эту технику практически не покрывает - все смотрят на классику: фишинговые письма, взломанные WordPress-сайты с
Ссылка скрыта от гостей
(как описано у Malwarebytes). А между тем
Ссылка скрыта от гостей
- вектор куда опаснее: жертва сама скачивает и запускает payload, считая его легитимным инструментом. Никакого социального инжиниринга в классическом понимании - человек добровольно тащит троян к себе на машину.Анатомия кампаний: фейковые репозитории с Vidar Stealer
В 2025-2026 годах зафиксированы минимум две крупные кампании по распространению Vidar Infostealer через GitHub. Разберу обе - подходы к social engineering разные, техническая база одна.Фейковые игровые читы на GitHub и Reddit
Первая кампания, задокументированная Acronis TRU, была нацелена на геймеров. Операторы наклепали сотни GitHub-репозиториев, мимикрирующих под читы для популярных игр - в первую очередь CS2. Схема атаки:- Создание репозитория. Название содержит ключевые слова типа «CS2-cheat», «free-aimbot», «valorant-hack». README оформлен со скриншотами, инструкциями по установке, иногда даже с фейковыми issues и discussions - чтобы создать видимость живого проекта.
- Промоутинг через Reddit. Операторы постят в игровых сабреддитах, продвигая «бесплатные читы» со ссылками на GitHub. Throwaway-аккаунты, но с достаточной историей, чтобы пройти базовую модерацию.
- Payload в Releases. Вредоносный бинарник лежит не в коде репозитория (это бы спалилось статическим анализом GitHub), а в секции Releases как скомпилированный архив. Жертва скачивает «готовый чит», распаковывает, запускает - и получает Vidar 2.0 вместо aimbot.
Поддельный слив исходного кода Claude Code
Вторая кампания, описанная Bitdefender, использовала более изощрённый social engineering. В основе - реальный инцидент: ошибка в упаковке npm-пакета Anthropic Claude Code, которая кратковременно раскрыла фрагменты внутреннего исходного кода.Операторы среагировали мгновенно: в течение часов после публичного обсуждения на GitHub появились десятки репозиториев - «claude-code-leaked-source», «anthropic-internal-code», «claude-source-code-dump». Каждый содержал фейковый «слив» и бинарник Vidar в Releases, замаскированный под «build tool» или «скомпилированную версию для тестирования».
Кейс показательный - это weaponizing trust signals в чистом виде. Как отмечает Trend Micro, операторы эксплуатируют реальные новостные поводы (утечки, уязвимости, релизы популярных инструментов) для создания правдоподобных лур. Разработчик, услышавший о реальном инциденте с Claude Code, с высокой вероятностью кликнет на репозиторий, обещающий доступ к утёкшему коду. Жадность до чужих секретов - отличный вектор.
Vidar Stealer 2.0 - технический разбор infostealer
Актуальная версия Vidar - не просто обновление с парой патчей. По данным Acronis TRU (они обозначают её как «
Ссылка скрыта от гостей
»), кодовая база переработана существенно. Для нас как аналитиков это значит, что старые сигнатуры на хэшах и специфичных строках предыдущих версий могут не сработать. Поведенческие правила, ориентированные на паттерны доступа к файлам, имеют больше шансов - но тестировать надо на актуальных образцах. Разберу ключевые технические изменения.Автоматический морфер и полиморфизм
Одна из самых неприятных особенностей актуального Vidar - серверный билдер с автоматическим криптованием (crypter), который генерирует уникальный бинарник для каждой раздачи. Это не self-morphing в runtime, а pre-distribution polymorphism на стороне MaaS-инфраструктуры. На практике:- Хэш каждого образца уникален - детектирование по SHA-256 бесполезно
- Структура секций PE меняется между сборками
- Строковые константы шифруются разными ключами
Если работаете с распаковкой в x64dbg - ставьте hardware breakpoint на
VirtualAlloc. После расшифровки основной payload аллоцирует новый регион памяти и пишет туда расшифрованный код. Стандартный паттерн, хорошая точка для дампа распакованного образца.Многопоточность и модульная архитектура
Vidar 2.0 перешёл на многопоточную модель. Каждый модуль сбора данных крутится в отдельном потоке:- Browser hijacking - вытаскивает credentials, cookies, данные автозаполнения из Chromium и Firefox-based браузеров
- Crypto reader - сканирует кошельки (Bitcoin, Ethereum, Monero и десятки других)
- Azure reader - тащит токены облачных сервисов Microsoft
- Social apps - извлекает токены из Telegram, Discord, Signal
- FTP/SSH reader - крадёт конфигурации FileZilla, WinSCP, PuTTY
- File grabber - ищет и эксфильтрирует файлы по паттернам (.txt, .doc, *.pdf в пользовательских директориях)
- Screenshot - снимает скриншот рабочего стола
Техники антианализа и обфускация
При реверсе образцов Vidar 2.0 регулярно встречаются следующие техники:Проверка окружения. Стилер ищет признаки виртуализации и песочниц: имена процессов (
vmtoolsd.exe, VBoxService.exe), ключи реестра виртуальных машин, MAC-адреса виртуальных сетевых адаптеров. Нашёл песочницу - тихо завершается, никакой вредоносной активности.Задержка выполнения. Некоторые образцы включают sleep перед основной логикой - классический трюк для обхода песочниц с таймаутом анализа. Старо как мир, но до сих пор работает на дешёвых sandbox.
Обфускация строк. Все значимые строки (URL C2-сервера, пути к файлам браузерных профилей, имена процессов) зашифрованы. Декрипт происходит только в момент использования - статический анализ по строкам не пройдёт.
Для обхода антианализа в x64dbg - патчите проверки окружения через NOP или подменяйте значения регистров в местах условных переходов. В Ghidra удобно написать Python-скрипт для автоматической расшифровки строк - паттерн декриптора обычно единообразен в рамках одной сборки. Лично я трачу на написание такого скрипта минут 20, зато потом все строки как на ладони.
C2-коммуникации Vidar Infostealer
Характерная черта Vidar - использование легитимных платформ как промежуточного звена для получения адреса C2-сервера. Исторически это были профили в Steam, Telegram-каналы, Mastodon. В версии 2.0 паттерн сохраняется.Типичная цепочка C2-коммуникации (при трассировке через Wireshark):
- Стилер обращается к легитимной платформе (Steam community profile, Telegram API)
- Из описания профиля или сообщения извлекает закодированный адрес реального C2
- Устанавливает HTTP/HTTPS-соединение с C2
- Отправляет собранные данные в ZIP-архиве
Практический анализ: пошаговый разбор образца
Вот конкретный воркфлоу, который я использую при анализе подозрительных бинарников из GitHub Releases.Шаг 1: Безопасное получение образца
Никогда не скачивайте подозрительные бинарники на рабочую машину. Изолированная среда - обязательно:
Bash:
# Скачиваем в изолированной VM через curl (без автозапуска)
curl -L -o sample.zip "https://github.com/<suspect-repo>/releases/download/v1.0/release.zip" --max-filesize 50M
# Считаем хэши до любых действий
sha256sum sample.zip
file sample.zip
# Проверяем на MalwareBazaar
curl -X POST https://mb-api.abuse.ch/api/v1/ -d "query=get_info&hash=<SHA256>"
Шаг 2: Статический анализ
Bash:
# Распаковка в изолированной директории
unzip sample.zip -d ./analysis/
# Анализ PE-заголовков
python3 -c "
import pefile
pe = pefile.PE('./analysis/cheat.exe')
print(f'Compile time: {pe.FILE_HEADER.TimeDateStamp}')
print(f'Sections: {[s.Name.decode().strip(chr(0)) for s in pe.sections]}')
print(f'Imports: {[e.dll.decode() for e in pe.DIRECTORY_ENTRY_IMPORT]}') if hasattr(pe, 'DIRECTORY_ENTRY_IMPORT') else print('No import table - likely packed/crypted')
print(f'Entropy: {[round(s.get_entropy(), 2) for s in pe.sections]}')
"
Шаг 3: Динамический анализ в песочнице
При анализе в ANY.RUN или собственной sandbox - следите за поведенческими индикаторами:
Код:
# Характерные файловые операции Vidar 2.0
# (наблюдаемые через Process Monitor / Sysmon)
# Чтение браузерных профилей
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Login Data
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Cookies
%LOCALAPPDATA%\Google\Chrome\User Data\Local State
%APPDATA%\Mozilla\Firefox\Profiles\*.default-release\logins.json
# Чтение крипто-кошельков
%APPDATA%\Exodus\exodus.wallet\
%APPDATA%\Ethereum\keystore\
%APPDATA%\atomic\Local Storage\
# Чтение конфигурации SSH/FTP
%APPDATA%\FileZilla\recentservers.xml
%USERPROFILE%\.ssh\*
# Создание временного ZIP-архива перед эксфильтрацией
%TEMP%\<random>.zip
Шаг 4: Трассировка C2
Bash:
# Фильтр Wireshark для выявления паттерна Vidar C2
# Сначала обращение к легитимной платформе, затем к C2
# Фильтр DNS-запросов к типичным dead-drop resolver'ам
dns.qry.name contains "steamcommunity" or dns.qry.name contains "t.me" or dns.qry.name contains "mastodon"
# Фильтр HTTP POST с ZIP-payload (эксфильтрация)
http.request.method == "POST" && http.content_type contains "application/zip"
Детекшн: YARA-правила и Sigma-запросы для github malware распространения
Самая практическая часть - что конкретно настроить, чтобы ловить Vidar в инфраструктуре.YARA-правило для Vidar 2.0
Адаптированное YARA-правило на основе данных Acronis TRU. Ориентировано на поведенческие паттерны, а не на хэши (из-за автоморфера хэши бесполезны):
Код:
rule vidar_stealer_2_behavioral {
meta:
description = "Detects Vidar Stealer 2.0 by behavioral patterns"
author = "Codeby Threat Research (adapted from Acronis TRU)"
date = "2025-07"
reference = "https://www.acronis.com/en/tru/posts/vidar-stealer-20-distributed-via-fake-game-cheats-on-github-and-reddit/"
strings:
// Пути к браузерным профилям (типично для стилеров)
$browser1 = "\\Google\\Chrome\\User Data" ascii wide
$browser2 = "\\Mozilla\\Firefox\\Profiles" ascii wide
$browser3 = "Login Data" ascii wide
$browser4 = "Local State" ascii wide
// Крипто-кошельки
$crypto1 = "exodus.wallet" ascii wide
$crypto2 = "Ethereum\\keystore" ascii wide
// Telegram/Discord
$social1 = "\\Telegram Desktop\\tdata" ascii wide
$social2 = "\\discord\\Local Storage" ascii wide
// FileZilla/SSH
$ftp1 = "recentservers.xml" ascii wide
$ftp2 = "\\.ssh\\" ascii wide
// Антианализ - типичные проверки VM
$antivm1 = "vmtoolsd.exe" ascii wide nocase
$antivm2 = "VBoxService" ascii wide nocase
condition:
uint16(0) == 0x5A4D and
filesize < 10MB and
(3 of ($browser*)) and
(1 of ($crypto*) or 1 of ($social*) or 1 of ($ftp*)) and
(1 of ($antivm*))
/* NB: Это правило - триажное (triage_only), с ожидаемо высоким
уровнем false positives. Легитимные утилиты аудита, бэкап-софт
и менеджеры паролей могут содержать те же строки.
Для снижения FP добавьте специфичные для Vidar индикаторы:
mutex-имена, характерные User-Agent строки, паттерны
структуры ZIP-архива эксфильтрации из конкретных образцов. */
}
Sigma-правило для SIEM
YAML:
title: Vidar Infostealer Browser Credential Access Pattern
id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
status: experimental
description: >
Detects rapid sequential access to browser credential stores
typical for Vidar Stealer 2.0 multithreaded execution
author: Codeby Threat Research
date: 2025/07/15
logsource:
# NB: Для срабатывания правила требуется телеметрия чтения файлов.
# Sysmon Event ID 11 (FileCreate) НЕ подходит - он не логирует чтение.
# Используется Windows Security Event 4663 (требует настройки SACL
# на целевых директориях). Альтернатива: EDR с file read telemetry
# и кастомным маппингом logsource.
product: windows
service: security
detection:
selection_chrome:
TargetFilename|contains:
- '\Google\Chrome\User Data\Default\Login Data'
- '\Google\Chrome\User Data\Default\Cookies'
- '\Google\Chrome\User Data\Local State'
selection_firefox:
TargetFilename|contains:
- '\Mozilla\Firefox\Profiles\'
TargetFilename|endswith:
- '\logins.json'
- '\cookies.sqlite'
selection_crypto:
TargetFilename|contains:
- '\Exodus\exodus.wallet'
- '\Ethereum\keystore'
- '\atomic\Local Storage'
# NB: timeframe не входит в стандартную спецификацию Sigma (SigmaHQ).
# Для временной корреляции используйте нативные средства SIEM:
# Splunk - transaction с maxspan=30s
# Elastic - EQL sequence с maxspan=30s
# Sentinel - arg_max с time window 30s
condition: ((selection_chrome and selection_firefox) or
(selection_chrome and selection_crypto) or
(selection_firefox and selection_crypto)) and not filter
filter:
Image|endswith:
- '\chrome.exe'
- '\firefox.exe'
- '\MsMpEng.exe'
- '\avp.exe'
- '\1password.exe'
- '\bitwarden.exe'
# Тюнинг обязателен: добавьте бэкап-агенты, менеджеры паролей
# и другие легитимные процессы, характерные для вашей среды.
level: high
tags:
- attack.credential_access
- attack.t1555.003
- attack.collection
- attack.t1005
Охота на вредоносные репозитории через GitHub API
Для threat intelligence инженеров - скрипт для проактивного поиска подозрительных репозиториев, распространяющих malware через github:
Python:
"""
Пример для демонстрации концепции -
поиск подозрительных репозиториев через GitHub Search API.
Адаптируйте под свои нужды.
"""
import requests
import json
from datetime import datetime, timedelta
GITHUB_TOKEN = "ghp_YOUR_TOKEN"
HEADERS = {"Authorization": f"token {GITHUB_TOKEN}"}
# Паттерны, характерные для фейковых репозиториев с малварью
SUSPICIOUS_PATTERNS = [
"cheat free download",
"crack keygen 2025",
"leaked source code",
"claude code leak",
"free hack download",
]
def search_suspicious_repos(query, created_after_days=7):
date_threshold = (datetime.now() - timedelta(days=created_after_days)).strftime("%Y-%m-%d")
url = "https://api.github.com/search/repositories"
params = {
"q": f"{query} created:>{date_threshold}",
"sort": "updated",
"per_page": 30
}
resp = requests.get(url, headers=HEADERS, params=params)
repos = resp.json().get("items", [])
suspicious = []
for repo in repos:
signals = []
# Молодой аккаунт с одним репозиторием
owner = repo["owner"]["login"]
owner_resp = requests.get(
f"https://api.github.com/users/{owner}", headers=HEADERS
)
owner_data = owner_resp.json()
if owner_data.get("public_repos", 0) <= 2:
signals.append("few_repos")
# Есть Releases (бинарники)
releases_resp = requests.get(
repo["releases_url"].replace("{/id}", ""), headers=HEADERS
)
if releases_resp.json():
signals.append("has_releases")
for release in releases_resp.json():
for asset in release.get("assets", []):
if asset["name"].endswith((".exe", ".zip", ".rar", ".msi")):
signals.append(f"binary_release:{asset['name']}")
if len(signals) >= 2:
suspicious.append({
"repo": repo["html_url"],
"created": repo["created_at"],
"signals": signals,
"description": repo.get("description", "")
})
return suspicious
# Запуск сканирования
for pattern in SUSPICIOUS_PATTERNS:
results = search_suspicious_repos(pattern)
for r in results:
print(json.dumps(r, indent=2))
Индикаторы компрометации и атрибуция кампаний
При работе с конкретными образцами Vidar Infostealer из описанных кампаний - источники IOC:- MalwareBazaar - поиск по тегу
vidarдаёт актуальные хэши - ANY.RUN - публичные сессии анализа с полной трассировкой поведения
- Acronis TRU - в оригинальном отчёте опубликованы IOC для кампании с фейковыми читами
Инфраструктуру C2 - операторы Vidar часто используют российские и восточноевропейские хостинги. Dead drop resolver - конкретный Steam-профиль или Telegram-канал, из которого извлекается адрес C2, - стабильный индикатор кампании, который живёт дольше самих C2-серверов. Временные паттерны тоже показательны: кампания с Claude Code была запущена в течение часов после реального инцидента. Это не скрипт-кидди - это организованная группа с мониторингом новостного фона.
Рекомендации по защите от вредоносных репозиториев
Для security-инженеров
Мониторинг загрузок с GitHub Releases. Настройте правило в прокси или NGFW: алерт при скачивании .exe/.msi/.zip из GitHub Releases репозитория, не входящего в whitelist. Да, whitelist - это боль, но альтернатива хуже.Sysmon + Sigma. Разверните Sigma-правило из этой статьи. Дополните мониторингом process creation: неизвестный процесс из директории Downloads обращается к файлам браузерных профилей - красный флаг.
DNS-мониторинг. Отслеживайте цепочку: обращение к steamcommunity.com или api.telegram.org от процесса, который не является Steam или Telegram, с последующим HTTP-запросом к неизвестному домену. Этот паттерн - визитная карточка Vidar.
Для разработчиков и DevOps
Верификация зависимостей. Не используйте бинарники из незнакомых GitHub Releases. Собирайте из исходного кода сами. Да, дольше. Зато без сюрпризов.Проверка репозитория. Перед клонированием оцените: возраст аккаунта, количество других проектов, историю коммитов (один коммит с бинарником - красный флаг), соотношение звёзд к форкам. Пустой аккаунт с одним репозиторием и 50 звёздами - почти наверняка фейк.
Пассивный DNS. При работе с open-source зависимостями проверяйте, не было ли недавних сообщений о typosquatting или supply chain атаках на конкретный проект.
Для пентестеров и CTF-игроков
Эта кампания - готовый кейс для red team и purple team упражнений. Техника «доверенная платформа как вектор доставки» (GitHub, PyPI, npm) активно используется APT-группами. При моделировании атак через цепочку поставок учитывайте:- GitHub Actions можно использовать для автоматической сборки payload
- Releases API позволяет программно обновлять бинарники без изменения коммитов
- Комбинация GitHub + Reddit/Twitter для промоутинга даёт высокую конверсию
Заключение
Vidar Infostealer через фейковые GitHub-репозитории - не экзотика, а масштабируемая операция с сотнями подставных проектов и продуманным social engineering. Серверный криптор, многопоточность, переработанная кодовая база - детектирование по статическим индикаторам тут практически бесполезно.Что работает - поведенческий подход: мониторинг паттернов доступа к файлам (Sigma), проактивная охота на подозрительные репозитории (GitHub API), анализ C2-коммуникаций через dead drop resolver. YARA-правила, Sigma-запросы и скрипты из этой статьи - адаптируйте под свою инфраструктуру и начинайте ловить. А заодно прогоните Python-скрипт по поиску подозрительных репозиториев - результаты могут неприятно удивить.
Последнее редактирование: