EC-CUBEにおけるディレクトリトラバーサルの脆弱性(JVN#21213852)

更新履歴
2022/09/15 16:50
JVNからの公表内容情報へのリンクを追加
2022/09/09 10:00
初版公開

EC-CUBEにおけるディレクトリトラバーサルの脆弱性

EC-CUBE 3系、4.0系、4.1系にEC-CUBEにおけるディレクトリトラバーサルの脆弱性(危険度: 低)があることが判明いたしました。

脆弱性そのものは、修正の反映によりすぐに解決するものです。
以下のいずれかの方法により、ご対応をお願いいたします。

皆様にはお手数おかけし誠に申し訳ございません。
本脆弱性における被害報告は現時点でございませんが、できるだけ速やかにご対応をお願いいたします。

脆弱性の概要

EC-CUBEにおけるディレクトリトラバーサルの脆弱性

危険度:

不具合が存在するEC-CUBEのバージョン:

詳細:

EC-CUBEにはディレクトリトラバーサル脆弱性が存在します。攻撃者は当該脆弱性を悪用して、レスポンスの差異からディレクトリの存在有無を確認することが可能です。


JVNからの公表内容 (2022/09/15公開)

JVN#21213852: EC-CUBE における複数の脆弱性

修正方法1: 修正ファイルを利用する場合

開発環境がある場合は、まず開発環境でお試しください。
以下の手順に従って、修正ファイルの反映をお願いいたします。

  1. 修正ファイルのダウンロード

    ご利用中のEC-CUBEのバージョンに該当する修正ファイルをダウンロードしてください。
    ※EC-CUBEのバージョンはこちらの手順でご確認ください。
    ※修正ファイルは各バージョンの最新版に対して作成しています。旧バージョンをご利用の場合は、「修正方法2」のご対応をお願いします。

    ダウンロードし、解凍していただきますと、以下の修正ファイルがあります。必ず該当するバージョンのファイルをご利用ください。

    • src/Eccube/Controller/Admin/Content/FileController.php
    • src/Eccube/Controller/Admin/Setting/Shop/PaymentController.php
    • src/Eccube/Form/Type/Admin/ProductType.php
  2. EC-CUBEファイルのバックアップ

    あらかじめEC-CUBEファイル全体のバックアップを行ってください。
    ※作業中はメンテナンスモードに切り替えることをおすすめします。

  3. 修正ファイルの反映

    以下のファイルを上書き更新してください。

    上書きするファイル

    • src/Eccube/Controller/Admin/Content/FileController.php
    • src/Eccube/Controller/Admin/Setting/Shop/PaymentController.php
    • src/Eccube/Form/Type/Admin/ProductType.php
    ※EC-CUBE本体のカスタマイズをしている場合、修正箇所の差分をご確認のうえ反映をお願いします。
    ※開発環境がある場合は、開発環境での反映・動作確認を行った後に、本番環境への反映をおすすめします。

  4. 動作確認

    管理画面にログインし、基本操作が正常に行えることをご確認ください。
    ※メンテナンスモードにされていた場合は解除をお願いします。

修正方法2-1: 修正差分を確認して適宜反映する場合(4.0系)

以下のコード差分情報を参照して頂き、必要な箇所に修正を反映してください。

本修正方法はEC-CUBE 4.0.6-p1のバージョンを例として提示しております。
過去バージョンをご利用の場合は、下記修正対象ファイルの修正差分を参考にご対応お願いいたします。

修正差分

src/Eccube/Controller/Admin/Content/FileController.php CHANGED
@@ -448,6 +448,9 @@ class FileController extends AbstractController
448
448
  */
449
449
  protected function checkDir($targetDir, $topDir)
450
450
  {
451
+ if (strpos($targetDir, '..') !== false) {
452
+ return false;
453
+ }
451
454
  $targetDir = realpath($targetDir);
452
455
  $topDir = realpath($topDir);
453
456
 
src/Eccube/Controller/Admin/Setting/Shop/PaymentController.php CHANGED
@@ -122,7 +122,7 @@ class PaymentController extends AbstractController
122
122
  // ファイルアップロード
123
123
  $file = $form['payment_image']->getData();
124
124
  $fs = new Filesystem();
125
- if ($file && $fs->exists($this->getParameter('eccube_temp_image_dir').'/'.$file)) {
125
+ if ($file && strpos($file, '..') === false && $fs->exists($this->getParameter('eccube_temp_image_dir').'/'.$file)) {
126
126
  $fs->rename(
127
127
  $this->getParameter('eccube_temp_image_dir').'/'.$file,
128
128
  $this->getParameter('eccube_save_image_dir').'/'.$file
src/Eccube/Form/Type/Admin/ProductType.php CHANGED
@@ -200,6 +200,10 @@ class ProductType extends AbstractType
200
200
  private function validateFilePath($form, $dirs)
201
201
  {
202
202
  foreach ($form->getData() as $fileName) {
203
+ if (strpos($fileName, '..') !== false) {
204
+ $form->getRoot()['product_image']->addError(new FormError(trans('admin.product.image__invalid_path')));
205
+ break;
206
+ }
203
207
  $fileInDir = array_filter($dirs, function ($dir) use ($fileName) {
204
208
  $filePath = realpath($dir.'/'.$fileName);
205
209
  $topDirPath = realpath($dir);

修正方法2-2: 修正差分を確認して適宜反映する場合(4.1系)

以下のコード差分情報を参照して頂き、必要な箇所に修正を反映してください。

本修正方法はEC-CUBE 4.1.2のバージョンを例として提示しております。
過去バージョンをご利用の場合は、下記修正対象ファイルの修正差分を参考にご対応お願いいたします。

修正差分

src/Eccube/Controller/Admin/Content/FileController.php CHANGED
@@ -466,6 +466,9 @@ class FileController extends AbstractController
466
466
  */
467
467
  protected function checkDir($targetDir, $topDir)
468
468
  {
469
+ if (strpos($targetDir, '..') !== false) {
470
+ return false;
471
+ }
469
472
  $targetDir = realpath($targetDir);
470
473
  $topDir = realpath($topDir);
471
474
 
src/Eccube/Controller/Admin/Setting/Shop/PaymentController.php CHANGED
@@ -122,7 +122,7 @@ class PaymentController extends AbstractController
122
122
  // ファイルアップロード
123
123
  $file = $form['payment_image']->getData();
124
124
  $fs = new Filesystem();
125
- if ($file && $fs->exists($this->getParameter('eccube_temp_image_dir').'/'.$file)) {
125
+ if ($file && strpos($file, '..') === false && $fs->exists($this->getParameter('eccube_temp_image_dir').'/'.$file)) {
126
126
  $fs->rename(
127
127
  $this->getParameter('eccube_temp_image_dir').'/'.$file,
128
128
  $this->getParameter('eccube_save_image_dir').'/'.$file
src/Eccube/Form/Type/Admin/ProductType.php CHANGED
@@ -200,6 +200,10 @@ class ProductType extends AbstractType
200
200
  private function validateFilePath($form, $dirs)
201
201
  {
202
202
  foreach ($form->getData() as $fileName) {
203
+ if (strpos($fileName, '..') !== false) {
204
+ $form->getRoot()['product_image']->addError(new FormError(trans('admin.product.image__invalid_path')));
205
+ break;
206
+ }
203
207
  $fileInDir = array_filter($dirs, function ($dir) use ($fileName) {
204
208
  $filePath = realpath($dir.'/'.$fileName);
205
209
  $topDirPath = realpath($dir);

修正方法2-3: 修正差分を確認して適宜反映する場合(3.0系)

以下のコード差分情報を参照して頂き、必要な箇所に修正を反映してください。

本修正方法はEC-CUBE 3.0.18-p4のバージョンを例として提示しております。
過去バージョンをご利用の場合は、下記修正対象ファイルの修正差分を参考にご対応お願いいたします。

修正差分

src/Eccube/Controller/Admin/Content/FileController.php CHANGED
@@ -321,6 +321,9 @@ class FileController extends AbstractController
321
321
 
322
322
  protected function checkDir($targetDir, $topDir)
323
323
  {
324
+ if (strpos($targetDir, '..') !== false) {
325
+ return false;
326
+ }
324
327
  $targetDir = realpath($targetDir);
325
328
  $topDir = realpath($topDir);
326
329
  return (strpos($targetDir, $topDir) === 0);
src/Eccube/Controller/Admin/Setting/Shop/PaymentController.php CHANGED
@@ -93,7 +93,7 @@ class PaymentController extends AbstractController
93
93
  // ファイルアップロード
94
94
  $file = $form['payment_image']->getData();
95
95
  $fs = new Filesystem();
96
- if ($file && $fs->exists($app['config']['image_temp_realdir'] . '/' . $file)) {
96
+ if ($file && strpos($file, '..') === false && $fs->exists($app['config']['image_temp_realdir'] . '/' . $file)) {
97
97
  $fs->rename(
98
98
  $app['config']['image_temp_realdir'] . '/' . $file,
99
99
  $app['config']['image_save_realdir'] . '/' . $file
src/Eccube/Form/Type/Admin/ProductType.php CHANGED
@@ -180,6 +180,11 @@ class ProductType extends AbstractType
180
180
  private function validateFilePath($form, $dirs)
181
181
  {
182
182
  foreach ($form->getData() as $fileName) {
183
+ if (strpos($fileName, '..') !== false) {
184
+ $formRoot = $form->getRoot();
185
+ $formRoot['product_image']->addError(new FormError('画像のパスが不正です。'));
186
+ break;
187
+ }
183
188
  $fileInDir = array_filter($dirs, function ($dir) use ($fileName) {
184
189
  $filePath = realpath($dir.'/'.$fileName);
185
190
  $topDirPath = realpath($dir);

問い合わせ先

本脆弱性に関するお問合せ:

EC-CUBE 運営チーム
MAIL: support@ec-cube.net