Un bug de traitement BGP provoque une instabilité du routage Internet
(blog.benjojo.co.uk)- Le 20 mai 2025 à 07:00 UTC, un message BGP corrompu propagé sur Internet a déclenché un comportement inattendu dans deux implémentations majeures, provoquant la réinitialisation de nombreuses sessions BGP interconnectées et, sur certains réseaux, une instabilité du routage ou de brèves pertes de connectivité
- La mise à jour en cause contenait un attribut BGP Prefix-SID inhabituel pour une mise à jour BGP Internet, dans un état corrompu avec des données internes entièrement à
0x00 - IOS-XR et Nokia SR-OS, avec la tolérance aux erreurs de type RFC7606, l’ont filtré, mais JunOS l’a relayé et Arista EOS a réinitialisé la session, ce qui a pu affecter les utilisateurs Arista connectés à des transit carriers basés sur JunOS
- Dans les observations de bgp.tools, AS9304, AS135338, AS151326 et AS138077 reviennent de façon répétée, et l’acteur ayant probablement ajouté l’attribut défectueux serait Starcloud AS135338 ou Hutchison AS9304
- Pendant l’incident, le débit moyen de messages sur 10 secondes du route collector de bgp.tools est passé de 20 000–30 000 messages/s en temps normal à plus de 150 000/s, montrant que les différences de traitement des erreurs BGP peuvent réellement déstabiliser l’Internet mondial
Incident sur les mises à jour BGP du 20 mai 2025
- Le mardi 20 mai 2025 à 07:00 UTC, un message BGP propagé sur Internet a provoqué un comportement inattendu dans deux implémentations BGP majeures, couramment utilisées pour acheminer le trafic Internet
- L’impact s’est étendu à mesure que de nombreuses sessions BGP interconnectées se terminaient automatiquement
- Une instabilité du routage a été observée sur certains réseaux
- Dans le pire des cas, de brèves pertes de connectivité ont pu se produire
Le message BGP en cause
- La mise à jour observée sur les sessions alimentant bgp.tools était une BGP Update assez banale pour un /16, mais elle contenait l’attribut BGP Prefix-SID problématique
- Cet attribut était dangereux pour deux raisons
- C’est un attribut qu’on ne s’attend pas à voir dans des mises à jour BGP de la table Internet
- C’était un attribut corrompu dont les données internes étaient entièrement à
0x00
- La plupart des implémentations comme IOS-XR ou Nokia SR-OS le filtrent correctement, sans provoquer de problème, lorsque la « BGP error tolerance » basée sur RFC7606 est activée
- La combinaison JunOS + Arista EOS a produit un résultat différent
- JunOS a relayé le message corrompu
- Les équipements Arista EOS réinitialisaient la session en recevant ce message, qui semblait provenir d’un équipement JunOS
- Comme de nombreux transit carriers Internet utilisent du matériel Juniper exécutant JunOS, les réseaux exploitant Arista EOS et connectés à des routeurs de transit amont basés sur JunOS ont pu perdre l’accès à Internet pendant un certain temps
- La durée est estimée à environ 10 minutes au maximum
AS candidats ayant ajouté l’attribut défectueux
- Le filtrage des archives bgp.tools sur cette période montre que plusieurs AS d’origine semblent impliqués dans l’incident
- Cela suggère que l’attribut a pu être ajouté non par le réseau à l’origine du préfixe, mais par un carrier intermédiaire sur le trajet vers l’Internet plus large
- Les quatre candidats revenant de façon répétée dans l’ensemble des messages problématiques sont les suivants
- bgp.tools a observé le préfixe impacté sur le chemin
[…] 151326 138077 […]sans l’attribut BGP défectueux- L’acteur ayant ajouté l’attribut défectueux serait donc probablement Starcloud AS135338 ou Hutchison AS9304
- Voici quelques préfixes observés dans des mises à jour contenant cet attribut
156.230.0.0/16138.113.116.0/24163.171.102.0/24163.171.103.0/24163.171.104.0/24
Le chemin de propagation via les points d’échange Internet
- L’incident a pris de l’ampleur parce que Hutchison/AS9304 était connecté à de nombreux points d’échange Internet
- Les messages problématiques ont été envoyés à des route servers d’IX, qui exécutent généralement bird
- Bird ne prend pas en charge BGP SID et n’a donc pas pu filtrer ces messages, les redistribuant tels quels à plusieurs points d’échange Internet multi-térabits
- En conséquence, la perturbation s’est étendue bien au-delà des seules sessions de transit Internet
La nature de BGP Prefix-SID
- L’attribut BGP Prefix-SID ne devrait normalement apparaître que dans des sessions BGP internes
- Comme le définit RFC8669, il sert à aider à déterminer, au sein d’un seul réseau, le chemin que doit emprunter le trafic vers une destination
- Si cet attribut a fuité dans la table de routage globale, c’est peut-être parce qu’une session BGP externe a été configurée comme une session interne
Réseaux affectés et indicateurs d’observation
- Il est difficile d’affirmer avec certitude qui a été touché, mais en se basant sur les réseaux dont le churn a été très élevé par rapport à leur taille juste après le premier message BGP problématique, environ 100 réseaux auraient subi des problèmes
- Exemples cités avec un haut niveau de confiance
- En temps normal, le route collector de bgp.tools collecte environ 20 000 à 30 000 messages par seconde
- Pendant cet incident, le débit moyen de messages sur 10 secondes a largement dépassé 150 000/s
- Ce qui indique une perturbation importante sur un grand nombre de routes Internet
Différences de traitement des erreurs selon les fournisseurs
- Même si la cause racine et l’acteur réellement à l’origine ne sont pas totalement établis, le fait qu’un message défectueux ait pu se propager à l’échelle d’Internet montre le risque lié au traitement des erreurs BGP
- D’autres fournisseurs ont détecté l’attribut défectueux et supprimé l’annonce de route, mais Juniper l’a propagé à ses peers
- Une fois le message arrivé sur des équipements Arista, l’absence de code de tolérance aux erreurs BGP, ou un défaut dans celui-ci, a conduit à des réinitialisations de session
- La documentation JunOS sur la tolérance aux erreurs BGP indique que JunOS n’examine pas toutes les parties d’un message
- Ce comportement permet à JunOS d’éviter lui-même une réinitialisation de session déclenchée à distance, tout en transmettant le même message à d’autres peers ou clients
Implications opérationnelles
- Cette panne a été brève, mais elle aurait pu avoir un impact bien plus large
- À mesure que davantage de services migrent vers l’IP, la portée d’une panne Internet peut dépasser le simple échec d’accès aux e-mails
- Panne de diffusion TV
- Défaillance des appels vers les services d’urgence
- Ce type de bug augmente le risque de provoquer ou d’aggraver des pertes humaines dans le monde réel
- Les opérateurs de réseau disposant de la table de routage complète peuvent fournir un flux de données à bgp.tools pour aider à déboguer de futurs incidents
- 2 570 sessions actives fournissent déjà des données à bgp.tools
- La méthode de configuration est expliquée dans la documentation de configuration du data feed bgp.tools
1 commentaires
Avis sur Hacker News
L’approche standard consiste à être tolérant à la réception et strict à l’émission.
Les options sont de filtrer les messages cassés, de les rejeter, d’ignorer les attributs cassés tout en les transmettant, ou de tomber en panne à cause d’un attribut cassé ; à mon avis, la seule option vraiment difficile à accepter est la 4e, le comportement à la Arista. Le comportement de Juniper, la 3e option, n’est pas souhaitable, mais il n’est pas fatal.
En relisant, Arista était plutôt proche de la 2e option que de la 4e : il semble que l’équipement n’ait pas complètement crashé, mais ait considéré la connexion comme erronée et l’ait fermée. Du point de vue de l’utilisateur, ce n’est pas idéal, mais dans le débat, cela reste plutôt acceptable.
La méthode la plus courante est treat-as-withdraw, qui consiste à traiter une mise à jour d’annonce de route comme le retrait d’une route précédemment annoncée. Il ne faut pas simplement jeter les messages cassés, car cela maintiendrait indéfiniment un ancien état qui n’est plus valide.
C’est une idée issue de la préhistoire d’Internet, dans les années 1980 et 1990, mais elle est aujourd’hui largement comprise comme une mauvaise idée ayant conduit à l’ossification des protocoles et à de nombreux problèmes de sécurité.
Désormais, beaucoup de systèmes dépendent de ce comportement, et on subit les inconvénients de cette « fonctionnalité ».
À première vue, cette « fonctionnalité » ressemble à une très mauvaise idée, car elle permet à des informations inconnues de se propager aveuglément via des systèmes qui ne comprennent pas les effets des informations qu’ils transmettent. Mais on peut aussi considérer que c’est grâce à elle que des choses comme les Large Communities ont pu être déployées plus rapidement et plus largement, et que le déploiement de nouvelles fonctionnalités BGP a tout simplement été possible.
Je me souviens encore d’avoir couru partout comme un fou pour corriger CVE-2023-4481 sur tout le réseau.
Ce genre de bug doit être un véritable cauchemar à gérer, et vu la façon dont BGP a été conçu et implémenté, corriger ce comportement prendra très longtemps.
Il y a plusieurs décennies, j’ai développé des fonctionnalités BGP chez un fournisseur d’équipements télécoms.
Je continue de penser que BGP est beaucoup trop complexe ; les gens n’arrêtent pas d’y ajouter de nouvelles fonctionnalités, et les fournisseurs continuent de les implémenter à partir des RFC ou des brouillons de standards.
Comme BGP ne semble pas près d’être abandonné, ce genre de bug va probablement continuer à être découvert encore et encore.
Personnellement, je trouvais cela effroyablement complexe, mais pour certains, c’était très rentable.
HGC Global Communications Limited est une entreprise autrefois connue sous le nom de Hutchison Global Communications Limited ; c’est un fournisseur d’accès Internet de Hong Kong.
https://en.wikipedia.org/wiki/HGC_Global_Communications
Nos châssis IOS XR ont aussi reçu une partie de ces paquets, et cela coïncidait avec un volume élevé d’annonces de routes BGP. Honnêtement, je ne sais pas quel équipement utilise notre upstream.
Je me demande si le protocole BGP est correctement fuzzé. C’est peut-être un domaine tellement critique que tout le monde a peur d’essayer de le casser.
Écrire un fuzzer BGP pourrait être facile, mais diagnostiquer la cause des crashs me semble très difficile.
J’ai l’impression de n’avoir jamais appris BGP avant d’entendre dire qu’il causait des problèmes. C’est pourtant essentiel à Internet, comme TCP/IP, mais TCP/IP, je l’ai appris à l’université, je l’ai rencontré au cours de ma carrière et j’ai lu beaucoup de livres dessus, alors que BGP, je ne l’ai presque jamais croisé ni à l’université, ni au travail, ni dans les livres.
Avec TCP/IP, on peut apprendre en « jouant » à la maison sur des projets jouets, mais avec BGP, je ne vois pas trop comment faire. Comment apprendre BGP chez soi ?
L’article mentionne bird, et il y a aussi FRR (Free Range Routing), une implémentation très populaire. Lancer deux conteneurs Docker, établir une session BGP entre eux et, par exemple, annoncer une route statique configurée en interne, c’est très simple.
Si vous aimez les tutoriels guidés, https://blog.ipspace.net/2023/08/bgp-labs-basic-setup/ est plutôt bien et va jusqu’à des sujets un peu plus avancés. Tout ce qu’il faut pour le suivre est du logiciel libre.
Le moyen le plus simple d’acquérir une expérience pratique de n’importe quelle technologie réseau est probablement GNS3.
[1]: https://wiki.dn42.us/home
Une façon d’expérimenter est celle-ci : https://www.eve-ng.net/
Une autre consiste à créer deux ou trois machines virtuelles avec plusieurs interfaces réseau, à configurer un réseau entre elles, puis à utiliser un démon de routage BGP.
https://bird.network.cz/
https://www.nongnu.org/quagga/
Il existe des outils de ce genre.
On utilisait un package Python pour simuler plusieurs AS, mais je ne me souviens plus lequel.
Pour expérimenter avec BGP, on peut utiliser un simulateur de réseau, comme l’auteur de cet article. En cours, on utilisait gini[1], qui semblait avoir été créé par un doctorant du professeur, et l’auteur semble utiliser gns3, qui ressemble à une version de ns3 spécialisée Cisco. J’ai essayé ns3 une fois, et la courbe d’apprentissage était raide. Le simulateur gini a une interface plus rudimentaire, mais il est sans doute moins puissant.
[1] https://citelab.github.io/gini5/
[2] https://docs.gns3.com/docs/
On dirait que BGP serait beaucoup plus stable si les différents fabricants de matériel s’étaient mis d’accord sur une méthode standard pour gérer ce genre de choses.
Le vrai problème est-il que chaque fournisseur veut créer un effet de verrouillage et évite donc la standardisation ?
Cela dit, ma compréhension de BGP est superficielle et limitée, et je ne suis pas expert.
Vu l’impact de ce genre de bug, je suis surpris qu’il n’existe pas de consortium doté d’une suite de tests d’interopérabilité.
Peut-être qu’il en existe une, mais que ce problème précis ne figure pas dans la suite de tests. Dans ce cas, je trouve surprenant qu’on n’utilise pas du fuzzing ou de la génération automatique pour explorer toutes les erreurs de paquets possibles et en faire des cas de test. Ce ne serait pas grave si l’exécution de la suite prenait des heures ou des jours.
L’auteur de cet article a créé un fuzzer avec un certain niveau de couverture, et semble déjà avoir rencontré un problème similaire auparavant. Je suis surpris que les fournisseurs ne s’emparent pas plus activement de ce travail.
Plusieurs fournisseurs ont déjà rencontré ce bug par le passé : https://www.kb.cert.org/vuls/id/347067
Il y a eu CVE-2023-4481 (Juniper), CVE-2023-38802 (FRR), CVE-2023-38283 (OpenBGPd) et CVE-2023-40457 (EXOS).
À l’époque, Arista n’était pas affecté.
Je me demande s’il existe quelque chose d’aussi vaste que la plomberie d’Internet et dont la complexité accidentelle soit aussi byzantine.