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

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

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

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

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

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


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

修正ファイル(2.11.1用)
  md5:131864D2367F640F253872892E0F2597

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

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

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

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

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

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

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

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

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

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

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

修正ファイル(2.12.4用)
  md5:207373D0600879ED12A87F784E9B1F9D

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

修正ファイル(2.12.5用)
  md5:BF2EA709FD346E7706BB564B9D611A65

修正ファイル(2.12.5en用)
  md5:2B9064A1494BB16A0AD00E929986E421

修正ファイル(2.12.6用)
  md5:742B5B82A2B03CD462AD44EDB4EEE250

修正ファイル(2.12.6en用)
  md5:3AADD2727F4D823391FF0A5317A5E24D

修正ファイル(2.13.0用)
  md5:26E42DC6FA670FA693A4584D62C578E1

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

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

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

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

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

(1)【危険度:高】個人情報漏えいの脆弱性
 - 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.12.5
 - EC-CUBE 2.12.5en
 - EC-CUBE 2.12.6
 - EC-CUBE 2.12.6en
 - EC-CUBE 2.13.0
 
(2)【危険度:中】ファイルパス情報漏えいの脆弱性
 - 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 2.12.5
 - EC-CUBE 2.12.5en
 - EC-CUBE 2.12.6
 - EC-CUBE 2.12.6en
 - EC-CUBE 2.13.0
 
(3)【危険度:中】クロスサイトリクエストフォージェリの脆弱性
 - 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 2.12.5
 - EC-CUBE 2.12.5en
 - EC-CUBE 2.12.6
 - EC-CUBE 2.12.6en
 - EC-CUBE 2.13.0

