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

Printcart Storeに遠隔コード実行の脆弱性、修正版は要確認

WordPressプラグインのPrintcart Store 2.13.2以前に、ログイン不要でサーバー上へPHPファイルを置かれ、遠隔からコードを実行される脆弱性が公表されました。まず導入の有無と、アップロード画面の設定が Advanced Upload Popup かどうかを確認してください。

CVE-2026-19803 公開 更新 執筆・監修: 佐々木 航 人が監修しながらAIを活用して執筆
画像は生成 AI で作成したイメージです

急ぎ度: 早めに

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より新しい版が出ているかを確認してください。

確かめ方

  1. 1WordPressの管理画面で、プラグイン一覧にPrintcart Storeがあるか、版が2.13.2以前かを見ます。配布元のURLに含まれる名前はprintcart-integrationです。
  2. 2WP-CLIが使えるサーバーなら、wp plugin list で版を確認できます。
  3. 3設定値 nbdesigner_upload_popup_style が a(Advanced Upload Popup)になっていないかを確認します。wp option get nbdesigner_upload_popup_style で読み取れます。
  4. 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. 1

    設定が前提

    サイトのアップロード方式がAdvanced Upload Popupになっていて、未ログインの来訪者にも処理が開かれている。

  2. 2

    トークン入手

    公開のアップロード画面に表示される確認用トークンを、匿名の来訪者が読み取る。

  3. 3

    不正な送信

    切り抜き処理に、保存先と拡張子を操作した値を送る。

  4. 4

    PHPが書かれる

    uploadsの外にまで、攻撃者が用意したPHPの内容が保存される。

  5. 5

    コード実行

    保存されたファイルにアクセスすると、サーバー上でコードが動く。

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

どう悪用されるか

ログインは要りません。インターネット越しに、利用者の操作もなしで攻撃できます。ただし、サイトの設定 nbdesigner_upload_popup_style が a(Advanced Upload Popup)のときに限られます。この設定だと、問題の処理が未認証のリクエストにも開かれるためです。

処理に必要な save-design のトークンは、誰でも見られる upload-design-file ページに表示されます。設定が a になっていれば、匿名の来訪者でも手に入れられる程度のものです。トークンが付いているから安全、とは考えないでください。

成功すると、サーバー上で任意のコードを動かされます。CVSSの評価では、情報の読み取り、改ざん、サービス停止のいずれも最大の影響です。顧客情報や注文データを扱う店舗では、サイト全体の乗っ取りにつながる可能性があります。

今すぐやること

  1. 1

    導入有無と版を確認する

    Printcart Storeが入っているサイトを洗い出し、版が2.13.2以前かを見ます。制作会社に任せているサイトも含めてください。

    wp plugin list
  2. 2

    アップロード方式の設定を確認する

    nbdesigner_upload_popup_style が a なら、未認証でこの脆弱性を悪用できる状態です。ほかの値なら、悪用の前提は満たしていません。

    wp option get nbdesigner_upload_popup_style
  3. 3

    修正版を確認して更新する

    WordPress.orgのプラグインページとPrintcartの告知で、2.13.2より新しい版が出ているかを確認します。出ていれば、先にステージング環境で動作を見てから本番を更新します。まだなければ、更新できるまでの回避策を当ててください。

  4. 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` ではないサイトも、更新は必要ですか。
A.悪用の前提を満たさないので、今すぐの危険は小さいと考えられます。ただ、管理画面からアップロード方式を変えると前提が成り立ってしまうため、修正版が出たら更新しておくと安心です。
Q.プラグインを無効化しておけば安全ですか。
A.無効化すれば、この処理は読み込まれなくなります。ただし、すでに書き込まれたPHPファイルは残ります。無効化したあとも、uploadsの外のファイルとアクセスログの確認は続けてください。

この記事は、取得元の公開情報をもとに、人が監修しながら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

参照URL

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