Ninja Forms File Uploadsにファイル削除の脆弱性
WordPressのNinja Forms用アドオンFile Uploadsの3.3.36以前に、認証なしでサーバー上のファイルを削除され、サイト乗っ取りにつながる脆弱性があります。該当する版を使うサイトは、版を確認したうえで修正版の有無を調べ、なければアドオンの停止を検討してください。
急ぎ度: 至急
CVSS v3が9.1で、認証なしにネットワークから悪用でき、wp-config.phpの削除からサイト乗っ取りに至る恐れがある一方、修正版の公開はまだ確認できていないためです。
関係があるか
Ninja FormsにFile Uploadsアドオンを追加したWordPressサイトが対象です。履歴書や申込書、問い合わせの添付ファイルをフォームで受け付けている企業サイトが典型です。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| Ninja Forms - File Uploads(WordPress用アドオン、提供元はSaturdayDrive) | 3.3.36以前のすべての版 | 修正版の版番号は確認できていません。Ninja Formsの提供元の告知で、3.3.36より新しい版が出ているかを確認してください |
確かめ方
- 1WordPressの管理画面でプラグイン一覧を開き、Ninja Forms - File Uploadsが入っているか、入っていれば版がいくつかを見ます。
- 2サーバーにWP-CLIがあれば、
wp plugin listで導入済みプラグインと版を一覧できます。 - 3Ninja Forms本体だけで、File Uploadsアドオンを入れていないサイトは、今回の対象製品に含まれていません。
- 4複数のサイトを管理している場合は、各サイトで同じ確認をします。使っていないステージング環境や古いサイトにも、アドオンが残っていることがあります。
何が起きたか
Ninja FormsのFile Uploadsアドオンの3.3.36以前に、認証なしの外部の者がサイトのサーバー上のファイルを削除できる脆弱性があります。S3・Dropbox・Google Driveへの送信機能を介して、サーバー上のファイルを外部に持ち出される恐れもあると説明されています。
wp-config.phpが削除されると、WordPressは初期設定の画面に戻ります。そこからサイトを丸ごと乗っ取られる恐れがあるため、単なるファイル削除では済まない点に注意が必要です。
原因はパスの検証不足で、分類はCWE-22です。保存途中の進捗を示す値が付いた公開フォームの送信では、アドオンの処理が途中で終わり、送信側が指定したファイル情報がそのまま残ります。外部サービス連携の処理には、サーバー側で正規のパスを読み直す仕組みがありますが、これが働くのは特定の条件のときだけです。条件から外れると、送信側が指定したパスがバックグラウンドのアップロードの待ち行列に残り、S3への送信と、送信後のサーバー上のファイル削除に使われます。パスの正規化も、アップロード用ディレクトリの中かどうかの確認もありません。プラグインには確認用の関数がありますが、管理画面側の経路でしか使われていません。
攻撃の流れ
-
1
公開フォームへの送信
ログイン不要で使えるフォームに、細工したファイル情報を含む送信が届きます。
-
2
パスが検証されない
サーバー側での正規パスへの読み直しが働かず、送信側が指定したパスが待ち行列に残ります。
-
3
任意ファイルの削除
バックグラウンド処理が、指定されたサーバー上のファイルを検証なしで削除します。外部ストレージ経由の持ち出しも起こり得ます。
-
4
設定ファイルの喪失
wp-config.phpが消えるとWordPressが初期設定の画面に戻ります。
-
5
サイト乗っ取り
初期設定の画面を悪用され、サイトの管理権限を奪われる恐れがあります。
どう悪用されるか
認証は要りません。インターネット側から、公開されているフォームの送信として届くリクエストだけで成立し、サイト管理者や訪問者の操作も必要としません。CVSS v3のベクターでも、攻撃元はネットワーク、複雑さは低、必要な権限と利用者の操作はなしです。
被害は、サーバー上の任意のファイルの削除です。CVSSでは完全性と可用性への影響が高と評価されています。wp-config.phpが削除されると、WordPressは初期設定の画面に戻り、サイト全体の乗っ取りにつながります。S3・Dropbox・Google Driveへの送信を通じた任意ファイルの読み取りも、脆弱性の説明に挙げられています。
今すぐやること
-
1
導入の有無と版を確認する
File Uploadsアドオンを入れているサイトを洗い出し、版が3.3.36以前かどうかを確認します。
wp plugin list -
2
修正版を確認して更新する
Ninja Formsの提供元の告知で、3.3.36より新しい版が出ているかを確認します。出ていれば、本番に当てる前にステージングで動作を見たうえで、早めに更新します。
-
3
侵害の跡がないか点検する
wp-config.phpなど、サイトに必要なファイルが残っているかを確認します。サイトが初期設定の画面になっていたり、意図しない管理者アカウントが増えていたりしたら、乗っ取りを疑います。フォーム送信まわりのアクセスログに、見慣れないリクエストがないかも見ます。
-
4
バックアップを確認する
ファイルとデータベースの最新のバックアップが取れているか、復元できるかを確かめます。侵害が疑われるときは、S3・Dropbox・Google Driveの連携に使っている認証情報の取り替えも検討します。
修正版がないあいだのつなぎ
修正版がまだ出ていない、またはすぐに更新できない場合は、File Uploadsアドオンを無効化します。アップロード欄を持つフォームは一時的に使えなくなるため、受付を止められない業務では、メールなど別の受付手段を用意します。無効化の前に、サイトのファイルとデータベースのバックアップを取ります。
背景
Ninja FormsはWordPressで問い合わせや申込みのフォームを作るプラグインで、File Uploadsは有償のアドオンです。フォームにアップロード欄を足し、ファイルをメディアライブラリ、Google Drive、Dropbox、Amazon S3に保存したり、通知メールに添付したりできます。提供元の製品ページには、履歴書や申込書の受付といった用途が挙がっています。
製品ページは、拡張子の許可リストで危険なファイルを遮断し、サーバー側でも検証していると説明しています。今回の問題は、アップロードされるファイルの種類ではなく、サーバー上のどのファイルを処理の対象にするかの検証にあります。外部サービスへの送信と送信後の削除という、アドオンの中心機能の内部で起きている点が特徴です。
よくある質問
Q.Ninja Forms本体だけを使っているサイトも対象ですか。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
影響パッケージ
| パッケージ | 影響を受ける版 → 修正版 | |
|---|---|---|
| SaturdayDriveNinja Forms - File Uploads |
3.3.36 以前→ 記載なし |
記載なし |
この記録には修正版の版が載っていません。修正版の有無と版は、本文か参照URLのベンダーの勧告で確かめてください。
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
The Ninja Forms - File Uploads add-on for WordPress is vulnerable to Arbitrary File Deletion (and arbitrary file read via S3/Dropbox/Google Drive exfiltration) in versions up to, and including, 3.3.36. The flaw spans NF_FU_Fields_Upload::process() in includes/fields/upload.php — which returns early (leaving the client-supplied files[] intact) whenever a public submission carries a nonempty extra.saveProgress — and NF_FU_External_Abstracts_Service::process_upload() in includes/external/abstracts/service.php, whose authoritative-path reload only fires when the client sends upload_id. By omitting upload_id, an attacker's data[file_path] survives into the Background Upload queue and is used by both upload_file_to_s3() (as SourceFile) and the maybe_delete_server_file() unlink() call in includes/external/abstracts/backgroundupload.php, with no canonicalization or upload-directory containment check (the plugin's own is_path_within_upload_dir() helper is only applied on admin paths). This makes it possible for unauthenticated attackers to delete arbitrary files on the affected site's server which may make remote code execution possible — specifically, deleting wp-config.php forces WordPress into its setup screen, enabling full site takeover.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- web security@wordfence.com
- web security@wordfence.com
- web nvd.nist.gov
- web ninjaforms.com
- web github.com