1 ポイント 投稿者 GN⁺ 2025-05-29 | 1件のコメント | WhatsAppで共有
  • BGPメッセージ処理バグにより、2025年5月20日に大規模なルーティング不安定性と一部ネットワークでインターネット接続断が発生
  • 問題の原因は不正なBGP Prefix-SID Attributeであり、主要なBGP実装(特に JunOS と Arista EOS)で例外的な反応を誘発
  • Hutchison と Starcloudを含む一部のトランジットキャリアが原因メッセージを中継し、被害が拡大
  • この事案により、約100以上のネットワークで大量のBGPセッションリセットと不安定性が発生
  • ベンダーごとのBGPエラー耐性処理の欠陥と改善の必要性が今回の事態で強調された

May 27 2025

BGP処理バグによる世界的なインターネットルーティング不安定性

2025年5月20日火曜日の午前7時(UTC)にBGPメッセージが伝播し、インターネットトラフィック処理でよく使われる2つの主要BGP実装で予期しない動作が発生した。

これにより、多数の「インターネット接続BGPセッション」が自動的に終了し、最小限のルーティング不安定性から、最悪の場合には一部ネットワークの接続断まで、一時的に発生した。

問題のBGPメッセージ

  • bgp.tools で収集されたセッションを分析した結果、この現象を引き起こしたBGP Updateメッセージは一見すると通常のものだが、内部データが 0x00 で埋められた破損したBGP Prefix-SID Attributeを含んでいた
  • ほとんどのBGP実装(IOS-XR、Nokia SR-OS)は RFC7606(BGPエラー耐性) に従って正しくフィルタリングするが、JunOS と Arista EOS の相互作用で問題が発生
    • JunOS は破損したメッセージを保持したまま転送し、Arista EOS はそのメッセージを受信すると BGP セッションをリセットする
  • Juniper ハードウェア(JunOS)が多く使われる環境で、Arista EOS と接続されている場合、最長10分程度のインターネット接続断が発生する可能性がある

問題のメッセージ送信元

  • 該当期間の bgp.tools アーカイブを分析すると、複数の AS オリジンが関連している

  • これは Prefix を生成したネットワークではなく、経路途中のトランジットキャリアが不正な Attribute を追加したことを示唆している

  • 問題発生に関連した主要 AS は次のとおり

    • AS9304 (Hutchison Global Communications Limited)
    • AS135338 (Starcloud Information Limited)
    • AS151326 (DCConnect Communication Pte. Ltd.)
    • AS138077 (PT Abhinawa Sumberdaya Asia)
  • bgp.tools のデータから見ると、Attribute を実際に追加したのは Starcloud(AS135338) または Hutchison(AS9304) である可能性が高い

  • 該当 Attribute が伝播した代表的な Prefix は 156.230.0.0/16、138.113.116.0/24 など

  • Hutchison/AS9304 は多数のインターネットエクスチェンジ(IX)に接続しており、bird が使われるルートサーバーにもメッセージが伝播した

  • Bird は BGP SID をサポートしていないため、フィルタリングなしで多数の IX にメッセージを送信し、ネットワーク規模の混乱が拡大した

