技術 約3分で読めます

MagentoのREST APIで未認証RCEを可能にするPolyShell脆弱性

Sansec が Magento の REST API に存在する未認証のファイルアップロード→ RCE 脆弱性「PolyShell」を公開した。攻撃者はアカウントなしで任意のファイルをサーバーに書き込め、環境によっては PHP のリモートコード実行(RCE)が成立する。影響を受けるバージョンは Magento Open Source および Adobe Commerce の 2.4.9-alpha2 以前の全バージョン。修正は alpha3 以降に含まれており、現行プロダクションバージョン向けの独立したパッチはまだ存在しない。

ポリグロットファイルとは

「PolyShell」という名称はこの攻撃の中核技術であるポリグロットファイル(polyglot file)に由来する。ポリグロットファイルは複数のファイル形式として同時に有効なファイルで、画像として見せかけながら PHP スクリプトとしても実行できる。ファイルの先頭バイトやヘッダー構造で MIME バリデーションをパスしつつ、PHP インタプリタが実行できるコードを末尾に埋め込む仕組みだ。

JPEG や GIF と PHP スクリプトを組み合わせた手法自体は昔からあり、ファイルアップロード機能を持つ Web アプリへの Webシェル(web shell、サーバー上で任意のコマンドを実行できるバックドアスクリプト)持ち込みに使われてきた。今回は Magento の検証ロジックがこの手法に対して無防備だった。

攻撃の流れ

flowchart TD
    A[攻撃者] -->|未認証REST APIリクエスト| B[Magento REST API<br/>商品オプション endpoint]
    B --> C[file_info オブジェクト解析<br/>Base64デコード + ファイル書き込み]
    C --> D[pub/media/custom_options/quote/<br/>に保存(実行制限なし)]
    D --> E{Webサーバー設定}
    E -->|nginx 2.0.0〜2.2.x| F[PHP ファイルとして実行]
    F --> G[リモートコード実行 RCE]
    E -->|その他の設定| H[ファイルを直接リクエスト]
    H --> I[Stored XSS 実行]
    I --> J[管理者アカウント乗っ取り]

脆弱な REST API エンドポイントは商品オプション(product option)の type=file を処理するパスで、リクエストボディに file_info オブジェクトを含めると Magento は次の情報を使ってファイルを書き込む。

  • Base64 エンコードされたファイルデータ
  • MIME タイプ(攻撃者が自由に指定可能)
  • ファイル名(拡張子を攻撃者が制御可能)

書き込み先は pub/media/custom_options/quote/ で、実行制限が設定されていない。なお、GraphQL ミューテーションは異なるコードパスを通るためこの脆弱性の影響を受けない。

環境別の影響

Webサーバー環境影響
nginx 2.0.0〜2.2.x(ストック設定)PHP RCE(フルリモートコード実行)
その他のnginx / ApacheStored XSS → 管理者アカウント乗っ取り
pub/media/ をPHP実行不可にした環境影響を大幅に軽減

nginx 2.0.0〜2.2.x のストック設定では pub/media/ 以下の .php ファイルを直接実行する設定になっているため、アップロードしたファイルを URL で叩くだけでコードが動く。

対応状況

Adobe のセキュリティ速報 APSB25-94 で修正された(alpha3 以降に含まれる)。CVSS スコアは非公開。

日付対応内容
3月16日Sansec Shield に防御シグネチャを追加
3月17日公開開示と検出パターンの公開
3月18日方法論の訂正版発行

現行プロダクションバージョン(2.4.8 以前)向けの独立したパッチは存在しない。

緩和策

対策内容
ディレクトリアクセス制限nginx/Apache で pub/media/custom_options/ への直接アクセスをブロック。ただしアップロード自体は防げない
WAF の導入Sansec Shield のような専用 WAF でアップロードリクエストをブロック
侵害痕跡の確認アップロードディレクトリ内の Webシェルやバックドアを確認

同時期の関連事象

開示と前後して、Asus、FedEx、Toyota を含む約7,500ドメインの 15,000 サイトが改ざん被害に遭っているが、Sansec は今回の PolyShell 脆弱性との直接的な関連は確認していない。