EC-CUBE 2系におけるクロスサイトスクリプティングの脆弱性(JVN#46993816)

更新履歴
2023/08/09 16:00
JVN番号と謝辞を追加
2023/07/27 13:00
初版公開

EC-CUBEにおけるクロスサイトスクリプティングの脆弱性

EC-CUBE 2系におけるクロスサイトスクリプティングの脆弱性(危険度: 低)があることが判明いたしました。

脆弱性そのものは、修正の反映によりすぐに解決するものです。
以下のいずれかの方法により、ご対応をお願いいたします。

皆様にはお手数おかけし誠に申し訳ございません。
本脆弱性における被害報告は現時点でございませんが、できるだけ速やかにご対応をお願いいたします。

脆弱性の概要

EC-CUBEにおけるクロスサイトスクリプティングの脆弱性

危険度:

不具合が存在するEC-CUBEのバージョン:

詳細:

該当バージョンのEC-CUBEにはXSSの脆弱性が存在します。攻撃者が管理画面にログイン可能な場合に、当該脆弱性を悪用して、他の管理者またはサイトにアクセスした第三者のブラウザ上で任意のスクリプトを実行させる可能性があります。


JVNからの公表内容 (2022/08/17公開)

JVN#46993816: EC-CUBE 2系におけるクロスサイトスクリプティングの脆弱性

修正ファイル適用による注意点

以下の注意事項をご確認お願いいたします。

本修正ファイルを適用することにより、スクリプトを含む文字列がサニタイズされます。
そのため、商品情報やメルマガテンプレートの登録内容にスクリプトが含まれる場合は、スクリプトはサニタイズされ機能しなくなります。あらかじめご了承ください。

修正方法1: 修正ファイルを利用する場合

開発環境がある場合は、まず開発環境でお試しください。
以下の手順に従って、修正ファイルの反映をお願いいたします。

  1. 修正ファイルのダウンロード

    ご利用中のEC-CUBEのバージョンに該当する修正ファイルをダウンロードしてください。
    ※EC-CUBEのバージョンはこちらの手順でご確認ください。
    ※修正ファイルは各バージョンの最新版に対して作成しています。旧バージョンをご利用の場合は、「修正方法2」のご対応をお願いします。

    ダウンロードし、解凍していただきますと、以下の修正ファイルがあります。必ず該当するバージョンのファイルをご利用ください。

    2.17.2-p1

    • data/smarty_extends/modifier.script_escape.php

    2.13.5-p1

    • data/Smarty/templates/admin/mail/preview.tpl
    • data/Smarty/templates/admin/products/confirm.tpl
    • data/Smarty/templates/default/products/detail.tpl
    • data/Smarty/templates/mobile/products/detail.tpl
    • data/Smarty/templates/sphone/products/detail.tpl
    • data/smarty_extends/modifier.script_escape_ex.php
  2. EC-CUBEファイルのバックアップ

    あらかじめEC-CUBEファイル全体のバックアップを行ってください。

  3. 修正ファイルの反映

    以下のファイルを上書き更新してください。

    上書きするファイル

    2.17.2-p1

    • data/smarty_extends/modifier.script_escape.php

    2.13.5-p1

    • data/Smarty/templates/admin/mail/preview.tpl
    • data/Smarty/templates/admin/products/confirm.tpl
    • data/Smarty/templates/default/products/detail.tpl
    • data/Smarty/templates/mobile/products/detail.tpl
    • data/Smarty/templates/sphone/products/detail.tpl
    • data/smarty_extends/modifier.script_escape_ex.php
    ※デザインテンプレートの適用や、EC-CUBE本体のカスタマイズをしている場合、修正箇所の差分をご確認のうえ反映をお願いします。
    ※開発環境がある場合は、開発環境での反映・動作確認を行った後に、本番環境への反映をおすすめします。

  4. キャッシュの削除

    キャッシュは自動で更新されますが、念の為EC-CUBE のキャッシュの削除をしておくと安全です。以下のディレクトリ配下のキャッシュファイルを削除をお願い致します。

    • data/Smarty/templates_c/admin/*
    • data/Smarty/templates_c/default/*
    • data/Smarty/templates_c/sphone/*
    • data/Smarty/templates_c/mobile/*
    • data/Smarty/templates_c/お使いのテンプレート/*
    ※ディレクトリごと削除せず、配下のファイルを削除するようにしてください。
  5. 動作確認

    フロント画面と管理画面(ログインが必要)それぞれにおいて、基本操作が正常に行えることをご確認ください。

修正方法2-1: 修正差分を確認して適宜反映する場合(2.17系)

以下のコード差分情報を参照して頂き、必要な箇所に修正を反映してください。

本修正方法はEC-CUBE 2.17.2-p1のバージョンを例として提示しております。
過去バージョンをご利用の場合は、下記修正対象ファイルの修正差分を参考にご対応お願いいたします。

修正差分

data/smarty_extends/modifier.script_escape.php CHANGED
@@ -9,12 +9,36 @@ function smarty_modifier_script_escape($value)
9
9
  {
10
10
  if (is_array($value)) return $value;
11
11
 
12
- $pattern = "/<script.*?>|<\/script>|javascript:|<svg.*(onload|onerror).*?>|<img.*(onload|onerror).*?>|<body.*onload.*?>|<iframe.*?>|<object.*?>|<embed.*?>|<.*onmouse.*?>|(\"|').*(onmouse|onerror|onload|onclick).*=.*(\"|').*/i";
12
+ $pattern = "<script.*?>|<\/script>|javascript:|<svg.*(onload|onerror).*?>|<img.*(onload|onerror).*?>|<body.*onload.*?>|<iframe.*?>|<object.*?>|<embed.*?>|";
13
+
14
+ // 追加でサニタイズするイベント一覧
15
+ $escapeEvents = array(
16
+ 'onmouse',
17
+ 'onclick',
18
+ 'onblur',
19
+ 'onfocus',
20
+ 'onresize',
21
+ 'onscroll',
22
+ 'ondblclick',
23
+ 'onchange',
24
+ 'onselect',
25
+ 'onsubmit',
26
+ 'onkey',
27
+ );
28
+
29
+ // イベント毎の正規表現を生成
30
+ $generateHtmlTagPatterns = array_map(function($str) {
31
+ return "<(\w+)([^>]*\s)?\/?".$str."[^>]*>";
32
+ }, $escapeEvents);
33
+ $pattern .= implode("|", $generateHtmlTagPatterns)."|";
34
+ $pattern .= "(\"|').*(onerror|onload|".implode("|", $escapeEvents).").*=.*(\"|').*";
35
+
36
+ // 正規表現をまとめる
37
+ $attributesPattern = "/${pattern}/i";
38
+
39
+ // 置き換える文字列
13
40
  $convert = '#script tag escaped#';
14
41
 
15
- if (preg_match_all($pattern, $value, $matches)) {
16
- return preg_replace($pattern, $convert, $value);
17
- } else {
18
- return $value;
19
- }
42
+ // マッチしたら文字列を置き換える
43
+ return preg_replace($attributesPattern, $convert, $value);
20
44
  }

