本文へ移動
English version →
重大 9.8 急ぎ度: 早めに

Grav APIプラグインにキャッシュ枯渇と権限回避、1.0.42で修正

Grav の API プラグイン(grav-plugin-api)に、認証なしで送る小さなリクエストでサーバーのディスクやキャッシュを使い切らせられる弱点と、ページ単位のアクセス規則を回避できる弱点が見つかりました。API プラグインを有効にした Grav サイトが対象で、修正版は 1.0.42 です。API を外部に公開している場合は、早めの更新か、公開範囲の制限を進めてください。

CVE-2026-112779 公開 生成 AI で作成
画像は生成 AI で作成したイメージです

急ぎ度: 早めに

認証なしで外部から突かれうる弱点ですが、公表されている影響はディスクやキャッシュの枯渇と権限の回避が中心で、実際の攻撃での悪用が確認されたという公表も現時点ではないためです。

関係があるか

Grav に API プラグイン(grav-plugin-api)を入れて有効にしているサイトが対象です。特に /api/v1/ をインターネットに公開している場合は、認証なしで弱点に届きます。

製品影響を受ける版直った版
Grav API plugin(grav-plugin-api):翻訳エンドポイントのキャッシュ枯渇 1.0.40 以上 1.0.42 未満 1.0.42
Grav API plugin(grav-plugin-api):sync・一括コピーでのページ規則の未確認 1.0.16 以上 1.0.42 未満 1.0.42

確かめ方

  1. 1Grav の管理画面のプラグイン一覧、またはサーバー上の user/plugins/api/ で、API プラグインが入っているか、有効になっているかを確認します。入っていなければ対象外です。
  2. 2入っている場合は、プラグインの版を確認します。1.0.42 より前であれば対象です。
  3. 3リバースプロキシや WAF、Web サーバーの設定で、/api/ 以下が社外から到達できる状態になっているかを確認します。
  4. 4api.pages.write の権限を持つアカウントがどれだけあるかを洗い出します。権限回避の側の影響範囲は、このアカウントの数で決まります。

何が起きたか

Grav はデータベースを使わずにファイルでページを管理する CMS で、API プラグインを入れると、ページや設定を外部のプログラムから操作できるようになります。このプラグインに、性質の異なる 2 つの弱点が見つかりました。1 つ目は、ログイン不要で呼べる翻訳データの取得口が、リクエストのたびに大きなデータをサーバーに保存してしまう問題です。2 つ目は、ページの複製などの機能が、ページごとに設定されたアクセス規則を確認しない問題です。

1 つ目は、GET /api/v1/translations/{lang} というエンドポイントの問題です。形式として正しい言語コードが送られるたびに、翻訳辞書全体をキャッシュとして保存します。1 回あたり約 560 KB で、これを大量に送ればディスクや APCu(PHP の共有メモリキャッシュ)を使い切らせることができます。対象は 1.0.40 以上 1.0.42 未満です。保存量に上限がないことが原因で、CWE-770(上限のない資源の割り当て)に分類されています。

2 つ目は、同期(sync)と一括コピー(batch copy)のエンドポイントが、コピー元と先のページに設定された規則を確認しない問題です。対象は 1.0.16 以上 1.0.42 未満です。api.pages.write 権限を持つアカウントが、本来は拒否されるはずの翻訳の上書きやページの作成を行えます。こちらは認証済みのアカウントが前提です。

攻撃の流れ

  1. 1

    言語コード送信

    外部の第三者が、認証なしで翻訳取得用のエンドポイントに小さなリクエストを送ります。

  2. 2

    辞書を保存

    サーバーは形式が正しい言語コードごとに、約 560 KB の翻訳辞書全体をキャッシュします。

  3. 3

    繰り返し送信

    コードを変えながら送り続けると、保存量が積み上がります。

  4. 4

    資源の枯渇

    ディスクや APCu が埋まり、サイトの動作に支障が出るおそれがあります。

公開されている情報をもとにした流れの例です。

どう悪用されるか

翻訳キャッシュの問題は、認証もユーザー操作も不要で、ネットワーク経由で悪用できます。API が外部に公開されていれば、誰でも届く位置にあります。悪用されると、ディスクや APCu が埋まり、Grav サイトの応答が遅くなったり止まったりするおそれがあります。同じサーバーで別のサービスが動いている場合は、ディスクが埋まることでそちらにも影響が及ぶ可能性があります。

ページ規則の問題は、api.pages.write 権限を持つアカウントが前提です。そのアカウントが、規則で拒否されているはずの翻訳の上書きやページの作成を行えます。権限を持つ人を信頼できる運用であれば、主なリスクは、内部の担当者の誤操作や、そのアカウントが乗っ取られた場合の被害の拡大です。

