Статья Vidar Infostealer через фейковые GitHub-репозитории: полный разбор атаки и детекшн

Vidar Infostealer через фейковые GitHub-репозитории: supply chain атака и распространение malware через Releases


В мае 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. Схема атаки:
  1. Создание репозитория. Название содержит ключевые слова типа «CS2-cheat», «free-aimbot», «valorant-hack». README оформлен со скриншотами, инструкциями по установке, иногда даже с фейковыми issues и discussions - чтобы создать видимость живого проекта.
  2. Промоутинг через Reddit. Операторы постят в игровых сабреддитах, продвигая «бесплатные читы» со ссылками на GitHub. Throwaway-аккаунты, но с достаточной историей, чтобы пройти базовую модерацию.
  3. Payload в Releases. Вредоносный бинарник лежит не в коде репозитория (это бы спалилось статическим анализом GitHub), а в секции Releases как скомпилированный архив. Жертва скачивает «готовый чит», распаковывает, запускает - и получает Vidar 2.0 вместо aimbot.
Для пентестеров и CTF-игроков тут принципиальный урок: GitHub Releases - слепая зона. Код в репозитории можно проверить через code review, но бинарник в Releases - просто файл, привязанный к тегу. Никакого автоматического сканирования при загрузке GitHub не проводит. Вообще.

Поддельный слив исходного кода 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 меняется между сборками
  • Строковые константы шифруются разными ключами
При загрузке образца в IDA Pro или Ghidra картина типичная для криптованных стилеров: огромный blob зашифрованных данных в секции .data и компактный цикл декриптора в entry point. Криптор билдера меняет именно этот декриптор и ключи, сохраняя внутренний payload неизменным. По сути - матрёшка, где внешний слой каждый раз новый, а начинка та же.

Если работаете с распаковкой в 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 - снимает скриншот рабочего стола
Многопоточность тут не для красоты - весь процесс кражи данных занимает секунды. При динамическом анализе в ANY.RUN вы увидите характерный паттерн: массовое обращение к файлам профилей браузеров и конфигурационным файлам в короткий промежуток времени. Буквально - пылесос, который за 10-15 секунд высасывает всё ценное.

Техники антианализа и обфускация​

При реверсе образцов 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):
  1. Стилер обращается к легитимной платформе (Steam community profile, Telegram API)
  2. Из описания профиля или сообщения извлекает закодированный адрес реального C2
  3. Устанавливает HTTP/HTTPS-соединение с C2
  4. Отправляет собранные данные в ZIP-архиве
При анализе трафика обращайте внимание на последовательность: сначала DNS-запрос к легитимному домену (steamcommunity.com, api.telegram.org), затем - запрос к неизвестному IP или домену. Это характерный поведенческий паттерн, который можно ловить в SIEM. Если процесс, не являющийся Steam, лезет на steamcommunity.com, а через пару секунд стучится на какой-нибудь 185.x.x.x - это красный флаг.

Практический анализ: пошаговый разбор образца​

Вот конкретный воркфлоу, который я использую при анализе подозрительных бинарников из 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]}')
"
Высокая энтропия секций (>7.0) - первый индикатор упаковки или шифрования. Для Vidar 2.0 с автоморфером характерна энтропия секции .data близкая к 8.0 (теоретический максимум для случайных данных). Видите 7.9 в .data - можете почти не сомневаться, там крипт.

Шаг 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-архива эксфильтрации из конкретных образцов. */
}
Правило ловит не только Vidar, но и другие infostealer с похожим поведением - для первичного триажа это нормально. Для точечной детекции конкретно Vidar 2.0 нужны строки из распакованного образца, а они уникальны для каждой морфированной сборки. Тут уж без ручной работы никуда.

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
Ключевой момент - временная корреляция (~30 секунд). Легитимный браузер обращается к своим файлам при запуске, но одновременный доступ к профилям Chrome, Firefox и крипто-кошелькам за 30 секунд от одного процесса - это однозначно вредоносное поведение. Реализуйте временное окно нативными средствами вашего SIEM (см. комментарии в правиле).

Охота на вредоносные репозитории через 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))
Скрипт ищет репозитории по подозрительным ключевым словам, созданные за последнюю неделю, и проверяет два сигнала: владелец с минимумом репозиториев и наличие бинарных файлов в Releases. Два совпадения - повод для ручной проверки. Скрипт простой, но на практике выгребает интересное - потренируйтесь на паттерне «free hack download» и удивитесь количеству результатов.

Индикаторы компрометации и атрибуция кампаний​

При работе с конкретными образцами 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 для промоутинга даёт высокую конверсию
На одном red team проекте мы воспроизвели похожую схему (с согласия заказчика, разумеется) - 14% сотрудников скачали и попытались запустить «утилиту» из фейкового репозитория. Четырнадцать процентов. Это к вопросу об эффективности вектора.

Заключение​

Vidar Infostealer через фейковые GitHub-репозитории - не экзотика, а масштабируемая операция с сотнями подставных проектов и продуманным social engineering. Серверный криптор, многопоточность, переработанная кодовая база - детектирование по статическим индикаторам тут практически бесполезно.

Что работает - поведенческий подход: мониторинг паттернов доступа к файлам (Sigma), проактивная охота на подозрительные репозитории (GitHub API), анализ C2-коммуникаций через dead drop resolver. YARA-правила, Sigma-запросы и скрипты из этой статьи - адаптируйте под свою инфраструктуру и начинайте ловить. А заодно прогоните Python-скрипт по поиску подозрительных репозиториев - результаты могут неприятно удивить.
 
Последнее редактирование:
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы