sistema: OPERATIVO
← volver a todos los hacks
INFRASTRUCTURE CRITICAL

LMDeploy SSRF: cuando un cargador de imágenes secuestra la infraestructura de IA

CVE-2026-33626 convirtió load_image() de LMDeploy en una primitiva SSRF genérica. El primer exploit en producción se observó 12 horas y 31 minutos tras la publicación del aviso.

2026-05-22 // 7 min affects: lmdeploy, internlm-xcomposer, vision-language-models, gpu-inference-nodes

Qué ha ocurrido

El 21 de abril de 2026, el equipo de InternLM publicó el aviso GHSA-6w67-hwm5-92mq correspondiente a CVE-2026-33626, una Server-Side Request Forgery en LMDeploy, uno de los kits de código abierto más utilizados para servir modelos de visión-lenguaje y grandes modelos de lenguaje. El defecto reside en load_image() (lmdeploy/vl/utils.py): la función descarga cualquier URL recibida en una petición de visión sin comprobar si el destino apunta a una dirección link-local, loopback o RFC1918. NIST lo clasifica como CVSS 7.5 (alto). Todas las versiones hasta la 0.12.2 inclusive, compiladas con soporte de visión-lenguaje, son vulnerables; la 0.12.3 incorpora el parche.

El asunto no es el bug — un SSRF es un clásico — sino el plazo. El equipo de Sysdig observó el primer intento de explotación armada 12 horas y 31 minutos después de la publicación del aviso en GitHub, desde la IP 103.116.72[.]119. En una sesión de ocho minutos, el atacante convirtió el cargador de imágenes en una primitiva HTTP SSRF genérica y sondeó la superficie interna del nodo GPU.

Cómo funciona

LMDeploy expone endpoints de visión-lenguaje que aceptan un cuerpo JSON con una referencia a una imagen. La biblioteca pasa esa URL a load_image(), que invoca requests.get sin lista blanca, sin lista negra y sin DNS pinning. Todo aquello que el contenedor de inferencia pueda alcanzar, el atacante también puede alcanzarlo a través de la API del modelo.

# Esbozo conceptual basado en el aviso público y el análisis de Sysdig.
# NO usar contra ningún sistema del que no sea propietario.
POST /v1/chat/completions  HTTP/1.1
Host: model.example.com
Content-Type: application/json

{
  "model": "internvl-2-8b",
  "messages": [{
    "role": "user",
    "content": [
      {"type": "text",      "text": "describe this image"},
      {"type": "image_url", "image_url": {
         "url": "http://169.254.169.254/latest/meta-data/iam/security-credentials/"
      }}
    ]
  }]
}

La cadena de explotación reconstruida por Sysdig a partir del tráfico de honeypot encadena cinco objetivos: AWS Instance Metadata Service (IMDS) en 169.254.169.254, un puerto Redis interno, MySQL en la misma subred VPC, una interfaz administrativa HTTP secundaria y, por último, un endpoint de exfiltración DNS fuera de banda para recuperar lo que los mensajes de error del cargador devolvían. Como los nodos de visión-LLM suelen correr en instancias GPU con roles IAM amplios — artefactos de modelos en S3, datasets de entrenamiento y a veces assume-role entre cuentas — una sola petición IMDS exitosa basta para pivotar al conjunto de la cuenta cloud.

La prueba de concepto publicada es la petición HTTP más simple posible; no hay truco criptográfico nuevo ni exploit del lado del modelo. El interés editorial está en otra parte: toda una categoría de infraestructura de servicio IA opera silenciosamente con un bug de aplicación web de los años 2010, detrás de un front-end GPU de 2026.

Por qué importa

Tres propiedades justifican un artículo aparte.

