Эта страница является переводом. Авторитетным считается текст английской версии. Читать на английском

threat-actor · litellm · agentic-ai · credential-theft · china-nexus

keyHunter: операция по сбору ключей LLM-прокси, раскрывшая собственный инструментарий

Китаеязычный оператор прочесывает FOFA в поисках открытых панелей AI-прокси, проверяет их кодом с модульными тестами, написанным так, чтобы распознавать honeypot, и выгружает API-ключи. Его агент отправил на один из наших honeypot 283 файловых пути со своего хоста, результаты сканирования, лог переписки в WeChat и каталог результатов с файлами эксплойтов, названными по шести CVE 2026 года, включая обход Stripe-вебхука в New-API.

Автор Davis Zheng·

CWE
CWE-306

TLP:CLEAR. Разрешено к публичному распространению. Практически весь материал ниже принадлежит самому оператору и восстановлен из вывода, который агент оператора отправил на один из наших honeypot. Индикаторы деактивированы, то есть адреса атакующих записаны так, что по ним нельзя случайно перейти или разрешить их в DNS. Цели сканирования, один сторонний хост, помеченный самим оператором, и полное значение его 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, требует реального chat completion по каждой модели, оценивает, соответствует ли ответ заявленному вендору, и в одном прогоне отнёс 20 из 41 проверенной записи модели к категории honeypot_or_unusable. Высокая уверенность.
  • Набор эксплойтов целиком n-day. Имена их файлов с результатами соотносятся с шестью рекомендациями 2026 года по LiteLLM, Sub2API и New-API, одна из которых входит в список CISA Known Exploited Vulnerabilities. Признаков собственных исследований уязвимостей нет. Высокая уверенность в отношении продуктов и техник, умеренная в отношении конкретной 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 developer@127.0.0.1 \
    'cd /home/developer && /home/developer/.venv-us30/bin/python litellm_scan_us_30d_optimized.py'

Эта машина была в работе четыре дня и девять часов, имеет 7.5 ГБ ОЗУ и четыре ядра и запускает воркеры сканирования. Отделение шумного сканирования от фронтенда агента, это осознанный выбор, а имя hw_vm_key говорит, что оператор воспринимает её как машину Huawei.

Управление идёт через WeChat. Служба шлюза описывает себя как “Hermes Agent Gateway, Messaging Platform Integration”, и оператор ставит агенту задачи, переписываясь с ним в ветке WeChat. Долговременная память агента, это та самая переписка: он ищет по собственной истории чата, чтобы вспомнить, над чем работает. Второй фреймворк демонстрирует ту же схему, с сессией под именем openclaw-weixin. Потребительский мессенджер, это дешёвый канал управления: трафик шифруется по умолчанию и идёт в Tencent вместе с трафиком всех остальных пользователей WeChat, поэтому не срабатывает ничего из настроенного на обнаружение маячков command-and-control.

Движок рассуждений за всем этим, это 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 с собственным виртуальным окружением и ещё один набор внутри keyHunter-skill/, охватывающий Австралию, Бразилию, Канаду, Францию, Индию, Нидерланды и Сингапур. Файлы результатов существуют для четырнадцати стран. Параллелизм составляет 48 легких воркеров и 12 глубоких, с отступом по rate limit на ответы 429 от FOFA и дедупликацией эндпоинтов по протоколу, хосту и порту.

FOFA API-ключ жёстко прописан в исходнике сканера, поэтому он у нас и есть. Запросы идут к неофициальному зеркалу FOFA на hamal.cc[.]cd, а исходящий трафик проходит через локальный прокси Squid.

Что реально даёт один прогон

СтранаЦели в FOFAСписки моделейДоля попаданий
США10,447640.61%
Китай6,329831.31%
Южная Корея1,772100.56%
Великобритания1,422181.27%
Италия1,13090.80%
Австралия, Индия, Бразилия6,07310, из них 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. Десятки тысяч прочёсанных хостов ради семнадцати ключей, это либо плохая отдача от затраченных усилий, либо аргумент в пользу того, что усилия дешёвы, потому что работу делает агент.

Противодействие обману: они охотятся на honeypot

Инженерная работа лучше всего видна в одном файле, litellm_verifier.py.

Он занимает десять килобайт и снабжён набором модульных тестов. Он отправляет реальный минимальный chat completion каждой модели, которую заявляет панель, и фиксирует успех только при корректном ответе 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 как honeypot. Этот адрес мы не публикуем, потому что это чужой сенсор, и его раскрытие вывело бы его из строя.

