世界を動かす技術を、日本語で。

BGP処理バグが広範なインターネットルーティングの不安定性を引き起こす

概要

2025年5月20日、BGPメッセージの不具合により大規模なインターネット障害が発生。 JunOSとArista EOSの組み合わせでBGPセッションが自動切断され、接続障害が発生。 原因は破損したBGP Prefix-SID属性のインターネット伝播。 主な関与ASや影響を受けたネットワークも特定。 BGPエラー処理の不備とベンダー間の実装差異が問題の本質。

2025年5月20日のBGP障害概要

  • UTC 2025年5月20日午前7時、不正なBGPメッセージ伝播による大規模障害発生
  • JunOSとArista EOS の組み合わせでBGPセッション自動切断、ルーティング不安定・一部ネットワークで接続断
  • 問題のBGPアップデートは /16プレフィックス に対するもので、 BGP Prefix-SID属性 が付与されていた
  • この属性は全データが 0x00で破損、インターネット向けBGPアップデートでは想定外
  • IOS-XR/Nokia SR-OS はRFC7606準拠で正常にフィルタリング、問題なし
  • JunOS は破損メッセージを転送、 Arista EOS は受信時にセッションリセット
  • 多くのトランジットキャリアがJuniperハードウェアを利用、Arista EOS利用者の接続に影響

問題メッセージの発信元調査

  • bgp.toolsアーカイブ分析により、複数のASが関与していたことが判明
  • 属性がオリジンネットワークではなく、 中継キャリア で付与された可能性
  • 主要な関与AS(全ての問題メッセージに出現)
    • AS9304 (Hutchison Global Communications Limited)
    • AS135338 (Starcloud Information Limited)
    • AS151326 (DCConnect Communication Pte. Ltd.)
    • AS138077 (PT Abhinawa Sumberdaya Asia)
  • bgp.toolsのルート記録から、 AS135338またはAS9304 が属性付与の有力候補
  • 属性付きアップデートで観測されたプレフィックス例
    • 156.230.0.0/16
    • 138.113.116.0/24
    • 163.171.102.0/24
    • 163.171.103.0/24
    • 163.171.104.0/24

影響拡大の理由

  • Hutchison/AS9304 が多くのIXに接続、IXのルートサーバー(bird)がBGP SID非対応
  • フィルタされず多くのIXに配信、マルチテラビット規模で障害拡大

BGP Prefix-SID属性とは

  • BGP Prefix-SID属性 はRFC8669で規定、主に 内部BGPセッション で利用
  • ネットワーク内の経路制御用、インターネット全体へ伝播するものではない
  • 外部BGPセッションを内部用として誤設定した場合などにリーク発生

影響を受けたネットワーク例

  • 規模に対して大きな経路変動が観測されたネットワーク
    • SpaceX Starlink (AS14593)
    • Zscaler (AS62044 / AS53813)
    • Bytedance (AS396986)
    • Disney Worldwide Services (AS23344)
    • Nagasaki Cable Media Inc (AS10000)
    • Global Secure Layer (AS7578)
    • UpCloud (AS202053)
    • Netskope (AS55256)
    • Teleguam Holdings (AS9246)
  • bgp.toolsの通常時は毎秒2万〜3万メッセージ、障害時は 毎秒15万超 に急増

ベンダー間のBGPエラー処理問題

  • 根本原因や真犯人は断定できないが、 インターネット全体に伝播 した事実が問題
  • Juniper は自装置のセッションリセットは防ぐが、不正メッセージを他ピアに転送
  • Arista EOSはエラー処理コードの不備でセッションリセット
  • JunOSのBGPエラー耐性は全メッセージ部分を検査せず、結果として顧客側に障害を波及

まとめと今後の課題

  • 障害は短時間だったが、影響範囲は広大
  • IPベースサービスの拡大で、インターネット障害の社会的リスクが増大
    • 例:TV放送停止や緊急通報不能などの重大な影響
  • BGPエラー処理の実装不備や運用ミスが、現実世界の被害を引き起こすリスク
  • bgp.toolsへのデータ提供で、今後の障害解析や防止に貢献可能
  • 継続的な監視・情報共有・実装改善の必要性

