緊急度の高い2件の脆弱性に関しまして(最終更新日:2014年01月20日)
 更新履歴 
2014/01/09 15:00 脆弱性情報告知サイト公開
2014/01/10 18:30 《個人情報の漏洩の脆弱性》 2.11系修正方法を修正
2014/01/15 18:30
《個人情報削除の脆弱性》 2.4系以下の修正方法を修正
2014/01/20 15:00
FAQを追加しました
本件の概要   修正方法   FAQ
 EC-CUBE 脆弱性に関するお知らせ 
いつもEC-CUBEをご利用いただきまして、誠にありがとうございます。

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

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

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

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

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


※2.4系以下に関しましては別途修正方法をご確認し、ご対応いただきますようお願いいたします。

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

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

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

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

修正ファイル(2.11.4用)
  md5:726da417b81e1a33e1f0a98ded2cc1fd

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

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

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

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

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

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

4.動作確認をしてください。

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

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

(1)【危険度:高】個人情報削除の脆弱性
 - EC-CUBE 2.4.4以下
 - 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
 
(2)【危険度:高】個人情報漏えいの脆弱性
 - 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

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

/data/class/pages/shopping/LC_Page_Shopping_Deliv.php::action
/data/class/pages/shopping/LC_Page_Shopping_Multiple.php::lfCheckError

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

=================================================================================================================
▼(1)個人情報削除の脆弱性
-----------------------------------------------------------------------------------------------------------------
【危険度】
高

【対象バージョン】
2.12.2 以前

【修正方法について】
/data/class/pages/shopping/LC_Page_Shopping_Deliv.php::action

【更新情報(2014/01/15 18:30)】
2.4.4以下のバージョンのEC-CUBEでは、下記の箇所に修正方法を追加しています。
/data/class/pages/shopping/LC_Page_Shopping_Deliv.php::mobileProcess

【修正後の確認方法について】
別のお届け先の削除ができる事をご確認ください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
=================================================================================================================
▽2.11.0以上のバージョンは以下を参考下さい
-----------------------------------------------------------------------------------------------------------------
▽LC_Page_Shopping_Deliv.php::action
107行目付近を変更下さい。
-----------------------------------------------------------------------------------------------------------------
 変更前
-----------------------------------------------------------------------------------------------------------------
$arrForm = $objFormParam->getHashArray();

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

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
$arrForm = $objFormParam->getHashArray();

if (!$this->doCheck($arrForm, $objCustomer)) {
    SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, '', true);
}

switch ($this->getMode()) {
=================================================================================================================

▽LC_Page_Shopping_Deliv.php
235行目付近に追記下さい。
-------------------------------------------------------------------
 追記後
-------------------------------------------------------------------
    function doCheck($arrForm, &$objCustomer) {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        if (empty($arrForm['other_deliv_id'])) {
            $result = 1;
        }
        else {
            $where = 'other_deliv_id = ? AND customer_id = ?';
            $result = $objQuery->count('dtb_other_deliv', $where, array($arrForm['other_deliv_id'], $objCustomer->getValue('customer_id')));
        }

        return $result;
    }
}
?>
=================================================================================================================
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

=================================================================================================================
▽2.4.4以下のバージョンは以下を参考下さい
-----------------------------------------------------------------------------------------------------------------
▽LC_Page_Shopping_Deliv.php::action
99行目付近を変更下さい。
-----------------------------------------------------------------------------------------------------------------
 変更前
-----------------------------------------------------------------------------------------------------------------
// ログインチェック
if($_POST['mode'] != 'login' && !$objCustomer->isLoginSuccess()) {
    // 不正アクセスとみなす
    SC_Utils_Ex::sfDispSiteError(CUSTOMER_ERROR);
}

switch($_POST['mode']) {
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
// ログインチェック
if($_POST['mode'] != 'login' && !$objCustomer->isLoginSuccess()) {
    // 不正アクセスとみなす
    SC_Utils_Ex::sfDispSiteError(CUSTOMER_ERROR);
}

if (!$this->doCheck($_POST, $objCustomer)) {
    SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, '', true);
}

