緊急度の高い2件を含めた5件の脆弱性に関しまして(2013年6月26日)
 EC-CUBE 脆弱性に関するお知らせ 
いつもEC-CUBEをご利用いただきまして、誠にありがとうございます。
株式会社ロックオンEC-CUBE運営チームです。

EC-CUBE(2.4系以下/2.11系/2.12系)に緊急度の高い2件の脆弱性を含め5件の脆弱性があることが判明いたしました。 (本脆弱性における被害報告は現在ございません。)

脆弱性そのものは該当ファイルのソースコード修正、またはファイルの上書きにより、すぐに解決するものです。

皆様にはお手数おかけしまして誠に申し訳ございませんが、対策を早急に講じて頂きますよう、どうかよろしくお願い申し上げます。

 修正方法につきまして 
1.EC-CUBEバージョンごとの修正ファイルをダウンロードしてください。
  ※バージョンの確認方法
  EC-CUBE管理画面へログイン後のホーム画面にてご確認頂けます。
  また、カスタマイズによってシステム情報が表示されない場合は、以下のファイルをご確認下さい。

  - data/class/SC_Initial.php(40行目付近)
  <例>-------------------------------------
  /** EC-CUBEのバージョン */
  define('ECCUBE_VERSION', '2.12.4');
  -----------------------------------------
  上記の例の場合、EC-CUBEのバージョンは2.12.4となります。


 ※ 2.4系以下をお使いの方、該当ファイルをカスタマイズしている場合は以下をご参考いだだき個別で修正をお願いいたします。

・ 2.4系以下をお使いの方は下記をご参考いだだき個別で修正をお願いいたします。
  【危険度:中】EC-CUBE における管理画面でのクロスサイト・スクリプティング
  【危険度:低】resize_image.phpによるディレクトリトラバーサル

修正ファイル(2.11.0用)
  md5:cdd926b92a7205c82bb9420b86ab6588

修正ファイル(2.11.1用)
  md5:9bfe49038cd8741c5afddf90c044796e

修正ファイル(2.11.2用)
  md5:1a2bd540cb05d553e5fc2dd7b72de29e

修正ファイル(2.11.3用)
  md5:c62ce27b9237153a0382e6a69f629e40

修正ファイル(2.11.4用)
  md5:38ceefac99d14be2bac60ffe6bc7c3de

修正ファイル(2.11.5用)
  md5:0b2e4f996322191dd151533a468c6905

修正ファイル(2.12.0用)
  md5:db007a684f61d8bbbd9d95a165442e50

修正ファイル(2.12.1用)
  md5:c07598cdf8661ed2884abad1bdce86cd

修正ファイル(2.12.2用)
  md5:0e1e3aaa2084f982ffc210ecb91febee

修正ファイル(2.12.3用)
  md5:af30fdecaf9bfdf4f753ff989ea60d86

修正ファイル(2.12.3en用)
  md5:d691eec7e99e86de2132fc60ac49f52e

修正ファイル(2.12.3enP1用)
  md5:d92f9789a24ce5d4995665f10b2b0998

修正ファイル(2.12.3enP2用)
  md5:f06eed9b30ce6014d7198362392c3a6e

修正ファイル(2.12.4用)
  md5:0f3678a9d180c6340be6f0070f6e8ab6

修正ファイル(2.12.4en用)
  md5:5fc7a38389d23d4680c204e0844b1d12

2.修正する該当ファイル、もしくはEC-CUBEファイル全体のバックアップをとってください。

3.ダウンロードしたファイルを解凍し、該当ファイルを既存ファイルへ上書きしてください。
  ※ディレクトリ付きファイルですので、ルートディレクトリからそのままファイルの上書きが可能です。
  (EC-CUBEデフォルトのディレクトリ構造以外で使用されている場合、ファイルの上書きができない可能性がございますのでご注意ください)
  ※既存ファイルをカスタマイズしている場合、以下個別の修正方法をご参考に修正をお願いします。

4.動作確認をしてください。
  ※今回の修正によりプラグインが正常に動作しなくなる可能性がございます。

以上となります。
開発環境がある場合は、まず開発環境でお試しください。