参考

  • bgp.tools
  • RFC7606 “BGP error tolerance”
  • RFC8669 “BGP Prefix-SID”

Hackerたちの意見

インターネットでのマルチキャストって、実際に機能するの?BGPはプライベートネットワーク専用だと思ってたんだけど。

BGPはプライベートネットワークだけのものじゃないよ。インターネットの基盤になってるんだから。もしかして、iBGPとかOSPFのことを考えてるのかな?

いや、BGPはプライベートネットワークだけのものじゃないよ。AS番号を使って、お互いにメッセージを交換してるんだ。

BGPはインターネットのルーティングプロトコルだよ。他の自律システム間のルーティングプロトコルは実質的にこれしかない。 "インターネット"の合理的な同義語は"グローバルBGPルーティングテーブル"だね。BGPはマルチキャストを使わないから、マルチアクセスネットワークのOSPFを考えてるかもしれない。BGPはtcp/179のユニキャストを設定されたピアのIPアドレスに送るんだ。とはいえ、インターネット上でマルチキャストはちゃんと機能するよ。一般的にはあまり使われてないし、家庭ユーザーにはまず使われないし、企業ユーザーでもあまり見かけないけど、2021年にはInternet2で段階的に廃止されたと思う。でも、原理的には全く問題なく機能するよ。

マルチキャストについてはよくわからないな…直感ではダメだと思うけど、その答えには賭けられないな。BGPは自律システム同士が話し合って交渉する唯一の方法だよ。

インターネット上の全トラフィックは、BGPを通じて伝播されたルートによってルーティングされてるんだ。隣接するネットワークが、お互いにどのIPを発信しているか、どのネットワークに接続しているかを伝える方法だよ。

「インターネット」っていうのは、異なる団体が運営する別々のネットワークの集合体なんだ。BGPは、それらがルーティング情報を交換することで接続できるようにするもの。昔はmboneっていうものがあったけど、今はランダムなマルチキャストを送ることはあまりできないけど、ISPsがIPTVのために使ってるのは確かだね。

標準的なアプローチは、受け入れるものには寛容で、出すものには具体的であることだよ。1) 壊れたメッセージをフィルタリングする 2) 壊れたメッセージを破棄する 3) 壊れた属性を無視して渡す 4) 壊れた属性で破綻する 俺にとって、4(Arista)は本当に受け入れられない行動だね。3(Juniper)は望ましくないけど、壊滅的な行動ではない。追記:再読してみたら、Aristaは4じゃなくて2をやったみたい。完全にクラッシュするんじゃなくて、無効な接続として閉じたんだと思う。それはある意味許容できるけど、ユーザーにはあまり良くないね。

このアプローチには賛成できないな。受け入れるものにはすごく具体的で、出すものにもすごく具体的である方がいいと思う。

問題は、BGPがローカルデバイスが理解できない属性を転送する挙動を利用して、ネットワーク全体でいろんなことをやってた人たちがいたことだね。今はその挙動に頼ってる人が多い。今、私たちはこの「機能」の悪影響を経験してるところだよ。

Aristaは2つのことをしたけど、全接続を切断しちゃったのは多分良くなかったと思う。私見だけど、壊れた属性はメッセージから削除してログに残して、残っている有効なデータがあればそれを渡せばいいんじゃないかな。もしなければ、その特定のピアからUPDATEメッセージを受け取っていないふりをすればいい。監視をすれば問題のある発信元を見つけられるし、ネットワークの不安定さを気にせずに対処できると思う。

著者は関連する投稿でこの点を指摘してるね。「一見すると、この“機能”は非常に悪いアイデアに思える。なぜなら、理解していないシステムを通じて盲目的に未知の情報が伝播される可能性があるからだ。しかし、この機能のおかげで、Large Communitiesのようなものが迅速に広まることができたし、新しいBGP機能の導入も可能になったと言える。」

