Gravity Formsに脆弱性、認証不要でコード実行の恐れ
WordPressのフォームプラグインGravity Formsに、認証なしでサーバー上のコード実行につながりうる脆弱性が公表されました。投稿を作成するフォームを使うサイトは、導入版を確認して修正版へ更新してください。
急ぎ度: 早めに
CVSS v3は9.8で認証なしにネットワークから届きますが、対象は特定のフォーム設定を使うサイトに限られ、修正版も出ているため、至急ではなく早めの更新が妥当と見ます。
関係があるか
Gravity Formsを入れたWordPressサイトのうち、フォームの送信内容から投稿を作る設定を使っているサイトが主な対象です。問い合わせ受付や投稿募集のフォームを公開している企業サイトや、制作会社が複数案件を預かっている環境も含まれます。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| Gravity Forms(WordPressプラグイン) | 3.1.2以前のすべての版 | 3.1.2より新しい版。具体的な版番号はベンダーの告知で確認してください |
確かめ方
- 1WordPressの管理画面でプラグイン一覧を開き、Gravity Formsの版が3.1.2以前でないかを見ます。
- 2WP-CLIが使える環境では、
wp plugin get gravityforms --field=versionで版を確認できます。 - 3フォームの編集画面で、投稿フィールドのカスタムフィールドに入力タイプがListのものがないかを調べます。あわせて、そのフィールドでコンテンツテンプレートが有効になっていないかも見ます。両方に当てはまるフォームが、今回の経路の対象です。
- 4同じWordPressに入っている他のプラグインやテーマの一覧も控えておきます。被害の大きさは、これらに左右されます。
何が起きたか
Gravity Formsに、フォームの送信内容から投稿を作る処理で、外部から届いた値をそのままPHPのオブジェクトに戻してしまう脆弱性が見つかりました。ログインしていない第三者が、サイトの投稿メタデータに不正なオブジェクトを書き込める状態です。公表は2026年10月30日です。
原因は、処理の呼び分けにあります。プラグインにはオブジェクトの生成を禁じた安全な読み込み関数が用意されていますが、投稿を作る処理は、制限のないWordPress標準の関数を呼んでいました。入力タイプがListのカスタムフィールドで、コンテンツテンプレートが有効なとき、送信された値が検査されずにこの関数へ届きます。
プラグイン単体には、コード実行まで進める部品は含まれていません。ただし、同じサイトの他のプラグインやテーマ、あるいはWordPress本体の部品が組み合わさると、深刻な被害に広がりえます。その条件はこの記事の後半で整理します。
攻撃の流れ
-
1
公開フォームへ送信
ログイン不要で、対象のフォームに細工した値が送られます。
-
2
値が検査されず通過
投稿作成の処理が、制限のない関数で値をオブジェクトに戻します。
-
3
オブジェクトを注入
不正なPHPオブジェクトが投稿メタデータに書き込まれます。
-
4
他の部品と連鎖
サイト内の他のプラグイン、テーマ、または特定の環境条件がそろうと、コード実行に進みます。
どう悪用されるか
ログインは要りません。インターネットから対象のフォームへ送信できれば足り、管理者や訪問者に何かを操作させる必要もありません。攻撃が成り立つのは、フォームの投稿フィールドにListタイプのカスタムフィールドがあり、そのコンテンツテンプレートが有効なときです。
オブジェクトを書き込めても、それだけで直ちにコードが動くわけではありません。同じサイトの他のプラグインやテーマに悪用できる部品があれば、遠隔でのコード実行に進みえます。さらに、カスタムフィールドがWordPressの保護されたメタキーである_wp_page_templateに割り当てられている場合は、WordPress本体の部品だけで連鎖が成り立つと説明されています。その場合の前提は、読み取れるPEARがサーバーにあることと、PHPのregister_argc_argvが有効なことです。
成功すると、サーバー上で攻撃者の指定したコードが動きます。サイトのデータの閲覧・改ざん・停止まで及びうることは、CVSSのベクターが機密性・完全性・可用性のすべてを高と評価していることにも表れています。
今すぐやること
-
1
導入版を確認する
本番・検証を問わず、Gravity Formsを入れているサイトをすべて洗い出し、版を確認します。制作会社に運用を任せている場合は、版の報告を依頼します。
wp plugin get gravityforms --field=version -
2
修正版へ更新する
ベンダーの告知で修正版の版番号を確認し、更新します。まず、投稿を作成するフォームを公開しているサイトから進めます。検証環境がある場合は、フォームの送信と投稿の作成が正常に動くかを確かめてから、本番に反映します。
-
3
フォーム設定を棚卸しする
投稿フィールドを使うフォームのうち、Listタイプのカスタムフィールドとコンテンツテンプレートの組み合わせがあるものを洗い出します。使っていない設定は外しておくと、今後同種の問題が出たときの影響範囲を狭められます。
-
4
同居するプラグインとテーマを整理する
コード実行に進むかどうかは、同じサイトの他の部品に左右されます。使っていないプラグインとテーマは削除し、残すものも最新の版に保ちます。
-
5
更新までの間の痕跡を調べる
公表前から対象の版を公開していたサイトでは、身に覚えのない投稿やファイルの追加、フォームの送信先に対する不審なリクエストがないかを、アクセスログと投稿データで確認します。
すぐ更新できないとき
すぐに更新できないときは、該当するカスタムフィールドのコンテンツテンプレートを無効にするか、そのフィールドを外します。投稿を作成するフォームそのものを一時的に非公開にする方法もあります。いずれも暫定のつなぎであり、修正版への更新は必要です。
背景
Gravity Formsは、WordPressで問い合わせ、申し込み、アンケートなどのフォームを作るための代表的な有料プラグインです。フォームの内容からWordPressの投稿を自動で作る機能もあり、寄稿の受け付けや求人情報の投稿などに使われます。公開フォームは誰でも値を送れるため、入力値の扱いはそのまま外部との境界になります。
今回の脆弱性は、PHPのシリアライズされたデータを元のオブジェクトに戻す処理で、入力を制限していなかったことが原因です。プラグインには以前からオブジェクトの生成を禁じた安全な読み込み関数がありましたが、投稿を作る経路だけがWordPress標準の関数を呼び続けていました。安全な関数を用意していながら、一か所だけ置き換わっていなかったことが、この問題の中身です。
よくある質問
Q.投稿を作成するフォームを使っていなければ、更新しなくてもよいですか。
この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 修正版 |
|---|---|---|---|
| Gravity Forms | Gravity Forms |
3.1.2 以前 |
— |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
The Gravity Forms plugin for WordPress is vulnerable to PHP Object Injection in all versions up to, and including, 3.1.2 via a Post Custom Field whose input type is List. This is due to GFFormsModel::create_post() passing the submitted value to WordPress' unrestricted global maybe_unserialize() rather than the plugin's own hardened GFCommon::maybe_unserialize(), which was added in 3.1.1 and passes allowed_classes => false precisely to prevent object instantiation. Where the field has a content template enabled, the submitted row reaches that call verbatim. This makes it possible for unauthenticated attackers to inject a PHP object into post meta. No PHP Object Injection gadget chain is present in the plugin itself; however, if a gadget chain is present via an additional plugin or theme, it could allow the attacker to perform actions such as remote code execution. Where the custom field is mapped to the protected _wp_page_template meta key, WordPress itself supplies the chain: validate_file() accepts non-scalars, WP_Theme::__toString() then resolves an attacker-controlled path, and on hosts with a readable PEAR install and register_argc_argv enabled this yields remote code execution.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- web security@wordfence.com
- web security@wordfence.com
- web nvd.nist.gov
- web docs.gravityforms.com
- web github.com