threat-actor · litellm · agentic-ai · credential-theft · china-nexus
keyHunter: операция по краже ключей LLM-прокси, раскрывшая собственный инструментарий
Китаеязычный оператор прочёсывает FOFA в поисках открытых панелей AI-прокси, проверяет их покрытым юнит-тестами кодом, написанным для распознавания приманок, и выгружает API-ключи. Его агент выполнил вызовы инструментов от ловушки Kinryū Labs на собственном хосте и вернул 283 пути к файлам, результаты сканирования, журнал переписки WeChat и каталог результатов с файлами эксплойтов, названными по шести CVE 2026 года, среди которых обход Stripe-вебхука в New-API.
Автор Davis Zheng·
TLP:CLEAR. Согласовано к публикации. Почти всё изложенное ниже представляет собой собственный материал оператора, полученный в тот момент, когда его агент выполнил вызовы инструментов от ловушки Kinryū Labs на собственном хосте и отправил вывод обратно. Индикаторы обезврежены, то есть адреса атакующего записаны так, чтобы их нельзя было случайно кликнуть или разрешить. Цели сканирования, один сторонний хост, который оператор пометил, и его FOFA API-ключ целиком не публикуются.
Краткое резюме
- 27,173хостов-кандидатов прочёсано через FOFA
- 194из них перечислили модель
- 17API-ключей выгружено
- 6CVE 2026 года, по именам файлов
Китаеязычный оператор прочесал 27,173 хоста в восьми странах ради одной цели: открытых панелей AI-прокси с живыми ключами за ними. Панель AI-прокси представляет собой ПО, которое команды ставят между своими приложениями и платными провайдерами моделей, чтобы один набор ключей провайдера можно было использовать сообща; таковы, например, LiteLLM, One-API и её форк New-API, Sub2API и Chat2API. Оставьте такую панель в интернете без пароля, и всё, что за ней стоит, смогут тратить посторонние. Оператор находит их через FOFA, поисковую систему поверх непрерывного сканирования всего интернета и китайский аналог Shodan, проверяет, какие панели ещё отвечают, и выгружает ключи.
Эти цифры принадлежат самому оператору, они взяты из его файлов с результатами, а не оценены нами. Из тех 27,173 хостов 194 перечислили модель, а 17 ключей попали в файл выгрузки. Прогон по США оказался самым показательным отдельным случаем: 10,447 целей на входе, 64 перечисления моделей на выходе, доля попаданий 0.61%, и его собственный агент мог объяснить почему. Публично открытый и по-настоящему вызываемый LiteLLM встречается редко, а ошибка в построении URL в его сканере помечала живые хосты как мёртвые.
- Это операция из Китая, на китайском языке и исключительно на китайской инфраструктуре. У каждого восстановленного файла временная метка
+0800, рабочий язык на всём протяжении китайский, а тремя хостами выступают Alibaba Cloud, Tencent Cloud и сканирующая ВМ на Huawei Cloud. Высокая уверенность. - Инструментарий собственный и покрыт юнит-тестами, а не взят с полки.
litellm_verifier.pyпоставляется с тремя тестовыми файлами, в каталоге резервных копий лежитSHA256SUMS, а работа разбита на пронумерованные раунды. Такая инженерная дисциплина нетипична для сбора учётных данных. Высокая уверенность, взято из собственных листингов файлов оператора. - Они встраивают противодействие обману, и оно работает. Их верификатор отказывается засчитывать листинг
/v1/modelsза успех, требует реального ответа чата по каждой модели, оценивает, соответствует ли ответ заявленному вендору, и в одном прогоне отнёс 20 из 41 проверенной записи о модели кhoneypot_or_unusable. Высокая уверенность. - Набор эксплойтов целиком n-day. Имена их файлов с результатами соответствуют шести бюллетеням 2026 года по LiteLLM, Sub2API и New-API, один из которых входит в список известных эксплуатируемых уязвимостей CISA. Ничто не указывает на оригинальное исследование уязвимостей. Высокая уверенность в продуктах и техниках, умеренная в конкретных CVE для четырёх из шести, которые выведены из имён файлов, а не наблюдались.
- Версия про конкурс не выдерживает встречи с каталогом результатов. Своему агенту они говорят, что область работ ограничена только учётными данными по умолчанию, однако имена файлов в каталоге называют удалённое выполнение кода, SQL-инъекцию, инъекцию шаблонов, подделку запросов на стороне сервера, утечку токенов, переполнение квоты и обход Stripe-вебхука. У нас есть листинг, а не тела файлов, поэтому намерение остаётся открытым, но оператор написал и запустил этот инструментарий при любом из прочтений. Высокая уверенность в артефактах, умеренная в том, какое прочтение намерений верно.
О названии
Мы отслеживаем это как keyHunter, по названию /root/keyHunter-skill/, собственного проектного каталога оператора.
Агентный фреймворк, которым они управляют, называется Hermes, и Hermes является реальным опенсорсным проектом от Nous Research. Назвать актора его именем значило бы обвинить легитимный инструмент в том, что с его помощью сделал кто-то другой, поэтому мы так не делаем. То же относится к OpenClaw, второму агентному фреймворку на этой машине. И то и другое представляет собой обычное ПО, которое оператор установил и нацелил на чужую инфраструктуру.
Оператор
Оператор работает с трёх хостов, все на китайских облаках, и работа поделена между ними. 39.98.82[.]200 на Alibaba Cloud (AS37963) держит шлюз агента и выполнил большую часть замеченной нами разведки. 101.43.41[.]72 на Tencent Cloud (AS45090) выступает релеем: он отдаёт совместимый с OpenAI эндпоинт на порту 8087, к которому агент обращается за мощностями моделей. У них общий отпечаток JA4H po11nn070000_ebbca96fac43, который описывает, как клиент собирает свои HTTP-запросы, и переживает смену адреса, вместе с нестандартными user-agent’ами Hermes-Agent/0.18.0 и Hermes-Panel/1.0 и единым общим идентификатором сессии чата. В совокупности это относит оба узла к одному оператору. Этот отпечаток не является артефактом единичного захвата: два разных сенсора в разных регионах зафиксировали его независимо в период с 16 по 20 августа, оба раза в ходе одного и того же прочёсывания через FOFA.
Само сканирование опять же происходит в другом месте. С хоста Alibaba они дотягиваются до ВМ на Huawei Cloud через локальный проброс:
ssh -o ServerAliveInterval=20 -i /root/.ssh/hw_vm_key -p 8888 [email protected] \
'cd /home/developer && /home/developer/.venv-us30/bin/python litellm_scan_us_30d_optimized.py'
Эта машина была в аптайме четыре дня и девять часов, имеет 7.5 GB оперативной памяти и четыре ядра и крутит воркеры сканирования. Отделение шумного сканирования от фронтенда агента представляет собой осознанный выбор, а имя hw_vm_key говорит, что оператор считает её хуавэевской машиной.
Управление идёт через WeChat. Сервис шлюза описывает себя как «Hermes Agent Gateway, Messaging Platform Integration», и оператор ставит агенту задачи, переписываясь с ним в ветке WeChat. Долговременной памятью агента служит та самая переписка: он ищет по собственной истории чата, чтобы вспомнить, над чем работает. Второй фреймворк показывает тот же паттерн, с сессией под именем openclaw-weixin. Потребительский мессенджер даёт дешёвый канал управления: трафик по умолчанию зашифрован и уходит в Tencent вместе с трафиком всех остальных пользователей WeChat, поэтому он не срабатывает ни на чём, что настроено на маячки командного управления.
Движком рассуждений за всем этим служит github_copilot/gpt-5.6-sol, коммерческий ассистент для кода, доступный через релей. В их конфигурации также прописаны опциональные ключи для нескольких других провайдеров. Наступательный код написан на собственном Python; движок рассуждений, агентный фреймворк и лежащий в его основе канал управления через WeChat, все они представляют собой готовые потребительские продукты.
Конвейер
Их мастер-скилл описывает всю операцию в одну строку: “Discover, scan, verify, and archive publicly exposed AI API proxy panels (LiteLLM, Sub2API, New-API, One-API) using FOFA + keyHunter + custom verification scripts.”
FOFA search, per country
-> dedupe and normalise targets
-> light HTTP fingerprint
-> /v1/models listing
-> real chat completion per model
-> honeypot classification
-> weak-credential panel login, key extraction
-> export keys and accounts, archive
Обнаружение сводится к единственному FOFA-запросу, повторяемому для каждой страны:
(title="LiteLLM" || body="LiteLLM") && country="{cc}" && org!="AMAZON-AES"
Значимой здесь является часть с исключением AWS. Оператор отфильтровывает Amazon из каждого прочёсывания ещё до того, как посмотреть хоть на один хост. Блокировка диапазонов Shodan и Censys на вашем периметре ничего не даёт против конвейера, построенного на чужих данных сканирования.
Под каждую страну они держат отдельные скрипты: litellm_scan_hw.py для США, litellm_scan_gb_hw.py, litellm_scan_it_hw.py, litellm_scan_us_30d_optimized.py с собственным virtualenv и ещё один набор под keyHunter-skill/, покрывающий Австралию, Бразилию, Канаду, Францию, Индию, Нидерланды и Сингапур. Файлы с результатами есть по четырнадцати странам. Параллелизм составляет 48 лёгких воркеров и 12 глубоких, с отступом при ограничении скорости на ответы 429 от FOFA и дедупликацией эндпоинтов по протоколу, хосту и порту.
FOFA API-ключ зашит в исходном коде сканера, вот откуда он у нас. Сканер работает против неофициального зеркала FOFA на hamal.cc[.]cd и выходит наружу через локальный прокси Squid.
Что на самом деле возвращает прочёсывание
| Страна | Цели FOFA | Перечислено моделей | Доля попаданий |
|---|---|---|---|
| США | 10,447 | 64 | 0.61% |
| Китай | 6,329 | 83 | 1.31% |
| Южная Корея | 1,772 | 10 | 0.56% |
| Великобритания | 1,422 | 18 | 1.27% |
| Италия | 1,130 | 9 | 0.80% |
| Австралия, Индия, Бразилия | 6,073 | 10, из них 4 подтверждены | 0.16% |
Один захваченный прогон: 2,255 сырых строк из FOFA, 1,130 уникальных эндпоинтов после дедупликации, 9 сайтов, перечисливших модели, 8 подтверждённых, а на уровне запросов 41 успех по моделям против 8 неудач.
Собранная ими перепись заголовков FOFA показывает, как выглядит открытая популяция. LiteLLM API - Swagger UI возвращает 7,630 результатов. OmniRoute возвращает 171, SillyTavern 170, LiteLLM Dashboard 156, Claude Code Hub 131, Aivar AI Gateway 11. Большая часть поверхности приходится на один продукт, а большинство открытых экземпляров этого продукта представляют собой автоматически сгенерированную страницу документации API.
Итоговый выход на дальнем конце мы оцениваем как низкий в абсолютном выражении. litellm_extracted_keys.json фиксирует 43 экземпляра и 3 извлечённых ключа по 23 моделям. exported_keys.json содержит 17. Десятки тысяч хостов, прочёсанные ради семнадцати ключей, означают либо плохую отдачу на усилия, либо довод в пользу того, что усилия дёшевы, потому что работу делает агент.
Противодействие обману: они охотятся на приманки
Инженерия виднее всего в одном файле, litellm_verifier.py.
В нём десять килобайт и набор юнит-тестов. Он шлёт реальный минимальный запрос чата каждой модели, которую рекламирует панель, и засчитывает успех только на валидном ответе в форме OpenAI choices/message/content или на легитимном потоковом ответе с маркером завершения. Их собственное правило, их же словами: голый успех по /models не считается никогда. Имена тестов это кодируют, в том числе один под названием test_models_listing_alone_is_not_success. Кто-то написал регрессионный тест, чтобы их собственный инструментарий не врал им о краденом ключе.
Счётчики вердиктов из одного прогона:
verdict_counts: honeypot_or_unusable 20 · trusted_pass 5 · unavailable 16
formatted_false_success_model_hits 29
non_chinese_evidence_count 13
total_questions 205
formatted_false_success, это заготовленный или отражённый ответ, именно так отвечает наивная ловушка. non_chinese_evidence оценивает, ведёт ли себя модель как вендор, которым себя называет. Они также прогоняют допрос из пяти вопросов, 蜜罐五题测试, и в захваченном окне применили его, чтобы пометить хост в лондонском диапазоне AWS как приманку. Этот адрес мы не раскрываем, потому что это чужой сенсор, и назвать его значит его сжечь.
Покупатель краденого инференса теперь исходит из того, что эндпоинт может быть ловушкой, и проверяет это, из-за чего низкоинтерактивная приманка на этой поверхности почти бесполезна. Встречная проверка, которая их ловит, запускает тот же тест наоборот: любой клиент, который просит ваш шлюз доказать, какую модель он на самом деле запускает, вопреки параметру API, проверяет товар.
Арсенал эксплойтов: целиком n-day
Содержимое их файлов с результатами эксплуатации до нас так и не дошло. Имена файлов дошли, а их цели представляют собой опенсорсные продукты с публичными бюллетенями, так что эксплойты восстановимы по бюллетеням.
| Файл с результатами на их хосте | CVE | Уязвимость | Основание |
|---|---|---|---|
litellm_host_header_bypass_results.json (568 KB) | CVE-2026-49468 | Обход аутентификации LiteLLM через инъекцию заголовка Host, CVSS 9.8, до 1.84.0. Рассинхронизирует аутентификацию с маршрутизацией, открывая неаутентифицированные /key/generate и /user/new | Подтверждено: те же вызовы административной плоскости летели в нашу ловушку, и они предъявляли user-agent CVE-2026-49468-Scanner |
litellm_sqli_apikey_results.json (517 KB), litellm_sqli_models.json | CVE-2026-42208 | SQL-инъекция LiteLLM до аутентификации на пути авторизации | Подтверждено: они выпустили ' OR '1'='1 по нашему полю ключа девятнадцать раз |
litellm_rce_exploit.json, litellm_mcp_rce_results.json | CVE-2026-42271 | Инъекция команд и удалённое выполнение кода в LiteLLM, CVSS 8.7, в списке известных эксплуатируемых уязвимостей CISA, с 1.74.2 по 1.83.6, включая вектор инъекции через MCP | Выведено из имени файла и продукта |
sub2api_cve_exploit.json и три более поздние фазы | CVE-2026-27812 | Отравление сброса пароля в Sub2API через доверенные заголовки Host и Forwarded, ведущее к захвату учётной записи. Эксплуатируется в реальных условиях, до 0.1.85 | Выведено |
newapi_stripe_bypass_results.json, newapi_stripe_exploited.json, newapi_quota_overflow_results.json | CVE-2026-41432 | Обход проверки подписи Stripe-вебхука в New-API из-за пустого секрета, дающий неограниченную квоту без оплаты, до 0.12.10 | Выведено |
newapi_user_token_leak_results.json, oneapi_user_token_leak_results.json, newapi_ssrf_bypass_results.json | CVE-2026-30886 | Небезопасная прямая ссылка на объект (IDOR) и обход аутентификации в New-API на эндпоинте видео-прокси, раскрывающие контент других пользователей и позволяющие атакующему тратить учётные данные жертвы у вышестоящего провайдера | Выведено |
litellm_ssti_prompts_results.json | нет единого бюллетеня | Серверная инъекция шаблонов Jinja2 против эндпоинтов промптов и шаблонов | Выведено |
Содержимое ни одного файла до нас не дошло; каждая строка держится на имени файла. По двум из них мы независимо наблюдали, как техника приходит на наш собственный сенсор, а именно обход через заголовок Host и SQLi в аутентификации, что подтверждает технику, а не файл. Остальные четыре держатся на имени файла плюс известном бюллетене по продукту и помечены соответствующим образом.
Паттерн по всем шести одинаков. Каждый бюллетень от 2026 года, несколько из одного и того же квартала, и ничто из этого не является оригинальным исследованием. keyHunter ставит на поток недавно раскрытые уязвимости высокой критичности в опенсорсной экосистеме LLM-прокси в тот же момент, как они выходят. Это короткое окно, на классе ПО, который часто ставит один разработчик, а потом оставляет без внимания.
Намерение: версия про конкурс против каталога результатов
Оператор описывает это своему агенту как конкурсную заявку. Лексика последовательна во всём восстановленном чате: 比赛项目 (конкурсный проект), 评委 (жюри), 答辩材料 (материалы для устной защиты), каталог contest-kit, и работа, разбитая на 第一轮 и 第二轮, первый и второй раунды.
На вопрос об области работ оператор прямо заявляет, что целью являются учётные данные по умолчанию, в оригинале:
llm 的主要就是那几个默认密码为主流,用自己的 sk 那种没办法抓到啊
Для LLM в основном преобладают те несколько паролей по умолчанию; те, что используют собственные ключи
sk-*, никак не выудить.
Агент соглашается и подтверждает, что попытки аутентификации ограничены тремя случаями: без аутентификации, sk-test и sk-1234, последний из которых является ключом из собственной документации быстрого старта LiteLLM.
Далее есть /root/keyHunter-skill/results/. Его листинг называет файлы под удалённое выполнение кода, SQL-инъекцию, инъекцию шаблонов, подделку запросов на стороне сервера, перехват сессий против Sub2API, распыление учётных данных, утечку пользовательских токенов, переполнение квоты и два под обход Stripe-вебхука, один из них newapi_stripe_exploited.json. У нас есть имена и, для некоторых, размеры: результаты обхода Stripe доходят до 2.4 MB, хотя их содержимое до нас так и не дошло. Обоснованное утверждение таково: оператор написал и запустил инструментарий обхода оплаты с неограниченной квотой против New-API, а CVE-2026-41432 представляет собой реальную уязвимость ровно такого рода. Являются ли эти 2.4 MB записей завершёнными мошенническими пополнениями или лишь попытками, нам не видно. _exploited в имени файла является словом самого оператора; записи мы не читали.
Мы оставляем оба прочтения открытыми. Конкурс может быть настоящим, а эксплуатация представляет собой отдельное направление работ, которое оператор не обсуждает с агентом, ведущим логи; либо конкурс может быть прикрытием для операции по краже. Мы оцениваем это различие как несущественное для защитников: возможность и риск для открытой панели идентичны при любом из прочтений.
Пробел в методике: собственный агент оператора провёл аудит инструментария
Самый полезный фрагмент восстановленного чата представляет собой код-ревью. Оператор спросил своего агента, почему доля попаданий при сканировании такая низкая, и агент прошёл по сканеру строка за строкой.
Ответ агента, сведённый к тому, что пригодится защитнику: сканер добавляет протокол в начало поля host из FOFA, которое зачастую уже его содержит, порождая URL вида https://https://<target>, из-за чего живые хосты записывались как мёртвые. Пул потоков собирает результаты в порядке создания, а не по мере готовности, поэтому один медленный запрос блокирует всё, что стоит за ним. CONCURRENCY=200 на четырёхъядерной машине сам себе создаёт таймауты. Дедупликация по IP отбрасывает другие валидные порты на том же адресе. Жёсткая фиксация temperature принимает ошибку совместимости за неудачу.
По их детекции приманок агент был прям: она судит в основном по тому, идентичен ли ответ или короче пяти символов, что убивает нормальные модели и пропускает хорошие ловушки. И несмотря на просьбу оператора выявлять некитайских отвечающих, в коде не было вообще никакой логики определения языка.
Он также отметил их гигиену безопасности: FOFA-ключ, зашитый в скрипте, абсолютные пути, прописанные под /root, тогда как фактический пользователь /home/developer, except: pass, проглатывающий любую причину сбоя, отдельная копия скрипта под каждую страну и файлы с результатами, хранящие цели и методы аутентификации без какого-либо контроля доступа или редактирования.
Последний пункт переосмысляет воронку. Доля попаданий 0.61% по США измеряет открытость через сканер с известными багами, так что реальная доля открытого LiteLLM выше, чем показывают собственные результаты оператора. Теперь у них есть агент, который будет и дальше чинить эти баги.
Инфраструктура монетизации
На том же хосте крутится их собственный экземпляр New-API: calciumion/new-api:latest в Docker, опубликованный на порту 8901, с данными, примонтированными рядом с результатами сканирования. Вокруг него лежат newapi_watchdog.py, файл резервной копии каналов и упакованная копия всего целиком.
New-API представляет собой агрегирующую панель. Она берёт кучу ключей вышестоящих провайдеров и представляет их как один API с собственными пользовательскими учётными записями и квотами. Поднять такое рядом с конвейером по сбору ключей имеет очевидную цель: собранные ключи становятся каналами в панели, а панель становится доступом, который можно продать. Мы не наблюдали перепродажи и не утверждаем её; но обвязка под неё установлена и работает.
Сотни похожих бесплатных роутеров, построенных на шаблонах sub2api и new-api, уже ходят по рукам, и keyHunter является одной из операций внутри этой экосистемы.
Кластерные связи
Отпечатки клиента связывают эти два хоста с рыхлым набором других, работающих по той же поверхности: тайваньский хост, гоняющий сканы CVE и чеканку ключей, гонконгский хост, бросающий ту же SQL-инъекцию, и на один шаг дальше, охотник за LLM-панелями и эксплуататор Ray-дашбордов, чьи однодневные всплески пришлись на 15 и 21 августа, с разницей в шесть дней. Пересечения местами идут на типовых клиентских стеках, так что это читается как общий инструментарий и общая сцена, а не одна рука за одной клавиатурой. Воспринимайте это как связанное с Китаем сообщество, делящееся инструментарием для охоты на LLM-прокси. Ни один индикатор не связывает это с названной APT, поэтому мы отслеживаем это как кластер активности.
Индикаторы компрометации
Сеть и инфраструктура, обезврежено:
| Индикатор | Роль |
|---|---|
39.98.82[.]200 | Шлюз агента, разведка, SQL-инъекция (Alibaba Cloud, AS37963, CN) |
101.43.41[.]72 | Эндпоинт-релей на порту 8087, делегированный воркер-субагент (Tencent Cloud, AS45090, CN) |
hamal.cc[.]cd | Неофициальное зеркало FOFA, к которому обращается сканер |
cae332848db5… | Собственный FOFA API-ключ оператора, зашитый в litellm_scan_hw.py. Здесь усечён; полное значение сохранено для передачи в FOFA, а не для публикации |
Отпечатки клиента и user-agent’ы:
po11nn070000_ebbca96fac43_00000000 shared across both nodes
Hermes-Agent/0.18.0
Hermes-Panel/1.0
Mozilla/5.0 (CVE-2026-49468-Scanner)
Артефакты хоста. Это пути на машинах оператора, полезные для поиска похожего хоста или второго развёртывания:
/home/developer/litellm_verifier.py real-chat verifier and honeypot classifier
/home/developer/test_litellm_verifier.py unit tests
/home/developer/litellm_endpoint.py endpoint normalise and dedupe
/home/developer/litellm_scan_hw.py FOFA scanner, US, AWS excluded
/home/developer/litellm_scan_gb_hw.py
/home/developer/litellm_scan_it_hw.py
/home/developer/litellm_scan_us_30d_optimized.py
/home/developer/contest-kit/keyHunter-skill/
/home/developer/backups/litellm_verifier_round2_<ts>/SHA256SUMS
/root/keyHunter-skill/results/
/root/keyHunter-skill/{honeypot_test.py, verify_country_models.py, add_to_panel.py, report.py}
/root/.ssh/hw_vm_key key to the scanning VM, [email protected]:8888
/opt/hermes-simple-panel/app.py config panel, port 9120
/root/new-api.tar.gz, /root/newapi_watchdog.py
Имена скиллов и проектов, самые сильные одностроковые точки поворота:
keyhunter / keyHunter
contest-kit
ai-proxy-panel-audit
fofa-panel-recon
delegation-orchestration
Поведенческие:
FOFA: (title="LiteLLM" || body="LiteLLM") && country="XX" && org!="AMAZON-AES"
auth: no credential, then sk-test, then sk-1234
SQLi: ' OR '1'='1 in the API key field
verify: a real chat completion per advertised model; a /models listing alone is rejected
verdict strings: honeypot_or_unusable, trusted_pass, unavailable,
formatted_false_success, non_chinese_evidence
services on actor infra: new-api :8901, config panel :9120, agent gateway
Обнаружение
Если у вас есть LLM-прокси, достижимый из интернета, вся эта последовательность видна в собственных логах шлюза. В Sigma, вендоронезависимом формате правил, который умеет импортировать большинство SIEM-платформ:
title: AI proxy panel enumeration consistent with keyHunter
id: 2c6f9a41-8e07-4b53-9f1a-7d0c4b62ae35
status: experimental
description: >
The keyHunter discovery and verification sequence against an exposed LLM
proxy: an unauthenticated model listing followed by per-model chat
completions from the same source, or one of the cluster's user agents.
references:
- https://kinryu.sh/reports/keyhunter-llm-proxy-key-harvesting/
logsource:
category: webserver
detection:
model_listing:
cs-uri-stem|endswith:
- '/v1/models'
- '/models'
admin_paths:
cs-uri-stem|startswith:
- '/key/'
- '/user/'
- '/organization/'
cluster_agents:
c-useragent|contains:
- 'Hermes-Agent'
- 'Hermes-Panel'
- 'CVE-2026-49468-Scanner'
admin_allowlist:
c-ip|cidr: '10.0.0.0/8' # replace with your own admin range
condition: (((model_listing or admin_paths) and not admin_allowlist) or cluster_agents)
falsepositives:
- Client libraries that legitimately call /v1/models on startup from allow-listed ranges
level: high
Веб-лог доступа не записывает заголовок Authorization, поэтому попытки с учётными данными по умолчанию и инъекции приходится ловить в собственном логировании запросов прокси: буквальные sk-1234 и sk-test, отсутствующие учётные данные и ' OR '1'='1 в поле ключа.
Три поведенческих поиска, которым не нужен движок правил:
- Ищите один источник, который перечисляет ваши модели, а затем шлёт ровно по одному короткому запросу чата каждой из них по очереди. Этот проверочный прогон является сигнатурой операции, и его трудно замаскировать.
- Поднимайте алерт на промпты, которые просят модель назвать её настоящую личность вопреки параметру API, это проверка, которую покупатель проводит, прежде чем довериться краденому доступу.
- Сравнивайте по расписанию список каналов и таблицу пользователей вашей панели. Извлечение ключей и экспорт учётных записей оставляют панель работающей как обычно, так что больше ничто вам об этом не скажет.
Что с этим делать
Считайте любой открытый в интернет LLM-прокси скомпрометированным с момента открытия. keyHunter прочёсывает страну за день и отрабатывает опубликованные CVE в течение недель после раскрытия.
- Поставьте LiteLLM, One-API, New-API, Sub2API и всё подобное за аутентифицирующий обратный прокси или в приватную сеть. Ни один из них не поставляется с настройками по умолчанию, пригодными для выставления в интернет.
- Обновитесь до актуальной версии. Из шести бюллетеней выше RCE в LiteLLM входит в список известных эксплуатируемых уязвимостей CISA, а захват учётной записи в Sub2API подтверждён как эксплуатируемый в реальных условиях.
- Смените мастер-ключ.
sk-1234является значением из собственного быстрого старта LiteLLM, и это одно из всего трёх учётных данных, которые этот оператор вообще пробует. - Ограничьте
/openapi.jsonи/docs. Анонимный клиент не должен иметь возможности скачать поверхность вашего административного API. - Ставьте бюджетный лимит и ограничивайте область каждого виртуального ключа, чтобы извлечение давало нечто, что не стоит перепродавать.
- Если вы принимаете платежи Stripe через New-API, убедитесь, что секрет подписи вебхука действительно задан. Пустой секрет и есть вся суть CVE-2026-41432.
- Ротируйте каждый ключ вышестоящего провайдера, который когда-либо лежал в панели, о которой вы не можете доказать, что она никогда не была открыта.
Сопоставление с MITRE ATT&CK
| Тактика | Техника |
|---|---|
| Reconnaissance | T1596.005 Search Open Technical Databases: Scan Databases (FOFA, по каждой стране, AWS исключён); T1595.002 Active Scanning: Vulnerability Scanning (лёгкое и глубокое HTTP-зондирование) |
| Resource Development | T1583.003 Acquire Infrastructure: Virtual Private Server (Alibaba, Tencent, Huawei); T1588.002 Obtain Capabilities: Tool (Hermes Agent, OpenClaw, подписка FOFA, github_copilot/gpt-5.6-sol в роли движка рассуждений) |
| Initial Access | T1190 Exploit Public-Facing Application (обход аутентификации через заголовок Host, SQL-инъекция до аутентификации, инъекция команд, SSTI, SSRF против LiteLLM, Sub2API и New-API) |
| Defense Evasion | T1480 Execution Guardrails (классификация приманок, оценка non_chinese_evidence, фильтрация org!="AMAZON-AES") |
| Credential Access | T1078.001 Valid Accounts: Default Accounts (без учётных данных, sk-test, sk-1234); T1552.001 Unsecured Credentials: Credentials In Files (извлечение ключей в exported_keys.json) |
| Discovery | T1518 Software Discovery (перечисление моделей и проверка по каждой модели); T1087 Account Discovery (перечисление пользователей против административной плоскости) |
| Collection | T1213 Data from Information Repositories (экспорт учётных записей, нормализация, архивирование) |
| Command and Control | T1102 Web Service (ветка WeChat в роли канала постановки задач) |
| Impact | T1657 Financial Theft (обход Stripe-вебхука, переполнение квоты); T1496 Resource Hijacking (обвязка для перепродажи собранного инференса) |
Методология и заметки аналитика
Почти всё изложенное выше дошло до нас одним и тем же путём. Ловушка Kinryū Labs, выдающая себя за открытый экземпляр LiteLLM, отвечает агентному клиенту так, как ответила бы настоящая модель, отдавая вызовы инструментов: инструкции вида «выполни эту команду и скажи, что она напечатала». Сама она не выполняет ни одной из них. Агент оператора воспринял эти ответы как настоящие вызовы функций, выполнил их на собственной файловой системе и отправил вывод обратно как результаты инструментов, 534 раза в период с 16 по 20 августа 2026 года. Этот вывод и есть их окружение: 283 различных пути к файлам, листинги сервисов и контейнеров, сводки результатов сканирования и собственные поиски агента по его памяти в WeChat. Ловушка на всём протяжении остаётся пассивной, так что всё изложенное выше представляет собой то, что агент оператора выдал ей сам.
То, что у нас есть, поэтому является подмножеством их реальной системы, ограниченным тем, что их агент случайно перечислил. Содержимое ни одного файла до нас не дошло; у нас есть имена, размеры и временные метки из собственных листингов каталогов оператора. Результаты сканирования и счётчики вердиктов являются собственными цифрами оператора, выданными их инструментарием, и ни одну из них мы независимо не проверяли. Их агент нашёл реальные баги в их сканере, так что доли попаданий следует читать как нижнюю границу открытости, а не как её измерение.
Чат на китайском языке переведён. Технические строки, пути и идентификаторы оставлены дословно как в этом отчёте, так и в переводе.
Четыре ограничения на то, что всё это подтверждает. Атрибуция останавливается на кластере активности на инфраструктуре в Китае, использующем китайский на всём протяжении; связи с названной группой нет, и мы её не предлагаем. Намерение действительно неоднозначно между конкурсной заявкой и операцией по краже. Содержимое ни одного файла эксплойтов до нас не дошло, так что все шесть сопоставлений с CVE держатся на именах файлов; по двум техника была независимо замечена приходящей на наш сенсор, что подтверждает технику, а не файл. И мы ни разу не видели, чтобы краденый ключ был потрачен: значения выгруженных оператором ключей до нас так и не дошли, только его счётчики: 3 извлечено и 17 выгружено, так что искать в телеметрии было нечего.
Сторонние адреса, которых касался их сканер, не раскрываются, включая хост, который они сами пометили как приманку и который принадлежит чужому исследованию. Их FOFA API-ключ здесь усечён.
Полные наборы индикаторов и исходные захваты доступны исследователям по запросу: [email protected].