本不具合に対する対応方法
-----------------------------------------------------------------------------------------------------------------
■不具合が存在するEC-CUBEのバージョン
-----------------------------------------------------------------------------------------------------------------

【危険度:高】パストラバーサルの脆弱性
 - EC-CUBE 2.12.0
 - EC-CUBE 2.12.1
 - EC-CUBE 2.12.2
 - EC-CUBE 2.12.3
 - EC-CUBE 2.12.3en
 - EC-CUBE 2.12.3enP1
 - EC-CUBE 2.12.3enP2
 - EC-CUBE 2.12.4
 - EC-CUBE 2.12.4en
 
【危険度:高】コードインジェクションの脆弱性
 - EC-CUBE 2.11.2
 - EC-CUBE 2.11.3
 - EC-CUBE 2.11.4
 - EC-CUBE 2.11.5
 - EC-CUBE 2.12.0
 - EC-CUBE 2.12.1
 - EC-CUBE 2.12.2
 - EC-CUBE 2.12.3
 - EC-CUBE 2.12.3en
 - EC-CUBE 2.12.3enP1
 - EC-CUBE 2.12.3enP2
 - EC-CUBE 2.12.4
 - EC-CUBE 2.12.4en

【危険度:中】EC-CUBE におけるクロスサイト・スクリプティング
 - EC-CUBE 2.11.0
 - EC-CUBE 2.11.1
 - EC-CUBE 2.11.2
 - EC-CUBE 2.11.3
 - EC-CUBE 2.11.4
 - EC-CUBE 2.11.5
 - EC-CUBE 2.12.0
 - EC-CUBE 2.12.1
 - EC-CUBE 2.12.2
 - EC-CUBE 2.12.3
 - EC-CUBE 2.12.3en
 - EC-CUBE 2.12.3enP1
 - EC-CUBE 2.12.3enP2
 - EC-CUBE 2.12.4
 - EC-CUBE 2.12.4en
 
【危険度:中】EC-CUBE における管理画面でのクロスサイト・スクリプティング
 - EC-CUBE 全てのバージョン(2.4系以下/2.11系/2.12系)

【危険度:低】resize_image.phpによるディレクトリトラバーサル
 - EC-CUBE 全てのバージョン(2.4系以下/2.11系/2.12系)
 

-----------------------------------------------------------------------------------------------------------------
■個別の脆弱性情報に関しまして
-----------------------------------------------------------------------------------------------------------------
以下、個別の脆弱性情報を記載いたします。
該当ファイルをカスタマイズしている場合は以下をご参考いだだき個別で修正をお願いいたします。

/data/class/pages/admin/contents/LC_Page_Admin_Contents_RecommendSearch.php::action
/data/class/pages/products/LC_Page_Products_List.php::lfSetSelectedData
/data/class/pages/LC_Page_ResizeImage.php::lfCheckFileName
/data/class/SC_CheckError.php::EXIST_CHECK_REVERSE
/data/class/SC_CheckError.php::EQUAL_CHECK
/data/class/SC_CheckError.php::DIFFERENT_CHECK
/data/class/SC_CheckError.php::GREATER_CHECK
/data/class/SC_CheckError.php::CHECK_SET_TERM
/data/class/SC_CheckError.php::CHECK_SET_TERM2
/data/class/SC_CheckError.php::CHECK_SET_TERM3
/data/class/SC_CheckError.php::EVAL_CHECK
/data/class/SC_CheckError.php::createParam
/data/class/SC_FormParam.php::recursionCheck
/data/Smarty/templates/admin/contents/recommend_search.tpl

※行数はバージョン・カスタマイズの内容によって異なりますので、ご注意下さい。

=================================================================================================================
▼パストラバーサルの脆弱性
▼コードインジェクションの脆弱性
-----------------------------------------------------------------------------------------------------------------
【危険度】
高

【修正方法について】
/data/class/SC_FormParam.php
/data/class/SC_CheckError.php
に以下の変更を加えます。

【修正後の確認方法について】
「管理画面」顧客管理>顧客マスターの動作確認を行ってください。


