EC-CUBEのカスタマイズ、ネットショップ制作メモ

主にEC-CUBEを利用したネットショップの制作、カスタマイズや独自機能の開発について

EC-CUBE2.4.4以前のバージョンに存在するクロスサイトリクエストフォージェリの脆弱性への対応

2011年5月10日、JVNからEC-CUBEの2.4.4以前のバージョンに存在するCSRF脆弱性に関する情報が公開されました
JVN#37878530 EC-CUBE におけるクロスサイトリクエストフォージェリの脆弱性
*1

CSRF*2とは、簡単に言うと、どんなサイトやHTMLメールからでも、ユーザの意図しない情報をターゲットのサイトに送信させて、望まない操作をさせる事が出来るという物です。*3
特にサイト管理者の方はEC-CUBEの管理画面にログインしたままの状態で、よく解らないリンクやボタンをクリックしない様にしましょう。*4

2.11.0以降のバージョンには存在しませんので、2.11.0以降を利用されている方は大丈夫です。*5

2.4系から2.11系へのデータ移行ツールもリリースされていますが、2.11系は2.4系とは大きく変わり、簡単にはバージョンアップ出来ないのも事実です。
特に多数のカスタマイズを加えていると、より作業量は増えてしまいます。
とりあえず2.4系をそのまま使って、この脆弱性に対応する為のやり方を今回はご紹介します。

全てのフォームにトークンを加える。

EC-CUBEには、元々CSRFに対応する為の機能が備わっています。
ただ、2.4系よりも前のバージョンでは一部の画面でしか利用されていない為、脆弱性が存在してしまっています。

これに対応する為には全てのフォームにトークンを追加します。
例:

<input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" />

次に、トークンを追加したページに該当するLC_Page系のクラスのinit()*6に下記を追加します。

$this->transactionid = $this->getToken();

追加したトークンを受け取る画面に該当するLC_Page系のクラスのinit()に下記を追加します。

if (!$this->isValidToken()) {
    SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, "", true);
}
結構大変です。

作業自体は簡単ですが、とにかく追加しないといけない箇所が多いので結構大変だと思います。
サイトの状態によっては2.11.1にバージョンアップした方が早いかもしれません。
サイトのカスタマイズ状況を見極めて、どちらの方が良いか早めに検討される事をオススメします。

*1:クリックしなくても開いただけで攻撃も可能です

*2:クロスサイトリクエストフォージェリ

*3:具体的にどんな事が出来るかは、ここで書く事は控えさせて頂きます。

*4:管理画面にログインしている時は、ブラウザで他のウィンドウやタブを開かない様にして、コマメにログアウトすれば平気です。

*5:2.11の開発中にこの辺の話や作業をしました。

*6:モバイルの方にも足します。