Readestに認証不要のSSRF脆弱性、0.11.10で修正
電子書籍リーダーReadestのサーバー側に、認証なしで任意のURLを代理取得させられる脆弱性があり、自前で公開している組織が影響を受けます。0.11.10に更新し、更新前の/api/opds/proxyへのアクセスも確認してください。
急ぎ度: 早めに
CVSS v3は9.3で認証も利用者の操作も要りませんが、影響を受けるのはReadestのサーバー側を自前で公開している環境に限られ、0.11.10という修正版がすでにあります。
関係があるか
Readestのサーバー側を、Node、Docker、Cloudflare Workersなどで自前運用し、インターネットから届く状態にしている組織や個人が対象です。社内ネットワークやクラウドのメタデータに届く環境ほど、影響が大きくなります。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| Readest(Node、Docker、その他のセルフホスト構成) | 0.11.10より前 | 0.11.10 |
| Readest(Cloudflare Workers構成) | 0.11.10より前。リンクローカルやプライベート宛ての通信は制限されるため内部への影響は小さいものの、公開された代理取得の挙動は残る | 0.11.10 |
確かめ方
- 1自組織でReadestのサーバー側を動かしているかを、情シスや開発担当に確認します。利用者として公式のアプリやサービスを使うだけなら、この確認は要りません。
- 2動かしている場合は、デプロイしているReadestの版が0.11.10より前かどうかを調べます。
- 3インターネット側から/api/opds/proxyに到達できるかを、リバースプロキシやファイアウォールの設定とアクセスログで確認します。
何が起きたか
Readestのサーバー側に、誰でも使える中継口がありました。外部から指定されたURLをサーバーが代わりに取得し、その結果をそのまま返してしまいます。
問題の経路は/api/opds/proxyです。0.11.10より前では、認証が要らず、取得先のスキームに制限がなく、プライベート、ループバック、リンクローカル、メタデータ用のアドレスも止めていませんでした。リダイレクトを自動で追う際にも、移動先を検め直していません。
さらにこの経路は、呼び出し側が指定した送信ヘッダーとAuthorizationの値を受け付け、取得先のステータスと本文を呼び出し側へ返します。0.11.10で修正されました。
攻撃の流れ
-
1
公開口を見つける
インターネットから/api/opds/proxyに届くReadestのサーバーを探す。
-
2
取得先を指定する
認証なしで、取得してほしいURLを指定した要求を送る。
-
3
サーバーが代理取得
Readestのサーバーが宛先を検証しないまま、指定先に要求を出す。
-
4
応答が送り主へ戻る
内部サービスやクラウドのメタデータの応答が、そのまま返される。
どう悪用されるか
ネットワーク越しに、認証なしで、利用者の操作も待たずに悪用できます。特別な条件も要らず、CVSSの評価でも攻撃の複雑さは低いとされています。
いちばん困るのは、Readestのサーバーが社内やクラウド内部への踏み台に使われることです。Node、Docker、その他のセルフホスト構成で内部ネットワークに届く場合、クラウドのメタデータや内部サービスの応答が外部の第三者に読まれます。メタデータに認証情報が含まれていれば、被害はReadestの外へ広がります。
また、送信ヘッダーとAuthorizationの値も指定されるため、Readestのサーバーを送信元にした外部への要求にも使われます。踏み台にされた場合、見かけ上の送信元は自組織のサーバーになります。
今すぐやること
-
1
動かしている版を確認する
ソースから動かしているなら、リポジトリやパッケージの版を調べます。コンテナーなら、実行中のイメージの版を確認します。
grep '"version"' apps/readest-app/package.json -
2
0.11.10以降に更新する
Readestを0.11.10以降にし、Dockerならイメージを作り直して入れ替えます。更新後に/api/opds/proxyへの外部要求が内部宛てに通らないことも確かめます。
-
3
更新前のアクセスを調べる
リバースプロキシやアプリのログで、/api/opds/proxyへの要求を洗い出します。見覚えのない取得先や、内部アドレス、メタデータ用アドレスが含まれていないかを見ます。
-
4
ベンダーの告知を読む
GitHub上のReadestのセキュリティアドバイザリで、影響する構成と修正内容の詳細を確認します。自組織の構成が当てはまるかの最終判断にも使えます。
すぐ更新できないとき
すぐに更新できないときは、リバースプロキシやWAFで/api/opds/proxyへの外部からのアクセスを遮断します。あわせて、Readestを動かすホストから内部ネットワークやメタデータ用アドレスへの通信を、出口側で制限します。経路を遮断すると、OPDSカタログを取得する機能は使えなくなる可能性があります。
背景
Readestは、複数のOSで同じ読書体験を提供する電子書籍リーダーです。問題の/api/opds/proxyは、外部のOPDSカタログ(電子書籍の配信先一覧)をサーバーが代わりに取得して返す経路で、本来は書籍カタログの閲覧を助けるための機能です。
サーバーが外部のURLを取りに行く機能は、取得先を絞らないと内部への入口になります。クラウド上のサーバーでは、同じ環境の内側からしか見えないメタデータサービスや社内サービスが、公開サーバーを経由して読まれかねません。今回はスキームの制限も、内部アドレスの遮断も、リダイレクト先の再検証も欠けていたため、CVSSの機密性への影響が高く評価されています。
よくある質問
Q.デスクトップ版やスマートフォン版のアプリも影響を受けますか。
Q.ログに不審な要求があった場合、何をすればよいですか。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
Readest is a modern, feature-rich ebook reader designed for seamless cross-platform access and an intuitive reading experience. Prior to 0.11.10, the unauthenticated /api/opds/proxy route in apps/readest-app/src/app/api/opds/proxy/route.ts accepted an attacker-controlled URL and fetched it server-side without restricting the scheme, blocking private, loopback, link-local, or metadata hosts, or revalidating destinations during automatic redirect following. The route also accepted caller-controlled outbound headers and Authorization values and reflected the upstream status and response body. A remote attacker could use the service as an open request proxy and, on Node, Docker, or other self-hosted deployments with internal-network access, retrieve cloud metadata or internal-service responses. Cloudflare Workers deployments restrict access to link-local and private destinations, which reduces the internal-network impact there, but the unauthenticated public fetch-and-reflect behavior remains. This issue is fixed in version 0.11.10.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- advisory github.com
- advisory github.com
- advisory nvd.nist.gov
- patch github.com
- patch github.com
- web github.com