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

EC-CUBE2.11系,2.12系のバージョンに緊急度の高い2件の脆弱性を含め4件の脆弱性があることが判明いたしました。 (本脆弱性における被害報告は現在ございません。)

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

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

 修正方法につきまして(4件共通) 
1.EC-CUBEバージョンごとの修正ファイルをダウンロードしてください。
 ※EC-CUBEのバージョンはEC-CUBE管理画面ログイン後TOPページよりご確認いただけます。

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

修正ファイル(2.11.1用)
  md5:6afde98e2fc1dd1d6e8fab5017c1e552

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

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

修正ファイル(2.11.4用)
  md5:7cb0f212d08c01437ad985055bff8fa5

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

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

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

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

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

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

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

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

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

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

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

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

※株式会社スピリットオブ様より標準環境向けのアップデートプログラムを提供いただきました。
アップデートプログラムによる修正が可能となっていますのでこちらご参考下さい。
本不具合に対する対応方法
-----------------------------------------------------------------------------------------------------------------
■不具合が存在するEC-CUBEのバージョン(4件共通)
-----------------------------------------------------------------------------------------------------------------
EC-CUBE 2.11.0 以降 (2011年3月23日公開~)
 - 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

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

/data/class/pages/forgot/LC_Page_Forgot.php::lfCheckForgotMail
/data/class/pages/forgot/LC_Page_Forgot.php::lfCheckForgotSecret
/data/class/pages/cart/LC_Page_Cart.php::action
/data/class/helper/SC_Helper_Session.php::adminAuthorization
/data/Smarty/templates/default/shopping/multiple.tpl
/data/Smarty/templates/mobile/shopping/multiple.tpl
/data/Smarty/templates/sphone/shopping/multiple.tpl

※行数はバージョン・カスタマイズの内容によって異なりますので、ご注意下さい。
※テンプレートファイルの変更箇所は以下のチェンジセットをご参考下さい。
 http://svn.ec-cube.net/open_trac/changeset/22784

=================================================================================================================
▼パスワードリマインド機能における不適切な入力確認の脆弱性
-----------------------------------------------------------------------------------------------------------------
【危険度】
高

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

【修正後の確認方法について】
「パスワードの再発行」の機能が正常に動作する事を確認下さい。

▽LC_Page_Forgot.php
157行目付近
-----------------------------------------------------------------------------------------------------------------
 変更前
-----------------------------------------------------------------------------------------------------------------
errmsg = NULL; 
$objQuery =& SC_Query_Ex::getSingletonInstance(); 
$where = '(email Like ? OR email_mobile Like ?) AND name01 Like ? AND name02 Like ? AND del_flg = 0'; 
-----------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------
 変更後
-----------------------------------------------------------------------------------------------------------------
errmsg = NULL; 
$objQuery =& SC_Query_Ex::getSingletonInstance(); 
$where = '(email = ? OR email_mobile = ?) AND name01 = ? AND name02 = ? AND del_flg = 0';
-----------------------------------------------------------------------------------------------------------------

▽LC_Page_Forgot.php
207行目付近
-----------------------------------------------------------------------------------------------------------------
 変更前
-----------------------------------------------------------------------------------------------------------------
$table = 'dtb_customer'; 
$where = '(email Like ? OR email_mobile Like ?)'
        . ' AND name01 Like ? AND name02 Like ?'
-----------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------
 変更後
-----------------------------------------------------------------------------------------------------------------
$table = 'dtb_customer'; 
$where = '(email = ? OR email_mobile = ?)'
        . ' AND name01 = ? AND name02 = ?'
=================================================================================================================



=================================================================================================================
▼一部環境における、管理画面の不適切な認証に関する脆弱性
-----------------------------------------------------------------------------------------------------------------
【危険度】
高

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

【修正後の確認方法について】
管理画面にログインが出来る事を確認下さい。

▽SC_Helper_Session.php
217行目付近
-----------------------------------------------------------------------------------------------------------------
 変更前
-----------------------------------------------------------------------------------------------------------------
function adminAuthorization() {
    $masterData = new SC_DB_MasterData_Ex();
    $arrExcludes = $masterData->getMasterData('mtb_auth_excludes');
    if (preg_match('|^' . ROOT_URLPATH . ADMIN_DIR . '|', $_SERVER['SCRIPT_NAME'])) {
        $is_auth = true;

        foreach ($arrExcludes as $exclude) {
            if (preg_match('|^' . ROOT_URLPATH . ADMIN_DIR . $exclude . '|', $_SERVER['SCRIPT_NAME'])) {
                $is_auth = false;
                break;
            }
        }
        if ($is_auth) {
            SC_Utils_Ex::sfIsSuccess(new SC_Session_Ex());
        }
    }
}
-----------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------
 変更後
-----------------------------------------------------------------------------------------------------------------
function adminAuthorization() {
    if (($script_path = realpath($_SERVER['SCRIPT_FILENAME'])) !== FALSE) {
        $arrScriptPath = explode('/', str_replace('\\', '/', $script_path));
        $arrAdminPath = explode('/', str_replace('\\', '/', substr(HTML_REALDIR . ADMIN_DIR, 0, -1)));
        $arrDiff = array_diff_assoc($arrAdminPath, $arrScriptPath);
        if (in_array(substr(ADMIN_DIR, 0, -1), $arrDiff)) {
            return;
        } else {
            $masterData = new SC_DB_MasterData_Ex();
            $arrExcludes = $masterData->getMasterData('mtb_auth_excludes');
            foreach ($arrExcludes as $exclude) {
                $arrExcludesPath = explode('/', str_replace('\\', '/', HTML_REALDIR . ADMIN_DIR . $exclude));
                $arrDiff = array_diff_assoc($arrExcludesPath, $arrScriptPath);
                if (count($arrDiff) === 0) {
                    return;
                }
            }
        }
    }
    SC_Utils_Ex::sfIsSuccess(new SC_Session_Ex());
}
=================================================================================================================