▽SC_FormParam.php
279行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
$objErr = new SC_CheckError_Ex(array(0 => $value));
$objErr->doFunc(array($disp_name, 0, $length), array($func))
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
$objErr = new SC_CheckError_Ex(array(($error_last_key ? $error_last_key : $error_key) => $value));
$objErr->doFunc(array($disp_name, ($error_last_key ? $error_last_key : $error_key), $length), array($func)); 
-------------------------------------------------------------------

▽SC_CheckError.php
102行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
function EXIST_CHECK_REVERSE($value) {
    if (isset($this->arrErr[$value[0]])) {
        return;
    }
    $this->createParam($value);
    if (strlen($this->arrParam[$value[0]]) == 0) {
        $this->arrErr[$value[0]] = '※ ' . $value[0] . 'が入力されていません。<br />';
    }
}
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
function EXIST_CHECK_REVERSE($value) {
    if (isset($this->arrErr[$value[0]])) {
        return;
    }
    // $this->createParam($value);
    if (strlen($this->arrParam[$value[0]]) == 0) {
        $this->arrErr[$value[0]] = '※ ' . $value[0] . 'が入力されていません。<br />';
    }
}
-------------------------------------------------------------------

185行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
function EQUAL_CHECK( $value ) {
    if(isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[3]])) {
        return;
    }
    $this->createParam($value);
    // 文字数の取得
    if( $this->arrParam[$value[2]] != $this->arrParam[$value[3]]) {
        $this->arrErr[$value[2]] = "※ " . $value[0] . "と" . $value[1] . "が一致しません。<br />";
    }
}
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
function EQUAL_CHECK( $value ) {
    if(isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[3]])) {
        return;
    }
    // $this->createParam($value);
    // 文字数の取得
    if( $this->arrParam[$value[2]] != $this->arrParam[$value[3]]) {
        $this->arrErr[$value[2]] = "※ " . $value[0] . "と" . $value[1] . "が一致しません。<br />";
    }
}
-------------------------------------------------------------------

203行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
function DIFFERENT_CHECK( $value ) {
    if(isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[3]])) {
        return;
    }
    $this->createParam($value);
    // 文字数の取得
    if( $this->arrParam[$value[2]] == $this->arrParam[$value[3]]) {
        $this->arrErr[$value[2]] = "※ " . $value[0] . "と" . $value[1] . "は、同じ値を使用できません。<br />";
    }
}
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
function DIFFERENT_CHECK( $value ) {
    if(isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[3]])) {
        return;
    }
    // $this->createParam($value);
    // 文字数の取得
    if( $this->arrParam[$value[2]] == $this->arrParam[$value[3]]) {
        $this->arrErr[$value[2]] = "※ " . $value[0] . "と" . $value[1] . "は、同じ値を使用できません。<br />";
    }
}
-------------------------------------------------------------------

221行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
function GREATER_CHECK($value) {
    if(isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[3]])) {
        return;
    }
    $this->createParam($value);
    // 文字数の取得
    if($this->arrParam[$value[2]] != "" && $this->arrParam[$value[3]] != "" && ($this->arrParam[$value[2]] > $this->arrParam[$value[3]])) {
        $this->arrErr[$value[2]] = "※ " . $value[0] . "は" . $value[1] . "より大きい値を入力できません。<br />";
    }
}
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
function GREATER_CHECK($value) {
    if(isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[3]])) {
        return;
    }
    // $this->createParam($value);
    // 文字数の取得
    if($this->arrParam[$value[2]] != "" && $this->arrParam[$value[3]] != "" && ($this->arrParam[$value[2]] > $this->arrParam[$value[3]])) {
        $this->arrErr[$value[2]] = "※ " . $value[0] . "は" . $value[1] . "より大きい値を入力できません。<br />";
    }
}
-------------------------------------------------------------------

