En bref

  • SGLang 0.5.9 : RCE via SSTI Jinja2 dans les fichiers GGUF (CVE-2026-5760, CVSS 9.8)
  • Exploitation déclenchée par le chargement d'un modèle et un appel à /v1/rerank
  • Pas de sandbox Jinja2 : tout GGUF téléchargé depuis un dépôt public devient vecteur RCE

Les faits

Les chercheurs d'Orca Security ont publié le 20 avril 2026 les détails de CVE-2026-5760, une vulnérabilité critique (CVSS 9.8) dans SGLang, framework open-source d'inférence pour grands modèles de langage. La faille permet à un attaquant de déclencher une exécution de code distante via un fichier GGUF (GPT-Generated Unified Format) malveillant dont le paramètre tokenizer.chat_template contient une payload d'injection de template côté serveur (SSTI) écrite en Jinja2.

La cause racine est l'utilisation de jinja2.Environment() sans bac à sable, au lieu de la variante ImmutableSandboxedEnvironment. Lorsque la victime charge le modèle piégé dans SGLang et qu'une requête atteint l'endpoint /v1/rerank avec la phrase déclencheuse "The answer can only be 'yes' or 'no'" (reconnue par la détection du reranker Qwen3), le template est rendu et la payload exécute du code Python arbitraire sur le serveur d'inférence.

Impact et exposition

Tout déploiement SGLang qui charge des modèles GGUF provenant de dépôts publics (Hugging Face, mirrors communautaires) est vulnérable. La surface est d'autant plus large que SGLang est massivement utilisé pour servir Qwen, DeepSeek, Llama et d'autres LLM en production. Les serveurs d'inférence exposent souvent des GPU, des clés API tierces (OpenAI, Anthropic) et des données sensibles transitées en prompt ou en RAG, autant de cibles de valeur pour un attaquant ayant obtenu un shell.

Recommandations

  • Ne charger que des modèles GGUF signés ou provenant de sources vérifiées en interne
  • Mettre à niveau SGLang dès la publication du correctif enforcement de la sandbox Jinja2
  • En attendant, auditer les modèles déjà déployés en recherchant des chat_templates contenant des appels suspects (subprocess, os, open, __class__, __mro__)
  • Isoler les serveurs d'inférence dans des segments réseau dédiés avec egress filtré
  • Activer le monitoring des processus enfants de SGLang pour détecter toute exécution Python non attendue

Alerte critique

L'écosystème LLM normalise le téléchargement massif de modèles tiers. CVE-2026-5760 transforme chaque fichier GGUF en potentiel cheval de Troie. Un seul modèle piégé sur Hugging Face peut compromettre des milliers de serveurs SGLang.

Comment auditer un fichier GGUF sans le charger dans SGLang ?

Extrayez les métadonnées avec gguf-py ou llama.cpp gguf-dump et inspectez le champ tokenizer.chat_template. Toute construction Jinja2 contenant {{% set %}} avec appels à __class__, __subclasses__, __globals__, os ou subprocess est un indicateur de compromission. Le template légitime ne devrait contenir que de la mise en forme de messages chat.

Votre infrastructure est-elle exposée ?

Ayi NEDJIMI réalise des audits de sécurité ciblés pour identifier et corriger vos vulnérabilités avant qu'elles ne soient exploitées.

Demander un audit