WandererにSSRF脆弱性、0.20.0で修正版が公開
セルフホスト型のトレイル管理アプリWandererの0.20.0未満に、ログインなしで内部ネットワークへ要求を送らせられる脆弱性があります。インターネットに公開している場合は、0.20.0以降へ更新し、設定とアクセスログも確認してください。
急ぎ度: 至急
CVSS v3が10.0で、認証なしにネットワーク越しで悪用でき、修正版0.20.0がすでに公開されているため、外部に公開しているインスタンスは至急の更新が妥当です。
関係があるか
Wandererを自前のサーバーやDocker環境で動かし、PUBLIC_PRIVATE_INSTANCEをtrueにしていない組織が対象です。インターネットやほかの部門から到達できるインスタンスほど影響が大きくなります。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| Wanderer(open-wanderer/wanderer) | 0.20.0未満(勧告ではv0.19.3以前)。PUBLIC_PRIVATE_INSTANCEがtrueでない構成 | 0.20.0 |
確かめ方
- 1稼働中のWandererの版を確認します。Docker Composeで運用している場合は、イメージのタグが0.20.0未満かどうかを見ます。
- 2環境変数PUBLIC_PRIVATE_INSTANCEの値を確認します。trueになっていなければ、脆弱性の発生条件に当てはまります。
- 3Wandererのサーバーが、インターネットや信頼できない利用者のいるネットワークから到達できるかを、リバースプロキシやファイアウォールの設定で確認します。
何が起きたか
WandererのURL取り込み用API(/api/v1/trail/download)に、サーバー側で任意のURLへ要求を送らせられる脆弱性(SSRF)があります。ログインしていない相手から渡された宛先を確認せずにサーバーが取りにいき、その応答を呼び出し元へ返してしまいます。
外部からは見えないはずの内部サービスの応答や、クラウド環境のメタデータが読まれるおそれがあります。内部ネットワークの探索や、内部サービスへの負荷によるサービス拒否にもつながります。CWEはCWE-918です。
原因は、受け取ったURLにプロトコルやホスト名の制限をかけないまま、サーバー側の取得処理に渡していることです。勧告は、同梱のDocker構成にあるPocketBase(db:8090)とMeilisearch(search:7700)が、外部には公開されていなくてもWebコンテナからは届く点を挙げています。
0.20.0では、未認証の要求に401を返す認証の確認が加わりました。あわせて、許可するプロトコルとホスト名の制限と、名前解決したIPアドレスがプライベート・予約済みの範囲に入っていないかの検査が追加されています。
攻撃の流れ
-
1
到達できる
外部から公開中のWandererのサーバーに接続できる状態を見つけます。
-
2
宛先を指定
URL取り込みAPIに、取得させたい宛先をログインなしで渡します。
-
3
サーバーが代行
Wandererのサーバーが、内部サービスやメタデータの宛先へ代わりに要求を送ります。
-
4
応答が返る
内部の応答が呼び出し元へ返り、情報の取得や内部の探索、負荷をかける攻撃に使われます。
どう悪用されるか
悪用に認証は要りません。Wandererのサーバーにネットワーク越しで接続でき、PUBLIC_PRIVATE_INSTANCEがtrueでなければ成立します。利用者の操作も不要で、CVSSの評価でも攻撃の複雑さは低とされています。
悪用されると、Wandererのサーバーから届く範囲の内部サービスの応答が、攻撃者の手元に返ります。データの漏えい、内部ネットワークの探索、内部エンドポイントへの負荷が想定される被害です。クラウド上で動かしている場合は、メタデータの取得を通じて認証情報が読まれる可能性もあります。
CVSSの評価では、改ざん(完全性)への影響はなしで、機密性と可用性への影響が高とされています。
今すぐやること
-
1
0.20.0以降へ更新する
Wandererを0.20.0以降の修正版に更新します。更新後は、このAPIが未ログインでは使えなくなります。URL取り込みを未ログインで使っていた運用があれば、利用者に伝えておくと問い合わせを減らせます。
docker compose images -
2
公開範囲と設定を確認する
更新までの間も含め、Wandererのサーバーが不要にインターネットへ公開されていないかを見直します。PUBLIC_PRIVATE_INSTANCEの現在の値も確認します。
docker compose config | grep PUBLIC_PRIVATE_INSTANCE -
3
アクセスログを調べる
リバースプロキシやWebサーバーのログで、/api/v1/trail/downloadへのPOSTが、心当たりのない送信元から来ていないかを確認します。POSTの本文はログに残らないことが多いので、アクセスの有無と頻度で判断します。
-
4
不審なアクセスがあれば鍵を入れ替える
該当するアクセスがあり、クラウド上で動かしている場合は、そのサーバーに付与された認証情報の利用履歴を調べ、必要に応じて入れ替えます。PocketBaseやMeilisearchに設定した管理用の鍵やパスワードも、同様に見直します。
すぐ更新できないとき
すぐに更新できない場合は、リバースプロキシやファイアウォールで/api/v1/trail/downloadへの外部からのアクセスを遮断します。この場合、URLからの取り込み機能は使えなくなります。PUBLIC_PRIVATE_INSTANCEをtrueにすると発生条件から外れますが、インスタンスの公開の挙動が変わる可能性があるので、事前に影響を確認してください。Wandererのサーバーから内部ネットワークやクラウドのメタデータ宛ての通信を絞る、外向き通信の制限も勧告に挙がっています。いずれも更新までのつなぎです。
背景
Wandererは、ハイキングなどのトレイルを保存・共有するセルフホスト型のデータベースです。Webの画面とは別に、データ管理にPocketBase、検索にMeilisearchを使い、同梱のDocker Compose構成ではこれらが内部ネットワークに置かれます。外から直接は届かない前提のため、内部サービスは認証が緩いままになりがちで、Webコンテナ経由で届いてしまうと守りが薄い点が弱みになります。
SSRFは、サーバーを踏み台にして、本来届かない内部の宛先へ要求を送らせる種類の脆弱性です。クラウド上のサーバーでは、メタデータの宛先から認証情報が読めることがあるため、被害が内部サービスの外へ広がりうることが知られています。今回の脆弱性は、個人や小規模チームが自前で動かす構成でも、同じ内部サービス構成が使われる点が特徴です。
よくある質問
Q.社内LANだけで使っていれば、更新しなくてもよいですか。
まだ分かっていないこと
- 実際の攻撃での悪用が確認されたかどうかは、勧告に記載がありません。
- 0.20.0の公開日は、勧告やCVEの記録では示されていません。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
Wanderer is a self-hosted trail database for saving and sharing adventures. Prior to 0.20.0, when PUBLIC_PRIVATE_INSTANCE is not set to true, the unauthenticated POST /api/v1/trail/download handler passes the attacker-controlled JSON url field directly to event.fetch() and returns the fetched response. This allows requests to internal services such as db:8090 and search:7700, cloud metadata addresses, and other network destinations, exposing returned data and permitting internal network reconnaissance or denial of service. This issue is fixed in version 0.20.0.
出典: CVE.org (CVE Program・cvelistV5) NVD