932行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
function CHECK_SET_TERM ($value) {

    // 期間指定
    if(isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[5]])) {
        return;
    }
    $this->createParam($value);
    $error = 0;
    if ( (strlen($this->arrParam[$value[2]]) > 0 || strlen($this->arrParam[$value[3]]) > 0 || strlen($this->arrParam[$value[4]] ) > 0) && ! checkdate($this->arrParam[$value[3]], $this->arrParam[$value[4]], $this->arrParam[$value[2]]) ) {
        $this->arrErr[$value[2]] = "※ " . $value[0] . "を正しく指定してください。<br />";
    }
    if ( (strlen($this->arrParam[$value[5]]) > 0 || strlen($this->arrParam[$value[6]]) > 0 || strlen($this->arrParam[$value[7]] ) > 0) && ! checkdate($this->arrParam[$value[6]], $this->arrParam[$value[7]], $this->arrParam[$value[5]]) ) {
        $this->arrErr[$value[5]] = "※ " . $value[1] . "を正しく指定してください。<br />";
    }
    if ( (strlen($this->arrParam[$value[2]]) > 0 && strlen($this->arrParam[$value[3]]) > 0 && strlen($this->arrParam[$value[4]] ) > 0) &&  (strlen($this->arrParam[$value[5]]) > 0 || strlen($this->arrParam[$value[6]]) > 0 || strlen($this->arrParam[$value[7]] ) > 0) ){

        $date1 = $this->arrParam[$value[2]] .sprintf("%02d", $this->arrParam[$value[3]]) .sprintf("%02d",$this->arrParam[$value[4]]) ."000000";
        $date2 = $this->arrParam[$value[5]] .sprintf("%02d", $this->arrParam[$value[6]]) .sprintf("%02d",$this->arrParam[$value[7]]) ."235959";

        if (($this->arrErr[$value[2]] == "" && $this->arrErr[$value[5]] == "") && $date1 > $date2) {
            $this->arrErr[$value[2]] = "※ " .$value[0]. "と" .$value[1]. "の期間指定が不正です。<br />";
        }
    }
}
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
function CHECK_SET_TERM ($value) {

    // 期間指定
    if(isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[5]])) {
        return;
    }
    // $this->createParam($value);
    $error = 0;
    if ( (strlen($this->arrParam[$value[2]]) > 0 || strlen($this->arrParam[$value[3]]) > 0 || strlen($this->arrParam[$value[4]] ) > 0) && ! checkdate($this->arrParam[$value[3]], $this->arrParam[$value[4]], $this->arrParam[$value[2]]) ) {
        $this->arrErr[$value[2]] = "※ " . $value[0] . "を正しく指定してください。<br />";
    }
    if ( (strlen($this->arrParam[$value[5]]) > 0 || strlen($this->arrParam[$value[6]]) > 0 || strlen($this->arrParam[$value[7]] ) > 0) && ! checkdate($this->arrParam[$value[6]], $this->arrParam[$value[7]], $this->arrParam[$value[5]]) ) {
        $this->arrErr[$value[5]] = "※ " . $value[1] . "を正しく指定してください。<br />";
    }
    if ( (strlen($this->arrParam[$value[2]]) > 0 && strlen($this->arrParam[$value[3]]) > 0 && strlen($this->arrParam[$value[4]] ) > 0) &&  (strlen($this->arrParam[$value[5]]) > 0 || strlen($this->arrParam[$value[6]]) > 0 || strlen($this->arrParam[$value[7]] ) > 0) ){

        $date1 = $this->arrParam[$value[2]] .sprintf("%02d", $this->arrParam[$value[3]]) .sprintf("%02d",$this->arrParam[$value[4]]) ."000000";
        $date2 = $this->arrParam[$value[5]] .sprintf("%02d", $this->arrParam[$value[6]]) .sprintf("%02d",$this->arrParam[$value[7]]) ."235959";

        if (($this->arrErr[$value[2]] == "" && $this->arrErr[$value[5]] == "") && $date1 > $date2) {
            $this->arrErr[$value[2]] = "※ " .$value[0]. "と" .$value[1]. "の期間指定が不正です。<br />";
        }
    }
}
-------------------------------------------------------------------