(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
 - 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.12.5
 - EC-CUBE 2.12.5en
 - EC-CUBE 2.12.6
 - EC-CUBE 2.12.6en
 - EC-CUBE 2.13.0

(5)【危険度:低】クロスサイトスクリプティング及び、セッション情報漏えいの脆弱性
 - 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

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

/data/class/helper/SC_Helper_Address.php
/data/class/pages/mypage/LC_Page_Mypage_DeliveryAddr.php::action
/data/class/pages/mypage/LC_Page_Mypage_Refusal.php::action
/data/Smarty/templates/default/mypage/refusal_confirm.tpl
/data/Smarty/templates/default/shopping/payment.tpl
/data/Smarty/templates/mobile/mypage/refusal.tpl
/data/Smarty/templates/mobile/shopping/payment.tpl
/data/Smarty/templates/sphone/mypage/refusal_confirm.tpl
/data/Smarty/templates/sphone/shopping/payment.tpl
/html/handle_error.php::displaySystemError

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

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

【対象バージョン】
2.12.3~2.13.0

【修正方法について】
/data/class/helper/SC_Helper_Address.php を下記の修正ファイルに置き換えてください。

  - 修正ファイル(2.12系用)
    md5:2750B4E9A9838AA2B44F83DEE74A89EC
  - 修正ファイル(2.13系用)
    md5:2BB742B8FEF90A8A8BB8428B07C5CEEA
  - 修正ファイル(2.12.3en用)
    md5:E6253D2DBFFAC7641E8136973EB4DCD9
  ※EC-CUBE 2.12.3enのみ本修正ファイルをご利用ください。

【修正後の確認方法について】
別のお届け先の登録・編集・削除を行ってください。
=================================================================================================================

=================================================================================================================
▼(2)ファイルパス情報漏えいの脆弱性
-----------------------------------------------------------------------------------------------------------------
【危険度】
中

【対象バージョン】
2.11.2~2.13.0

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

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

▽LC_Page_Mypage_DeliveryAddr.php
84行目付近
-----------------------------------------------------------------------------------------------------------------
 変更前
-----------------------------------------------------------------------------------------------------------------
$this->ParentPage = $ParentPage;

/*
 * ログイン判定 及び 退会判定
 * 未ログインでも, 複数配送設定ページからのアクセスの場合は表示する
 *
 * TODO 購入遷移とMyPageで別クラスにすべき
 */
if (!$objCustomer->isLoginSuccess(true) && $ParentPage != MULTIPLE_URLPATH) {
    $this->tpl_onload = "fnUpdateParent('". $this->getLocation($_POST['ParentPage']) ."'); window.close();";
}
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
// 正しい遷移かをチェック
$arrParentPageList = array(DELIV_URLPATH, MYPAGE_DELIVADDR_URLPATH, MULTIPLE_URLPATH);
if(!SC_Utils_Ex::isBlank($ParentPage) && !in_array($ParentPage, $arrParentPageList)) {
    // 遷移が正しくない場合、デフォルトであるマイページの配送先追加の画面を設定する
    $ParentPage  = MYPAGE_DELIVADDR_URLPATH;
}

$this->ParentPage = $ParentPage;

/*
 * ログイン判定 及び 退会判定
 * 未ログインでも, 複数配送設定ページからのアクセスの場合は表示する
 *
 * TODO 購入遷移とMyPageで別クラスにすべき
 */
if (!$objCustomer->isLoginSuccess(true) && $ParentPage != MULTIPLE_URLPATH) {
    $this->tpl_onload = "fnUpdateParent('". $ParentPage ."'); window.close();";
}
=================================================================================================================

=================================================================================================================
▼(3)クロスサイトリクエストフォージェリの脆弱性
-----------------------------------------------------------------------------------------------------------------
【危険度】
中

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

【修正方法について】
/data/class/pages/mypage/LC_Page_Mypage_Refusal.php::action
/data/Smarty/templates/default/mypage/refusal_confirm.tpl
/data/Smarty/templates/mobile/mypage/refusal.tpl
/data/Smarty/templates/sphone/mypage/refusal_confirm.tpl
に以下の変更を加えます。

【修正後の確認方法について】
退会が行える事をご確認ください。

▽LC_Page_Mypage_Refusal.php
64行目付近
-----------------------------------------------------------------------------------------------------------------
 変更前
-----------------------------------------------------------------------------------------------------------------
switch ($this->getMode()) {
    case 'confirm':
        $this->tpl_mainpage     = 'mypage/refusal_confirm.tpl';
        $this->tpl_subtitle     = '退会手続き(確認ページ)';
        break;

    case 'complete':
        $objCustomer = new SC_Customer_Ex();
        $this->lfDeleteCustomer($objCustomer->getValue('customer_id'));
        $objCustomer->EndSession();

        SC_Response_Ex::sendRedirect('refusal_complete.php');

    default:
        break;
}
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
switch ($this->getMode()) {
    case 'confirm':
       // トークンを設定
       $this->refusal_transactionid = $this->getRefusalToken();

        $this->tpl_mainpage     = 'mypage/refusal_confirm.tpl';
        $this->tpl_subtitle     = '退会手続き(確認ページ)';
        break;

    case 'complete':
       // トークン入力チェック
       if(!$this->isValidRefusalToken()) {
           // エラー画面へ遷移する
           SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, '', true);
           SC_Response_Ex::actionExit();
       }

        $objCustomer = new SC_Customer_Ex();
        $this->lfDeleteCustomer($objCustomer->getValue('customer_id'));
        $objCustomer->EndSession();

        SC_Response_Ex::sendRedirect('refusal_complete.php');

    default:
       if (SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE) {
           $this->refusal_transactionid = $this->getRefusalToken();
       }
        break;
}
-------------------------------------------------------------------

▽LC_Page_Mypage_Refusal.php
95行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
/**
 * 会員情報を削除する
 *
 * @access private
 * @return void
 */
public function lfDeleteCustomer($customer_id)
{
    return SC_Helper_Customer_Ex::delete($customer_id);
}

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
/**
 * 会員情報を削除する
 *
 * @access private
 * @return void
 */
public function lfDeleteCustomer($customer_id)
{
    return SC_Helper_Customer_Ex::delete($customer_id);
}

/**
 * トランザクショントークンを取得する
 *
 * @return string
 */
function getRefusalToken() {
    if (empty($_SESSION['refusal_transactionid'])) {
        $_SESSION['refusal_transactionid'] = SC_Helper_Session_Ex::createToken();
    }
    return $_SESSION['refusal_transactionid'];
}

/**
 * トランザクショントークンのチェックを行う
 */
function isValidRefusalToken() {
    if(empty($_POST['refusal_transactionid'])) {
        $ret = false;
    } else {
        $ret = $_POST['refusal_transactionid'] === $_SESSION['refusal_transactionid'];
    }

    return $ret;
}

/**
 * トランザクショントークを破棄する
 */
function destroyRefusalToken() {
    unset($_SESSION['refusal_transactionid']);
}
-------------------------------------------------------------------

▽default/mypage/refusal_confirm.tpl
28行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
<form name="form1" method="post" action="?">
    <input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" />
    <input type="hidden" name="mode" value="complete" />

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
<form name="form1" method="post" action="?">
    <input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" />
    <input type="hidden" name="refusal_transactionid" value="<!--{$refusal_transactionid}-->" />
    <input type="hidden" name="mode" value="complete" />