すでにRFC 7606(BGP UPDATEメッセージの改訂エラーハンドリング)があって、壊れたBGPメッセージの扱いについて詳しく規定されてるんだ。最も一般的なアプローチは「withdrawとして扱う」ってやつで、つまり、更新(ルートの発表)を撤回(以前発表されたルートの削除)のように扱うってこと。壊れたメッセージを単に無視するのはダメだよ。そうすると、古い無効な状態を保持し続けることになるから。

これについては理解されていて、散々議論されてきたことなんだけど、Aristaが合意された最良のアプローチ(RFC7606)を正しく実装しなかっただけなんだよね。

標準的なアプローチは、受け入れるものには寛容で、発信するものには具体的であることです。ここで言ってるのは、いわゆる「ロバストネス原則」、別名「ポステルの法則」です。これは1980年代と90年代のインターネットの古い歴史からのアイデアです。今では、これは誤った考えで、プロトコルの硬直化や無数のセキュリティ問題を引き起こす原因になっていると広く理解されています。

ジュニパーの振る舞いが好ましいものだと主張するかもしれない。これ「壊れてると思うメッセージをドロップする」という定義を思い出してほしい。「壊れたメッセージをドロップする」とは必ずしも言えないんだ。メッセージが正常でも、バグがあってそれを壊れてると思わせることも十分にあり得る。壊れたメッセージと壊れたセッションを考えるのは大きく違うし、アリスタがやったのはその点なんだよね。

これって俺だけかな?BGPについては問題が起きるまで学んだことがなかった気がする。インターネットにとっては必須なものみたいだけど、TCP/IPのように大学で学んだわけじゃないし、キャリアの中でもTCP/IPに関する本はたくさん読んだけど…BGPについては何も知らない(大学でも、仕事でも、本でも、何も)。家でダミープロジェクトでTCP/IPを「遊ぶ」ことはできるけど、BGPを「遊ぶ」方法は全くわからない。そういう意味では、家でどうやって学ぶの?

それはすごく隠れてるね。デザインの成功ってことかな。IPを使うときは、ASNsの複雑さを気にしなくていいよ。

BGPで「遊ぶ」には、グローバルなインターネットトラフィックに接続された本物の(しかも大きな)ネットワークを管理する必要があると思う。家でいじることはできるけど、ネットワークシミュレーターを使うしかないね。

BGPの実装があるルーターを買うか(安いのもあるよ、例えばMikrotik)、オープンソースの実装を使ってみて。記事にはbirdが載ってるけど、もう一つ人気なのはFRR(フリーレンジルーティング)だよ。簡単に2つのDockerコンテナを立ち上げて、その間でBGPセッションを作って、例えばその中で設定した静的ルートを伝播させることができるよ。ガイド付きのチュートリアルが好きなら、https://blog.ipspace.net/2023/08/bgp-labs-basic-setup/はかなり良いし、少し進んだトピックにも対応してるよ。必要なものは全部無料のソフトウェアだよ。

WISPのことをやってた頃、実際のネットワークと仮想ネットワークを使って複数のマシン間でシミュレートしたネットワークを設定してたよ。VyOSは使ってたUBNT機器に似てて、軽量で複数のプロトコルをサポートしてるんだ。

ところで、大学では何を勉強してたの?私は大学でBGPやルーティングについて学んだよ。情報ネットワークとプロトコルが一つの科目だったから。でも、仕事でも家でも必要がなかったから、ラボの演習以外ではあまり使ってないな。

学部のネットワークコースではBGPに触れなかったけど、大学院のネットワークコースではBGPに触れたよ。いろんなASのシミュレーターとして機能するPythonパッケージを使ったけど、どれだったかは覚えてないな。