switch($_POST['mode']) {
=================================================================================================================

▽LC_Page_Shopping_Deliv.php::mobileProcess
264行目付近を変更下さい。
-----------------------------------------------------------------------------------------------------------------
 変更前
-----------------------------------------------------------------------------------------------------------------
// ログインチェック
if($_POST['mode'] != 'login' && !$objCustomer->isLoginSuccess(true)) {
    // 不正アクセスとみなす
    SC_Utils_Ex::sfDispSiteError(CUSTOMER_ERROR, "", false, "", true);
}

switch($_POST['mode']) {
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
// ログインチェック
if($_POST['mode'] != 'login' && !$objCustomer->isLoginSuccess(true)) {
    // 不正アクセスとみなす
    SC_Utils_Ex::sfDispSiteError(CUSTOMER_ERROR, "", false, "", true);
}

if (!$this->doCheck($_POST, $objCustomer)) {
    SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, '', true);
}

switch($_POST['mode']) {
=================================================================================================================

▽LC_Page_Shopping_Deliv.php
584行目付近に追記下さい。
-------------------------------------------------------------------
 追記後
-------------------------------------------------------------------
    function doCheck($arrForm, &$objCustomer) {
        $objQuery = new SC_Query();
        if (empty($arrForm['other_deliv_id'])) {
            $result = 1;
        }
        else {
            $where = 'other_deliv_id = ? AND customer_id = ?';
            $result = $objQuery->count('dtb_other_deliv', $where, array($arrForm['other_deliv_id'], $objCustomer->getValue('customer_id')));
        }

        return $result;
    }
}
?>
=================================================================================================================

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

▼(2)個人情報の漏洩の脆弱性
-----------------------------------------------------------------------------------------------------------------
【危険度】
高

【対象バージョン】
2.11.0~2.12.2

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

【修正後の確認方法について】
複数配送先指定での購入フローにて別のお届け先が正しく表示される事をご確認ください。

【更新情報(2014/01/10 18:30)】
2.11系(2.11.0~2.11.5)のEC-CUBEでは、SC_Response_Ex::actionExit()ではなく、exitを使用する形に修正しています。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
=================================================================================================================
▽2.12.0以上のバージョンは以下を参考下さい
-----------------------------------------------------------------------------------------------------------------
▽LC_Page_Shopping_Multiple.php::lfCheckError
221行目付近を変更下さい。
-----------------------------------------------------------------------------------------------------------------
 変更前
-----------------------------------------------------------------------------------------------------------------
function lfCheckError(&$objFormParam) {
    $objCartSess = new SC_CartSession_Ex();

    $objFormParam->convParam();
    // 数量未入力は0に置換
    $objFormParam->setValue('quantity', $objFormParam->getValue('quantity', 0));

    $arrErr = $objFormParam->checkError();

    $arrParams = $objFormParam->getSwapArray();

    if (empty($arrErr)) {
        foreach ($arrParams as $index => $arrParam) {
            // 数量0で、お届け先を選択している場合
            if ($arrParam['quantity'] == 0 && !SC_Utils_Ex::isBlank($arrParam['shipping'])) {
                $arrErr['shipping'][$index] = '※ 数量が0の場合、お届け先を入力できません。
';; } // 数量の入力があり、お届け先を選択していない場合 if ($arrParam['quantity'] > 0 && SC_Utils_Ex::isBlank($arrParam['shipping'])) { $arrErr['shipping'][$index] = '※ お届け先が入力されていません。
'; } } } ------------------------------------------------------------------- ------------------------------------------------------------------- 変更後 ------------------------------------------------------------------- function lfCheckError(&$objFormParam) { $objCartSess = new SC_CartSession_Ex(); $objQuery =& SC_Query_Ex::getSingletonInstance(); $objCustomer = new SC_Customer_Ex(); $objFormParam->convParam(); // 数量未入力は0に置換 $objFormParam->setValue('quantity', $objFormParam->getValue('quantity', 0)); $arrErr = $objFormParam->checkError(); $arrParams = $objFormParam->getSwapArray(); if (empty($arrErr)) { foreach ($arrParams as $index => $arrParam) { // 数量0で、お届け先を選択している場合 if ($arrParam['quantity'] == 0 && !SC_Utils_Ex::isBlank($arrParam['shipping'])) { $arrErr['shipping'][$index] = '※ 数量が0の場合、お届け先を入力できません。
';; } // 数量の入力があり、お届け先を選択していない場合 if ($arrParam['quantity'] > 0 && SC_Utils_Ex::isBlank($arrParam['shipping'])) { $arrErr['shipping'][$index] = '※ お届け先が入力されていません。
'; } } } if ($objCustomer->isLoginSuccess(true) && SC_Utils_Ex::isBlank($arrErr)) { $deliv_check_flg = true; foreach ($arrParams as $index => $arrParam) { if ($arrParam['shipping'] != 0) { $deliv_check = $objQuery->count('dtb_other_deliv','other_deliv_id = ? AND customer_id = ?', array($arrParam['shipping'], $objCustomer->getValue('customer_id'))); if ($deliv_check < 1) { $deliv_check_flg = false; break; } } } if (!$deliv_check_flg) { SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, '', true); SC_Response_Ex::actionExit(); } } ================================================================================================================= ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ================================================================================================================= ▽2.11.2~2.11.5のバージョンは以下を参考下さい ----------------------------------------------------------------------------------------------------------------- ▽LC_Page_Shopping_Multiple.php::lfCheckError 210行目付近を変更下さい。 ----------------------------------------------------------------------------------------------------------------- 変更前 ----------------------------------------------------------------------------------------------------------------- function lfCheckError(&$objFormParam) { $objCartSess = new SC_CartSession_Ex(); $objFormParam->convParam(); // 数量未入力は0に置換 $objFormParam->setValue('quantity', $objFormParam->getValue('quantity', 0)); $arrErr = $objFormParam->checkError(); $arrParams = $objFormParam->getSwapArray(); if (empty($arrErr)) { foreach ($arrParams as $index => $arrParam) { // 数量0で、お届け先を選択している場合 if ($arrParam['quantity'] == 0 && !SC_Utils_Ex::isBlank($arrParam['shipping'])) { $arrErr['shipping'][$index] = '※ 数量が0の場合、お届け先を入力できません。
';; } // 数量の入力があり、お届け先を選択していない場合 if ($arrParam['quantity'] > 0 && SC_Utils_Ex::isBlank($arrParam['shipping'])) { $arrErr['shipping'][$index] = '※ お届け先が入力されていません。
'; } } } ------------------------------------------------------------------- ------------------------------------------------------------------- 変更後 ------------------------------------------------------------------- function lfCheckError(&$objFormParam) { $objCartSess = new SC_CartSession_Ex(); $objQuery =& SC_Query_Ex::getSingletonInstance(); $objCustomer = new SC_Customer_Ex(); $objFormParam->convParam(); // 数量未入力は0に置換 $objFormParam->setValue('quantity', $objFormParam->getValue('quantity', 0)); $arrErr = $objFormParam->checkError(); $arrParams = $objFormParam->getSwapArray(); if (empty($arrErr)) { foreach ($arrParams as $index => $arrParam) { // 数量0で、お届け先を選択している場合 if ($arrParam['quantity'] == 0 && !SC_Utils_Ex::isBlank($arrParam['shipping'])) { $arrErr['shipping'][$index] = '※ 数量が0の場合、お届け先を入力できません。
';; } // 数量の入力があり、お届け先を選択していない場合 if ($arrParam['quantity'] > 0 && SC_Utils_Ex::isBlank($arrParam['shipping'])) { $arrErr['shipping'][$index] = '※ お届け先が入力されていません。
'; } } } if ($objCustomer->isLoginSuccess(true) && SC_Utils_Ex::isBlank($arrErr)) { $deliv_check_flg = true; foreach ($arrParams as $index => $arrParam) { if ($arrParam['shipping'] != 0) { $deliv_check = $objQuery->count('dtb_other_deliv','other_deliv_id = ? AND customer_id = ?', array($arrParam['shipping'], $objCustomer->getValue('customer_id'))); if ($deliv_check < 1) { $deliv_check_flg = false; break; } } } if (!$deliv_check_flg) { SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, '', true); exit; } } ================================================================================================================= ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ================================================================================================================= ▽2.11.1以下のバージョンは以下を参考下さい ----------------------------------------------------------------------------------------------------------------- ▽LC_Page_Shopping_Multiple.php::lfCheckError 209行目付近を変更下さい。 ----------------------------------------------------------------------------------------------------------------- 変更前 ----------------------------------------------------------------------------------------------------------------- function lfCheckError(&$objFormParam) { $objFormParam->convParam(); return $objFormParam->checkError(); } ------------------------------------------------------------------- ------------------------------------------------------------------- 変更後 ------------------------------------------------------------------- function lfCheckError(&$objFormParam) { $objQuery =& SC_Query_Ex::getSingletonInstance(); $objCustomer = new SC_Customer_Ex(); $objFormParam->convParam(); $arrErr = $objFormParam->checkError(); $arrParams = $objFormParam->getSwapArray(array('shipping')); if ($objCustomer->isLoginSuccess(true) && SC_Utils_Ex::isBlank($arrErr)) { $deliv_check_flg = true; foreach ($arrParams as $index => $arrParam) { if ($arrParam['shipping'] != 0) { $deliv_check = $objQuery->count('dtb_other_deliv','other_deliv_id = ? AND customer_id = ?', array($arrParam['shipping'], $objCustomer->getValue('customer_id'))); if ($deliv_check < 1) { $deliv_check_flg = false; break; } } } if (!$deliv_check_flg) { SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, '', true); exit; } } return $arrErr; } =================================================================================================================
 FAQ 
Q. 私のサイトは大丈夫か?
A. まずは対象バージョンをお確かめください。
脆弱性対象バージョンのEC-CUBEをお使いの場合、対象ファイルを確認ください。
修正がされていない場合、修正方法に沿って修正の対応をお願いいたします。

オフィシャルホスティングパートナーをご利用の場合》
インテグレートパートナーが構築している場合》
既に対策されている場合がございます。
各パートナー担当者さまへお問い合わせ下さい。

この度は、お手数をおかけいたしますことを深くお詫び申し上げます。
 謝辞 
本情報の一部は、株式会社アラタナ様よりご提供いただきました。この場をお借りして、厚く御礼申し上げます。