Printcart Storeに遠隔コード実行の脆弱性、修正版は要確認
WordPressプラグインのPrintcart Store 2.13.2以前に、ログイン不要でサーバー上へPHPファイルを置かれ、遠隔からコードを実行される脆弱性が公表されました。まず導入の有無と、アップロード画面の設定が Advanced Upload Popup かどうかを確認してください。
急ぎ度: 早めに
CVSS v3は9.8で認証なしの遠隔コード実行にあたりますが、悪用できるのは特定の設定のときに限られ、修正版の有無はベンダーの告知で確認する必要があります。
関係があるか
WooCommerceの店舗にPrintcart Storeプラグインを入れ、顧客がデザインファイルをアップロードできる画面を公開しているWordPressサイトが対象です。とくにアップロード画面の方式をAdvanced Upload Popupにしているサイトが危険です。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| Printcart Store-Web to Print Product Designer for WooCommerce(WordPressプラグイン) | 2.13.2以前のすべての版 | 修正版の版番号は本日の時点で確認できていません。WordPress.orgのプラグインページとPrintcartの告知で、2.13.2より新しい版が出ているかを確認してください。 |
確かめ方
- 1WordPressの管理画面で、プラグイン一覧にPrintcart Storeがあるか、版が2.13.2以前かを見ます。配布元のURLに含まれる名前はprintcart-integrationです。
- 2WP-CLIが使えるサーバーなら、
wp plugin listで版を確認できます。 - 3設定値
nbdesigner_upload_popup_styleがa(Advanced Upload Popup)になっていないかを確認します。wp option get nbdesigner_upload_popup_styleで読み取れます。 - 4複数のサイトや、制作会社に任せているサイトがあれば、同じ2点を各サイトで確認してください。
何が起きたか
Printcart Storeは、WooCommerceの商品にデザイン作成やファイルアップロードの機能を付けるWordPressプラグインです。2.13.2までの版に、認証なしでサーバー上の任意の場所へPHPファイルを書き込める脆弱性が見つかりました。書き込まれたファイルにアクセスされると、そのコードが実行されます。
原因は、画像の切り抜きを受け持つAJAX処理 nbu_crop_image にあります。この処理は、利用者が渡す url パラメーターをuploadsフォルダー配下のパスとして扱いますが、上位のフォルダーへ移る指定を取り除いていません。さらに、出力先のフォルダーと拡張子の両方を、その利用者由来のパスから決めています。
画像を書き出す前に中身を無害化する stripImage() も呼ばれません。そのため、画像のつもりで受け取ったデータがPHPとして、uploadsの外にも保存されます。弱点の分類はCWE-94です。
CVSS v3は9.8で、深刻度はcriticalです。本日公表された脆弱性です。
攻撃の流れ
-
1
設定が前提
サイトのアップロード方式がAdvanced Upload Popupになっていて、未ログインの来訪者にも処理が開かれている。
-
2
トークン入手
公開のアップロード画面に表示される確認用トークンを、匿名の来訪者が読み取る。
-
3
不正な送信
切り抜き処理に、保存先と拡張子を操作した値を送る。
-
4
PHPが書かれる
uploadsの外にまで、攻撃者が用意したPHPの内容が保存される。
-
5
コード実行
保存されたファイルにアクセスすると、サーバー上でコードが動く。
どう悪用されるか
ログインは要りません。インターネット越しに、利用者の操作もなしで攻撃できます。ただし、サイトの設定 nbdesigner_upload_popup_style が a(Advanced Upload Popup)のときに限られます。この設定だと、問題の処理が未認証のリクエストにも開かれるためです。
処理に必要な save-design のトークンは、誰でも見られる upload-design-file ページに表示されます。設定が a になっていれば、匿名の来訪者でも手に入れられる程度のものです。トークンが付いているから安全、とは考えないでください。
成功すると、サーバー上で任意のコードを動かされます。CVSSの評価では、情報の読み取り、改ざん、サービス停止のいずれも最大の影響です。顧客情報や注文データを扱う店舗では、サイト全体の乗っ取りにつながる可能性があります。
今すぐやること
-
1
導入有無と版を確認する
Printcart Storeが入っているサイトを洗い出し、版が2.13.2以前かを見ます。制作会社に任せているサイトも含めてください。
wp plugin list -
2
アップロード方式の設定を確認する
nbdesigner_upload_popup_styleがaなら、未認証でこの脆弱性を悪用できる状態です。ほかの値なら、悪用の前提は満たしていません。wp option get nbdesigner_upload_popup_style -
3
修正版を確認して更新する
WordPress.orgのプラグインページとPrintcartの告知で、2.13.2より新しい版が出ているかを確認します。出ていれば、先にステージング環境で動作を見てから本番を更新します。まだなければ、更新できるまでの回避策を当ててください。
-
4
侵害の跡を調べる
uploadsフォルダーの外に、覚えのないPHPファイルや最近作られたファイルがないかを見ます。Webサーバーのログで、
admin-ajax.phpへのnbu_crop_imageの呼び出しが急に増えていないかも確認してください。設定がaだった期間があるサイトは、とくに丁寧に見てください。
修正版がないあいだのつなぎ
設定 nbdesigner_upload_popup_style を a(Advanced Upload Popup)以外の方式に切り替えます。a のときだけ処理が未認証のリクエストに開かれるためです。切り替えるとアップロード画面の見た目や動作が変わるので、店舗の運用に影響がないか先に確認してください。確実に止めたいときや、設定を変えられないときは、修正版が出るまでプラグインを無効化します。
背景
Printcart Storeは、印刷物やカスタム商品を売るWooCommerceの店舗で、顧客が自分でデザインを作ったり、手元の画像をアップロードしたりできるようにするプラグインです。この種の機能は、ログインしていない来訪者からファイルや画像のURLを受け取る場面が多く、受け取り口は店舗の公開ページに置かれます。
今回の特徴は、保存先のフォルダーと拡張子の両方が、来訪者から届く値で決まることです。PHPとして動く拡張子で、サーバーの任意の場所に書けてしまいます。しかも設定が a のときだけ処理が未認証に開かれるため、同じ版でもサイトごとに危険度が分かれます。
よくある質問
Q.設定が `a` ではないサイトも、更新は必要ですか。
Q.プラグインを無効化しておけば安全ですか。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
影響パッケージ
| パッケージ | 影響を受ける版 → 修正版 | |
|---|---|---|
| printcartPrintcart Store – Web to Print Product Designer for WooCommerce |
2.13.2 以前→ 記載なし |
記載なし |
この記録には修正版の版が載っていません。修正版の有無と版は、本文か参照URLのベンダーの勧告で確かめてください。
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
The Printcart Store – Web to Print Product Designer for WooCommerce plugin for WordPress is vulnerable to Arbitrary File Upload in all versions up to, and including, 2.13.2. This is due to the nbu_crop_image AJAX handler accepting a user-supplied url parameter that Nbdesigner_IO::convert_url_to_path() concatenates onto the uploads base directory without normalizing or stripping ../ sequences, and then deriving both the output directory and output file extension via pathinfo() from the same attacker-controlled path — with no stripImage() call before writeImage() is invoked. This makes it possible for unauthenticated attackers to write attacker-controlled PHP content to arbitrary locations outside the uploads directory, resulting in remote code execution when the written file is subsequently requested. This vulnerability is only exploitable when the nbdesigner_upload_popup_style site option is set to a (Advanced Upload Popup), which causes the handler to be registered for unauthenticated requests; however, the required save-design nonce is printed on the fully public frontend upload-design-file page, making it trivially obtainable by any anonymous visitor once that configuration is active.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory