本記事は2026年3月23日投稿のXRPL公式ブログ"Vulnerability Disclosure Report: Transaction Set Handling“の和訳です。
この脆弱性開示レポートには、2025年6月9日に報告された XRP Ledger のバグに関する技術的詳細が記載されています。
報告日: 2025年6月9日
影響を受けるバージョン: rippled 2.6.2 まで
脆弱性の概要
Common Prefix によって、XRPLのライブネス(継続稼働性)に影響を与え得る2つの脆弱性が発見されました。 これらが悪用されると、ネットワークがフォワードプログレスできなくなる可能性がありました。 ただし、これらのバグを実際に悪用するためには、UNLバリデーターが侵害されている必要があります。 両脆弱性に対する修正は、rippled 3.0.0 リリースの一部として公開されています。
影響
修正前の段階で、もしUNLバリデーターが侵害されていた場合、攻撃者は本バグを悪用するように改変したrippledをデプロイできた可能性があります。 具体的には、トランザクションセット内のトランザクションデータを操作することで、侵害されたバリデーターは、その悪意あるメッセージを直接受信したすべての他のバリデーターをクラッシュさせることができました。 そして、UNLから侵害されたバリデーターが除外されるまで、繰り返しクラッシュを引き起こすことが可能だった、ということになります。
技術的詳細
発見の経緯
Common Prefix の Nikolaos Kamarinakis さん、Dejan Cabrilo さん、Dr. Dimitris Karakostas さん、そして Prof. Zeta Avarikioti さんが、責任ある開示レポートを通じて本脆弱性を報告してくださいました。 Rippleのエンジニアリングチームは、独立したテストネットワーク上でPoC(概念実証)を行い、両方のバグを再現することで報告内容を検証しました。
根本原因
バリデーター間のコンセンサスラウンドは、トランザクション群を処理してレジャーへ含めるために、対象となるトランザクションのセットについて合意を形成する手続きです。 各バリデーターは、自分が把握している未処理のトランザクション集合を提案し、他のバリデーターとメッセージを交換しながら、スーパーマジョリティが合意できる最終的なトランザクションセットを確定させていきます。 今回の2つの脆弱性は、コード内でトランザクションセットの差分(disputes)がどう扱われていたかに起因していました。
両方の脆弱性とも、約35個あるUNLバリデーターのうち1つが侵害されていることが前提となります。 そのうえで、悪意あるメッセージを送信することで、それを受信したノードをクラッシュさせる、という流れになります。 UNLバリデーターを侵害することは、通常プロキシノードの背後に隠れていてプロキシ経由でしか通信を行わない構成のため容易ではありませんが、不可能ではありません。
脆弱性1: トランザクションの比較
あるバリデーターが他のバリデーターからトランザクションセットを受信すると、自分のトランザクションセットと比較し、相違のあるトランザクション(disputed)を特定します。 ここに1つ目の脆弱性が存在しました。 侵害されたバリデーターは、SHAMap内の特定のノードに、実際にはそこに存在しないトランザクションが含まれている、と主張できる状態にありました。 悪意あるトランザクションセットを受信したバリデーターは、無効なノードIDを使ってトランザクションIDを検索しようとした瞬間にクラッシュしてしまっていました。
脆弱性2: トランザクションのリレー
バリデーターは、相違のあるトランザクションに遭遇すると、それをピアへリレーします。 2つ目の脆弱性は、この機能を悪用するものでした。 侵害されたバリデーターは、トランザクションデータが任意のハッシュとなっているトランザクションセットを送信できました。 悪意あるトランザクションセットを受信したバリデーターは、それをdisputed(相違あり)なトランザクションと判定し、ピアへリレーしようとします。
トランザクションをリレーする前に、バリデーターはまずそれが疑似トランザクション(pseudo transaction)でないかを確認します(疑似トランザクションはリレーされるべきでないため)。 このとき、トランザクションセット内の不正なデータによって、その検査処理がクラッシュを引き起こしていました。
再現手順
脆弱性1: トランザクションの比較
- 侵害されたバリデーターが、
TxIdが正しいノードに含まれていないTxSetを構築します。 - そのバリデーターは、対応するプロポーザルをピアへ送信します。
- プロポーザルを受信したピアバリデーターは
TxSetを取得し、disputeの作成を試みます。 その結果、トランザクションIDをノードIDで検索しようとしたところでクラッシュが発生します。
脆弱性2: トランザクションのリレー
- 侵害されたバリデーターが、
STTxコンストラクタでは読み取れないデータを含むSHAMapItemを持つTxSetを構築します。 - そのバリデーターは、対応するプロポーザルをピアへ送信します。
- プロポーザルを受信したピアバリデーターは
TxSetを取得し、disputeを作成してそれをリレーしようとします。 その結果、疑似トランザクションかどうかのチェックを行ったところでクラッシュが発生します。
修正対応
- 1つ目の脆弱性に対する保護として、プロポーザルが「ノードに含まれている」と主張するトランザクションが、本当にそのノードで見つかるかを確認する追加のチェックを実装しました。
- 2つ目の脆弱性に対する保護として、悪意あるトランザクションを検査した際にコードがスローする例外を扱うため、try-catchを追加しました。
- Common Prefixの調査結果を再現するために、テスト環境で侵害されたUNLバリデーターをシミュレートするよう改変したrippledをデプロイしました。 1つ目の修正がない状態では、攻撃を行うと、侵害されたバリデーターから悪意あるメッセージを受け取ったすべてのノードが実際にクラッシュしました。 2つ目の修正がない状態でも、2つ目の攻撃を行ったときに同様のクラッシュが発生しました。 両方の修正を適用したあとは、操作されたメッセージを受け取ったノードがクラッシュすることはなくなりました。
セキュリティ強化のロードマップ
私たちは複数の取り組みを通じて、XRPLのセキュリティ態勢の継続的な強化を進めています。
- 未公開コードに対するセキュリティ監査の対象範囲を拡大し、問題を先回りして発見する。
- AIによるコードレビュー支援を導入し、セキュリティ上の問題を特定する。
- ハッカソンの開催と、バグバウンティ報奨金のさらなる充実。
利用可能な修正/パッチ
修正は、rippled 3.0.0リリースの一部として公開されています。
謝辞
両脆弱性を責任を持って開示してくださり、修正に向けた時間とご協力をいただいた Common Prefix に、心より感謝いたします。
お問い合わせ
詳細情報、または追加の問題を報告される場合は、バグバウンティプログラムのページをご覧ください。
インシデント対応タイムライン
| 主なアクション | 日付 | 説明 |
|---|---|---|
| 初期発見 | 2025年6月9日 | Common PrefixのNikolaos Kamarinakisさんがバグレポートを提出。 |
| テスト環境の構築 | 2025年7月10日 | テスト環境を整備。 |
| バグの再現 | 2025年8月6日 | 1つ目の脆弱性を再現。 |
| バグの再現 | 2025年8月11日 | 2つ目の脆弱性を再現。 |
| 修正の作成 | 2025年8月19日 | プライベートリポジトリで修正を作成し、レビュー中。 |
| 修正のテスト | 2025年10月10日 | Common Prefixが修正をテスト。 |
| 修正の承認 | 2025年10月16日 | Common Prefixが修正を承認。 |
| 修正のリリース | 2025年12月9日 | 修正を3.0.0リリースに含めて公開。 |
| レポート公開 | 2026年3月23日 | 公開脆弱性開示レポートを公開。 |