EC-CUBE におけるクロスサイトリクエストフォージェリの脆弱性について

5月10日, JVN より EC-CUBE における CSRF脆弱性について発表がありました.

JVN#37878530: EC-CUBE におけるクロスサイトリクエストフォージェリの脆弱性

2.11.0 では対応されているけど, 2.4.x ではどうなの?? という声があがっていますので, ちょっと書いておこうと思います.

対策方法は, id:xross-cube さんところに, 詳しく書かれていますが, おそらく 100ヶ所以上の修正を入れなくてはならないため, 一筋縄にはいかないようです.

EC-CUBE2.4.4以前のバージョンに存在するクロスサイトリクエストフォージェリの脆弱性への対応 - EC-CUBEのカスタマイズ、ネットショップ制作メモ

また, JVN には,

管理者が、EC-CUBE にログインした状態で悪意あるページを読み込んだ場合、当該製品で管理している情報を改ざんされる可能性があります。

と書かれていますが, 重要な情報が抜けています.

EC-CUBE の管理画面では SC_Utils::sfIsSuccess() 関数で認証を行っていますが, ここで HTTP_REFERER のチェックをしています.

http://svn.ec-cube.net/open_trac/browser/branches/version-2_4/data/class/util/SC_Utils.php#L208

<?php
    /* 認証の可否判定 */
    function sfIsSuccess($objSess, $disp_error = true) {
        $ret = $objSess->IsSuccess();
        if($ret != SUCCESS) {
            if($disp_error) {
                // エラーページの表示
                SC_Utils::sfDispError($ret);
            }
            return false;
        }
        // リファラーチェック(CSRFの暫定的な対策)
        // 「リファラ無」 の場合はスルー
        // 「リファラ有」 かつ 「管理画面からの遷移でない」 場合にエラー画面を表示する
        if ( empty($_SERVER['HTTP_REFERER']) ) {
            // TODO 警告表示させる?
            // sfErrorHeader('>> referrerが無効になっています。');
        } else {
            $domain  = SC_Utils::sfIsHTTPS() ? SSL_URL : SITE_URL;
            $pattern = sprintf('|^%s.*|', $domain);
            $referer = $_SERVER['HTTP_REFERER'];

            // 管理画面から以外の遷移の場合はエラー画面を表示
            if (!preg_match($pattern, $referer)) {
                if ($disp_error) SC_Utils::sfDispError(INVALID_MOVE_ERRORR);
                return false;
            }
        }
        return true;
    }

ここでは, ブラウザから送出された HTTP_REFERER と SITE_URL 又は SSL_URL のドメインを比較し, 一致しない場合はエラー画面を表示させます.

つまり, 2.4.4 未満のバージョンでも, ブラウザの HTTP_REFERER 送出を無効にしない限りは, 攻撃が成立しません.

ほとんどのブラウザは, デフォルトで HTTP_REFERER を送出するので, あまり心配しなくても良いかもしれません.
ただし, セキュリティソフトにより HTTP_REFERER の送出が無効になる場合もありますので, 注意が必要です.