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のバージョン:
- 4.0.0〜4.1.2
- 3.0.0〜3.0.18-p4
詳細:
EC-CUBEにはディレクトリトラバーサル脆弱性が存在します。攻撃者は当該脆弱性を悪用して、レスポンスの差異からディレクトリの存在有無を確認することが可能です。
JVNからの公表内容 (2022/09/15公開)
修正方法1: 修正ファイルを利用する場合
開発環境がある場合は、まず開発環境でお試しください。
以下の手順に従って、修正ファイルの反映をお願いいたします。
- 修正ファイルのダウンロード
ご利用中のEC-CUBEのバージョンに該当する修正ファイルをダウンロードしてください。
※EC-CUBEのバージョンはこちらの手順でご確認ください。
※修正ファイルは各バージョンの最新版に対して作成しています。旧バージョンをご利用の場合は、「修正方法2」のご対応をお願いします。- 修正ファイル(4.0.6-p1用) (SHA256:6f765843b4fe4903c0ede49bec1cc26966e414b02f50e76c645a3fa48cfcc531)
- 修正ファイル(4.1.2用) (SHA256:19c207f40a025e3b483b84a32d32a498b50c12fd89fc4dea6b6d8d2bd2b38603)
- 修正ファイル(3.0.18-p4用) (SHA256:8244f7d7481701c80fc3f82f3d57f9201559725a6686d8073eeeacf0fd32043d)
ダウンロードし、解凍していただきますと、以下の修正ファイルがあります。必ず該当するバージョンのファイルをご利用ください。
- src/Eccube/Controller/Admin/Content/FileController.php
- src/Eccube/Controller/Admin/Setting/Shop/PaymentController.php
- src/Eccube/Form/Type/Admin/ProductType.php
- EC-CUBEファイルのバックアップ
あらかじめEC-CUBEファイル全体のバックアップを行ってください。
※作業中はメンテナンスモードに切り替えることをおすすめします。 - 修正ファイルの反映
以下のファイルを上書き更新してください。
上書きするファイル
- src/Eccube/Controller/Admin/Content/FileController.php
- src/Eccube/Controller/Admin/Setting/Shop/PaymentController.php
- src/Eccube/Form/Type/Admin/ProductType.php
※開発環境がある場合は、開発環境での反映・動作確認を行った後に、本番環境への反映をおすすめします。 - 動作確認
管理画面にログインし、基本操作が正常に行えることをご確認ください。
※メンテナンスモードにされていた場合は解除をお願いします。
修正方法2-1: 修正差分を確認して適宜反映する場合(4.0系)
以下のコード差分情報を参照して頂き、必要な箇所に修正を反映してください。
本修正方法はEC-CUBE 4.0.6-p1のバージョンを例として提示しております。
過去バージョンをご利用の場合は、下記修正対象ファイルの修正差分を参考にご対応お願いいたします。
修正差分
@@ -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
|
|
@@ -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
|
@@ -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);
|