深刻度は CVSS v3.1 で 9.8(Critical)とされています。これは認証なしでネットワークから悪用できる点を最大限に評価した数値です。公表されている説明は、資源の枯渇と権限規則の回避が中心です。実際の影響は、API を外部に公開しているか、権限を持つアカウントがどれだけあるかによって大きく変わります。

今すぐやること

  1. 1

    API プラグインを 1.0.42 以降に更新する

    Grav の管理画面、または bin/gpm でプラグインを更新します。本番に当てる前に、ステージング環境などで API を使っている連携の動作を確認してください。

    grep -n "^version" user/plugins/api/blueprints.yaml
  2. 2

    API の公開範囲を見直す

    API を社外に出す必要がなければ、社内ネットワークや特定の接続元だけに制限します。使っていないなら、プラグインを無効にするか削除します。

  3. 3

    ディスクと APCu の使用量を確認する

    ディスクの空き容量と、APCu の使用量の推移を見ます。急に増えていないかを確認してください。更新後に溜まったキャッシュが自動で消えるかは公表されていないため、不要な分は Grav のキャッシュ消去で整理することを検討してください。

  4. 4

    api.pages.write 権限の棚卸しをする

    この権限を持つアカウントを洗い出し、不要なものは外します。あわせて、翻訳やページが意図しない形で書き換えられていないかを確認します。

すぐ更新できないとき

すぐに更新できない場合は、次の対応で影響を小さくできます。ただし、いずれも一時しのぎです。
- リバースプロキシや WAF で /api/v1/translations/ への認証なしのアクセスを遮断する。または、/api/ 全体を社内ネットワークなど信頼できる接続元に限定する
- 同じ接続元からの大量のリクエストに、レート制限をかける
- API を使っていなければ、プラグインを無効にする
- api.pages.write 権限を、必要な担当者だけに絞る

背景

Grav はファイルベースで動く CMS で、社内向けのサイトやドキュメント、広報サイトなどに使われます。API プラグインは、その内容を外部のシステムや自動化の仕組みから読み書きできるようにするもので、便利な反面、認証や権限の確認が甘いと、管理画面を経由せずに直接操作されてしまう入口になります。

リクエストの内容に応じてキャッシュを作り、その量に上限を設けないという作りは、Web アプリケーションで以前から繰り返し問題になってきた種類の弱点です。1 回のリクエストは小さくても、保存される側が大きければ、少ない通信量でサーバーの資源を使い切らせられます。公開 API には、認証の有無にかかわらず、保存量や回数に上限を設けることが求められます。

よくある質問

Q.CVSS 9.8 なので、すぐにサイトが乗っ取られるのでしょうか。
A.公表されている説明では、認証なしで起こせるのはディスクや APCu の枯渇で、サイトの停止や遅延につながる問題です。ページ規則の回避は、api.pages.write 権限を持つアカウントが前提です。数値は高いものの、説明されている内容に外部から任意のコードを実行できるとは書かれていません。それでも、認証なしで外部から届く弱点なので、早めの更新をおすすめします。
Q.API プラグインを使っていない Grav サイトは対象ですか。
A.プラグインが入っていない、または無効であれば、この弱点の影響は受けません。ただし、以前に試験的に入れたまま放置していないか、user/plugins/ の中を一度確認してください。
Q.実際の攻撃は確認されていますか。
A.実際の攻撃で悪用されたという公表は、現時点でありません。悪用の見込みを示す指標も、ここでは示されていません。状況が変わる可能性があるため、Grav の公式の告知(GitHub のセキュリティアドバイザリ)を確認してください。

まだ分かっていないこと

  • 実際の攻撃での悪用が確認されているかは公表されていません。
  • 更新後に、すでに溜まったキャッシュが自動で消えるかは公表されていません。
  • 1.0.16 より前の版と、1.0.40 より前の版で翻訳エンドポイントの問題があるかは、公表されている情報からは読み取れません。最新の告知で確認してください。

この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。

原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。

Grav API plugin (grav-plugin-api) 1.0.40 before 1.0.42 caches a full translation dictionary for every well-formed language code sent to the unauthenticated GET /api/v1/translations/{lang} endpoint, and 1.0.16 before 1.0.42 fails to check target and destination page rules in the sync and batch copy endpoints. Unauthenticated attackers can send small requests that each store about 560 KB to exhaust disk or APCu, while accounts with api.pages.write can overwrite translations or create pages that page-level rules deny.

出典: NIST National Vulnerability Database NVD GitHub Advisory

参照URL

当サイトでは、アクセス解析と広告の効果測定のために Cookie を使います。株式会社Game のサイト共通の設定です。 詳しく