Вредоносные коммиты внедрили в 8093 репозитория GitHub ради ключей OpenAI и Anthropic

С 10 по 12 ноября 2026 года злоумышленники разместили вредоносные коммиты в 8093 репозиториях GitHub через 4833 скомпрометированных аккаунта — по данным Aikido Security. Скрипт на 1500 строк собирал ключи OpenAI, Anthropic, Hugging Face, токены GitHub Actions, данные AWS и Azure, после чего изменения откатывались, чтобы замести следы. Отдельно 12 и 13 ноября GitHub пометил вредоносными сборки @rclaude в npm, 19 загрузчиков в PyPI и MCP-сервер для распознавания водительских прав, отправлявший снимки на сторонний IP. Тем, у кого эти пакеты стояли, GitHub советует считать машину скомпрометированной и менять все ключи с другого устройства.
12 и 13 ноября 2026 года GitHub добавил в базу вредоносных пакетов сразу несколько записей, касающихся инструментов для работы с ИИ. Под удар попали две платформенные сборки нативного клиента неофициального сервиса «удалённый Claude Code» в npm, 19 загрузчиков в PyPI из более длинной кампании и MCP-сервер, который пересылал изображения водительских прав на чужой сервер. Накануне, 11 ноября, компания HoneyLabs показала разбор сканера, запрашивавшего у веб-серверов файлы с токенами Claude Code, Cursor и других ассистентов.
Смысл всех трёх историй один: интерес атакующих сместился с облачных ключей и паролей к базам на всё, что лежит вокруг ИИ-агента разработчика — токены подписки, конфигурации MCP с секретами от GitHub и баз, саму программу, которой разрешено выполнять команды на машине. Если что-то из перечисленного у вас установлено или наружу смотрит сервер, раздающий домашний каталог либо чекаут репозитория, это повод проверить хост и сменить ключи.
Атака шире: 8093 репозитория и 4833 аккаунта
13 ноября Aikido Security описала кампанию, в которой GitHub использовался не как источник пакетов, а как площадка для внедрения кода. С 10 по 12 ноября злоумышленники разместили вредоносные коммиты в 8093 репозиториях, для распространения использовались 4833 скомпрометированных аккаунта. Целью стали секреты GitHub Actions, облачные учётные данные и ключи API ИИ-сервисов, включая OpenAI, Anthropic и Hugging Face.
Сначала атакующие проверяли права украденных токенов: открывали pull request с названием «docs: dependency audit notes» и ветки wfx-docs, добавляя небольшой файл с заметками. Всего таких запросов обнаружено 61 879 в 61 734 репозиториях от имени 4833 аккаунтов; около 91% на момент анализа оставались открытыми. В 1343 репозиториях вредоносные коммиты публиковались не от владельцев проектов, а от соавторов и ботов. После проверки доступа код внедряли одним из трёх способов: новый файл рабочего процесса GitHub Actions в пустом репозитории, правка существующих сценариев сборки или скрипт в механизме postinstall пакета npm, который запускается при установке. Из 8093 затронутых репозиториев 7309 получили изменения существующих сценариев CI, 16 — новые рабочие процессы, ещё 771 — вредоносный установочный сценарий; последний опасен тем, что код мог выполняться и на компьютере разработчика.
Основной инструмент — shell-скрипт объёмом около 1500 строк. Он собирает секреты репозитория и переменные GitHub Actions, токены доступа, ключи API, конфигурации облачных сервисов, SSH-ключи, историю команд терминала, файлы окружения и конфигурации ИИ-инструментов, отдельно проверяет память процессов и переменные окружения в поисках учётных данных GitHub и AWS. Собранное отправляется на удалённые серверы или в Telegram. Дальше скрипт пытается закрепиться в облаке через OpenID Connect: в AWS создаёт новые ключи доступа и меняет политики доверия ролей, в Azure добавляет учётные данные в регистрации приложений Microsoft Entra ID, так что рабочие процессы GitHub могут авторизоваться от их имени даже после смены клиентских секретов. В коде есть и попытки доступа к Google Cloud, HashiCorp Vault и Kubernetes.
Следы кампания заметает: после выполнения сценария репозиторий возвращают в прежнее состояние. В одном задокументированном случае вредоносный файл появился в 14:01 UTC и исчез в 14:05, в проектах redock заражённые коммиты откатывались примерно через 50 секунд. Поэтому проверка текущего состояния репозитория ничего не доказывает. За пределами GitHub вредоносный код найден в версии v3.14.3 PHP-пакета neuronai-studio в Packagist и в версиях v1.0.278, v1.0.280 и v1.0.282 Go-модуля redock; ещё один Go-модуль gocurl получил вредоносный коммит, который теперь кэшируется прокси-сервером Go.
- Вредоносными признаны пакеты @rclaude/darwin-x64 0.2.1 (GHSA-gm9f-q9rw-p3gm, 12 ноября) и @rclaude/darwin-arm64 0.2.0 (GHSA-mq7w-jmv5-vq3p, 13 ноября). Машину, где они стояли, GitHub рекомендует считать полностью скомпрометированной.
- Кампания загрузчиков в PyPI под названиями вроде qwen3ttsui и ferrotts насчитывает 83 пакета в базе GitHub, из них 19 добавлены 12–13 ноября.
- MCP-сервер my-mcp-server-driving-license-ocr 0.1.3 не слушал собственную настройку и отправлял снимки документов на 42.193.222.35 по HTTP без шифрования.
- Сканер из Google Cloud, по подсчётам HoneyLabs, за 11 дней сделал 366 845 запросов; в его словаре 32 пути к файлам ИИ-ассистентов, среди них /.claude/.credentials.json.
- Проверка сводится к трём шагам: поискать пакеты в зависимостях, запросить эти пути у своих серверов и заменить все секреты, если что-то обнаружилось.
Чем отличаются сборки @rclaude от официальных
@rclaude/darwin-x64 и @rclaude/darwin-arm64 — не подделки под пакеты Anthropic: платформенные сборки настоящего Claude Code называются @anthropic-ai/claude-code-darwin-arm64 и подобным образом. Это нативные клиенты для macOS к пакету rclaude, появившемуся в npm 9 ноября. По README на китайском, сервис устроен так: Claude Code работает на удалённом сервере rclaude.xyz, а файлы и команды исполняются на компьютере пользователя; ставить сам Claude Code и учётные данные модели не требуется, вход по токену или через браузер.
Там же сказано, что по умолчанию клиент даёт удалённой стороне право менять локальные файлы и выполнять команды, а сужает эти права флаг --read-only. Даже без вредоносного кода такая схема означает, что вашим терминалом управляет чужой сервер. Начиная с версии 0.2.1 клиент, по описанию, сначала обращается к «ускоренной линии» и только при ошибке возвращается на основной сайт, а учётные данные складывает в ~/.rclaude.
Технических деталей в advisory GitHub нет — только стандартный вердикт для малвари: компьютер, где пакет установили или запустили, считается полностью скомпрометированным, все секреты и ключи с него меняются с другого устройства, а удаление пакета не гарантирует исчезновения вредоносного кода. Речь именно о версиях @rclaude/darwin-x64 0.2.1 и @rclaude/darwin-arm64 0.2.0. На 13 ноября этих версий в реестре npm уже нет, остальные сборки (последняя — 0.2.6) и сам пакет rclaude в базе вредоносных не значатся. Что делали помеченные сборки, публично не описано.
83 пакета-загрузчика в PyPI
13 ноября GitHub опубликовал advisory по пакету qwen3ttsui, чьё название отсылает к голосовой модели Qwen3-TTS. Пакет входит в кампанию, которую исследователь под ником kam193 назвал 2026-10-voice-synthesis-profiles. По его описанию, это семейство однотипных загрузчиков: вредоносной нагрузки внутри нет, зато они умеют скачать и выполнить код по заданному URL. Как именно их применяют, неизвестно, но согласованный выпуск множества обманных способов запустить чужой код исследователь считает заведомо вредоносным. Сам qwen3ttsui описан в PyPI как «крошечный загрузчик и запускатель удалённых Python-профилей».
В GitHub Advisory Database по метке этой кампании 83 записи. Первые 43 появились 22 октября, ещё 21 — на следующий день, 15 — 12 ноября и 4 — утром 13 ноября. Примерно половина названий маскируется под синтез и распознавание речи (ferrotts, lumitts, voxcpmttslora, acustoviasr), остальные похожи на утилиты для очередей задач и бенчмарков (taskquay, evalometer, stackvane). Во всех случаях затронута версия 0.1.0.
Добавленные 12–13 ноября: acustoviasr, eulaliatts, evalometer, ferrotts, flowmetry, garviscope, garvisometerui, garvisuite, inframetric, lumitts, melstagen, phoneliasr, qwen3ttsui, spectrova, stackvane, voxcpmttslora, voxgramasr, voxrelitts, wavforge.
Почему MCP-сервер для распознавания прав попал в чёрный список
my-mcp-server-driving-license-ocr даёт агенту инструмент analyze_image для распознавания водительских удостоверений. Согласно advisory, основанному на находке Amazon Inspector, в версии 0.1.3 инструмент принимает ссылку на картинку или её байты в base64 и отправляет POST-запросом на http://42.193.222.35:8000/ocr_pic. Адрес читается из переменной окружения MY_API_URL, но тут же перезаписывается захардкоженным IP, так что перенаправить запросы на свой сервер не получится. Издатель этот адрес никак не раскрыл, соединение идёт без TLS, а получатель видит изображения документов с персональными данными.
Все пять опубликованных версий проверены: в 0.1.0–0.1.2 и в последней 0.1.5 адрес берётся только из MY_API_URL, захардкоженный IP есть лишь в 0.1.3. В 0.1.5 сообщение об ошибке отсылает к настройкам на ModelScope, китайской площадке моделей и MCP-серверов. Отладка это была или сознательный сбор данных, по коду не определить, но для пользователя итог один: документы уходили на неизвестный сервер. Для MCP-серверов из каталогов это наглядный пример, почему код инструмента читают до подключения, а версии фиксируют.
Кто ищет .claude/.credentials.json на веб-серверах
HoneyLabs содержит сеть ловушек-honeypot и разобрала незапрошенный трафик с 27 августа по 9 ноября 2026 года. 4 сентября сканер из Google Cloud (AS396982), который с 27 августа ежедневно перебирал одни и те же 543 пути (логи Laravel, ключи почтовых сервисов, дампы баз), за одну секунду добавил в список 49 новых. Из них 32 относятся к ИИ-ассистентам: /.claude.json, /.claude/settings.json, /.claude/.credentials.json, /.cursor/mcp.json, /.windsurf/mcp.json, /.aider.env, /.continue/config.json, /.mcp.json, /.vscode/mcp.json, /litellm_config.yaml и другие. В /.claude/.credentials.json Claude Code хранит OAuth-токены на машине без системного хранилища ключей, а MCP-конфиги в блоке env держат токены от GitHub, баз и Slack. Оставшиеся 17 путей — история и стартовые файлы оболочки вроде /.zsh_history и /.bashrc, где тоже оседают строки вида export ANTHROPIC_API_KEY=....
За первые 11 дней наблюдения сканер отправил 366 845 запросов с 2 894 адресов, причём 2 499 из них встречались лишь один день — похоже на короткоживущие облачные машины, поэтому блокировка по IP почти бесполезна. Запросы шли на 203 порта, и 443 оказался только 28-м по нагрузке; чаще всего стучались на 8190, 8085 и 4567, где обычно висят открытые внутренние панели и dev-серверы. Файлы ИИ-ассистентов этот сканер запрашивал с 4 по 7 сентября, 8 сентября исчез, но другие клиенты продолжили: с 8 сентября по 9 ноября HoneyLabs насчитала 8 067 таких запросов, хотя бы несколько каждую неделю. Для масштаба: только за неделю с 4 сентября их было 18 707.
Оговорка авторов существенна: ловушки видят лишь то, что сканеры спрашивают, и установить, ответил ли им хоть один настоящий сервер, нельзя. Первые такие запросы ещё в июле описал SANS Internet Storm Center на логах одного небольшого хостинга, а к сентябрю эти пути попали в общий словарь для поиска учётных данных.
Что проверить на своей машине
- npm: выполните npm ls -g --all для глобальных установок и npm ls --all в проектах (платформенные сборки приходят как необязательные зависимости rclaude), загляните в каталог ~/.rclaude. Если стояли @rclaude/darwin-x64 0.2.1 или @rclaude/darwin-arm64 0.2.0, по рекомендации GitHub считайте машину скомпрометированной и меняйте с другого устройства все ключи и токены, которые на ней были.
- PyPI: поищите пакеты кампании в окружениях и lock-файлах, например pip list | grep -iE 'tts|asr|qwen3ttsui|garvi|wavforge|spectrova', и сверьтесь с полным списком в базе GitHub по метке кампании. Сам загрузчик ничего не крадёт, но скачанный и выполненный им код мог сделать что угодно.
- MCP: если подключали my-mcp-server-driving-license-ocr, проверьте версию — 0.1.3 отправляла картинки на сторонний IP. Документы, прошедшие через неё, стоит считать утёкшими.
- Веб-серверы: запросите у своих хостов пути /.claude.json, /.claude/.credentials.json, /.cursor/mcp.json, /.mcp.json, /.aider.env. Код 200 сам по себе ничего не доказывает: сайт может отдать обычную страницу. Откройте тело ответа; если там действительно лежит запрошенный файл, корень сайта указывает на домашний каталог или чекаут, и все секреты из этого файла нужно заменить — для MCP-конфига это каждый токен в блоке env.
- Блокировка по путям: адреса сканеров меняются ежедневно, поэтому HoneyLabs советует отсекать сами пути, например одним блоком location в nginx.
- GitHub и облака: если в ваших репозиториях появлялись чужие pull request с ветками wfx-docs, проверяйте не текущее состояние, а историю Actions и логи запусков за 10–12 ноября. Заражённые коммиты откатывались за секунды и минуты, поэтому чистое дерево проекта ничего не опровергает. После кампании в Aikido Security советуют перевыпустить токены GitHub Actions и ключи AWS, Azure, Google Cloud, а в AWS и Azure отдельно проверить роли: скрипт добавлял свои ключи доступа и доверенные учётные данные приложений, которые переживают смену пароля.
Те же файлы утекают и через Git: в начале ноября Apiiro обнаружила 1 122 публичные копии .claude/settings.local.json с настоящими секретами. Мартовская атака на LiteLLM показала, как пакет для работы с нейросетями превращается в стилер секретов разработчика. Каталоги .claude/, .cursor/ и MCP-конфиги на ноутбуке и сервере стоит защищать так же, как .env.
Чего пока не известно
Число пострадавших не названо ни по одному из пакетов. GitHub не объяснил, что именно делали помеченные сборки @rclaude, и не пометил остальные версии. У кампании загрузчиков в PyPI неизвестна полезная нагрузка, которую они должны были скачивать. HoneyLabs не может сказать, получил ли сканер хоть один настоящий файл с токенами. Aikido Security не сообщила, сколько ключей OpenAI, Anthropic и облачных сервисов фактически попало к атакующим и каким из 4833 аккаунтов владельцы уже вернули контроль.
Tproger · права на исходный материал принадлежат автору.
Материал носит информационный характер и не является индивидуальной инвестиционной рекомендацией. Операции с криптовалютами связаны с риском полной потери вложенных средств. Подробнее — «Отказ от ответственности».
Разборы событий, итоги дня и то, что двигает рынок. Без сигналов и обещаний — только факты и что они значат.
Читать в Telegram →По теме
- ▪Anthropic купила у OnePWR Solutions газовые генераторы на 3,4 млрд долларовХабр ИИ · 13 ноября
- ▪Минторг США готовит запрет на удалённый доступ к американским ускорителямiXBT · 13 ноября
- ▪В весах шести китайских ИИ-моделей нашли следы ускорителей Nvidia BlackwelliXBT · 13 ноября
- ▪Microsoft Research внедрила бэкдор в языковую модель, изменив менее 10 нейроновiXBT · 13 ноября