=================================================================================================================
▼カート画面でのXSS脆弱性、及びセッション固定の脆弱性
-----------------------------------------------------------------------------------------------------------------
【危険度】
中

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

【修正後の確認方法について】
カートへの商品追加が出来る事を確認下さい。

▽LC_Page_Cart.php
89行目付近
-----------------------------------------------------------------------------------------------------------------
 変更前
-----------------------------------------------------------------------------------------------------------------
$objFormParam = $this->lfInitParam($_REQUEST); 
-----------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------
 変更後
-----------------------------------------------------------------------------------------------------------------
$objFormParam = $this->lfInitParam($_POST); 
-----------------------------------------------------------------------------------------------------------------


▽LC_Page_Cart.php
91行目付近
-----------------------------------------------------------------------------------------------------------------
 変更前
-----------------------------------------------------------------------------------------------------------------
$this->mode = $this->getMode(); 

$this->cartKeys = $objCartSess->getKeys(); 
-----------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------
 変更後
-----------------------------------------------------------------------------------------------------------------
$this->mode = $this->getMode(); 
 
// モバイル対応 
if(SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE) { 
    if(isset($_GET['cart_no'])) $objFormParam->setValue('cart_no', $_GET['cart_no']); 
    if(isset($_GET['cartKey'])) $objFormParam->setValue('cartKey', $_GET['cartKey']); 
}


$this->cartKeys = $objCartSess->getKeys(); 
-----------------------------------------------------------------------------------------------------------------


▽LC_Page_Cart.php
91行目付近
-----------------------------------------------------------------------------------------------------------------
 変更前
-----------------------------------------------------------------------------------------------------------------

$cart_no = $objFormParam->getValue('cart_no'); 
$cartKey = $objFormParam->getValue('cartKey'); 

switch ($this->mode) { 
-----------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------
 変更後
-----------------------------------------------------------------------------------------------------------------

$cart_no = $objFormParam->getValue('cart_no'); 
$cartKey = $objFormParam->getValue('cartKey'); 

// エラーチェック 
$arrError = $objFormParam->checkError(); 
if(isset($arrError) && !empty($arrError)) { 
    SC_Utils_Ex::sfDispSiteError(CART_NOT_FOUND); 
    SC_Response_Ex::actionExit(); 
} 

switch ($this->mode) { 
-----------------------------------------------------------------------------------------------------------------


▽LC_Page_Cart.php
215行目付近(※2.11.0,2.11.1では対応不要となります。)
-----------------------------------------------------------------------------------------------------------------
 変更前
-----------------------------------------------------------------------------------------------------------------
$objFormParam->addParam('数量', 'quantity', INT_LEN, 'n', array('EXIST_CHECK', 'ZERO_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
-----------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------
 変更後
-----------------------------------------------------------------------------------------------------------------
$objFormParam->addParam('数量', 'quantity', INT_LEN, 'n', array('ZERO_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
=================================================================================================================



=================================================================================================================
▼ お届け先複数指定画面でのXSS脆弱性
-----------------------------------------------------------------------------------------------------------------
【危険度】
中

【修正方法について】
/data/Smarty/templates/default/shopping/multiple.tpl
/data/Smarty/templates/mobile/shopping/multiple.tpl
/data/Smarty/templates/sphone/shopping/multiple.tpl

以下のチェンジセットを参考に修正下さい。
http://svn.ec-cube.net/open_trac/changeset/22784

【修正後の確認方法について】
お届け先複数指定が出来る事を確認下さい。

=================================================================================================================


 FAQ 
Q. 私のサイトは大丈夫か?
A. まずは対象バージョンをお確かめ下さい。2.4以下のバージョンの場合は対策不要です。
2.11,2.12系の場合、対象ファイルを確認下さい。
修正がされていない場合、修正方法に沿って修正の対応をお願い致します。
オフィシャルホスティングパートナーをご利用の場合・インテグレートパートナーが構築した場合、既に対策されている場合がございます。

この度は、お手数をおかけいたしますことを深くお詫び申し上げます。
 アップデートプログラムを利用した修正 
株式会社スピリットオブ様より標準環境向けのアップデートプログラムを提供いただきました。
2.11.0~2.12.3 の各バージョンで同様に利用可能です。

1. updater_20130522.zip をダウンロードし解凍する(update201305.php)。

2. 管理画面にログイン。(この後更新完了までログイン状態ではないと利用出来ません)

3. 「コンテンツ管理>ファイル管理」からプログラムをuser_dataディレクトリ(開いてすぐのディレクトリ)にアップロード。

4. 「(ショップのURL)/user_data/update201305.php」とURLを打ち込み、更新画面を開く。

5. 画面上の説明に従って更新してください。
 謝辞 
本情報は、インテグレートパートナーの株式会社システムフレンド様 並びに、EC-CUBEオフィシャルサイトへお問い合わせ頂きました開発者さまよりご提供頂きました。この場をお借りして、厚く御礼申し上げます。