Python's standard library and its most popular frameworks contain 6 confirmed security vulnerabilities in 2026 — down from 12 in 2025, but the severity has jumped sharply. Two vulnerabilities stand out: CVE-2026-3298, an out-of-bounds write in asyncio.ProactorEventLoop that affects every Windows Python deployment running 3.11 or later, and CVE-2026-48710 (BadHost), a Host-header authentication bypass in Starlette that silently defeats middleware-level auth across FastAPI, LiteLLM, vLLM and thousands of AI agent deployments. On top of these, the tarfile module's security filters introduced in Python 3.12 have been found bypassable via a PATH_MAX overflow, and Python 3.11 reaches end of life in just 5 months.
La bibliothèque standard Python et ses frameworks les plus populaires comptent 6 vulnérabilités confirmées en 2026 — en baisse par rapport aux 12 de 2025, mais avec une sévérité en hausse marquée. Deux vulnérabilités se démarquent : CVE-2026-3298, une écriture hors limites dans asyncio.ProactorEventLoop qui touche tous les déploiements Python Windows en version 3.11 et supérieure, et CVE-2026-48710 (BadHost), un contournement d’authentification via l’en-tête Host dans Starlette qui désamorce silencieusement les middlewares d’auth dans FastAPI, LiteLLM, vLLM et des milliers d’agents IA. Par ailleurs, les filtres de sécurité du module tarfile introduits en Python 3.12 se révèlent contournables via un overflow PATH_MAX, et Python 3.11 atteint sa fin de vie dans seulement 5 mois.
CVE-2026-3298 asyncio
CVE-2026-3298 asyncio
per week (BadHost scope)
par semaine (périmètre BadHost)
security patches stop
correctifs sécurité arrêtés
CVE-2026-3298: asyncio Out-of-Bounds Write on Windows (CVSS 8.8)
CVE-2026-3298 : écriture hors limites asyncio sur Windows (CVSS 8.8)
sock_recvfrom_into() method of asyncio.ProactorEventLoop fails to enforce a boundary check when the optional nbytes parameter is specified. An attacker who controls a UDP peer can send a datagram larger than the target buffer, triggering an out-of-bounds write. At minimum, this causes a crash (DoS); on Windows, where the ProactorEventLoop uses IOCP (I/O Completion Ports) as the default event loop since Python 3.8, memory corruption could enable arbitrary code execution.sock_recvfrom_into() de asyncio.ProactorEventLoop ne vérifie pas les limites du tampon lorsque le paramètre optionnel nbytes est spécifié. Un attaquant contrôlant un pair UDP peut envoyer un datagramme plus grand que le tampon cible, déclenchant une écriture hors limites. Au minimum, cela provoque un crash (DoS) ; sur Windows, où ProactorEventLoop (IOCP) est la boucle d’événements par défaut depuis Python 3.8, la corruption mémoire pourrait permettre une exécution de code arbitraire.CVE-2026-3298 was disclosed on April 21, 2026, by Seth Larson (Python Security Developer-in-Residence) via the official Python security mailing list. A patch has been submitted as CPython GitHub Pull Request #148809, introducing proper boundary checks. Until an official release ships the fix, the recommended workaround is to explicitly set the Windows event loop policy to WindowsSelectorEventLoopPolicy:
CVE-2026-3298 a été divulguée le 21 avril 2026 par Seth Larson (Python Security Developer-in-Residence) via la liste de diffusion sécurité officielle Python. Un correctif a été soumis via CPython Pull Request #148809, ajoutant les vérifications de limites manquantes. En attendant une version officielle, le contournement recommandé est de forcer explicitement la boucle d’événements Windows vers WindowsSelectorEventLoopPolicy :
Note that WindowsSelectorEventLoopPolicy disables IOCP-backed performance benefits and is not suitable for all workloads (e.g., subprocess spawning is limited under SelectorEventLoop on Windows). Monitor the CPython security releases page and upgrade as soon as the patched version ships.
Notez que WindowsSelectorEventLoopPolicy désactive les bénéfices de performance IOCP et n’est pas adapté à tous les workloads (par exemple, la création de sous-processus est limitée sous SelectorEventLoop sur Windows). Surveillez la page des releases sécurité CPython et mettez à jour dès que la version corrigée est disponible.
CVE-2026-48710 — BadHost: How One Character Bypasses FastAPI Auth
CVE-2026-48710 — BadHost : Comment un caractère contourne l’auth FastAPI
request.url from the Host header. Because Starlette failed to sanitize the Host header before reconstruction, injecting characters like /, ?, or # into the Host value shifts where path boundaries fall in request.url.path. Any middleware that makes authorization decisions based on request.url.path (rather than the raw ASGI scope path) can be bypassed with a single injected character — no credentials required.request.url à partir de l’en-tête Host. Starlette ne validant pas cet en-tête avant la reconstruction, l’injection de caractères comme /, ? ou # dans la valeur Host décale les frontières de chemin dans request.url.path. Tout middleware prenant des décisions d’autorisation basées sur request.url.path (plutôt que sur le chemin brut du scope ASGI) peut être contounné avec un seul caractère injecté — sans authentification.The vulnerability was discovered by X41 D-Sec during an Open Source Technology Improvement Fund (OSTIF) sponsored audit of vLLM in January 2026. The patch — Starlette version 1.0.1 — shipped on May 21, one day before public disclosure, giving operators effectively zero lead time. The official CVSS score of 6.5 has been widely called an underestimate by the security community, given that the bypass requires no authentication and affects the entire Python AI infrastructure ecosystem.
La vulnérabilité a été découverte par X41 D-Sec lors d’un audit de vLLM commandé par l’Open Source Technology Improvement Fund (OSTIF) en janvier 2026. Le correctif — Starlette version 1.0.1 — a été publié le 21 mai, un jour avant la divulgation publique, laissant aux opérateurs un délai nul. Le score CVSS officiel de 6.5 est largement considéré comme sous-estimé par la communauté sécurité, compte tenu qu’aucune authentification n’est requise pour l’exploiter et que toute l’écosystème IA Python est concerné.
Directly vulnerable: FastAPI (any version pinned to Starlette < 1.0.1), Starlette < 1.0.1
Ecosystem risk: vLLM, LiteLLM, Text Generation Inference (TGI), OpenAI-compatible API proxies, MCP servers, AI agent harnesses, model-management UIs built on FastAPI or Starlette.
How to check: pip show starlette — upgrade to 1.0.1+ immediately.
Directement vulnérables : FastAPI (toute version pinned sur Starlette < 1.0.1), Starlette < 1.0.1
Risque écosystème : vLLM, LiteLLM, Text Generation Inference (TGI), proxies API compatibles OpenAI, serveurs MCP, harnais d’agents IA, UI de gestion de modèles construits sur FastAPI ou Starlette.
Vérification : pip show starlette — mettez à jour vers 1.0.1+ immédiatement.
The remediation is straightforward: upgrade to Starlette 1.0.1 or later. X41 D-Sec has also published a free online scanner at badhost.org along with Semgrep rules and CodeQL queries for detecting vulnerable middleware patterns in your codebase. As a defense-in-depth measure, ensure authorization logic in FastAPI always reads from the ASGI scope path rather than request.url.path:
La correction est simple : mettre à jour vers Starlette 1.0.1 ou supérieur. X41 D-Sec a également publié un scanner en ligne gratuit sur badhost.org avec des règles Semgrep et des requêtes CodeQL pour détecter les patterns de middleware vulnérables. En défense en profondeur, assurez-vous que la logique d’autorisation FastAPI lit toujours le chemin depuis le scope ASGI plutôt que depuis request.url.path :
CVE-2025-4517: tarfile Security Filter Bypass via PATH_MAX Overflow
CVE-2025-4517 : Contournement du filtre de sécurité tarfile via overflow PATH_MAX
tarfile to prevent path traversal attacks: filter="data" is the recommended secure mode, and filter="tar" preserves Unix metadata. CVE-2025-4517 reveals that both filters can be bypassed. When a tar archive contains a carefully crafted symlink chain whose resolved path exceeds PATH_MAX (4096 bytes on Linux), os.path.realpath(strict=False) silently stops resolving symlinks and falls back to pure string manipulation. This causes Python to believe a symlink resolves inside the extraction directory when it actually escapes to an arbitrary location on the filesystem.tarfile afin de prévenir les attaques de path traversal : filter="data" est le mode sécurisé recommandé, et filter="tar" préserve les métadonnées Unix. CVE-2025-4517 révèle que les deux filtres peuvent être contounnés. Quand une archive tar contient une chaîne de liens symboliques dont le chemin résolu dépasse PATH_MAX (4096 octets sur Linux), os.path.realpath(strict=False) cesse silencieusement de résoudre les symlinks et revient à une manipulation de chaîne pure. Python croit alors que le lien symbolique se résout à l’intérieur du répertoire d’extraction alors qu’il s’échappe vers un emplacement arbitraire du système de fichiers.The safe approach for untrusted archives in Python 3.12+ is to implement a custom filter that explicitly validates the resolved path against the extraction root, rather than relying solely on the built-in filter keywords:
L’approche sécurisée pour les archives non fiables en Python 3.12+ est d’implémenter un filtre personnalisé qui valide explicitement le chemin résolu par rapport à la racine d’extraction, plutôt que de se fier uniquement aux mots-clés de filtre intégrés :
Additionally, CVE-2024-12718 (also affecting tarfile extraction filters in Python 3.12+) allows attackers to modify file metadata or permissions outside the intended extraction directory. Both vulnerabilities underscore that no single filter keyword is sufficient when processing archives from untrusted sources — a defense-in-depth approach with explicit path validation is required.
De plus, CVE-2024-12718 (affectant également les filtres d’extraction tarfile en Python 3.12+) permet à des attaquants de modifier des métadonnées ou permissions de fichiers en dehors du répertoire d’extraction. Ces deux vulnérabilités soulignent qu’aucun filtre seul ne suffit pour traiter des archives non fiables — une approche de défense en profondeur avec validation explicite des chemins est nécessaire.
Python Version EOL in 2026: 3.11 Reaches End of Life in October
Fin de Vie des Versions Python en 2026 : Python 3.11 EOL en octobre
Python 3.11 receives its last security patch on October 31, 2026 — just 5 months from now. After that date, discovered vulnerabilities like CVE-2026-3298 will no longer be backported. Teams still running 3.11 in production need to plan their upgrade to 3.12 or 3.13 immediately, as migration typically takes longer than expected in enterprise environments.
Python 3.11 recevra son dernier correctif de sécurité le 31 octobre 2026 — dans seulement 5 mois. Après cette date, les vulnérabilités découvertes comme CVE-2026-3298 ne seront plus backportées. Les équipes utilisant encore Python 3.11 en production doivent planifier leur migration vers 3.12 ou 3.13 immédiatement, car la migration prend souvent plus de temps que prévu en environnement d’entreprise.
| Python Version | EOL Date | Status | Version Python | Date EOL | Statut |
|---|---|---|---|---|---|
| Python 3.9 | October 31, 2025 | EOL — no security patches | EOL — plus de correctifs | ||
| Python 3.10 | October 31, 2026 | EOL in 5 months — migrate now | EOL dans 5 mois — migrez maintenant | ||
| Python 3.11 | October 31, 2026 | EOL in 5 months — migrate now | EOL dans 5 mois — migrez maintenant | ||
| Python 3.12 | October 31, 2028 | Active — recommended | Active — recommandée | ||
| Python 3.13 | October 31, 2029 | Active — latest stable | Active — dernière stable |
Source: Python Developer's Guide — devguide.python.org/versions, June 2026
Source: Python Developer's Guide — devguide.python.org/versions, juin 2026
Other Notable Python Security Issues in 2026
Autres Problèmes de Sécurité Python Notables en 2026
Beyond the two headline vulnerabilities, 2026 has seen several other significant issues in the Python ecosystem:
Au-delà des deux vulnérabilités phares, 2026 a vu plusieurs autres problèmes importants dans l’écosystème Python :
requests.utils.extract_zipped_paths() utility saves extracted files to a predictable file path in the system temporary directory. An attacker with local access can pre-create a file at the expected path, causing the application to load attacker-controlled content. Fix: upgrade to requests >= 2.33.0.requests.utils.extract_zipped_paths() sauvegarde les fichiers extraits dans un chemin prévisible du répertoire temporaire système. Un attaquant disposant d’un accès local peut pré-créer un fichier au chemin attendu, forçant l’application à charger un contenu contrôlé par l’attaquant. Correctif : passer à requests >= 2.33.0.Python Security Hardening Checklist for 2026
Checklist de Durcissement Sécurité Python pour 2026
Apply these controls across your Python projects to reduce exposure to the vulnerabilities described above and the broader threat landscape:
Appliquez ces contrôles dans vos projets Python pour réduire l’exposition aux vulnérabilités décrites ci-dessus et au paysage de menaces global :
- Pin all dependencies in
requirements.txtorpoetry.lockwith exact hashes - Pinner toutes les dépendances dans
requirements.txtoupoetry.lockavec des hashes exacts - Run
pip-auditin CI on every push — blocks merges on HIGH/CRITICAL CVEs - Exécuter
pip-auditen CI à chaque push — bloque les merges sur les CVE HIGH/CRITICAL - Enable PyPI Trusted Publishers (OIDC) for your own packages
- Activer PyPI Trusted Publishers (OIDC) pour vos propres packages
- Upgrade Starlette to ≥ 1.0.1 immediately (BadHost)
- Mettre à jour Starlette vers ≥ 1.0.1 immédiatement (BadHost)
- Set
WindowsSelectorEventLoopPolicyon Windows (asyncio CVE-2026-3298) - Configurer
WindowsSelectorEventLoopPolicysur Windows (CVE-2026-3298) - Use
request.scope["path"]notrequest.url.pathin FastAPI auth middleware - Utiliser
request.scope["path"]et nonrequest.url.pathdans les middlewares FastAPI - Never use
tarfile.extractall()on untrusted archives without a custom path validator - Ne jamais utiliser
tarfile.extractall()sur des archives non fiables sans validateur de chemin personnalisé - Migrate from Python 3.9/3.10/3.11 before October 31, 2026
- Migrer de Python 3.9/3.10/3.11 avant le 31 octobre 2026
Frequently Asked Questions
Questions Fréquentes
Is CVE-2026-3298 exploitable remotely?
CVE-2026-3298 est-elle exploitable à distance ?
Yes — the CVSS 4.0 vector includes a Network attack vector with no authentication or user interaction required. An attacker controlling a UDP peer reachable by the vulnerable application can send crafted datagrams to trigger the out-of-bounds write. The impact ranges from a crash (DoS) to potential arbitrary code execution on Windows hosts running Python 3.11+.
Oui — le vecteur CVSS 4.0 inclut un vecteur d’attaque réseau sans authentification ni interaction utilisateur requise. Un attaquant contrôlant un pair UDP accessible par l’application vulnérable peut envoyer des datagrammes conçus pour déclencher l’écriture hors limites. L’impact va du crash (DoS) à une potentielle exécution de code arbitraire sur les hôtes Windows en Python 3.11+.
Does the BadHost vulnerability affect my Django app?
La vulnérabilité BadHost affecte-t-elle mon application Django ?
No. Django uses its own WSGI/ASGI routing and does not rely on Starlette. CVE-2026-48710 (BadHost) exclusively affects ASGI applications built on Starlette or using frameworks that depend on Starlette — primarily FastAPI, vLLM, LiteLLM, and similar tools in the Python AI/ML ecosystem. Django, Flask, aiohttp, and Tornado are not affected.
Non. Django utilise son propre routage WSGI/ASGI et ne dépend pas de Starlette. CVE-2026-48710 (BadHost) affecte exclusivement les applications ASGI construites sur Starlette ou utilisant des frameworks qui dépendent de Starlette — principalement FastAPI, vLLM, LiteLLM et outils similaires de l’écosystème Python IA/ML. Django, Flask, aiohttp et Tornado ne sont pas concernés.
Is filter="data" still the recommended approach for tarfile after CVE-2025-4517?
filter="data" reste-t-il recommandé pour tarfile après CVE-2025-4517 ?
Yes, but not in isolation. The filter="data" parameter should still be passed — it blocks many attack vectors. However, because CVE-2025-4517 shows that the PATH_MAX overflow can bypass even the data filter via crafted symlink chains, you must combine it with explicit pre-extraction path validation that rejects all symlinks and verifies resolved paths against the extraction root. Using filter="data" alone is no longer sufficient for untrusted archives.
Oui, mais pas isolément. Le paramètre filter="data" doit toujours être passé — il bloque de nombreux vecteurs d’attaque. Cependant, comme CVE-2025-4517 montre que l’overflow PATH_MAX peut contourner même le filtre data via des chaînes de symlinks conçus, vous devez le combiner avec une validation explicite des chemins avant extraction, rejetant tous les symlinks et vérifiant les chemins résolus par rapport à la racine d’extraction. Utiliser filter="data" seul ne suffit plus pour les archives non fiables.
Should I migrate from Python 3.11 to 3.12 or 3.13?
Dois-je migrer de Python 3.11 vers 3.12 ou 3.13 ?
Both are valid choices. Python 3.12 is battle-tested (EOL October 2028) and the pragmatic choice for most teams. Python 3.13 is the latest stable release (EOL October 2029) and includes free-threaded mode (no-GIL) as a preview feature for performance-sensitive workloads. If you have strict CI/CD pipelines, starting with 3.12 is lower risk; if you can invest in testing, 3.13 gives an extra year of security support. Avoid staying on 3.11 past October 2026 — unpatched CVEs will accumulate rapidly.
Les deux sont des choix valides. Python 3.12 est éprouvé (EOL octobre 2028) et le choix pragmatique pour la plupart des équipes. Python 3.13 est la dernière release stable (EOL octobre 2029) et inclut le mode sans GIL en préview pour les workloads sensibles à la performance. Si vous avez des pipelines CI/CD stricts, commencer par 3.12 est moins risqué ; si vous pouvez investir dans les tests, 3.13 offre un an de support sécurité supplémentaire. Évitez de rester sur Python 3.11 après octobre 2026 — les CVE non patchées s’accumuleront rapidement.
How do I detect if my project is exposed to any of these vulnerabilities automatically?
Comment détecter automatiquement si mon projet est exposé à ces vulnérabilités ?
For dependency vulnerabilities (BadHost, CVE-2026-25645, Lightning supply chain), run pip-audit against your lockfile — it queries the OSV database and flags known CVEs with affected version ranges. For runtime configuration issues (CVE-2026-3298 asyncio policy, tarfile misuse), a SAST tool like Semgrep with the rules published by X41 D-Sec can detect vulnerable coding patterns. For continuous monitoring across all your Python projects with lockfile scanning and automated alerts, CVE OptiBot automates this pipeline daily.
Pour les vulnérabilités de dépendances (BadHost, CVE-2026-25645, supply chain Lightning), exécutez pip-audit contre votre lockfile — il interroge la base OSV et signale les CVE connues avec les plages de versions affectées. Pour les problèmes de configuration runtime (CVE-2026-3298 asyncio policy, mauvaise utilisation tarfile), un outil SAST comme Semgrep avec les règles publiées par X41 D-Sec peut détecter les patterns de code vulnérables. Pour un monitoring continu sur tous vos projets Python avec scan des lockfiles et alertes automatisées, CVE OptiBot automatise ce pipeline quotidiennement.
Is Python still a secure language for building web applications?
Python reste-t-il un langage sécurisé pour développer des applications web ?
Absolutely. Python's security record is strong — 6 CVEs in all of 2026 across the entire CPython interpreter is remarkably low for a language running millions of production services. The vulnerabilities in this article are serious but patchable with standard dependency management practices. The greater risk for Python web apps in 2026 is not the interpreter but the dependency supply chain — PyPI supply chain attacks (see our PyPI supply chain article), misconfigured pip install scripts, and unmonitored transitive dependencies. Keep your lockfiles up to date, run automated CVE scanning, and monitor Python EOL dates.
Absolument. Le bilan sécurité de Python est solide — 6 CVE sur toute l’année 2026 dans l’interpréteur CPython complet est remarquablement bas pour un langage qui fait tourner des millions de services en production. Les vulnérabilités de cet article sont sérieuses mais corrigeables avec de bonnes pratiques standard de gestion des dépendances. Le risque le plus élevé pour les apps web Python en 2026 n’est pas l’interpréteur mais la supply chain des dépendances — attaques supply chain PyPI (voir notre article supply chain PyPI), scripts pip install mal configurés, et dépendances transitives non surveillées. Gardez vos lockfiles à jour, exécutez des scans CVE automatisés, et surveillez les dates EOL Python.
Monitor Your Python Dependencies Automatically
Surveillez Vos Dépendances Python Automatiquement
CVE OptiBot scans your requirements.txt, poetry.lock and Pipfile.lock daily against the OSV database. Get alerted before CVE-2026-3298 or BadHost-class vulnerabilities reach your production environment — across all your Python projects in a single dashboard.
CVE OptiBot scanne vos requirements.txt, poetry.lock et Pipfile.lock quotidiennement contre la base OSV. Soyez alerté avant que des vulnérabilités comme CVE-2026-3298 ou BadHost n’atteignent votre environnement de production — sur tous vos projets Python depuis un seul tableau de bord.