Покупатель краденого инференса теперь исходит из того, что эндпоинт может быть ловушкой, и проверяет это. Встречная проверка, которая их выявляет, устроена так же, но наоборот: любой клиент, который просит ваш шлюз доказать, какую модель он на самом деле запускает, вопреки параметру 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.jsonCVE-2026-42208Доаутентификационная SQL-инъекция в LiteLLM на пути аутентификацииПодтверждено: они девятнадцать раз отправляли ' OR '1'='1 в качестве ключа
litellm_rce_exploit.json, litellm_mcp_rce_results.jsonCVE-2026-42271Инъекция команд и удалённое выполнение кода в LiteLLM, CVSS 8.7, в списке CISA Known Exploited Vulnerabilities, версии с 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.jsonCVE-2026-41432Обход проверки подписи Stripe-вебхука в New-API через пустой секрет, дающий неограниченную квоту без оплаты, до версии 0.12.10Выведено
newapi_user_token_leak_results.json, oneapi_user_token_leak_results.json, newapi_ssrf_bypass_results.jsonCVE-2026-30886Небезопасная прямая ссылка на объект и обход аутентификации в 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 МБ, хотя их содержимое до нас не дошло. Обоснованно утверждать можно то, что оператор собрал и запустил против New-API инструментарий обхода оплаты с неограниченной квотой и что CVE-2026-41432, это реальная уязвимость именно такого рода. Являются ли эти 2.4 МБ записей завершёнными мошенническими пополнениями или только попытками, нам не видно. Слово _exploited в имени файла, это формулировка самого оператора; сами записи мы не читали.

Мы оставляем открытыми обе трактовки. Конкурс может быть настоящим, а эксплуатация, отдельным направлением работы, которое оператор не обсуждает с агентом, ведущим логи; либо конкурс может быть прикрытием операции по краже. Мы оцениваем это различие как несущественное для защищающихся: возможности и риск для открытой панели идентичны при любой трактовке.

Пробел в методике: агент самого оператора провёл аудит инструментария

Самый полезный фрагмент восстановленной переписки, это код-ревью. Оператор спросил своего агента, почему доля попаданий при сканировании такая низкая, и агент прошёл по сканеру строка за строкой.

Ответ агента, сжатый до того, что может использовать защищающийся: сканер подставляет протокол в поле host из FOFA, которое часто уже содержит протокол, получая URL вида https://https://<target>, из-за чего живые хосты записывались как мёртвые. Пул потоков собирает результаты в порядке создания, а не по мере готовности, поэтому один медленный запрос блокирует всё, что стоит за ним. CONCURRENCY=200 на четырёхъядерной машине сам создаёт себе таймауты. Дедупликация по IP отбрасывает другие валидные порты на том же адресе. Жёсткая фиксация temperature приводит к тому, что ошибка совместимости трактуется как неудача.

По их обнаружению honeypot агент высказался прямо: оно судит в основном по тому, идентичен ли ответ или короче пяти символов, что отсекает нормальные модели и пропускает хорошие приманки. И, несмотря на просьбу оператора выявлять некитайских респондентов, в коде вообще не было логики определения языка.

Он также отметил проблемы с их гигиеной безопасности: 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, developer@127.0.0.1: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 в поле ключа.

Три поведенческих поиска, для которых не нужен движок правил:

  • Ищите один источник, который запрашивает список ваших моделей и затем отправляет каждой из них по очереди ровно один короткий chat completion. Этот проверочный прогон, это подпись операции, и его трудно замаскировать.
  • Настройте оповещение на промпты, требующие от модели назвать её настоящую идентичность вопреки параметру API, это та проверка, которую покупатель проводит перед тем, как доверять краденому доступу.
  • Регулярно сравнивайте список каналов и таблицу пользователей вашей панели. Извлечение ключей и экспорт аккаунтов оставляют панель работающей нормально, поэтому больше ничто вам об этом не сообщит.

Что делать