982行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
function CHECK_SET_TERM2 ($value) {

    // 期間指定
    if(isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[8]])) {
        return;
    }
    $this->createParam($value);
    $error = 0;
    if ( (strlen($this->arrParam[$value[2]]) > 0 || strlen($this->arrParam[$value[3]]) > 0 || strlen($this->arrParam[$value[4]] ) > 0 || strlen($this->arrParam[$value[5]]) > 0) && ! checkdate($this->arrParam[$value[3]], $this->arrParam[$value[4]], $this->arrParam[$value[2]]) ) {
        $this->arrErr[$value[2]] = "※ " . $value[0] . "を正しく指定してください。<br />";
    }
    if ( (strlen($this->arrParam[$value[8]]) > 0 || strlen($this->arrParam[$value[9]]) > 0 || strlen($this->arrParam[$value[10]] ) > 0 || strlen($this->arrParam[$value[11]] ) > 0) && ! checkdate($this->arrParam[$value[9]], $this->arrParam[$value[10]], $this->arrParam[$value[8]]) ) {
        $this->arrErr[$value[8]] = "※ " . $value[1] . "を正しく指定してください。<br />";
    }
    if ( (strlen($this->arrParam[$value[2]]) > 0 && strlen($this->arrParam[$value[3]]) > 0 && strlen($this->arrParam[$value[4]] ) > 0 && strlen($this->arrParam[$value[5]] ) > 0) &&  (strlen($this->arrParam[$value[8]]) > 0 || strlen($this->arrParam[$value[9]]) > 0 || strlen($this->arrParam[$value[10]] ) > 0 || strlen($this->arrParam[$value[11]] ) > 0) ){

        $date1 = $this->arrParam[$value[2]] .sprintf("%02d", $this->arrParam[$value[3]]) .sprintf("%02d",$this->arrParam[$value[4]]) .sprintf("%02d",$this->arrParam[$value[5]]).sprintf("%02d",$this->arrParam[$value[6]]).sprintf("%02d",$this->arrParam[$value[7]]);
        $date2 = $this->arrParam[$value[8]] .sprintf("%02d", $this->arrParam[$value[9]]) .sprintf("%02d",$this->arrParam[$value[10]]) .sprintf("%02d",$this->arrParam[$value[11]]).sprintf("%02d",$this->arrParam[$value[12]]).sprintf("%02d",$this->arrParam[$value[13]]);

        if (($this->arrErr[$value[2]] == "" && $this->arrErr[$value[8]] == "") && $date1 > $date2) {
            $this->arrErr[$value[2]] = "※ " .$value[0]. "と" .$value[1]. "の期間指定が不正です。<br />";
        }
        if($date1 == $date2) {
            $this->arrErr[$value[2]] = "※ " .$value[0]. "と" .$value[1]. "の期間指定が不正です。<br />";
        }

    }
}
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
function CHECK_SET_TERM2 ($value) {

    // 期間指定
    if(isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[8]])) {
        return;
    }
    // $this->createParam($value);
    $error = 0;
    if ( (strlen($this->arrParam[$value[2]]) > 0 || strlen($this->arrParam[$value[3]]) > 0 || strlen($this->arrParam[$value[4]] ) > 0 || strlen($this->arrParam[$value[5]]) > 0) && ! checkdate($this->arrParam[$value[3]], $this->arrParam[$value[4]], $this->arrParam[$value[2]]) ) {
        $this->arrErr[$value[2]] = "※ " . $value[0] . "を正しく指定してください。<br />";
    }
    if ( (strlen($this->arrParam[$value[8]]) > 0 || strlen($this->arrParam[$value[9]]) > 0 || strlen($this->arrParam[$value[10]] ) > 0 || strlen($this->arrParam[$value[11]] ) > 0) && ! checkdate($this->arrParam[$value[9]], $this->arrParam[$value[10]], $this->arrParam[$value[8]]) ) {
        $this->arrErr[$value[8]] = "※ " . $value[1] . "を正しく指定してください。<br />";
    }
    if ( (strlen($this->arrParam[$value[2]]) > 0 && strlen($this->arrParam[$value[3]]) > 0 && strlen($this->arrParam[$value[4]] ) > 0 && strlen($this->arrParam[$value[5]] ) > 0) &&  (strlen($this->arrParam[$value[8]]) > 0 || strlen($this->arrParam[$value[9]]) > 0 || strlen($this->arrParam[$value[10]] ) > 0 || strlen($this->arrParam[$value[11]] ) > 0) ){

        $date1 = $this->arrParam[$value[2]] .sprintf("%02d", $this->arrParam[$value[3]]) .sprintf("%02d",$this->arrParam[$value[4]]) .sprintf("%02d",$this->arrParam[$value[5]]).sprintf("%02d",$this->arrParam[$value[6]]).sprintf("%02d",$this->arrParam[$value[7]]);
        $date2 = $this->arrParam[$value[8]] .sprintf("%02d", $this->arrParam[$value[9]]) .sprintf("%02d",$this->arrParam[$value[10]]) .sprintf("%02d",$this->arrParam[$value[11]]).sprintf("%02d",$this->arrParam[$value[12]]).sprintf("%02d",$this->arrParam[$value[13]]);

        if (($this->arrErr[$value[2]] == "" && $this->arrErr[$value[8]] == "") && $date1 > $date2) {
            $this->arrErr[$value[2]] = "※ " .$value[0]. "と" .$value[1]. "の期間指定が不正です。<br />";
        }
        if($date1 == $date2) {
            $this->arrErr[$value[2]] = "※ " .$value[0]. "と" .$value[1]. "の期間指定が不正です。<br />";
        }

    }
}
-------------------------------------------------------------------

