Esta página es una traducción. La versión en inglés es el texto de referencia. Leer en inglés
threat-actor · litellm · agentic-ai · credential-theft · china-nexus
keyHunter: una operación de claves de proxy LLM que filtró su propio kit de herramientas
Un operador de habla china rastrea FOFA en busca de paneles de proxy de IA expuestos, los verifica con código sometido a pruebas unitarias y construido para reconocer honeypots, y exporta las claves de API. Su agente publicó en uno de nuestros honeypots 283 rutas de archivo de su propio host, los resultados de los barridos, el registro de chat de WeChat y un directorio de resultados con archivos de explotación nombrados por seis CVE de 2026, entre ellos una elusión del webhook de Stripe en New-API.
Por Davis Zheng·
TLP:CLEAR. Autorizado para su divulgación pública. Casi todo lo que sigue es material del propio operador, recuperado de la salida que su agente publicó en uno de nuestros honeypots. Los indicadores están desactivados, lo que significa que las direcciones del atacante se escriben de forma que no puedan pulsarse ni resolverse por accidente. Se omiten los objetivos de los barridos, un host de terceros que el operador marcó y su clave de API de FOFA completa.
Resumen ejecutivo
- 27,173hosts candidatos rastreados con FOFA
- 194que listaron un modelo
- 17claves de API exportadas
- 6CVE de 2026, por nombre de archivo
Un operador de habla china ha rastreado 27,173 hosts en ocho países con un solo objetivo: paneles de proxy de IA expuestos con claves activas detrás. Un panel de proxy de IA es el software que los equipos colocan entre sus aplicaciones y los proveedores de modelos de pago para que un único conjunto de claves de proveedor pueda compartirse, como LiteLLM, One-API y su fork New-API, Sub2API y Chat2API. Deje uno en internet sin contraseña y todo lo que hay detrás queda a disposición de desconocidos. El operador los encuentra a través de FOFA, un buscador construido sobre escaneo continuo de todo internet y la contraparte china de Shodan, comprueba qué paneles siguen respondiendo y exporta las claves.
Estas cifras son del propio operador, tomadas de sus archivos de resultados y no estimadas por nosotros. De esos 27,173 hosts, 194 llegaron a listar un modelo y 17 claves alcanzaron su archivo de exportación. La tanda de Estados Unidos es el caso individual más claro: 10,447 objetivos a la entrada, 64 listados de modelos a la salida, una tasa de acierto del 0.61%, y su propio agente supo explicar por qué. Una instancia de LiteLLM públicamente expuesta y genuinamente invocable es rara, y un error de construcción de URL en su escáner marcaba como muertos hosts que estaban vivos.
- Se trata de una operación radicada en China, en lengua china y sobre infraestructura exclusivamente china. Todas las marcas de tiempo de archivo recuperadas son
+0800, el idioma de trabajo es el chino en todo momento, y los tres hosts son Alibaba Cloud, Tencent Cloud y una VM de escaneo en Huawei Cloud. Confianza alta. - Las herramientas son propias y con pruebas unitarias, no de mercado.
litellm_verifier.pyviene con tres archivos de pruebas, el directorio de copias de seguridad incluyeSHA256SUMS, y el trabajo está organizado en rondas numeradas. Esa disciplina de ingeniería es inusual en el escaneo de credenciales. Confianza alta, tomado de los propios listados de archivos del operador. - Incorporan contraengaño, y funciona. Su verificador se niega a contar un listado
/v1/modelscomo éxito, exige un chat completion real por cada modelo, puntúa si la respuesta se corresponde con el proveedor que dice ser, y clasificó 20 de 41 entradas de modelo probadas en una tanda comohoneypot_or_unusable. Confianza alta. - El kit de explotación es enteramente n-day. Los nombres de sus archivos de resultados se corresponden con seis avisos de 2026 contra LiteLLM, Sub2API y New-API, uno de ellos en la lista de vulnerabilidades explotadas conocidas de CISA. Nada sugiere investigación original de vulnerabilidades. Confianza alta sobre los productos y las técnicas, moderada sobre el CVE concreto en cuatro de los seis, que se infieren de los nombres de archivo y no de observación directa.
- El encuadre de concurso no sobrevive al contacto con el directorio de resultados. Le dicen a su agente que el alcance son solo credenciales por defecto, y sin embargo los nombres de archivo del directorio mencionan ejecución remota de código, inyección SQL, inyección de plantillas, falsificación de peticiones del lado del servidor, fuga de tokens, desbordamiento de cuota y una elusión del webhook de Stripe. Tenemos el listado y no el contenido de los archivos, así que la intención queda abierta, pero bajo cualquiera de las dos lecturas el operador construyó y ejecutó esas herramientas. Confianza alta sobre los artefactos, moderada sobre cuál lectura de la intención es la correcta.
Sobre el nombre
Lo seguimos como keyHunter, por /root/keyHunter-skill/, el directorio de proyecto del propio operador.
El framework de agentes que utilizan se llama Hermes, y Hermes es un proyecto de código abierto real de Nous Research. Nombrar al actor a partir de él culparía a una herramienta legítima de lo que alguien hizo con ella, así que no lo hacemos. Lo mismo vale para OpenClaw, el segundo framework de agentes que hay en la máquina. Ambos son software corriente que el operador instaló y apuntó a la infraestructura de otras personas.
El operador
El operador trabaja desde tres hosts, todos en nubes chinas, con el trabajo repartido entre ellos. 39.98.82[.]200 en Alibaba Cloud (AS37963) ejecuta el gateway del agente e hizo la mayor parte del reconocimiento que vimos. 101.43.41[.]72 en Tencent Cloud (AS45090) es un relé, que sirve un endpoint compatible con OpenAI en el puerto 8087 al que el agente llama para obtener capacidad de modelo. Comparten la huella JA4H po11nn070000_ebbca96fac43, que describe cómo un cliente ensambla sus peticiones HTTP y sobrevive a un cambio de dirección, junto con los user agents a medida Hermes-Agent/0.18.0 y Hermes-Panel/1.0 y un único identificador de sesión de chat compartido. En conjunto, eso sitúa ambos nodos bajo un mismo operador. Esa huella no es un artefacto de una sola captura: se repite a lo largo de la actividad del 16 al 20 de agosto, en el mismo barrido dirigido por FOFA.
El escaneo ocurre en otro sitio distinto. Desde el host de Alibaba llegan a una VM de Huawei Cloud mediante un reenvío local:
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'
Esa máquina llevaba cuatro días y nueve horas encendida, tiene 7.5 GB de RAM y cuatro núcleos, y ejecuta los workers de escaneo. Separar el escaneo ruidoso del front end del agente es una decisión deliberada, y el nombre hw_vm_key indica que el operador la considera la máquina de Huawei.
El control va por WeChat. El servicio de gateway se describe a sí mismo como “Hermes Agent Gateway, Messaging Platform Integration”, y el operador asigna tareas al agente conversando con él en un hilo de WeChat. La memoria a largo plazo del agente es esa conversación: busca en su propio historial de chat para recordar en qué está trabajando. El segundo framework muestra el mismo patrón, con una sesión llamada openclaw-weixin. Una aplicación de mensajería de consumo es un canal de control barato: el tráfico va cifrado por defecto y viaja hacia Tencent junto al de todos los demás usuarios de WeChat, de modo que no activa nada ajustado para detectar balizas de mando y control.
El motor de razonamiento detrás de todo ello es github_copilot/gpt-5.6-sol, un asistente comercial de programación al que se accede a través de un relé. Su configuración también incorpora claves opcionales para varios otros proveedores. El código ofensivo es Python propio; el modelo de razonamiento, el framework de agentes y el canal de control de WeChat que hay debajo son todos productos de consumo listos para usar.
El flujo de trabajo
Su skill maestra describe toda la operación en una línea: “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
El descubrimiento es una única consulta de FOFA, repetida por país:
(title="LiteLLM" || body="LiteLLM") && country="{cc}" && org!="AMAZON-AES"
La cláusula que importa es la exclusión de AWS. El operador filtra a Amazon en cada barrido antes de mirar un solo host. Bloquear en su perímetro los rangos de Shodan y Censys no aporta nada frente a una cadena construida sobre los datos de escaneo de un tercero.
Por país mantienen scripts separados: litellm_scan_hw.py para Estados Unidos, litellm_scan_gb_hw.py, litellm_scan_it_hw.py, un litellm_scan_us_30d_optimized.py con su propio entorno virtual, y un conjunto adicional bajo keyHunter-skill/ que cubre Australia, Brasil, Canadá, Francia, India, Países Bajos y Singapur. Existen archivos de resultados para catorce países. La concurrencia es de 48 workers ligeros y 12 workers profundos, con retroceso ante los límites de tasa por las respuestas 429 de FOFA, y deduplicación de endpoints por protocolo, host y puerto.
La clave de API de FOFA está incrustada en el código fuente del escáner, que es como la tenemos. Se ejecuta contra un espejo no oficial de FOFA en hamal.cc[.]cd y sale a través de un proxy Squid local.
Lo que realmente devuelve un barrido
| País | Objetivos FOFA | Modelos listados | Tasa de acierto |
|---|---|---|---|
| Estados Unidos | 10,447 | 64 | 0.61% |
| China | 6,329 | 83 | 1.31% |
| Corea del Sur | 1,772 | 10 | 0.56% |
| Reino Unido | 1,422 | 18 | 1.27% |
| Italia | 1,130 | 9 | 0.80% |
| Australia, India, Brasil | 6,073 | 10, de los cuales 4 verificados | 0.16% |
Una tanda capturada: 2,255 filas en bruto de FOFA, 1,130 endpoints únicos tras la deduplicación, 9 sitios que listaron modelos, 8 que verificaron, y a nivel de petición 41 éxitos de modelo frente a 8 fallos.
El censo de títulos de FOFA que recopilaron indica cómo es la población expuesta. LiteLLM API - Swagger UI devuelve 7,630 resultados. OmniRoute devuelve 171, SillyTavern 170, LiteLLM Dashboard 156, Claude Code Hub 131, Aivar AI Gateway 11. La mayor parte de la superficie es un solo producto, y la mayoría de las instancias expuestas de ese producto son la página de documentación de API autogenerada.
Evaluamos que el rendimiento en el extremo final es bajo en términos absolutos. litellm_extracted_keys.json registra 43 instancias y 3 claves extraídas en 23 modelos. exported_keys.json contiene 17. Decenas de miles de hosts rastreados para diecisiete claves, lo que o bien es un retorno pobre para el esfuerzo invertido o bien un argumento de que el esfuerzo es barato porque lo hace un agente.
Contraengaño: cazan honeypots
La ingeniería se ve con más claridad en un archivo, litellm_verifier.py.
Ocupa diez kilobytes y tiene una batería de pruebas unitarias. Envía un chat completion mínimo y real a cada modelo que anuncia un panel y solo registra éxito ante una respuesta válida con forma de OpenAI choices/message/content o una respuesta legítima en streaming con marcador de finalización. Su propia regla, en sus propias palabras: un éxito escueto en /models nunca cuenta. Los nombres de las pruebas lo codifican, incluida una llamada test_models_listing_alone_is_not_success. Alguien escribió una prueba de regresión para impedir que sus propias herramientas les mintieran sobre una clave robada.
Los recuentos de veredictos de una única tanda:
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 es una respuesta enlatada o repetida, que es como contesta un señuelo ingenuo. non_chinese_evidence puntúa si un modelo se comporta como el proveedor que dice ser. También ejecutan un interrogatorio de cinco preguntas, 蜜罐五题测试, y en la ventana capturada lo usaron para marcar como honeypot un host en un rango de AWS en Londres. Estamos omitiendo esa dirección, porque es el sensor de otra persona y nombrarlo lo quema.
Un comprador de inferencia robada ahora asume que el endpoint podría ser una trampa y lo comprueba. La contracomprobación que los detecta ejecuta la misma prueba a la inversa: cualquier cliente que pida a su gateway demostrar qué modelo está ejecutando realmente, en contra del parámetro de la API, está validando mercancía.
Arsenal de exploits: enteramente n-day
El contenido de sus archivos de resultados de explotación nunca llegó hasta nosotros. Los nombres de archivo sí, y sus objetivos son productos de código abierto con avisos públicos, de modo que los exploits se pueden reconstruir a partir de los avisos.
| Archivo de resultados en su host | CVE | Vulnerabilidad | Base |
|---|---|---|---|
litellm_host_header_bypass_results.json (568 KB) | CVE-2026-49468 | Elusión de autenticación en LiteLLM mediante inyección de cabecera Host, CVSS 9.8, anterior a 1.84.0. Desincroniza la autenticación del enrutamiento, dando acceso sin autenticar a /key/generate y /user/new | Corroborado: las mismas llamadas al plano de administración llegaron a nuestro sensor, y presentaban un user agent CVE-2026-49468-Scanner |
litellm_sqli_apikey_results.json (517 KB), litellm_sqli_models.json | CVE-2026-42208 | Inyección SQL previa a la autenticación en la ruta de autenticación de LiteLLM | Corroborado: enviaron ' OR '1'='1 como clave diecinueve veces |
litellm_rce_exploit.json, litellm_mcp_rce_results.json | CVE-2026-42271 | Inyección de comandos y ejecución remota de código en LiteLLM, CVSS 8.7, en la lista de vulnerabilidades explotadas conocidas de CISA, de 1.74.2 a 1.83.6, incluido un vector de inyección MCP | Inferido a partir del nombre de archivo y del producto |
sub2api_cve_exploit.json y tres fases posteriores | CVE-2026-27812 | Envenenamiento del restablecimiento de contraseña en Sub2API mediante cabeceras Host y Forwarded confiadas, que conduce a la toma de control de cuentas. Explotado en el mundo real, anterior a 0.1.85 | Inferido |
newapi_stripe_bypass_results.json, newapi_stripe_exploited.json, newapi_quota_overflow_results.json | CVE-2026-41432 | Elusión de la firma del webhook de Stripe en New-API mediante un secreto vacío, que otorga cuota ilimitada sin pago, anterior a 0.12.10 | Inferido |
newapi_user_token_leak_results.json, oneapi_user_token_leak_results.json, newapi_ssrf_bypass_results.json | CVE-2026-30886 | Referencia directa insegura a objetos y elusión de autenticación en New-API en el endpoint de proxy de vídeo, que expone contenido de otros usuarios y permite a un atacante gastar credenciales de la víctima aguas arriba | Inferido |
litellm_ssti_prompts_results.json | sin aviso concreto | Inyección de plantillas del lado del servidor con Jinja2 contra los endpoints de prompts y plantillas | Inferido |
El contenido de ningún archivo llegó hasta nosotros; cada fila descansa sobre el nombre del archivo. En dos de ellos observamos de forma independiente cómo la técnica llegaba a nuestro propio sensor, la elusión por cabecera Host y la inyección SQL de autenticación, lo que corrobora la técnica y no el archivo. Los otros cuatro se apoyan en el nombre de archivo más el aviso conocido del producto, y están señalados como tales.
El patrón en los seis es el mismo. Todos los avisos son de 2026, varios del mismo trimestre, y nada de ello es investigación original. keyHunter industrializa fallos de alta severidad recién divulgados en el ecosistema de proxies LLM de código abierto en cuanto aparecen. Esa es una ventana corta, sobre una clase de software que a menudo instala un único desarrollador y luego queda desatendido.
Intención: el relato del concurso frente al directorio de resultados
El operador describe esto a su propio agente como una participación en un concurso. El vocabulario es constante a lo largo del chat recuperado: 比赛项目 (proyecto de concurso), 评委 (jurado), 答辩材料 (materiales de defensa oral), un directorio contest-kit, y trabajo organizado en 第一轮 y 第二轮, rondas uno y dos.
Preguntado por el alcance, el operador es explícito en que el objetivo son las credenciales por defecto, en el original:
llm 的主要就是那几个默认密码为主流,用自己的 sk 那种没办法抓到啊
En los de LLM lo que predomina son esas pocas contraseñas por defecto; los que usan sus propias claves
sk-*, a esos no hay forma de pillarlos.
El agente coincide, y confirma que los intentos de autenticación se limitan a tres casos: sin autenticación, sk-test y sk-1234, esta última la clave que usa la propia documentación de inicio rápido de LiteLLM.
Y luego está /root/keyHunter-skill/results/. Su listado nombra archivos de ejecución remota de código, inyección SQL, inyección de plantillas, falsificación de peticiones del lado del servidor, secuestro de sesión contra Sub2API, rociado de credenciales, fuga de tokens de usuario, desbordamiento de cuota, y dos para una elusión del webhook de Stripe, uno de ellos newapi_stripe_exploited.json. Tenemos los nombres y, para algunos archivos, los tamaños; los resultados de la elusión de Stripe alcanzan los 2.4 MB, aunque su contenido nunca llegó hasta nosotros. La afirmación defendible es que el operador construyó y ejecutó herramientas de elusión de pagos con cuota ilimitada contra New-API, y que CVE-2026-41432 es una vulnerabilidad real exactamente de ese tipo. Si esos 2.4 MB de registros son recargas fraudulentas completadas o solo intentos, no podemos verlo. El _exploited del nombre de archivo es la palabra del operador; nosotros no leímos los registros.
Mantenemos ambas lecturas abiertas. El concurso puede ser genuino, y la explotación una línea de trabajo aparte que el operador no comenta con un agente que guarda registros; o el concurso puede ser tapadera de una operación de robo. Evaluamos que la distinción es irrelevante para los defensores: la capacidad y el riesgo para un panel expuesto son idénticos bajo cualquiera de las dos lecturas.
Fallo de oficio: el propio agente del operador auditó el kit de herramientas
El pasaje más útil del chat recuperado es una revisión de código. El operador preguntó a su agente por qué la tasa de acierto del barrido era tan baja, y el agente repasó el escáner línea a línea.
La respuesta del agente, condensada a lo que un defensor puede aprovechar: el escáner antepone un protocolo a un campo host de FOFA que a menudo ya lleva uno, produciendo URLs de la forma https://https://<target>, con lo que hosts vivos se registraban como muertos. El pool de hilos recoge los resultados en orden de creación en lugar de a medida que terminan, de modo que una petición lenta bloquea todo lo que hay detrás. CONCURRENCY=200 en una máquina de cuatro núcleos fabrica sus propios timeouts. Deduplicar por IP descarta otros puertos válidos en la misma dirección. Fijar temperature hace que un error de compatibilidad se interprete como un fallo.
Sobre su detección de honeypots el agente fue tajante: juzga principalmente por si la respuesta es idéntica o de menos de cinco caracteres, lo que descarta modelos normales y no detecta buenos señuelos. Y pese a que el operador le pidió identificar a los que responden en un idioma distinto del chino, el código no contenía lógica alguna de detección de idioma.
También señaló su higiene de seguridad: la clave de FOFA incrustada en el script, rutas absolutas escritas para /root cuando el usuario real es /home/developer, except: pass tragándose todos los motivos de fallo, una copia separada del script por país, y archivos de resultados que contienen objetivos y métodos de autenticación sin control de acceso ni redacción.
Ese último punto reencuadra el embudo. La tasa de acierto del 0.61% en Estados Unidos mide la exposición a través de un escáner con errores conocidos, así que la tasa real de instancias de LiteLLM expuestas es más alta de lo que muestran los propios resultados del operador. Ahora tienen un agente que seguirá corrigiendo esos errores.
Infraestructura de monetización
El mismo host ejecuta una instancia de New-API propia: calciumion/new-api:latest en Docker, publicada en el puerto 8901, con los datos montados junto a los resultados de los barridos. A su alrededor hay un newapi_watchdog.py, un archivo de copia de seguridad de canales y una copia empaquetada del conjunto.
New-API es un panel de agregación. Toma un montón de claves de proveedores aguas arriba y las presenta como una sola API con sus propias cuentas de usuario y cuotas. Levantar eso junto a una cadena de recolección de claves tiene un propósito evidente: las claves recolectadas se convierten en canales de un panel, y el panel se convierte en acceso vendible. No observamos reventa y no la afirmamos; la fontanería para ello está instalada y en marcha.
Ya circulan cientos de enrutadores gratuitos similares construidos sobre las plantillas de sub2api y new-api, y keyHunter es una operación más dentro de ese ecosistema.
Asociaciones del clúster
La toma de huellas de cliente vincula estos dos hosts con un conjunto laxo de otros que trabajan la misma superficie: un host taiwanés que ejecuta escaneos de CVE y acuñación de claves, un host de Hong Kong que lanza la misma inyección SQL, y un salto más allá, un cazador de paneles LLM y un explotador de dashboards de Ray cuyas ráfagas de un solo día cayeron el 15 y el 21 de agosto, con seis días de diferencia. Los solapamientos se apoyan en pilas de cliente genéricas en algunos puntos, así que esto se lee como herramientas compartidas y una escena compartida, más que como una sola mano en un solo teclado. Trátese como una comunidad con nexo en China que comparte herramientas de caza de proxies LLM. Ningún indicador lo vincula a una APT con nombre, así que lo seguimos como un clúster de actividad.
Indicadores de compromiso
Red e infraestructura, desactivados:
| Indicador | Función |
|---|---|
39.98.82[.]200 | Gateway del agente, reconocimiento, inyección SQL (Alibaba Cloud, AS37963, CN) |
101.43.41[.]72 | Endpoint de relé en el puerto 8087, worker subagente delegado (Tencent Cloud, AS45090, CN) |
hamal.cc[.]cd | Espejo no oficial de FOFA que consulta el escáner |
cae332848db5… | La clave de API de FOFA del propio operador, incrustada en litellm_scan_hw.py. Truncada aquí; el valor completo se ha conservado para informar a FOFA en lugar de publicarse |
Huellas de cliente y user agents:
po11nn070000_ebbca96fac43_00000000 shared across both nodes
Hermes-Agent/0.18.0
Hermes-Panel/1.0
Mozilla/5.0 (CVE-2026-49468-Scanner)
Artefactos de host. Son rutas en las máquinas del operador, útiles para cazar un host similar o un segundo despliegue:
/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
Nombres de skills y proyectos, que son los pivotes de cadena única más sólidos:
keyhunter / keyHunter
contest-kit
ai-proxy-panel-audit
fofa-panel-recon
delegation-orchestration
Conductuales:
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
Detección
Si usted opera un proxy LLM accesible desde internet, toda la secuencia es visible en los registros del propio gateway. En Sigma, el formato de reglas neutral respecto al fabricante que la mayoría de plataformas SIEM pueden importar:
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
Un registro de acceso web no guarda la cabecera Authorization, así que los intentos con credenciales por defecto y las inyecciones hay que capturarlos en el registro de peticiones del propio proxy: los literales sk-1234 y sk-test, la ausencia de credencial, y ' OR '1'='1 en el campo de la clave.
Tres búsquedas conductuales que no necesitan motor de reglas:
- Busque un origen que liste sus modelos y luego envíe exactamente un chat completion corto a cada uno de ellos por turno. Ese barrido de verificación es la firma de la operación y es difícil de disimular.
- Alerte sobre prompts que pidan al modelo declarar su identidad real en contra del parámetro de la API, la comprobación que ejecuta un comprador antes de fiarse de un acceso robado.
- Compare de forma periódica la lista de canales y la tabla de usuarios de su panel. La extracción de claves y la exportación de cuentas dejan el panel funcionando con normalidad, así que nada más se lo va a indicar.
Qué hacer
Trate cualquier proxy LLM expuesto a internet como comprometido desde el momento de la exposición. keyHunter barre un país en un día y trabaja CVE publicados a las pocas semanas de su divulgación.
- Ponga LiteLLM, One-API, New-API, Sub2API y cualquier cosa similar detrás de un proxy inverso con autenticación o en una red privada. Ninguno de ellos trae un valor por defecto defendible para exposición a internet.
- Actualice a la versión vigente. De los seis avisos anteriores, la RCE de LiteLLM está en la lista de vulnerabilidades explotadas conocidas de CISA y la toma de control de cuentas de Sub2API tiene explotación confirmada en el mundo real.
- Cambie la clave maestra.
sk-1234es el valor del propio inicio rápido de LiteLLM y es una de solo tres credenciales que este operador se molesta en probar. - Restrinja
/openapi.jsony/docs. Un cliente anónimo no debería poder descargar la superficie de su API administrativa. - Limite el presupuesto y acote el alcance de cada clave virtual, para que su extracción rinda algo que no valga la pena revender.
- Si acepta pagos de Stripe a través de New-API, verifique que el secreto de firma del webhook está realmente configurado. Un secreto vacío es todo CVE-2026-41432.
- Rote cada clave de proveedor aguas arriba que haya estado alguna vez en un panel del que no pueda demostrar que nunca estuvo expuesto.
Mapeo MITRE ATT&CK
| Táctica | Técnica |
|---|---|
| Reconocimiento | T1596.005 Search Open Technical Databases: Scan Databases (FOFA, por país, AWS excluido); T1595.002 Active Scanning: Vulnerability Scanning (sondeo HTTP ligero y profundo) |
| Desarrollo de recursos | T1583.003 Acquire Infrastructure: Virtual Private Server (Alibaba, Tencent, Huawei); T1588.002 Obtain Capabilities: Tool (Hermes Agent, OpenClaw, una suscripción a FOFA, github_copilot/gpt-5.6-sol como motor de razonamiento) |
| Acceso inicial | T1190 Exploit Public-Facing Application (elusión de autenticación por cabecera Host, inyección SQL previa a la autenticación, inyección de comandos, SSTI, SSRF contra LiteLLM, Sub2API y New-API) |
| Evasión de defensas | T1480 Execution Guardrails (clasificación de honeypots, puntuación non_chinese_evidence, filtrado org!="AMAZON-AES") |
| Acceso a credenciales | T1078.001 Valid Accounts: Default Accounts (sin credencial, sk-test, sk-1234); T1552.001 Unsecured Credentials: Credentials In Files (extracción de claves a exported_keys.json) |
| Descubrimiento | T1518 Software Discovery (listado de modelos y verificación por modelo); T1087 Account Discovery (enumeración de usuarios contra el plano de administración) |
| Recolección | T1213 Data from Information Repositories (exportación de cuentas, normalización, archivado) |
| Mando y control | T1102 Web Service (un hilo de WeChat como canal de asignación de tareas) |
| Impacto | T1657 Financial Theft (elusión del webhook de Stripe, desbordamiento de cuota); T1496 Resource Hijacking (fontanería de reventa para la inferencia recolectada) |
Metodología y notas del analista
Casi todo lo anterior es salida que el propio agente del operador publicó en uno de nuestros honeypots entre el 16 y el 20 de agosto de 2026: 283 rutas de archivo distintas, listados de servicios y contenedores, resúmenes de resultados de barridos y las propias búsquedas del agente en su memoria de WeChat.
Lo que tenemos es, por tanto, un subconjunto de su sistema real, delimitado por lo que su agente haya enumerado. El contenido de ningún archivo llegó hasta nosotros; tenemos nombres, tamaños y marcas de tiempo de los propios listados de directorio del operador. Los rendimientos de los barridos y los recuentos de veredictos son cifras del propio operador, reportadas por sus herramientas, y no hemos verificado ninguna de ellas de forma independiente. Su agente encontró errores reales en su escáner, así que las tasas de acierto deben leerse como un suelo de la exposición y no como una medición de ella.
El chat en chino está traducido. Las cadenas técnicas, rutas e identificadores se dejan literales tanto en este informe como en la traducción.
Cuatro límites sobre lo que esto sostiene. La atribución se detiene en un clúster de actividad sobre infraestructura radicada en China que usa el chino en todo momento; no hay vínculo con un grupo con nombre y no ofrecemos ninguno. La intención es genuinamente ambigua entre una participación en un concurso y una operación de robo. El contenido de ningún archivo de explotación llegó hasta nosotros, así que los seis mapeos de CVE descansan sobre nombres de archivo; en dos de ellos la técnica se observó de forma independiente llegando a nuestro sensor, lo que corrobora la técnica y no el archivo. Si alguna clave robada llegó a gastarse después es algo que no sabemos: la salida del operador solo da recuentos, 3 extraídas y 17 exportadas, y ningún valor de clave que rastrear.
Se omiten las direcciones de terceros que su escáner tocó, incluido el host que ellos mismos marcaron como honeypot, que pertenece a la investigación de otra persona. Su clave de API de FOFA está truncada aquí.
Los conjuntos completos de indicadores y las capturas subyacentes están disponibles para investigadores que lo soliciten: contact@kinryu.sh.