Radicle: ネットワークプロトコルにおける脆弱性の開示
Radicle: Disclosure of Vulnerability in the Network Protocol (radicle.dev)
要約
Radicleのネットワークプロトコルに2件の重大なセキュリティ脆弱性が発見されました。これらの脆弱性により、ノード間のネットワーク通信が暗号化されず、認証も行われないため、情報漏洩やノードのなりすましが可能になります。Radicleは、修正版リリースまでプライベートリポジトリの使用を停止することを推奨しています。
全文翻訳
ネットワークプロトコルにおける脆弱性の開示
Radicleは、Gitを基盤としたP2P型のローカルファーストなコードコラボレーションスタックです。
2026年9月23日
要約
何が起こったか?
Radicleノードが使用するネットワークプロトコルに、2つの重大なセキュリティ脆弱性が報告されました。
どのバージョンが影響を受けるか?
これまでにリリースされたRadicleの全バージョンが脆弱です。
問題点は何か?
ノード間のネットワークトラフィックは暗号化されておらず、認証もされていません。署名付き参照によるリポジトリコンテンツの認証は、2つのノード間のネットワークパス上の攻撃者が転送中のオブジェクトを変更した場合を検出しますが、主な懸念は情報漏洩、つまり、2つのノード間のネットワークパス上の攻撃者が転送中のオブジェクトを読み取ることです。公開リポジトリの場合、情報漏洩はそれほど大きな懸念ではありません。しかし、転送中の暗号化はプライベートリポジトリにとって非常に重要です。
ユーザーは何をすべきか?
修正版がリリースされるまで、プライベートリポジトリの使用を停止することをお勧めします。
修正版はいつリリースされるか?
バージョンネゴシエーション機能の欠如と、修正がワイヤー上で互換性がないことに起因して、後方互換性のある緩和策は実現不可能であり、この問題を修正するリリースは破壊的なものとなるため、メジャーバージョン番号が引き上げられます。この作業は現在進行中です。この開示により、私たちの目標は、まず第一に状況について正直かつ明確に伝えることであり、ユーザーが評価して行動できるようにしつつ、私たちは解決策に取り組んでいます。
脆弱性
- Radicleが使用するネットワークプロトコルは、期待される機密性を提供しません。2つのノード間のネットワークパスを傍受できる人は誰でも、データがプレーンテキストで送信されるため、交換されるデータを読み取ることができます。これは、Konstantinos Maninakis氏から2026年6月24日に報告されました。彼の投稿はこちらで読むことができます。私たちはこれをアップストリームに報告しました。詳細はこちらのissueを参照してください。
- 接続ハンドシェイクにおけるピア認証が壊れており、なりすましを可能にします。攻撃者はあなたのノードに接続し、自身のNode IDではないものを提示できます。プライベートリポジトリは、許可リストに登録されたNode IDとのみ共有されます。許可リストに登録されたNode IDを偽装した攻撃者は、ネットワークパス上にいなくても、プライベートリポジトリを直接取得できます。これは、cryptocode氏から2026年8月12日に報告されました。私たちはこれをアップストリームに提案しました。詳細はこちらのpull requestを参照してください。
2番目の欠陥は、単独で悪用する場合、聞こえるほど容易ではありません。許可リストに登録されたNode IDになりすますには、攻撃者はまずそれを知っている必要があります。許可リストは公開されていないため、ネットワークパス上にいない攻撃者は推測する必要があります。
実際には、2つの欠陥は一緒に悪用される場合に最も有用です。パス上の攻撃者は接続の両端のNode IDを確認でき、どちらも通常は許可リストに登録されています。その攻撃者は、傍受している間に交換されるものをすべて読み取ることができ、その後、見たNode IDを使用してオンデマンドでリポジトリ全体を取得できます。現実的な脅威は、あなたのノードと同期しているノードとの間のパス上の誰でもあり、設定や許可リストはそれらから保護されません。
セキュリティアップデートが利用可能になる前に、これを公開します。あなたは今日から対応でき、後でリリースされる修正パッチは、すでに発生した露出を元に戻すことはできません。
回避策
- セキュリティアップデートがリリースされるまで、プライベートリポジトリを(ネットワーク経由で)使用しないでください。プライベートリポジトリのシード(配布)を停止してください。ただし、修正版がリリースされたら再びシードできるように、プライベートリポジトリをストレージに保持しておくことをお勧めします(完全に削除しない)。
- ネットワーク経由で他のノードに送信したすべてのプライベートリポジトリが漏洩したと考えてください。もし暗号化されていない認証情報、キー、またはトークンが含まれていた場合は、それらをローテーションしてください。
- Tor、I2P、その他のオーバーレイネットワークやVPNソリューションのような追加の暗号化されたトランスポートを使用しても、データを保護するには十分ではありません。これらは、2つのノード間のネットワークパス上の攻撃者からネットワークトラフィックを隠します。これにより攻撃対象領域は制限されますが、ピアのなりすましを防ぐことはできず、標的を絞った高度な攻撃はプライベートリポジトリの内容の漏洩につながる可能性があります。
プライベートリポジトリのシードを停止する方法
ストレージ内のプライベートリポジトリを一覧表示します。
rad ls --private --all
各リポジトリのシードポリシーを「ブロック」に変更します。
rad block <RID>
注意: ノードのシードポリシーが「許可」に設定されている場合、
rad unseedの代わりにrad blockを使用することをお勧めします。
rad unseedはリポジトリのシードポリシーを削除し、ノードはデフォルトポリシーにフォールバックします。デフォルトは「ブロック」なので、デフォルト設定ではrad unseedで十分です。デフォルトのシードポリシーを「許可」に変更した場合、rad unseedを実行してもノードはリポジトリの提供を続行します。rad blockは明示的なブロックを設定し、ノードはそれを最初にチェックするため、どちらの場合でも機能します。
ノードを完全に停止するには、以下を実行します。
rad node stop
これによって達成されることには3つの制限があります。
- これはあなたのノードがリポジトリを提供するのを停止するだけで、ローカルコピーは削除されません。コピーは
$(rad path)/storage/<RIDのプレフィックスなし>に残ります。そのディレクトリを削除するのは、リポジトリとそのフォークをすべて削除することを理解している場合のみにしてください。不明な場合は、ストレージから削除しないでください。 - 許可されたピアがすでに取得したコピーには到達しません。それらのピアはデータを保持しており、それらのノードも同じ欠陥を持っています。それらのピアにもリポジトリをブロックするように依頼してください。
- 過去の露出を元に戻すことはできません。すでにネットワーク経由で同期されたデータは、開示されたものとして扱われるべきです。
影響を受けるもの
両方の欠陥は、リポジトリデータモデルではなく、ノードのトランスポートレイヤーにあります。Gitオブジェクトと署名付き参照は、これまでどおりストレージレイヤーで検証されます。攻撃者はコードやIDを偽造することはできません。
機密性の欠陥は、これまでにリリースされたRadicleのすべてのバージョンに存在していました。
解決策
私たちは積極的に解決策に取り組んでいます。
解決策には、Radicleのネットワーキングプロトコル(現在はNoiseを使用したカスタムプロトコル)を、オープンスタンダード上に構築されたオープンソースのP2Pネットワーキングスタックであるirohに置き換えることが含まれます。私たちはすでに移行計画を共有しており、今回の脆弱性により、さらに前進する理由ができました。脆弱性に対処するだけでなく、irohはNATトラバーサルなどの追加機能をもたらし、Radicleネットワークの信頼性と回復力を向上させます。
ネットワークトランスポートへのこのような変更は、本質的に後方互換性がありません。そのため、ネットワークはアップグレードされたクラスターとアップグレードされていないクラスターに分割され、互いに通信できなくなります。
これはメジャーリリースを意味しますが、ストレージレイアウトは互換性を保ちつつ、ネットワークエンドの破壊に焦点を当てることで、アップグレードパスを可能な限りスムーズにするよう努めています。
謝辞
Konstantinos Maninakis氏とcryptocode氏が、これらの脆弱性を責任を持って開示し、連絡を取り続けてくれたことに感謝いたします。
セキュリティ問題の報告をご希望の場合は、https://radicle.dev/.well-known/security.txtを参照してください。