1025行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
function CHECK_SET_TERM3 ($value) {

    // 期間指定
    if(isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[4]])) {
        return;
    }
    $this->createParam($value);
    $error = 0;
    if ( (strlen($this->arrParam[$value[2]]) > 0 || strlen($this->arrParam[$value[3]]) > 0) && ! checkdate($this->arrParam[$value[3]], 1, $this->arrParam[$value[2]]) ) {
        $this->arrErr[$value[2]] = "※ " . $value[0] . "を正しく指定してください。<br />";
    }
    if ( (strlen($this->arrParam[$value[4]]) > 0 || strlen($this->arrParam[$value[5]]) > 0) && ! checkdate($this->arrParam[$value[5]], 1, $this->arrParam[$value[4]]) ) {
        $this->arrErr[$value[4]] = "※ " . $value[1] . "を正しく指定してください。<br />";
    }
    if ( (strlen($this->arrParam[$value[2]]) > 0 && strlen($this->arrParam[$value[3]]) > 0 && (strlen($this->arrParam[$value[4]]) > 0 || strlen($this->arrParam[$value[5]]) > 0 ))) {

        $date1 = $this->arrParam[$value[2]] .sprintf("%02d", $this->arrParam[$value[3]]);
        $date2 = $this->arrParam[$value[4]] .sprintf("%02d", $this->arrParam[$value[5]]);

        if (($this->arrErr[$value[2]] == "" && $this->arrErr[$value[5]] == "") && $date1 > $date2) {
            $this->arrErr[$value[2]] = "※ " .$value[0]. "と" .$value[1]. "の期間指定が不正です。<br />";
        }
    }
}
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
function CHECK_SET_TERM3 ($value) {

    // 期間指定
    if(isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[4]])) {
        return;
    }
    // $this->createParam($value);
    $error = 0;
    if ( (strlen($this->arrParam[$value[2]]) > 0 || strlen($this->arrParam[$value[3]]) > 0) && ! checkdate($this->arrParam[$value[3]], 1, $this->arrParam[$value[2]]) ) {
        $this->arrErr[$value[2]] = "※ " . $value[0] . "を正しく指定してください。<br />";
    }
    if ( (strlen($this->arrParam[$value[4]]) > 0 || strlen($this->arrParam[$value[5]]) > 0) && ! checkdate($this->arrParam[$value[5]], 1, $this->arrParam[$value[4]]) ) {
        $this->arrErr[$value[4]] = "※ " . $value[1] . "を正しく指定してください。<br />";
    }
    if ( (strlen($this->arrParam[$value[2]]) > 0 && strlen($this->arrParam[$value[3]]) > 0 && (strlen($this->arrParam[$value[4]]) > 0 || strlen($this->arrParam[$value[5]]) > 0 ))) {

        $date1 = $this->arrParam[$value[2]] .sprintf("%02d", $this->arrParam[$value[3]]);
        $date2 = $this->arrParam[$value[4]] .sprintf("%02d", $this->arrParam[$value[5]]);

        if (($this->arrErr[$value[2]] == "" && $this->arrErr[$value[5]] == "") && $date1 > $date2) {
            $this->arrErr[$value[2]] = "※ " .$value[0]. "と" .$value[1]. "の期間指定が不正です。<br />";
        }
    }
}
-------------------------------------------------------------------