大学のネットワークの授業で少しだけBGPの話をしたけど、黒板だけだったな。BGPを実験するには、ブログの著者がやったみたいにネットワークシミュレーターを使うといいよ。私のクラスではginiっていうのを使ったけど、たぶん教授の大学院生が作ったやつだと思う。著者はgns3を使ったみたいだけど、これはcisco特有のns3バージョンらしい。ns3を一度使ったことがあるけど、習得するのが結構大変だった。giniシミュレーターはもっと基本的なユーザーインターフェースだけど、たぶんパワーは劣るね。

DN42はルーティング技術の遊び場を提供してるよ。あんまり時間をかけたくないなら、深入りするのはお勧めしないかな。ネットワーキングにはそこそこ詳しいけど、WANルーティングはまだ混乱することがある。GNS3はネットワーキング技術を実際に体験するのに一番簡単な方法だと思う。

私の意見では、containerlabはネットワーキングのラボ環境を設定するのが比較的簡単なツールの一つだよ。ノードとそれらの間のリンクで構成されたネットワークをyamlで定義すると、dockerを使ってそれを作成してくれる。BGPピアリングの例のラボもあるよ。

BGPが問題を引き起こしてないことってあったっけ?最初の大規模な事件は1997年のものを見つけたけど、あんまり深く調べてないんだ。小規模なネットワークでBGPをうまく扱うのは難しいと思う。トラフィックエンジニアリングが楽しそうだけど、たくさんのトラフィックと接続がないと意味がないよね。そうすると、自分のアナウンスを使って、他のインターネットに自分が望む接続を通してパケットを送らせることになる。できるだけ自分の好みの接続を通るように、出ていくパケットを調整したりもするんだろうけど。残念ながら、誰も自分のセットアップで遊ばせてくれないんだよね。エマージェントなルーティングの挙動を感じる方法の一つは、いろんな場所にホスティングがあれば、遠い国に行くときにルートの違いがたくさん見えるってこと。自宅のインターネットや携帯電話、いろんなホスティングからトレーサウト(またはmtr)を実行して、トレースバックできれば…多様なルートが見えると思うよ。例えば、アメリカ西海岸からブラジルに行くとき、あるISPはパケットをフロリダ経由でブラジルに送るけど、別のISPはスペイン経由でブラジルに送って、遅延がすごく大きいこともあるんだ。

CVE-2023-4481をネットワーク全体で修正しなきゃいけなかった時の混乱をまだ覚えてるよ。このクラスのバグは本当に厄介で、BGPの設計と実装の仕方のせいで、こういう挙動を修正するのにかなりの時間がかかるだろうね。

HGC Global Communications Limited(以前はHutchison Global Communications Limitedとして知られていた、略してHGC)は、香港のインターネットサービスプロバイダーだよ。

何十年も前だけど、通信会社のベンダーでBGP機能を開発してたことがある。今でもBGPは複雑すぎると思うし、人々は新しい機能を追加し続けてるし、ベンダーはRFC標準やドラフトに基づいて実装してる。BGPは決して廃止されることはなさそうだから、こういうバグは何度も見つかるんだろうな…。

私たちのIOS XRシャーシには、これらのパケットがいくつか届いてる。高いBGPルート広告と関連してるね。正直、上流がどんな機器を使ってるのかは全然わからない。BGPプロトコルがちゃんとファズテストされてるのか気になるな。重要なものだから、みんな試すのが怖いのかもしれない。BGP用のファズテスターを書くのは簡単かもしれないけど、クラッシュの診断はすごく難しいんじゃないかな?

(投稿者)そう、これが私がリンクした投稿でやったことそのものだよね。

2025年5月20日水曜日の午前7時(UTC) 5月20日は火曜日だよ、念のため。

いい指摘だね。今週は3つのミニインシデントを追ってたから、ちょっと混乱しちゃった。すぐに投稿を修正するよ。

世界の一部では、午前7時UTCは月曜日だったけどね :D

まあ驚きだよね。人々が cheating するのは、学位が仕事を得るために必要な厳しいタスクのリストの中のチェックボックスの一つだからなんだ。これを改善して、実際に学問に興味がある人だけが残るようにすれば、学問における cheating の問題は解決すると思う。