修正方法2-2: 修正差分を確認して適宜反映する場合(2.13系)

以下のコード差分情報を参照して頂き、必要な箇所に修正を反映してください。

本修正方法はEC-CUBE 2.13.5-p1のバージョンを例として提示しております。
過去バージョンをご利用の場合は、下記修正対象ファイルの修正差分を参考にご対応お願いいたします。

修正差分

data/Smarty/templates/admin/mail/preview.tpl CHANGED
@@ -22,4 +22,4 @@
22
22
  */
23
23
  *}-->
24
24
 
25
- <!--{if $mail.mail_method eq 2}--><!--{$mail.body|h|nl2br}--><!--{else}--><!--{$mail.body}--><!--{/if}-->
25
+ <!--{if $mail.mail_method eq 2}--><!--{$mail.body|h|nl2br}--><!--{else}--><!--{$mail.body|script_escape_ex}--><!--{/if}-->
data/Smarty/templates/admin/products/confirm.tpl CHANGED
@@ -200,7 +200,7 @@
200
200
  <tr>
201
201
  <th>詳細-メインコメント</th>
202
202
  <td>
203
- <!--{$arrForm.main_comment|nl2br_html}-->
203
+ <!--{$arrForm.main_comment|nl2br_html|script_escape_ex}-->
204
204
  </td>
205
205
  </tr>
206
206
  <tr>
@@ -249,7 +249,7 @@
249
249
  <th>詳細-サブコメント(<!--{$smarty.section.cnt.iteration}-->)</th>
250
250
  <td>
251
251
  <!--{assign var=key value="sub_comment`$smarty.section.cnt.iteration`"}-->
252
- <!--{$arrForm[$key]|nl2br_html}-->
252
+ <!--{$arrForm[$key]|nl2br_html|script_escape_ex}-->
253
253
  </td>
254
254
  </tr>
255
255
  <tr>
data/Smarty/templates/default/products/detail.tpl CHANGED
@@ -177,7 +177,7 @@
177
177
  </dl>
178
178
 
179
179
  <!--★詳細メインコメント★-->
180
- <div class="main_comment"><!--{$arrProduct.main_comment|nl2br_html}--></div>
180
+ <div class="main_comment"><!--{$arrProduct.main_comment|nl2br_html|script_escape_ex}--></div>
181
181
 
182
182
  <!--▼買い物カゴ-->
183
183
  <div class="cart_area clearfix">
@@ -292,7 +292,7 @@
292
292
  <!--▼サブ画像-->
293
293
  <!--{assign var=lkey value="sub_large_image`$smarty.section.cnt.index+1`"}-->
294
294
  <!--{if $arrProduct[$ikey]|strlen >= 1}-->
