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 の送出が無効になる場合もありますので, 注意が必要です.