Считайте любой LLM-прокси, доступный из интернета, скомпрометированным с момента открытия. keyHunter прочёсывает страну за день и отрабатывает опубликованные CVE в течение недель после раскрытия.

  • Поставьте LiteLLM, One-API, New-API, Sub2API и всё подобное за обратный прокси с аутентификацией или в приватную сеть. Ни один из них не поставляется с настройками по умолчанию, пригодными для доступа из интернета.
  • Обновитесь до актуальных версий. Из шести рекомендаций выше RCE в LiteLLM входит в список CISA Known Exploited Vulnerabilities, а захват аккаунта в Sub2API подтверждённо эксплуатируется в реальных атаках.
  • Смените мастер-ключ. sk-1234, это значение из документации быстрого старта самого LiteLLM, и это один из всего трёх наборов учётных данных, которые этот оператор вообще пробует.
  • Ограничьте доступ к /openapi.json и /docs. Анонимный клиент не должен иметь возможности скачать поверхность вашего административного API.
  • Задайте бюджетный лимит и область действия для каждого виртуального ключа, чтобы извлечение давало нечто, не стоящее перепродажи.
  • Если вы принимаете платежи Stripe через New-API, проверьте, что секрет подписи вебхука действительно задан. Пустой секрет, это и есть вся CVE-2026-41432.
  • Ротируйте все ключи вышестоящих провайдеров, которые когда-либо находились в панели, чью закрытость вы не можете доказать.

Сопоставление с MITRE ATT&CK

ТактикаТехника
ReconnaissanceT1596.005 Search Open Technical Databases: Scan Databases (FOFA, по странам, AWS исключён); T1595.002 Active Scanning: Vulnerability Scanning (лёгкое и глубокое HTTP-зондирование)
Resource DevelopmentT1583.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 AccessT1190 Exploit Public-Facing Application (обход аутентификации через заголовок Host, доаутентификационная SQL-инъекция, инъекция команд, SSTI, SSRF против LiteLLM, Sub2API и New-API)
Defense EvasionT1480 Execution Guardrails (классификация honeypot, оценка non_chinese_evidence, фильтрация org!="AMAZON-AES")
Credential AccessT1078.001 Valid Accounts: Default Accounts (без учётных данных, sk-test, sk-1234); T1552.001 Unsecured Credentials: Credentials In Files (извлечение ключей в exported_keys.json)
DiscoveryT1518 Software Discovery (получение списка моделей и проверка по каждой модели); T1087 Account Discovery (перечисление пользователей через административную плоскость)
CollectionT1213 Data from Information Repositories (экспорт аккаунтов, нормализация, архивация)
Command and ControlT1102 Web Service (ветка WeChat как канал постановки задач)
ImpactT1657 Financial Theft (обход Stripe-вебхука, переполнение квоты); T1496 Resource Hijacking (инфраструктура перепродажи собранного инференса)

Методология и замечания аналитиков

Практически весь материал выше, это вывод, который агент самого оператора отправил на один из наших honeypot между 16 и 20 августа 2026 года: 283 различных файловых пути, листинги сервисов и контейнеров, сводки результатов сканирования и собственные поисковые запросы агента по его памяти в WeChat.

То, что у нас есть, является, таким образом, подмножеством их реальной системы, ограниченным тем, что их агент по случаю перечислил. Содержимое ни одного файла до нас не дошло; у нас есть имена, размеры и временные метки из собственных каталожных листингов оператора. Результаты сканирования и счётчики вердиктов, это цифры самого оператора, выданные его инструментарием, и ни одну из них мы независимо не проверяли. Их агент нашёл реальные ошибки в их сканере, поэтому доли попаданий следует читать как нижнюю границу открытости, а не как её измерение.

Переписка на китайском языке дана в переводе. Технические строки, пути и идентификаторы оставлены дословно как в этом отчёте, так и в переводе.

Четыре ограничения на то, что этот материал подтверждает. Атрибуция останавливается на кластере активности на инфраструктуре в Китае с использованием китайского языка везде; связи с поименованной группой нет, и мы её не предлагаем. Мотивация действительно неоднозначна между заявкой на конкурс и операцией по краже. Содержимое ни одного файла эксплойта до нас не дошло, поэтому все шесть сопоставлений с CVE опираются на имена файлов; по двум из них техника независимо наблюдалась приходящей на наш сенсор, что подтверждает технику, но не файл. Был ли украденный ключ впоследствии израсходован, неизвестно: вывод оператора даёт только счётчики, 3 извлечено и 17 экспортировано, и ни одного значения ключа для отслеживания.

Сторонние адреса, к которым обращался их сканер, не публикуются, включая хост, который они сами помечали как honeypot и который принадлежит чьему-то исследованию. Их FOFA API-ключ здесь усечён.

Полные наборы индикаторов и исходные захваты доступны исследователям по запросу: contact@kinryu.sh.

How to cite
Kinryū Labs (2026). keyHunter: операция по сбору ключей LLM-прокси, раскрывшая собственный инструментарий. https://kinryu.sh/ru/reports/keyhunter-llm-proxy-key-harvesting/