1137行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
function EVAL_CHECK($value) {
    if (isset($this->arrErr[$value[0]])) {
        return;
    }
    $this->createParam($value);
    if ($this->evalCheck($value[1]) === false) {
        $this->arrErr[$value[0]] = '※ ' . $value[0] . ' の形式が不正です。<br />';
    }
}
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
function EVAL_CHECK($value) {
    if (isset($this->arrErr[$value[0]])) {
        return;
    }
    // $this->createParam($value);
    if ($this->evalCheck($value[1]) === false) {
        $this->arrErr[$value[0]] = '※ ' . $value[0] . ' の形式が不正です。<br />';
    }
}
-------------------------------------------------------------------

1165行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
function createParam($value) {
    foreach ($value as $key) {
        if (is_string($key) || is_int($key)) {
            if (!isset($this->arrParam[$key]))  $this->arrParam[$key] = '';
        }
    }
}
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
function createParam($value) {
     foreach ($value as $val_key => $key) {
         if ($val_key != 0 && (is_string($key) || is_int($key))) {
             if (!is_numeric($key) && preg_match('/^[a-z0-9_]+$/i', $key)) {
                 if (!isset($this->arrParam[$key])) $this->arrParam[$key] = '';
                 if (strlen($this->arrParam[$key]) > 0
                       && (preg_match('/^[[:alnum:]\-\_]*[\.\/\\\\]*\.\.(\/|\\\\)/', $this->arrParam[$key]))
                       ) {
                     $this->arrErr[$value[1]] = '※ ' . $value[0] . 'に禁止された記号の並びまたは制御文字が入っています。<br />';
                 }
             } else if (preg_match('/[^a-z0-9_]/i', $key)) {
                 trigger_error('', E_USER_ERROR);
             }
         }
     }
}
=================================================================================================================

=================================================================================================================
▼EC-CUBE におけるクロスサイト・スクリプティング
-----------------------------------------------------------------------------------------------------------------
【危険度】
中

【修正方法について】
/data/class/pages/products/LC_Page_Products_List.php::lfSetSelectedData
に以下の変更を加えます。

【修正後の確認方法について】
商品一覧で規格を選択できる事をご確認ください。

▽LC_Page_Products_List.php
420行目付近
-----------------------------------------------------------------------------------------------------------------
 変更前
-----------------------------------------------------------------------------------------------------------------
$arrProducts[$key]['quantity']          = $arrForm['quantity'];
$arrProducts[$key]['arrErr']            = $arrErr;
$js_fnOnLoad .= "fnSetClassCategories(document.product_form{$arrProducts[$key]['product_id']}, '{$arrForm['classcategory_id2']}');";
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
$arrProducts[$key]['quantity']          = $arrForm['quantity'];
$arrProducts[$key]['arrErr']            = $arrErr;
$classcategory_id2 = SC_Utils_Ex::jsonEncode($arrForm['classcategory_id2']);
$js_fnOnLoad .= "fnSetClassCategories(document.product_form{$arrProducts[$key]['product_id']}, {$classcategory_id2});";
=================================================================================================================

=================================================================================================================
▼EC-CUBE における管理画面でのクロスサイト・スクリプティング
-----------------------------------------------------------------------------------------------------------------
【危険度】
中

【修正方法について】
/data/Smarty/templates/admin/contents/recommend_search.tpl
/data/class/pages/admin/contents/LC_Page_Admin_Contents_RecommendSearch.php::action
に以下の変更を加えます。

【修正後の確認方法について】
商品選択が正常に動作する事を確認ください。

=================================================================================================================
▽2.11.0以上のバージョンは以下を参考下さい
-----------------------------------------------------------------------------------------------------------------

▽recommend_search.tpl
31行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
function func_submit( id ){
    var fm = window.opener.document.form<!--{$smarty.get.rank}-->;
    fm.product_id.value = id;
    fm.mode.value = 'set_item';
    fm.rank.value = '<!--{$smarty.get.rank}-->';
    fm.submit();
    window.close();
    return false;
}
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
function func_submit( id ){
    var fm = window.opener.document.form<!--{$rank|h}-->;
    fm.product_id.value = id;
    fm.mode.value = 'set_item';
    fm.rank.value = '<!--{$rank|h}-->';
    fm.submit();
    window.close();
    return false;
}
-------------------------------------------------------------------

