La logique de reconstruction d'URL de Starlette crée un décalage dangereux entre le chemin qui est routé et celui qui est autorisé. Lorsqu'une requête HTTP arrive, le routeur identifie correctement le point de terminaison cible à partir de la ligne de requête brute. Cependant, lorsque l'application vérifie request.url pour décider si un utilisateur est autorisé, Starlette reconstruit cette URL en concaténant l'en-tête Host avec le chemin de la requête, puis en analysant à nouveau le résultat .
Un attaquant peut exploiter cela en envoyant une requête vers un point de terminaison protégé comme /admin/secure avec une en-tête Host soigneusement empoisonnée, par exemple :
Host: legitimate.com/health?x=
Le routeur achemine correctement la requête au gestionnaire /admin/secure — mais lorsque le middleware d'autorisation examine request.url.path, il voit /health à la place. Si le middleware utilise une liste blanche qui fait confiance à /health en tant que point de contrôle de santé public, l'attaquant passe au travers. Le contrôle d'autorisation est silencieusement contourné ; sans jeton, sans mot de passe, sans aucune interaction de l'utilisateur .
L'avis de X41 D-Sec confirme la simplicité stupéfiante de l'attaque : « Il suffit d'insérer un seul caractère dans l'en-tête HTTP Host pour tromper le serveur » . Les caractères qui déclenchent la confusion incluent les barres obliques, les points d'interrogation et les symboles dièse — des délimiteurs d'URL standard que Starlette n'a jamais validés
.
La portée de la vulnérabilité est stupéfiante. Starlette est le moteur caché de presque tous les outils majeurs de gestion et d'orchestration d'IA en Python, téléchargé environ 325 millions de fois par semaine . Tous les projets qui dépendent d'une version de Starlette antérieure à la 1.0.1 sont affectés :
Les versions affectées confirmées vont de Starlette >= 0.8.3 à < 1.0.1, ce qui signifie que les systèmes fonctionnant sur des versions stables depuis des années sont tous potentiellement vulnérables .
Le niveau de sévérité officiel de la CVE-2026-48710 a suscité un désaccord important au sein de la communauté de la sécurité :
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N traite l'impact sur la confidentialité et l'intégrité comme « Faible », limite la portée à « Inchangée » et ne signale aucun impact sur la disponibilité CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:H/SI:H/SA:NTrois facteurs étayent l'argument des chercheurs selon lequel 6.5 est dangereusement bas :
SC:H/SI:H de CVSS v4.0 capturent enfin La version 1.0.1 de Starlette, publiée le 22 mai 2026, contient le correctif définitif. Ce correctif est suivi dans l'avis de sécurité GitHub GHSA-86qp-5c8j-p5mr et l'avis X41 X41-2026-002 .
Le correctif met en œuvre deux protections essentielles :
Host est désormais validé par rapport à la grammaire spécifiée dans les RFC 9112 §3.2 et RFC 3986 §3.2.2 avant d'être utilisé pour construire request.url scope["server"] — le tuple de connexion réel du serveur — plutôt que la valeur fournie par l'attaquant. Ainsi, request.url.path reflète systématiquement le chemin routé réel Le projet FastAPI a confirmé l'efficacité du correctif et recommandé de mettre à niveau starlette vers >=1.0.1 immédiatement .
La mise à niveau du paquet Starlette est la première étape essentielle, mais une défense complète nécessite plusieurs couches :
Appliquez le correctif immédiatement. Dans chaque environnement virtuel, image de conteneur et pipeline de déploiement exécutant une infrastructure d'IA, exécutez :
pip install --upgrade starlette
Redémarrez tous les services affectés. Cela s'applique aux installations directes de Starlette ainsi qu'aux instances de FastAPI, vLLM, LiteLLM et des serveurs MCP .
Auditez et épinglez les dépendances. FastAPI et d'autres frameworks peuvent ne pas appliquer automatiquement la version minimale de Starlette. Exigez explicitement starlette>=1.0.1 dans vos fichiers requirements.txt, pyproject.toml, poetry.lock ou équivalents. Exécutez pip list | grep starlette.
Analysez chaque composant de la pile IA. Tout service Python qui sert du HTTP — applications FastAPI personnalisées, points de terminaison d'inférence LLM, plans d'orchestration d'agents, panneaux d'évaluation de modèles et proxys compatibles OpenAI — peut embarquer une version vulnérable de Starlette. Effectuez un audit complet de l'infrastructure .
Renforcez les reverse proxies et les WAF. Configurez nginx, Envoy, HAProxy, Cloudflare ou AWS ALB pour rejeter ou assainir les en-têtes Host malformées avant de transmettre le trafic aux applications Python. Cela fournit une défense en profondeur qui bloque l'exploitation même si l'application du correctif est retardée .
Réécrivez les contrôles de sécurité de chemin loin de request.url.path. La cause racine était le décalage entre le chemin de routage et request.url.path. Dans la mesure du possible, faites migrer le middleware d'autorisation pour utiliser request.scope["path"], qui provient de la portée ASGI brute et ne peut pas être empoisonné par l'en-tête Host . X41 D-Sec recommande d'éviter totalement l'autorisation basée sur le chemin au profit de mécanismes d'authentification intrinsèques au point de terminaison
.
Testez l'exposition. Un scanner en ligne a été publié pour aider les organisations à vérifier si leurs serveurs sont vulnérables . Combiné à des tests d'intrusion approfondis sur les frontières d'authentification, cela peut révéler des surfaces d'attaque négligées.
Pour les déploiements basés sur Debian, la CVE-2026-48710 est suivie dans le Traqueur de Sécurité Debian avec une sévérité « importante », et des versions ponctuelles corrigées de starlette sont disponibles pour les suites affectées . Appliquez la transaction
apt corrective depuis le dépôt bullseye-security ou équivalent, et rechargez les fichiers d'unité systemd concernés .
Comments
0 comments