ソニーペイメントサービスの2つの決済モジュール

Welcartにおけるセキュリティ強化のご報告

Welcartのバージョン1.2.1以前に下記のセキュリティに関する不具合が存在することが判明しました。この不具合を悪用された場合、悪意ある第三者の攻撃により、閲覧者が意図しないサイトに誘導されたり、個人情報が漏えいする危険性が有ります。

  • 不具合1 クロスサイトリクエストフォージェリ
  • 不具合2 クロスサイトスクリプティング
  • 不具合3 ログが閲覧できてしまう

この問題の影響を受けるWelcartのバージョンを以下に示しますので、最新のバージョン(1.2.2)にアップグレードを行うか、パッチを適用してください。

影響を受けるバージョンとその確認方法

影響を受けるバージョンは以下の通りです。

プラグイン名 Welcart e-Commerce 該当バージョン 1.2.1 (を含む)以前の全てのバージョン

使用しているバージョンの確認方法は以下の通りです。 1.WordPress管理パネルにログインする。 2.「プラグイン – インストール済みプラグイン」画面にて、「Welcart e-Commerce」の欄にバージョン番号が記載されています。

脆弱性がもたらす脅威

今回発見された脆弱性では以下の様な脅威が考えられます。

脆弱性1 クロスサイトリクエストフォージェリの脆弱性

購入者が会員にログインしており、カートに商品が入っている状態で、悪意ある第三者による特定のファイルもしくは、別タブで開いている悪意あるサイトを閲覧もしくは送信ボタンをクリックすると、チェックアウトが完了してしまう可能性があります。

脆弱性2 クロスサイトスクリプティングの脆弱性

管理パネル「Welcart Shop – 基本設定」ページ、及び「Welcart Management – 会員リスト」ページにて、一部サニタイズ処理がもれている為、管理者ページ上で任意のスクリプトが実行させられ、その結果、ウェブの出力内容が変更させられる可能性があります。

脆弱性3 ログが閲覧できてしまう脆弱性

logsディレクトリのパーミッションを変更していない場合、クレジット決済用のログが外部から閲覧できてしまうため、個人情報漏えいの可能性があります。

対策方法

Welcart バージョン1.2.2 より前のバージョンを利用されている方は、バージョン1.2.2 以降にアップグレードしてください。 アップグレードの方法に関しましては、こちらのページをご参照ください。 http://support.welcart.com/246/

なお、WelcartのバージョンはWordPressのバージョンによって利用できない場合があります。WelcartとWordPressのバージョンは以下ページを参考に、バージョンがマッチするようそれぞれアップグレードを行ってください。 https://www.welcart.com/documents/

回避策

プログラム(Welcart本体)をハックしている、もしくはサーバー環境の為アップグレードが困難な場合は、脆弱性1と3についてはそれぞれ次の回避策があります。脆弱性2に関しましてはアップグレードするしか改善方法がありません。

以下の方法は、どうしてもアップグレードができない場合の回避策です。Welcart1.2.2以降にアップグレードした場合は必要ありません。

脆弱性3 ログが閲覧できてしまう脆弱性の回避策

wp-content/plugins/usc-e-shop/logs/ ディレクトリ内に、以下の内容の.htaccess ファイルを設置することで回避することができます。但し、.htaccess が利用できる環境でなくてはいけません。WordPressのパーマリンクが利用できる環境であれば.htaccess は利用できるかと思います。

作成するファイル名 .htaccess

.htaccessの内容

Order deny,allow
Deny from all

.htaccessを設置する場所 ご利用のWordPressがインストールされているディレクトリ内の、 wp-content/plugins/usc-e-shop/logs/

脆弱性1 クロスサイトリクエストフォージェリの脆弱性の回避策

ご利用のテーマ内にあるfunctions.phpに以下のコードを追記することで回避できます。

編集するファイル名 functions.php

functions.php がある場所 ご利用のWordPressがインストールされているディレクトリ内の、 wp-content/themes/ご利用のテーマフォルダ/

functions.php に追記するコード

/****************************************************************
* patch
******************************************************************/
if( !function_exists( 'wc_purchase_nonce' ) ){
function my_purchase_nonce($html, $payments, $acting_flag, $rand, $purchase_disabled){
    if( strpos($html, 'wc_nonce') || !in_array( $payments['settlement'], array('COD', 'installment', 'transferAdvance', 'transferDeferred', 'acting_zeus_card')) )
        return $html;
    $wc_nonce = wp_create_nonce('wc_purchase_nonce');
    $html .= wp_nonce_field( 'wc_purchase_nonce', 'wc_nonce', false, false )."\n";
    return $html;
}
function my_purchase_nonce_check(){
    global $usces;
    $entry = $usces->cart->get_entry();
    if( !isset($entry['order']['payment_name']) || empty($entry['order']['payment_name']) ){
        wp_redirect( home_url() );
        exit;<br />
    }</p>

<pre><code>$payments = usces_get_payments_by_name($entry['order']['payment_name']);
if( !in_array( $payments['settlement'], array('COD', 'installment', 'transferAdvance', 'transferDeferred', 'acting_zeus_card')) )
    return true;

$nonce = isset($_REQUEST['wc_nonce']) ? $_REQUEST['wc_nonce'] : '';
if( wp_verify_nonce($nonce, 'wc_purchase_nonce') )
    return true;

wp_redirect( home_url() );
exit;   
</code></pre>

<p>}
add_filter( 'usces_filter_confirm_inform', 'my_purchase_nonce', 20, 5 );
add_filter( 'usces_purchase_check', 'my_purchase_nonce_check', 1 );
}

関連情報

JVN#18731696 Welcart におけるクロスサイト・スクリプティング JVN#53269985 Welcart におけるクロスサイト・リクエストフォージェリ

謝辞

株式会社 神戸デジタル・ラボの松本 悦宜氏よりこの問題をご報告いただきました。心より感謝いたします。

更新履歴

2012.12.12  この脆弱性情報ページを公開しました。

脆弱性関連窓口

メール  infoアットwelcart.com (アットは@に置き換えてください)