-------------------------------------------------------------------

▽mobile/mypage/refusal.tpl
30行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
<form action="?" method="post">
    <input type="hidden" name="mode" value="complete">
    <input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->">

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
<form action="?" method="post">
    <input type="hidden" name="mode" value="complete">
    <input type="hidden" name="refusal_transactionid" value="<!--{$refusal_transactionid}-->" />
    <input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->">
-------------------------------------------------------------------

▽sphone/mypage/refusal_confirm.tpl
28行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
<form name="form1" method="post" action="<!--{$smarty.const.HTTPS_URL}-->mypage/refusal.php">
    <input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" />
    <input type="hidden" name="mode" value="complete" />

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
<form name="form1" method="post" action="<!--{$smarty.const.HTTPS_URL}-->mypage/refusal.php">
    <input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" />
    <input type="hidden" name="refusal_transactionid" value="<!--{$refusal_transactionid}-->" />
    <input type="hidden" name="mode" value="complete" />
=================================================================================================================

=================================================================================================================
▼(4)クロスサイト・スクリプティングの脆弱性
-----------------------------------------------------------------------------------------------------------------
【危険度】
中

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

【修正方法について】
/data/Smarty/templates/default/shopping/payment.tpl
/data/Smarty/templates/mobile/shopping/payment.tpl
/data/Smarty/templates/sphone/shopping/payment.tpl
に以下の変更を加えます。

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

▽default/shopping/payment.tpl
134行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
<input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm[$key].value}-->" id="deliv_id" />
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
<input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm[$key].value|h}-->" id="deliv_id" />
-------------------------------------------------------------------

▽mobile/shopping/payment.tpl
31行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
<input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm[$key].value}-->">
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
<input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm[$key].value|h}-->">
-------------------------------------------------------------------

▽sphone/shopping/payment.tpl
133行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
<input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm[$key].value}-->" id="deliv_id" />
-------------------------------------------------------------------

-------------------------------------------------------------------
 変更後
-------------------------------------------------------------------
<input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm[$key].value|h}-->" id="deliv_id" />
=================================================================================================================

=================================================================================================================
▼(5)クロスサイトスクリプティング及び、セッション情報漏えいの脆弱性
-----------------------------------------------------------------------------------------------------------------
【危険度】
低

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

【修正方法について】
/html/handle_error.php::displaySystemError
に以下の変更を加えます。

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

▽handle_error.php
96行目付近
-------------------------------------------------------------------
 変更前
-------------------------------------------------------------------
/**
 * エラー画面を表示する
 *
 * @param string|null $errstr エラーメッセージ
 * @return void
 */
function displaySystemError($errstr = null) {
    if (SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE) {
        ob_clean();
        ob_start(array('SC_MobileEmoji', 'handler'));
    } else {
        // 最下層以外の出力用バッファをクリアし、出力のバッファリングを解除する
        // FIXME #811(出力バッファリングの利用を見直し)
        while (ob_get_level() >= 2) {
            ob_end_clean();
        }

        // 最下層の出力バッファをクリアする
        ob_clean();
    }
-------------------------------------------------------------------
 変更後
-----------------------------------------------------------------------------------
/**
 * エラー画面を表示する
 *
 * @param string|null $errstr エラーメッセージ
 * @return void
 */
function displaySystemError($errstr = null) {
    ini_set('display_errors','0');
    if (SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE) {
        ob_clean();
        ob_start(array('SC_MobileEmoji', 'handler'));
    } else {
        // 最下層以外の出力用バッファをクリアし、出力のバッファリングを解除する
        // FIXME #811(出力バッファリングの利用を見直し)
        while (ob_get_level() >= 2) {
            ob_end_clean();
        }

        // 最下層の出力バッファをクリアする
        ob_clean();
    }
=================================================================================================================
 FAQ 
Q. 私のサイトは大丈夫か?
A. まずは対象バージョンをお確かめください。
脆弱性対象バージョンのEC-CUBEをお使いの場合、対象ファイルを確認ください。
修正がされていない場合、修正方法に沿って修正の対応をお願いいたします。

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

この度は、お手数をおかけいたしますことを深くお詫び申し上げます。
 謝辞 
本情報の一部は、株式会社ラック様、並びにお問い合わせいただきました開発者様よりご提供いただきました。この場をお借りして、厚く御礼申し上げます。