Une bibliothèque téléchargée près d’un milliard de fois vient d’admettre qu’elle acceptait, dans certaines conditions, des messages de négociation TLS 1.3 au mauvais niveau de chiffrement. L’avis RUSTSEC-2026-0285, publié le 14 septembre 2026 par la base RustSec, concerne Rustls, l’implémentation TLS écrite en Rust qui équipe une large part de l’infrastructure réseau moderne. Le correctif est sorti dans la version 0.23.45. Le score CVSS est de 5,3, classé “medium”. Ce n’est ni une catastrophe comparable à Heartbleed, ni un non-événement : c’est le genre de défaut discret qui en dit long sur la fragilité persistante du protocole le plus utilisé d’Internet, même réécrit dans un langage réputé plus sûr.
Que s’est-il passé exactement avec Rustls et TLS 1.3 ?
L’avis publié sur rustsec.org décrit un problème précis : Rustls acceptait des messages de handshake TLS 1.3 envoyés au mauvais niveau de chiffrement lorsqu’ils suivaient un message de changement de clé dans le même enregistrement réseau. Concrètement, un message EncryptedExtensions en clair pouvait être empaqueté dans le même enregistrement que le ServerHello, et Rustls le laissait passer au lieu de couper la connexion. La norme RFC 8446, section 5.1, est pourtant limpide : les messages de handshake ne doivent jamais franchir une limite de changement de clé, et une implémentation conforme doit mettre fin à la connexion avec une alerte “unexpected_message” dès qu’elle détecte ce cas.
Le rôle des niveaux de chiffrement dans TLS 1.3
TLS 1.3 change de clé plusieurs fois pendant la négociation : une clé pour le handshake, puis une autre pour les données applicatives. Cette séparation stricte empêche un message destiné à être protégé de circuler en clair sans que personne ne s’en aperçoive. Le défaut de Rustls cassait cette frontière sans casser l’authentification du transcript de négociation. La bibliothèque continuait donc, dans les faits, à produire une session valide, mais elle tolérait un comportement que le protocole interdit explicitement.
Pourquoi ce n’est pas un contournement d’authentification
Le vecteur CVSS associé à RUSTSEC-2026-0285 est CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N. L’impact sur l’intégrité et la disponibilité est noté “None”. Seule la confidentialité reçoit un impact “Low”. L’avis GitHub associé, référencé GHSA-2mjx-qc3c-rqvc, précise qu’un attaquant en position réseau ne peut pas altérer ou compléter une négociation grâce à cette faille, puisque le transcript reste authentifié. Le risque réel tient plutôt à un pair malveillant ou mal implémenté qui enverrait des données en clair là où elles devraient être chiffrées, sans que Rustls ne rejette l’échange.
Chronologie : du signalement du 14 septembre au correctif
L’entrée OSV confirme que le signalement et la publication de l’avis portent la même date, le 14 septembre 2026. La base de données osv.dev liste les versions affectées : toute version égale ou supérieure à 0.23.13 (sortie en septembre 2024) et inférieure à 0.23.45 est concernée. Les versions antérieures à 0.23.13 ne sont pas touchées, ce qui situe la fenêtre d’exposition à près de deux ans. Le projet a réagi en publiant 0.23.45, désormais la version stable la plus récente de la branche 0.23, en attendant la sortie future de la branche 0.24. Le bug a aussi été corrigé dans rustls-ffi, la couche d’interopérabilité utilisée par des projets non écrits en Rust qui s’appuient sur Rustls via une interface C.
Le correctif s’est ensuite propagé en dehors de l’écosystème Cargo. L’avis a été repris par GitLab dans sa propre base, consultable à l’adresse advisories.gitlab.com, et Red Hat a publié l’errata RHSA-2026:67285 pour livrer le paquet corrigé à ses clients Enterprise Linux. Le miroir Debian du projet RustSec a lui aussi indexé l’avis, signe que la faille a traversé toute la chaîne de distribution, des mainteneurs Rust jusqu’aux dépôts des distributions d’entreprise utilisées dans les datacenters français et européens.
CVSS 5,3 : ce que ce score dit, et ce qu’il ne dit pas
Un score medium à 5,3 n’a rien d’alarmant sur le papier. Mais le score CVSS mesure une gravité technique isolée, pas l’importance d’un composant dans la chaîne d’approvisionnement logicielle mondiale. Rustls n’est pas une bibliothèque de niche. C’est l’un des piliers du mouvement “memory-safe TLS”, avec BoringSSL côté audit renforcé par Google et s2n-tls côté AWS. Le projet est soutenu financièrement par Prossimo, l’initiative de l’Internet Security Research Group (ISRG), l’organisation à l’origine de Let’s Encrypt, précisément parce qu’elle considère la réécriture des piles réseau critiques dans des langages à sécurité mémoire comme une priorité de sécurité d’Internet. Un score medium sur ce composant pèse donc différemment qu’un score medium sur une bibliothèque obscure utilisée par cinq projets.
Autre nuance importante : aucun numéro CVE n’a été attribué à RUSTSEC-2026-0285 à la date de publication de cet article. La faille circule uniquement sous ses identifiants RustSec et GitHub Security Advisory. Pour les équipes sécurité qui scannent leurs dépendances par numéro CVE plutôt que par identifiant GHSA ou RUSTSEC, cela représente un angle mort réel : un inventaire basé uniquement sur une base CVE classique peut tout simplement ne jamais voir cette faille.
Rustls en chiffres : l’ampleur réelle de l’exposition
Les données publiques de crates.io, le registre officiel des paquets Rust, donnent la mesure de la diffusion de Rustls dans l’écosystème. Le tableau suivant résume les chiffres clés au moment de la faille.
| Indicateur | Valeur |
|---|---|
| Téléchargements cumulés du paquet rustls | 976 404 459 |
| Téléchargements sur la période récente | 222 396 788 |
| Paquets dépendants recensés (reverse dependencies) | 4 726 |
| Version introduisant le défaut | 0.23.13 (sept. 2024) |
| Version corrigée | 0.23.45 |
| Score CVSS 3.1 | 5,3 (Medium) |
| Identifiants officiels | RUSTSEC-2026-0285 / GHSA-2mjx-qc3c-rqvc |
Près d’un milliard de téléchargements cumulés et plus de 4 700 paquets dépendants directs ou indirects : ces chiffres placent Rustls dans la même catégorie d’infrastructure critique qu’OpenSSL ou BoringSSL, à la différence qu’il a été conçu dès le départ pour éliminer les failles mémoire qui ont fait la réputation désastreuse d’OpenSSL dans les années 2010. La faille RUSTSEC-2026-0285 ne contredit pas cette promesse de sécurité mémoire, elle rappelle simplement qu’un langage sûr côté mémoire reste vulnérable aux erreurs de logique protocolaire.
Le précédent troublant de Go : le même bug, huit mois plus tôt
Ce qui rend RUSTSEC-2026-0285 particulièrement intéressant, c’est qu’il n’est pas isolé. L’avis le dit lui-même : il s’agit fonctionnellement du même bug que GO-2026-4340, référencé CVE-2025-61730, découvert dans le paquet crypto/tls de la bibliothèque standard du langage Go. Cette faille avait été signalée à l’équipe Go dès le 30 septembre 2025, publiée le 28 janvier 2026, et corrigée dans Go 1.24.12 et Go 1.25.6. La description officielle parle d’une divulgation d’information mineure si un attaquant positionné sur le réseau local parvient à injecter des messages pendant le handshake.
Deux équipes différentes, deux langages différents, deux implémentations TLS 1.3 indépendantes, et pourtant la même erreur de frontière entre niveaux de chiffrement, découverte à huit mois d’écart. Ce n’est pas une coïncidence de code copié-collé, c’est le signe que la spécification RFC 8446 laisse une zone d’ambiguïté suffisante pour que des implémenteurs compétents, dans des écosystèmes séparés, tombent dans le même piège. Shattered.io a déjà couvert une autre défaillance de ce protocole chez Go crypto/tls, qui avait paralysé des serveurs TLS 1.3 avec 45 avis de sécurité en cascade. L’écosystème Go, cette fois, n’est pas la source du nouveau problème, mais son historique récent confirme que même les piles TLS les mieux financées et les plus auditées ne sont pas à l’abri d’erreurs similaires.
Rust, Go, C : la sécurité mémoire ne suffit pas à elle seule
Depuis une dizaine d’années, l’industrie de la cryptographie réseau a misé sur la réécriture dans des langages à sécurité mémoire pour éliminer la classe de bugs qui a produit Heartbleed en 2014 : un simple contrôle de longueur manquant dans une extension “heartbeat” d’OpenSSL, qui avait exposé jusqu’à 64 Ko de mémoire serveur par requête et forcé le renouvellement massif de certificats à l’échelle mondiale. Rust et Go éliminent effectivement les corruptions de mémoire natives de ce type. Mais RUSTSEC-2026-0285 et CVE-2025-61730 montrent que la classe de bugs “logique protocolaire mal implémentée” survit intacte au changement de langage. Le tableau ci-dessous situe la faille Rustls parmi d’autres incidents touchant des piles TLS majeures.
| Bibliothèque | Langage | Faille comparable | Correctif | CVSS |
|---|---|---|---|---|
| Rustls | Rust | RUSTSEC-2026-0285 (limites de chiffrement TLS 1.3) | 0.23.45, sept. 2026 | 5,3 |
| Go crypto/tls | Go | CVE-2025-61730 (même défaut logique) | Go 1.24.12 / 1.25.6, janv. 2026 | Non noté par la CNA Go |
| Mbed TLS | C | CVE-2026-25832 (faille TLS 1.3) | Correctif 2026 | 3,7 |
| OpenSSL | C | Heartbleed, CVE-2014-0160 (référence historique) | Correctif d’urgence, 2014 | 7,5 (NVD, rétrospectif) |
La comparaison avec le passage en revue que shattered.io avait fait d’OpenSSL, BoringSSL et wolfSSL reste instructive : même quand une équipe dispose de ressources d’audit considérables, la surface d’attaque d’un protocole aussi complexe que TLS 1.3 continue de produire des angles morts. Les failles de la vague de six CVE TLS 1.3 détectée plus tôt en 2026 avaient déjà montré ce schéma : la version la plus récente et la mieux considérée du protocole n’est pas synonyme d’absence de bugs, seulement de bugs d’une classe différente de ceux des années 2010.
Qui utilise Rustls, et pourquoi ce correctif compte pour la France et l’Europe
Rustls s’est imposé comme une alternative crédible à OpenSSL dans plusieurs couches de l’infrastructure réseau moderne : proxys, outils en ligne de commande écrits en Rust, composants de navigateurs, services cloud natifs, et une partie croissante de l’écosystème blockchain qui privilégie les langages à sécurité mémoire pour les composants réseau sensibles. Avec 4 726 paquets qui en dépendent directement ou indirectement sur crates.io, une régression de ce type se propage mécaniquement vers des milliers de projets en aval, souvent sans que leurs responsables n’en aient conscience jusqu’à ce qu’un outil d’audit de dépendances comme cargo audit ne la signale.
Pour les entreprises françaises et européennes soumises à NIS2 ou à des obligations sectorielles de cybersécurité, l’épisode illustre un problème récurrent de gouvernance logicielle : l’inventaire des dépendances cryptographiques exigé par les régulateurs doit désormais couvrir des identifiants GHSA et RustSec, pas seulement des numéros CVE classiques. Une direction technique qui ne surveille que les flux CVE habituels aurait pu laisser filer cette faille pendant plusieurs semaines sans la détecter, précisément parce qu’aucun CVE n’a encore été attribué.
Comment vérifier si votre infrastructure est exposée
La vérification technique est simple pour toute équipe disposant d’un projet Rust. La commande cargo tree permet d’identifier les versions exactes de Rustls présentes dans l’arbre de dépendances, y compris les versions transitives tirées par des bibliothèques tierces.
cargo tree -i rustls
cargo audit
cargo update -p rustls --precise 0.23.45
La commande cargo audit interroge directement la base RustSec et signale toute dépendance correspondant à un avis publié, y compris RUSTSEC-2026-0285. Pour les équipes qui ne maîtrisent pas directement le code Rust mais qui exploitent un produit tiers construit sur Rustls, la seule option fiable consiste à consulter la page de sécurité de l’éditeur ou à exiger une attestation de version dans le cadre d’une revue fournisseur.
Ce que cette faille révèle sur l’audit du code Rust critique
Rustls a fait l’objet de plusieurs audits externes financés par Prossimo depuis sa création par Joseph Birr-Pixton. Ces audits ont historiquement porté sur la mémoire, la gestion des types et la logique cryptographique de bas niveau. RUSTSEC-2026-0285 touche une zone différente : la validation de l’état du protocole pendant la phase de négociation, un domaine où même un typage rigoureux ne garantit pas automatiquement qu’une implémentation rejette tous les messages mal formés au bon moment. La catégorie officielle attribuée à cette faille dans la base RustSec, “crypto-failure”, confirme ce classement : ce n’est pas un bug de mémoire, c’est un bug de conformité au protocole.
Cette distinction compte pour l’avenir de l’audit logiciel. Les outils d’analyse statique spécialisés dans la détection de corruptions mémoire, très efficaces sur du code C ou C++, n’auraient probablement rien détecté dans ce cas, puisque le défaut relève d’une machine à états mal implémentée plutôt que d’un dépassement de tampon. Les tests de conformité protocolaire restent donc indispensables, même face à du code écrit dans un langage mémoire-sûr.
Impact pour les entreprises françaises et européennes
L’ampleur de l’impact réel reste, à ce stade, difficile à chiffrer précisément pour le marché français. Aucune donnée publique ne permet d’établir combien d’entreprises tricolores exploitent Rustls en production, et il faut résister à la tentation d’extrapoler un chiffre nationalement précis à partir des statistiques globales de crates.io. Ce qui est vérifiable, en revanche, c’est que la propagation du correctif via Red Hat Enterprise Linux et les miroirs Debian signifie que des administrations et entreprises européennes utilisant ces distributions ont reçu, ou recevront, le correctif via leurs canaux habituels de mise à jour système, sans action manuelle nécessaire au niveau applicatif dans la majorité des cas.
Le risque concret se situe surtout chez les équipes qui compilent leurs propres binaires Rust en figeant une version de Rustls dans leur fichier de verrouillage de dépendances (Cargo.lock) sans processus de mise à jour automatisé. Dans ce cas précis, la faille peut rester active indéfiniment, bien après la sortie du correctif, tant qu’une recompilation n’est pas déclenchée.
Prédictions : ce qui va changer après RUSTSEC-2026-0285
Plusieurs tendances se dessinent à partir de cet épisode.
- Les outils de gestion des dépendances vont devoir mieux intégrer les identifiants GHSA et RUSTSEC à côté des CVE classiques, faute de quoi des failles comme celle-ci continueront à échapper aux scanners configurés uniquement sur des flux CVE.
- D’autres implémentations TLS 1.3 indépendantes vont probablement signaler des variantes du même défaut de frontière de chiffrement dans les mois qui viennent, puisque Rust et Go l’ont déjà fait séparément.
- La pression va augmenter sur l’IETF pour clarifier, dans une future révision ou un errata de la RFC 8446, les cas limites de validation des limites de chiffrement, afin de réduire l’ambiguïté d’implémentation.
- Les grands utilisateurs de Rustls vont accélérer l’adoption de pipelines de mise à jour automatisée des dépendances Cargo, sur le modèle de ce que font déjà les équipes qui exploitent Dependabot ou Renovate à grande échelle.
- Les régulateurs européens, dans le sillage de NIS2, vont vraisemblablement insister davantage sur la nécessité de suivre les avis de sécurité par écosystème logiciel (Cargo, Go modules, npm) plutôt que par simple recensement CVE centralisé.
Le match Rust contre Go sur le terrain TLS 1.3
La comparaison entre les deux incidents mérite d’être posée clairement, sans faire de ce duel une question de supériorité d’un langage sur l’autre. Go a corrigé son défaut en janvier 2026, soit environ huit mois avant que Rustls ne publie le sien. Dans les deux cas, la découverte est venue d’un travail de revue externe plutôt que d’une exploitation active signalée. Dans les deux cas, l’impact reste qualifié de mineur par les équipes concernées elles-mêmes. La différence la plus notable tient à la gouvernance de la divulgation : l’équipe Go a attribué un numéro CVE officiel via sa propre autorité de numérotation, tandis que l’écosystème Rust continue de fonctionner principalement via RustSec et GitHub Security Advisories, sans CVE automatique. Pour un acheteur ou un auditeur européen qui doit produire une nomenclature logicielle conforme aux exigences du Cyber Resilience Act, cette différence de nomenclature entre écosystèmes complique sérieusement l’exercice de cartographie des risques.
Que doivent faire les équipes techniques dès maintenant
La recommandation immédiate est sans ambiguïté : toute organisation qui dépend de Rustls, directement ou via un paquet tiers, doit vérifier sa version avec cargo tree -i rustls et mettre à jour vers 0.23.45 ou une version plus récente dès que possible. Pour les projets qui dépendent de rustls-ffi, la mise à jour correspondante doit également être vérifiée séparément, puisque cette couche d’interopérabilité embarquait sa propre copie du défaut. Les équipes qui gèrent des produits packagés pour Red Hat Enterprise Linux ou des distributions Debian doivent s’assurer que l’errata correspondant a bien été appliqué sur l’ensemble du parc, pas uniquement sur les nouvelles installations.
Pour les équipes qui n’exploitent pas directement Rust mais qui s’appuient sur des produits tiers (passerelles API, proxys, outils de supervision réseau), la bonne pratique consiste à demander à l’éditeur une confirmation écrite de la version Rustls embarquée, dans le cadre normal d’une revue de sécurité fournisseur, plutôt que de supposer que le correctif a été appliqué automatiquement.
Questions fréquentes sur la faille Rustls et RUSTSEC-2026-0285
RUSTSEC-2026-0285 a-t-il un numéro CVE ?
Non, à la date de publication de cet article, aucun numéro CVE n’a été attribué à cette faille. Elle est référencée sous les identifiants RUSTSEC-2026-0285 et GHSA-2mjx-qc3c-rqvc.
Quelles versions de Rustls sont concernées ?
Toutes les versions comprises entre 0.23.13 et 0.23.44 incluses. Les versions antérieures à 0.23.13 ne sont pas affectées. Le correctif est disponible dans la version 0.23.45.
Un attaquant peut-il intercepter mes données chiffrées grâce à cette faille ?
Non, pas directement. L’avis officiel précise que le transcript de négociation reste authentifié, ce qui empêche un attaquant en position réseau d’altérer ou de compléter une négociation. L’impact concerne surtout l’acceptation incorrecte de messages mal formés envoyés par un pair malveillant ou défaillant.
Comment savoir si mon application Rust utilise une version vulnérable ?
Exécutez cargo tree -i rustls pour lister toutes les occurrences de la bibliothèque dans votre arbre de dépendances, puis cargo audit pour recevoir une alerte automatique si une version vulnérable est détectée.
Cette faille est-elle liée à la faille découverte dans Go en 2026 ?
Oui. L’avis RustSec indique explicitement qu’il s’agit fonctionnellement du même bug que CVE-2025-61730, référencé GO-2026-4340, corrigé dans la bibliothèque standard Go dès janvier 2026, soit environ huit mois plus tôt.
Les distributions Linux d’entreprise ont-elles déjà intégré le correctif ?
Red Hat a publié l’errata RHSA-2026:67285 pour livrer le paquet Rustls corrigé sur Red Hat Enterprise Linux. Le miroir Debian de la base RustSec a également indexé l’avis, ce qui confirme une propagation vers les dépôts des distributions d’entreprise les plus utilisées en France et en Europe.
Rustls est-il moins sûr qu’OpenSSL à cause de cette faille ?
Rien dans cet avis ne remet en cause l’avantage structurel de Rustls en matière de sécurité mémoire face à OpenSSL, historiquement marqué par des failles comme Heartbleed. RUSTSEC-2026-0285 relève d’une erreur de logique protocolaire, pas d’une corruption mémoire, une classe de défaut à laquelle aucun langage de programmation, quel que soit son modèle de sécurité mémoire, n’offre de protection automatique.
Faut-il s’attendre à d’autres failles similaires dans d’autres bibliothèques TLS 1.3 ?
C’est probable. Le fait que deux implémentations indépendantes, Rustls et Go crypto/tls, aient toutes deux buté sur la même ambiguïté de frontière de chiffrement suggère que d’autres piles TLS 1.3 pourraient présenter des variantes du même défaut, sans qu’elles aient encore été détectées ou divulguées publiquement.




