Infraestructura de inferencia IA es critical infrastructure. Cuando 400.000 GPUs corren software con tres RCEs sin patch y el mantenedor ignora el CERT/CC, la responsabilidad recae sobre quien opera. En Tech86, vimos esa dinámica repetidas veces: el proveedor no corrige, el atacante no espera, y la cuenta llega para el dueño del workload.
Cuatro RCEs, tres sin corrección
SGLang es el servidor de inferencia detrás de workloads de xAI, NVIDIA, AMD, LinkedIn, Cursor, Oracle, Google Cloud, Azure y AWS. En enero de 2026, el proyecto spinó como RadixArk con backing de Accel y valuation de aproximadamente 400 millones de dólares. El software que corre en esas 400.000 GPUs tiene cuatro vulnerabilidades de ejecución remota de código. El mantenedor corrigió apenas una.
La CVE-2026-5760 (CVSS 9.8) explora archivos GGUF con payload Jinja2 en el chat_template. La víctima carga el modelo, hace un request para /v1/rerank, y el payload ejecuta. Sin autenticación. Esa es la única corregida, patch en la versión 0.5.11.
La CVE-2026-7301 (CVSS 9.8) ataca el scheduler ZeroMQ. El runtime multimodal binda un socket ROUTER. El código default usa 127.0.0.1, pero la documentación oficial recomienda --host 0.0.0.0 en todos los ejemplos. El Docker Compose oficial usa network_mode: host. En todo deployment que siguió la guía, el socket está expuesto. El scheduler llama pickle.loads() en cada mensaje. Un pickle craftado equivale a RCE. El mismo patrón fue corregido en marzo en el CVE-2026-3059, pero en otro code path. Este es diferente. Sin patch.
La CVE-2026-7302 (CVSS 9.1) permite escritura arbitraria de archivos. Los endpoints /v1/images/edits y /v1/videos aceptan upload sin sanitizar ../ en el filename. Un atacante consigue escribir en cualquier path del proceso. Sin patch.
La CVE-2026-7304 (CVSS 9.8) usa el campo custom_logit_processor que acepta JSON con callable conteniendo payload dill hex-encoded. El servidor deserializa con dill.loads() sin validación. Dill es superset de pickle, misma propiedad de ejecución arbitraria. Requiere --enable-custom-logit-processor activo. Sin patch.
La cronología que debería preocupar a todo el mundo
Antiproof reportó las vulnerabilidades al mantenedor el 10 de marzo. El día 25 de marzo, un PR parcial fue abierto, cubre apenas el CVE-2026-5760. Los otros tres quedaron de fuera. El 15 de mayo, el CERT/CC publicó el VU#777338 porque el mantenedor no respondió. El 26 de mayo, JPCERT/CC emitió advisory independiente.
Más de dos meses desde el disclosure. Tres CVEs con CVSS 9.8. Cero patch. Una empresa evaluada en 400 millones de dólares que no responde al CERT/CC. Eso no es un olvido, es un patrón.
En Tech86, aprendimos que el tiempo entre disclosure y exploit efectivo se acortó drásticamente. Cuando el CERT/CC publica, el adversario ya sabe. Cada día sin mitigación es un día de ventana abierta.
Deserialización es el hueco que no se cierra
El patrón es recurrente y bien documentado: pickle.loads() en datos no confiables es RCE por definición. No es una vulnerabilidad zero-day, es una propiedad del formato. Python documenta eso explícitamente. La corrección de marzo (CVE-2026-3059) debería haber tenido triggers de auditoría en todos los code paths con deserialización. No tuvo.
SGLang usa pickle.loads() en el scheduler ZeroMQ y dill.loads() en el custom logit processor. Dos code paths distintos, misma clase de vulnerabilidad, misma raíz: deserialización de datos no confiables sin validación. Un inference server sin autenticación está a un pickle craftado de distancia de tener el host comprometido.
Y el host de inferencia no es un host cualquiera. Tiene acceso a modelos propietarios, datos de entrenamiento, credenciales cloud y GPU compute. El compromiso de un inference server no es un incidente de seguridad, es un incidente de infraestructura crítica.
La documentación que expone a todo el mundo
El problema no es solo el código. Es la guía. La documentación oficial de SGLang recomienda --host 0.0.0.0 en todos los ejemplos de deployment. El Docker Compose oficial configura network_mode: host. Eso significa que todo equipo que siguió la guía, y la mayoría sigue, expuso el socket ZeroMQ del scheduler en la red.
El código default es 127.0.0.1. Seguro. Pero la guía dice para cambiar. Y cuando la guía oficial dice para abrir, el equipo abre. No es negligencia, es confianza en la documentación del proyecto. Confiar en la documentación de un proyecto de código abierto no es imprudencia. Es el flujo normal de operación. El problema es cuando la documentación enseña a configurar inseguramente y el proyecto no corrige las consecuencias.
Mitigaciones que necesitas aplicar hoy
El patch no viene. Las mitigaciones son workarounds, no correcciones de raíz. Pero son lo que existe. Para el CVE-2026-7301, restringe --host a 127.0.0.1 y añade firewall en los ports ZeroMQ. Para el CVE-2026-7302, bloquea /v1/images/edits y /v1/videos en el proxy reverso. Para el CVE-2026-7304, deshabilita --enable-custom-logit-processor. Si no necesitas multimodal, deshabilita. Si no usas rerank, bloquea el endpoint.
Reduce la superficie. Cada endpoint activo es un vector. Cada flag habilitado es una puerta. El principio es el mismo que aplicamos en cualquier infraestructura crítica: si no es necesario, no queda expuesto.
La responsabilidad es tuya
AI inference infrastructure es critical infrastructure. No es un servidor de teste, no es un prototipo, no es un side project. Es el software que procesa datos sensibles en hardware que cuesta cientos de miles de dólares por cluster. Y cuando el mantenedor no responde al CERT/CC por dos meses, la responsabilidad de proteger no desaparece, se transfiere.
En Tech86, operamos infraestructura cloud con la premisa de que la seguridad no depende del proveedor upstream. Si el patch no existe, la mitigación necesita existir. Si la documentación enseña mal, la configuración necesita corregir. Es por eso que nuestros Cloud Servers son provisionados con aislamiento de red por defecto, firewall configurado antes del primer deploy, y superficie de ataque reducida al mínimo funcional. Cuando el proveedor falla, la infraestructura necesita aguantar.