La primitiva es específica de la IA, pero el impacto es cloud-wide. Un endpoint de visión que acepta una URL es, estructuralmente, un proxy HTTP con credenciales. Cualquiera que exponga inferencia open source detrás de una ruta pública hereda lo que el nodo GPU pueda alcanzar — y esa superficie es amplia por diseño (buckets de almacenamiento de modelos, sumideros de telemetría, observabilidad, APIs de herramientas internas).

El tiempo hasta la explotación es prácticamente nulo. 12 h 31 min está por debajo del ciclo de la mayoría de procesos de gestión de parches. Sysdig lo presenta como un punto de inflexión: los atacantes vigilan ya los avisos de GitHub de los repos de infraestructura IA y arman las divulgaciones en menos de una jornada laboral. Tratar las pilas GPU como código de investigación en lugar de servicios web de producción ya no es sostenible.

Los nodos de visión-LLM son cajas fuertes de credenciales. El mismo rol de instancia que permite al servidor de inferencia descargar en streaming un modelo de 70 B desde S3 alcanza también el IMDS. No hay un valor por defecto de «mínimo privilegio» en los charts de Helm y las recetas Docker más desplegadas; los equipos asignan el rol amplio gestionado por AWS porque funciona.

Defensas

No hay mitigación del lado del modelo. Las correcciones son de infraestructura y de operación.

  1. Actualice LMDeploy a 0.12.3 o posterior para incorporar la validación de URLs. Revise todos los forks y las copias vendorizadas internamente — la función afectada es lmdeploy/vl/utils.py:load_image. El aviso es GHSA-6w67-hwm5-92mq.
  2. Imponga IMDSv2 con hop-limit 1 en cada instancia GPU/inferencia. IMDSv2 obliga a una ida y vuelta de token que las primitivas SSRF sin control de cabeceras no pueden ejecutar.
  3. Aplique listas de permitidos en el tráfico de salida desde los nodos GPU y de inferencia. El HTTP saliente de un servidor de modelos debería llegar a un conjunto reducido y nombrado de endpoints: almacenamiento de objetos, sumideros de logs, telemetría del modelo. Todo lo demás bloqueado, incluidos por defecto link-local y RFC1918.
  4. Acote los roles IAM por carga de trabajo. Un rol de lectura para artefactos en S3 es suficiente para servir inferencia. No conviene adjuntar al nodo público el rol que se utiliza para entrenamiento, fine-tuning u orquestación de pipelines.
  5. Trate los endpoints de visión como buscadores de ficheros no fiables. Cualquier servicio de inferencia que resuelva URLs del lado servidor (visión, RAG, scraping, document QA) debería realizar la descarga en una subred aislada, sin metadatos, sin alcance a la red interna y sin IAM compartido. El consejo aplica a vllm, Triton, Text Generation Inference y a cualquier plug-in que acepte una URL.
  6. Suscríbase a los GitHub Security Advisories de los repos de infraestructura IA (InternLM/lmdeploy, vllm-project/vllm, huggingface/text-generation-inference, triton-inference-server/server, BerriAI/litellm, langchain-ai/langchain, microsoft/semantic-kernel). La medición de Sysdig pasa a ser la hipótesis de trabajo: entre aviso y exploit, cuente en horas, no en días.

Estado

ElementoFechaEstado
Aviso GitHub GHSA-6w67-hwm5-92mq publicado2026-04-21Público
Primera explotación observada in the wild (Sysdig)2026-04-22Confirmada
Parche publicado — LMDeploy 0.12.32026-04-21Disponible
Calificación CVSS7.5 (alto)
Versiones afectadas≤ 0.12.2 con lmdeploy[vl]Vulnerables

Más allá del caso LMDeploy, la lección es más amplia: los stacks de inferencia de IA son tratados ya por los atacantes como servicios web de alto valor. El manual de defensa también es convencional — controles de egress, IMDSv2, IAM acotado, parches rápidos — pero debe aplicarse de verdad a las máquinas que ejecutan los modelos, no solo a la capa de aplicación que tienen delante.

Sources