295
- <div class="subtext"><!--★サブテキスト★--><!--{$arrProduct[$ckey]|nl2br_html}--></div>
295
+ <div class="subtext"><!--★サブテキスト★--><!--{$arrProduct[$ckey]|nl2br_html|script_escape_ex}--></div>
296
296
  <div class="subphotoimg">
297
297
  <!--{if $arrProduct[$lkey]|strlen >= 1}-->
298
298
  <a href="<!--{$smarty.const.IMAGE_SAVE_URLPATH}--><!--{$arrProduct[$lkey]|h}-->" class="expansion" target="_blank" >
@@ -307,7 +307,7 @@
307
307
  <!--{/if}-->
308
308
  </div>
309
309
  <!--{else}-->
310
- <p class="subtext"><!--★サブテキスト★--><!--{$arrProduct[$ckey]|nl2br_html}--></p>
310
+ <p class="subtext"><!--★サブテキスト★--><!--{$arrProduct[$ckey]|nl2br_html|script_escape_ex}--></p>
311
311
  <!--{/if}-->
312
312
  <!--▲サブ画像-->
313
313
  </div>
data/Smarty/templates/mobile/products/detail.tpl CHANGED
@@ -59,7 +59,7 @@
59
59
  <!--{/if}-->
60
60
 
61
61
  <!--★詳細メインコメント★-->
62
- [emoji:76]<!--{$arrProduct.main_comment|nl2br_html}--><br>
62
+ [emoji:76]<!--{$arrProduct.main_comment|nl2br_html|script_escape_ex}--><br>
63
63
  <br>
64
64
 
65
65
  <!--▼商品ステータス-->
data/Smarty/templates/sphone/products/detail.tpl CHANGED
@@ -118,7 +118,7 @@
118
118
  <section id="detailarea">
119
119
 
120
120
  <!--★詳細メインコメント★-->
121
- <p class="main_comment"><!--{$arrProduct.main_comment|nl2br_html}--></p>
121
+ <p class="main_comment"><!--{$arrProduct.main_comment|nl2br_html|script_escape_ex}--></p>
122
122
 
123
123
  <form name="form1" id="form1" method="post" action="<!--{$smarty.const.ROOT_URLPATH}-->products/detail.php">
124
124
  <div id="detailrightblock">
@@ -342,7 +342,7 @@
342
342
  </p>
343
343
  <!--{/if}-->
344
344
  <!--★サブテキスト★-->
345
- <p class="subtext"><!--★サブテキスト★--><!--{$arrProduct[$ckey]|nl2br_html}--></p>
345
+ <p class="subtext"><!--★サブテキスト★--><!--{$arrProduct[$ckey]|nl2br_html|script_escape_ex}--></p>
346
346
  </div>
347
347
  <!--{/if}-->
348
348
  <!--{/section}-->
data/smarty_extends/modifier.script_escape_ex.php ADDED
@@ -0,0 +1,44 @@
1
+ <?php
2
+ /**
3
+ * Scriptタグをエスケープする
4
+ *
5
+ * @param string $value 入力
6
+ * @return string $value マッチした場合は変換後の文字列、しない場合は入力された文字列をそのまま返す。
7
+ */
8
+ function smarty_modifier_script_escape_ex($value)
9
+ {
10
+ if (is_array($value)) return $value;
11
+
12
+ $pattern = "<script.*?>|<\/script>|javascript:|<svg.*(onload|onerror).*?>|<img.*(onload|onerror).*?>|<body.*onload.*?>|<iframe.*?>|<object.*?>|<embed.*?>|";
13
+
14
+ // 追加でサニタイズするイベント一覧
15
+ $escapeEvents = array(
16
+ 'onmouse',
17
+ 'onclick',
18
+ 'onblur',
19
+ 'onfocus',
20
+ 'onresize',
21
+ 'onscroll',
22
+ 'ondblclick',
23
+ 'onchange',
24
+ 'onselect',
25
+ 'onsubmit',
26
+ 'onkey',
27
+ );
28
+
29
+ // イベント毎の正規表現を生成
30
+ $generateHtmlTagPatterns = array_map(function($str) {
31
+ return "<(\w+)([^>]*\s)?\/?".$str."[^>]*>";
32
+ }, $escapeEvents);
33
+ $pattern .= implode("|", $generateHtmlTagPatterns)."|";
34
+ $pattern .= "(\"|').*(onerror|onload|".implode("|", $escapeEvents).").*=.*(\"|').*";
35
+
36
+ // 正規表現をまとめる
37
+ $attributesPattern = "/${pattern}/i";
38
+
39
+ // 置き換える文字列
40
+ $convert = '#script tag escaped#';
41
+
42
+ // マッチしたら文字列を置き換える
43
+ return preg_replace($attributesPattern, $convert, $value);
44
+ }

問い合わせ先

本脆弱性に関するお問合せ:

EC-CUBE 運営チーム
MAIL: [email protected]

謝辞

本脆弱性は、

よりご報告いただきました。
この場をお借りして、厚く御礼申し上げます。