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

Points clés à retenir

  • Les faits
  • Impact et exposition
  • Recommandations

Le 20 avril 2026, les chercheurs d'Orca Security ont publié les détails techniques de CVE-2026-5760, une vulnérabilité critique notée 9.8 sur l'échelle CVSS affectant SGLang, framework open source d'inférence largement adopté pour le déploiement de grands modèles de langage. La faille réside dans le traitement des fichiers au format GGUF (GPT-Generated Unified Format) : le champ tokenizer.chat_template, extrait des métadonnées du modèle, est transmis sans validation au moteur de templates Jinja2, dont l'environnement d'exécution n'est pas cloisonné. Un attaquant capable de faire charger un modèle piégé — via un dépôt public, un miroir compromis ou une chaîne d'approvisionnement détournée — obtient ainsi l'exécution de code arbitraire à distance sur le serveur d'inférence, avec les privilèges du processus hôte, sans authentification préalable ni interaction de l'utilisateur.

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

Sources et références