BGP Prefix-SID とは?

  • BGP Prefix-SID Attribute は通常、内部 BGP セッションでのみ使用されるべきもので、1つのネットワーク内で宛先へ移動する経路を定義するために使われる(RFC8669
  • この Attribute がグローバルルーティングテーブルへ漏えいした原因として、外部 BGP セッションが内部セッションのように構成されていた可能性がある

被害対象

  • 正確な被害者の特定は難しいが、初期のBGPメッセージ後に激しい変動(churn)を示した約100前後のネットワークで問題が確認された
  • 通常、bgp.tools のルートコレクターは毎秒2〜3万件のメッセージを収集するが、事案発生時には10秒平均で15万件以上を記録した
  • この数値は、広範なインターネット経路で深刻な障害が発生していたことを示すシグナルである

ベンダーの責任と示唆

  • 根本原因は確定していないが、エラーメッセージがインターネット規模で拡散したことから、既存のBGPエラー処理問題 が現実的なリスクであることを証明した
  • 他ベンダーは問題の Attribute をフィルタリングしたが、Juniper はこれを迂回的に許容して Arista 機器へ転送し、BGP エラー耐性コードの不備によりセッションリセットを引き起こした
  • JunOS の公式ドキュメントでも「メッセージ全体を検査するわけではない」ことが明記されている
  • このような設計により、JunOS はリモートからのセッションリセットリスクは防ぐ一方で、他のピアや顧客に問題メッセージを転送する可能性がある

結論

  • 今回の事案は障害期間こそ短かったが、規模が拡大した場合にはより深刻化する可能性を示している

  • サービスがますます IP 中心へ移行する中、インターネット障害の影響は単なる消費者向けメール接続不能を超え、TV放送の失敗緊急サービスへの通話不通などへ広がるリスクがある

  • その結果、現実的に実際の人命被害にまでつながる可能性がある点から、ベンダーごとの確実な BGP エラー耐性実装の必要性が強調される

  • bgp.tools データ分析に協力できるネットワーク運用者の参加が案内されている(リンクあり)

1件のコメント

 
GN⁺ 2025-05-29
Hacker Newsのコメント
  • 一般的に「受信時には寛容に、送信時には厳密に」という原則が標準的なアプローチとして知られている

    • 壊れたメッセージを破棄する(drop, filter)、属性だけを無視して転送する(break)、接続自体を切断する(Aristaのように)といった選択肢がある

    • 私は4つ目の方式(Arista方式)は本当に容認しがたい動作だと思う

    • 3つ目(Juniper)も望ましくはないが、致命的な問題とまでは言えないと思う

    • 編集: 内容を読み直したところ、Aristaは4つ目ではなく2つ目(接続終了)だった

    • 接続を無効とみなして閉じただけで、ユーザー体験を考えるとあまり良い判断ではないが、受け入れ可能な範囲という印象だ

    • すでにRFC 7606(BGP UPDATEメッセージの改善されたエラー処理)があり、そこでは壊れたメッセージをどう扱うかが具体的に規定されている

      • 最も一般的な方法はtreat-as-withdraw(経路をwithdrawしたものとして扱う)である
      • 壊れたメッセージを単に無視してしまうと、以前の状態が実際には無効であるにもかかわらずそのまま維持される問題が生じる
    • 「寛容に受け入れ、厳密に送り出す」という原則は、いわゆる「robustness principle」または「Postel's law」と呼ばれるものだ

      • この原則は1980〜90年代のインターネット黎明期に由来する概念だ
      • しかし今では、これは誤った考え方だったと業界で広く認識されている
      • この原則のせいで、プロトコルの硬直化と数え切れないほどのセキュリティ問題が引き起こされた
    • BGPの動作特性を悪用し、ローカル機器が理解していない属性をそのまま転送できることを利用したさまざまな問題がネットワーク全体で起きていた

      • 今ではこうした「機能」の欠点が露わになる現実を目の当たりにしている
    • 投稿者も関連記事でこの点を指摘している

      • この「機能」は、システムが理解していないデータを無批判に転送させてしまうため、意外なほど非常に悪いアイデアに見える
      • しかしこの機能のおかげで、Large Communitiesのような新機能が急速に普及でき、新しいBGP機能の導入が可能になった側面もある
    • 私はこのアプローチには賛成しない

      • 何を受け入れるか、何を送り出すかの両方を厳密に具体化するほうがはるかに良いと思う
  • CVE-2023-4481のバグをネットワーク全体にパッチ適用するため、狂ったように忙しく動き回っていた記憶がまだ残っている

    • この種のバグは今後も本当に悪夢のような存在だ
    • BGPの設計と実装の特性上、こうした挙動を修正するにはかなり長い時間がかかるのではないかと心配している
  • 昔、通信機器ベンダーでBGP機能を開発していたことがある(かなり昔の話だ)

    • 今でもBGPは複雑すぎると思っている

    • 人々は新機能を追加し続け、ベンダーは標準やドラフトに合わせて実装を繰り返す

    • 永遠に退場しそうにないBGPの性質上、この手のバグは絶えず再発する気がする

      • 昔はAT&Tのような事業者やJuniper、CiscoなどのベンダーがMPLSやVPN関連機能にBGPを押し込み、システムが深い複雑性にはまり込むこともあった
        • 過度に複雑だったが、それで大きく稼いだ者もいた
  • HGC Global Communications Limited(Hutchison Global Communications Limitedから改称、略称HGC)は香港のインターネットサービスプロバイダーである

  • BGPがこうした事柄について、複数のハードウェアベンダー間で標準化されれば、はるかに安定するように感じる

    • 実際の問題は、各ベンダーが自社に顧客を囲い込む(ロックインする)ために標準化を嫌っていることなのだろうか、と疑問に思う
    • ちなみに自分のBGP理解は浅いレベルだと先に断っておく
  • 自分だけかもしれないが、BGPというものを、何か問題を起こしたという話を聞くまで一度も聞いたことがなかった

    • TCP/IPのようにインターネットに必須のプロトコルだが、TCP/IPは学校やキャリア、本などでよく学んだ一方、BGPは一度も扱ったことがなかった
    • 家ではTCP/IPなら実習や学習ができるが、BGPはどうやって「家で遊べる」のかまったく分からない
      • 家でBGPを練習する方法があるなら知りたい

      • BGP実装を搭載した実機ルーター(安価なものならMikrotikのような機器)や、オープンソース実装を用意して試せる

        • 記事に出てきたbirdや、非常に人気のあるFRR(Free Range Routing)などがある
        • Dockerコンテナを2つ立ち上げてBGPセッションを張り、static routeなどを伝播させてみることもできる
        • チュートリアルが欲しければ、このリンクのガイドがフリーソフトウェアベースで追いやすくよく整理されている
      • DN42はルーティング技術を練習できる遊び場だ

        • ただし時間投資は必須で、気軽に挑戦できるものではない
        • 私自身ネットワーキングはかなり扱うが、WANルーティングはいまだに混乱する
        • GNS3はどんなネットワーク技術でも実際に手を動かして試すのに最も簡単だ
        • DN42 wiki
      • 私の学部のネットワーク科目ではBGPは扱われなかったが、大学院の授業ではBGPを学んだ

        • 複数のASをシミュレーションできるPythonパッケージを使っていたが、正確なパッケージ名は覚えていない
      • 私が受けた学部のネットワーク授業では、BGPは黒板の上で簡単に触れられただけだった

        • BGP実習には、投稿者が使っていたようなネットワークシミュレーターを活用できる
        • 私たちの授業ではginiというシミュレーターを使っていたが、教授の大学院生が作ったプログラムだった
        • 投稿者が使ったgns3はCisco特化のns3のような感じだ
        • ns3は学ぶことが多くて難しく感じた
        • giniはもう少し易しいインターフェースだが、性能はやや劣る
        • giniプロジェクト案内
        • gns3公式ドキュメント
      • 実際のインターネットトラフィックにつながった大規模ネットワークを運用して初めて、BGPを本当に「練習」したことになるようにも思える

        • 家で触れるものといえば、ネットワークシミュレーターを使うくらいだ
  • 過去には複数ベンダーでも本文と似たバグがあった

    • 関連する脆弱性情報
    • CVE-2023-4481(Juniper)、CVE-2023-38802(FRR)、CVE-2023-38283(OpenBGPd)、CVE-2023-40457(EXOS) など
    • Aristaはそのとき影響を受けなかったベンダーだ
  • 私たちのIOS XRシャーシ機器でも似たようなパケットを受け取ったことがある

    • 同時にBGP経路広告が多かった経験もある

    • upstream機器が何だったのかは正確には分からない

    • BGPプロトコルがきちんとファジングされてテストされているのか気になる

    • あまりにも重要なプロトコルなので、意図的に障害を起こしてみる度胸がないからなのかもしれないとも思う

    • BGP用fuzzerを書くのは簡単でも、クラッシュ診断は非常に難しいかもしれない

      • (投稿者)
        • はい、まさにこの点を私が投稿で実際にやった
        • 関連ポスト
  • インターネットバックボーンほど巨大で、偶発的複雑性が積み重なったシステムが他にあっただろうかと考えさせられる

  • こうしたバグの影響力を考えると、相互運用性テストスイートのようなものを運営するコンソーシアムがあるはずだと思っていたので驚いた

    • あるいは本当に存在していても、この問題がテスト範囲から漏れていたということなのかもしれない
    • 可能なパケットエラーをすべて自動生成し、カバレッジを高めるためにfuzzerやマシンで多様なテストケースを作るのが当然に思える
    • 実行時間が数日かかっても構わないほどだ
    • 本文の著者は実際にfuzzerを作って使っており、似た問題にも何度も遭遇している
    • こうした重要な研究にベンダーが積極的な関心を示さないのは不思議に感じる