▽LC_Page_Admin_Contents_RecommendSearch.php
67行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
$objDb = new SC_Helper_DB_Ex();
$objFormParam = new SC_FormParam_Ex();
$this->lfInitParam($objFormParam);
$objFormParam->setParam($_POST);
$objFormParam->convParam();
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
$objDb = new SC_Helper_DB_Ex();
$objFormParam = new SC_FormParam_Ex();
$this->lfInitParam($objFormParam);
$objFormParam->setParam($_POST);
$objFormParam->convParam();

$rank = intval($_GET['rank']);
-------------------------------------------------------------------

105行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
// カテゴリ取得
$this->arrCatList = $objDb->sfGetCategoryList();
$this->setTemplate('contents/recommend_search.tpl');
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
// カテゴリ取得
$this->arrCatList = $objDb->sfGetCategoryList();
$this->rank       = $rank;
$this->setTemplate('contents/recommend_search.tpl');
-----------------------------------------------------------------------------------------------------------------

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
=================================================================================================================
▽2.4.4以下のバージョンは以下を参考下さい
-----------------------------------------------------------------------------------------------------------------

▽recommend_search.tpl
41行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
function func_submit( id ){
    var fm = window.opener.document.form<!--{$smarty.get.rank}-->;
    fm.product_id.value = id;
    fm.mode.value = 'set_item';
    fm.rank.value = '<!--{$smarty.get.rank}-->';
    fm.submit();
    window.close();
    return false;
}
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
function func_submit( id ){
    var fm = window.opener.document.form<!--{$rank|escape}-->;
    fm.product_id.value = id;
    fm.mode.value = 'set_item';
    fm.rank.value = '<!--{$rank|escape}-->';
    fm.submit();
    window.close();
    return false;
}
-------------------------------------------------------------------

▽LC_Page_Admin_Contents_RecommendSearch.php
67行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
// 認証可否の判定
SC_Utils_Ex::sfIsSuccess($objSess);

if (!isset($_POST['mode'])) $_POST['mode'] = "";
if ($_POST['mode'] == "search") {
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
// 認証可否の判定
SC_Utils_Ex::sfIsSuccess($objSess);

// 数値を代入
$this->rank = intval($_GET['rank']);

if (!isset($_POST['mode'])) $_POST['mode'] = "";
if ($_POST['mode'] == "search") {
=================================================================================================================

=================================================================================================================
▼resize_image.phpによるディレクトリトラバーサル
-----------------------------------------------------------------------------------------------------------------
【危険度】
低

【修正方法について】
/data/class/pages/LC_Page_ResizeImage.php::lfCheckFileName
に以下の変更を加えます。

【修正後の確認方法について】
画像が正しく表示される事をご確認ください。

▽LC_Page_ResizeImage.php
108行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
$file    = trim($_GET['image']);
if (preg_match_all($pattern, $file, $matches)) {
   return false;
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
$file    = trim($_GET['image']);
if (!preg_match("/^[[:alnum:]_\.-]+$/i", $file)) {
    return false;
=================================================================================================================
 FAQ 
Q. 私のサイトは大丈夫か?
A. まずは対象バージョンをお確かめ下さい。
脆弱性対象バージョンのEC-CUBEをお使いの場合、対象ファイルを確認下さい。
修正がされていない場合、修正方法に沿って修正の対応をお願い致します。
オフィシャルホスティングパートナーをご利用の場合・インテグレートパートナーが構築した場合、既に対策されている場合がございます。

この度は、お手数をおかけいたしますことを深くお詫び申し上げます。
 謝辞 
本情報は、インテグレートパートナーの株式会社システムフレンド様 並びに、EC-CUBEオフィシャルサイトへお問い合わせ頂きました開発者さまよりご提供頂きました。この場をお借りして、厚く御礼申し上げます。
 問い合わせ先 
EC-CUBE 運営チーム 金(キム)、吉本
MAIL:support@ec-cube.net