EC-CUBE4.0系におけるRCE可能な脆弱性(JVN#29195731)

更新履歴
2023/11/09 15:00
目次の追加
2023/11/07 14:00
JVNからの公表内容情報へのリンクを追加
2023/10/26 13:00
初版公開

目次

EC-CUBEにおけるRCE可能な脆弱性

EC-CUBE 4.0系におけるRCE可能な脆弱性(危険度: 低)があることが判明いたしました。

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

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

脆弱性の概要

EC-CUBEにおけるRCE可能な脆弱性

危険度:

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

詳細:

該当バージョンのEC-CUBEにはRCE可能な脆弱性が存在します。EC-CUBEはテンプレートエンジンとしてTwigを利用していますが、EC-CUBEの一部画面でTwigに対する設定不備が存在し、攻撃者が対象のシステム上で任意のコードを実行できる可能性があります。


JVNからの公表内容 (2023/11/07公開)

JVN#29195731: EC-CUBE 3系および 4系において任意のコードを実行される脆弱性

Twigの更新手順

EC-CUBE4.0系で利用している場合、Twigの不具合によりSandBox機能が動作しません。
修正方法を実施する前に、Twigのアップデートを行ってください。

Twigをアップデートするためには、composerを使用する方法とファイルを手動でアップデートする方法の2つがあります。
以下のどちらかを実施してください。

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

※本修正を実施する前に、Twigの更新を必ず行ってください。

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

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

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

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

    4.0.6-p3

    • app/config/eccube/packages/twig_extensions.yaml
    • src/Eccube/Resource/template/default/Product/detail.twig
    • src/Eccube/Resource/template/default/default_frame.twig
    • src/Eccube/Twig/Extension/IgnoreTwigSandboxErrorExtension.php
    • src/Eccube/Twig/Sandbox/SecurityPolicyDecorator.php
  2. EC-CUBEファイルのバックアップ

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

  3. 修正ファイルの反映

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

    上書きするファイル

    4.0.6-p3

    • app/config/eccube/packages/twig_extensions.yaml
    • src/Eccube/Resource/template/default/Product/detail.twig
    • src/Eccube/Resource/template/default/default_frame.twig
    • src/Eccube/Twig/Extension/IgnoreTwigSandboxErrorExtension.php
    • src/Eccube/Twig/Sandbox/SecurityPolicyDecorator.php

    下記にファイルが存在する場合は同様に上書きをお願いします

    • app/template/default/Product/detail.twig
    • app/template/default/default_frame.twig

    また、snippet.twigに関してはプラグインで拡張する箇所となるため対応不要となります。

    ※デザインテンプレートの適用や、EC-CUBE本体のカスタマイズをしている場合、修正箇所の差分をご確認のうえ反映をお願いします。
    ※開発環境がある場合は、開発環境での反映・動作確認を行った後に、本番環境への反映をおすすめします。

  4. キャッシュの削除

    EC-CUBE のキャッシュの削除が必要です。
    EC-CUBE の管理画面にログインいただき、コンテンツ管理 -> キャッシュ管理 のページからキャッシュの削除をお願いいたします。

  5. 動作確認

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

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

※本修正を実施する前に、Twigの更新を必ず行ってください。

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

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

修正差分

app/config/eccube/packages/twig_extensions.yaml CHANGED
@@ -8,3 +8,146 @@ services:
8
8
  #Twig\Extensions\DateExtension: ~
9
9
  Twig\Extensions\IntlExtension: ~
10
10
  #Twig\Extensions\TextExtension: ~
11
+
12
+ eccube.twig_sandbox.policy:
13
+ class: Twig\Sandbox\SecurityPolicy
14
+ arguments:
15
+ $allowedTags: "%eccube.twig_sandbox.allowed_tags%"
16
+ $allowedFilters: "%eccube.twig_sandbox.allowed_filters%"
17
+ $allowedFunctions: "%eccube.twig_sandbox.allowed_functions%"
18
+ $allowedMethods: "%eccube.twig_sandbox.allowed_methods%"
19
+ $allowedProperties: "%eccube.twig_sandbox.allowed_properties%"
20
+ eccube.twig_sandbox.extension:
21
+ class: Twig\Extension\SandboxExtension
22
+ arguments:
23
+ - '@eccube.twig_sandbox.policy'
24
+ - false
25
+ tags: ['twig.extension']
26
+ Eccube\Twig\Sandbox\SecurityPolicyDecorator:
27
+ decorates: 'eccube.twig_sandbox.policy'
28
+ parameters:
29
+ eccube.twig_sandbox.allowed_tags:
30
+ - 'apply'
31
+ - 'block'
32
+ - 'deprecated'
33
+ - 'embed'
34
+ - 'extends'
35
+ - 'flush'
36
+ - 'for'
37
+ - 'if'
38
+ - 'set'
39
+ - 'spaceless'
40
+ - 'verbatim'
41
+ - 'with'
42
+ - 'form_theme'
43
+ - 'stopwatch'
44
+ - 'trans'
45
+ - 'trans_default_domain'
46
+ eccube.twig_sandbox.allowed_filters:
47
+ - 'abs'
48
+ - 'batch'
49
+ - 'capitalize'
50
+ - 'column'
51
+ - 'convert_encoding'
52
+ - 'date'
53
+ - 'date_modify'
54
+ - 'default'
55
+ - 'escape'
56
+ - 'first'
57
+ - 'format'
58
+ - 'join'
59
+ - 'json_encode'
60
+ - 'keys'
61
+ - 'last'
62
+ - 'length'
63
+ - 'lower'
64
+ - 'merge'
65
+ - 'nl2br'
66
+ - 'number_format'
67
+ - 'replace'
68
+ - 'reverse'
69
+ - 'round'
70
+ - 'slice'
71
+ - 'spaceless'
72
+ - 'split'
73
+ - 'striptags'
74
+ - 'title'
75
+ - 'trim'
76
+ - 'upper'
77
+ - 'url_encode'
78
+ - 'abbr_class'
79
+ - 'abbr_method'
80
+ - 'file_link'
81
+ - 'format_args'
82
+ - 'format_args_as_text'
83
+ - 'humanize'
84
+ - 'trans'
85
+ - 'yaml_dump'
86
+ - 'yaml_encode'
87
+ - 'date_day'
88
+ - 'date_day_with_weekday'
89
+ - 'date_format'
90
+ - 'date_min'
91
+ - 'date_sec'
92
+ - 'doctrine_pretty_query'
93
+ - 'doctrine_replace_query_parameters'
94
+ - 'e'
95
+ - 'ellipsis'
96
+ - 'file_ext_icon'
97
+ - 'form_encode_currency'
98
+ - 'format_log_message'
99
+ - 'no_image_product'
100
+ - 'price'
101
+ - 'time_ago'
102
+ - 'doctrine_minify_query'
103
+ - 'localizedcurrency'
104
+ - 'localizeddate'
105
+ - 'localizednumber'
106
+ - 'transchoice'
107
+ eccube.twig_sandbox.allowed_functions:
108
+ - 'cycle'
109
+ - 'date'
110
+ - 'max'
111
+ - 'min'
112
+ - 'random'
113
+ - 'range'
114
+ - 'absolute_url'
115
+ - 'asset'
116
+ - 'asset_version'
117
+ - 'csrf_token'
118
+ - 'is_granted'
119
+ - 'logout_path'
120
+ - 'logout_url'
121
+ - 'path'
122
+ - 'relative_path'
123
+ - 'url'
124
+ - 'active_menus'
125
+ - 'class_categories_as_json'
126
+ - 'csrf_token_for_anchor'
127
+ - 'currency_symbol'
128
+ - 'get_all_carts'
129
+ - 'get_cart'
130
+ - 'get_carts_total_price'
131
+ - 'get_carts_total_quantity'
132
+ - 'has_errors'
133
+ - 'is_reduced_tax_rate'
134
+ - 'product'
135
+ - 'workflow_can'
136
+ - 'workflow_has_marked_place'
137
+ - 'workflow_marked_places'
138
+ - 'workflow_transitions'
139
+ - 'device_version'
140
+ - 'full_view_url'
141
+ - 'is_android_os'
142
+ - 'is_device'
143
+ - 'is_full_view'
144
+ - 'is_ios'
145
+ - 'is_mobile'
146
+ - 'is_mobile_view'
147
+ - 'is_not_mobile_view'
148
+ - 'is_tablet'
149
+ - 'is_tablet_view'
150
+ eccube.twig_sandbox.allowed_methods:
151
+ 'Symfony\Bridge\Twig\AppVariable': [ 'getrequest' ]
152
+ 'Symfony\Component\HttpFoundation\Request': [ 'geturi' ]
153
+ eccube.twig_sandbox.allowed_properties: []
src/Eccube/Resource/template/default/Product/detail.twig CHANGED
@@ -375,7 +375,7 @@ file that was distributed with this source code.
375
375
  </div>
376
376
  {% if Product.freearea %}
377
377
  <div class="ec-productRole__description">
378
- {{ include(template_from_string(Product.freearea)) }}
378
+ {{ include(template_from_string(Product.freearea), sandboxed = true) }}
379
379
  </div>
380
380
  {% endif %}
381
381
  </div>
src/Eccube/Resource/template/default/default_frame.twig CHANGED
@@ -28,7 +28,7 @@ file that was distributed with this source code.
28
28
  <meta name="robots" content="{{ Page.meta_robots }}">
29
29
  {% endif %}
30
30
  {% if Page.meta_tags is not empty %}
31
- {{ include(template_from_string(Page.meta_tags)) }}
31
+ {{ include(template_from_string(Page.meta_tags), sandboxed = true) }}
32
32
  {% endif %}
33
33
  <link rel="icon" href="{{ asset('assets/img/common/favicon.ico', 'user_data') }}">
34
34
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
src/Eccube/Twig/Extension/IgnoreTwigSandboxErrorExtension.php ADDED
@@ -0,0 +1,78 @@
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of EC-CUBE
5
+ *
6
+ * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
7
+ *
8
+ * http://www.ec-cube.co.jp/
9
+ *
10
+ * For the full copyright and license information, please view the LICENSE
11
+ * file that was distributed with this source code.
12
+ */
13
+
14
+ namespace Eccube\Twig\Extension;
15
+
16
+ use Twig\Environment;
17
+ use Twig\Error\LoaderError;
18
+ use Twig\Extension\AbstractExtension;
19
+ use Twig\Extension\SandboxExtension;
20
+ use Twig\Sandbox\SecurityError;
21
+ use Twig\TwigFunction;
22
+
23
+ /**
24
+ * \vendor\twig\twig\src\Extension\CoreExtension の拡張
25
+ */
26
+ class IgnoreTwigSandboxErrorExtension extends AbstractExtension
27
+ {
28
+ /**
29
+ * {@inheritdoc}
30
+ */
31
+ public function getFunctions(): array
32
+ {
33
+ return [
34
+ new TwigFunction('include', [$this, 'twig_include'], ['needs_environment' => true, 'needs_context' => true, 'is_safe' => ['all']]),
35
+ ];
36
+ }
37
+
38
+ /**
39
+ * twig sandboxの例外を操作します
40
+ * app_env = devの場合、エラーを表示する
41
+ * app_env = prodの場合、エラーを表示しない
42
+ *
43
+ * @param Environment $env
44
+ * @param $context
45
+ * @param $template
46
+ * @param $variables
47
+ * @param $withContext
48
+ * @param $ignoreMissing
49
+ * @param $sandboxed
50
+ *
51
+ * @return string|void
52
+ *
53
+ * @throws LoaderError
54
+ * @throws SecurityError
55
+ */
56
+ public function twig_include(Environment $env, $context, $template, $variables = [], $withContext = true, $ignoreMissing = false, $sandboxed = false)
57
+ {
58
+ try {
59
+ return \twig_include($env, $context, $template, $variables, $withContext, $ignoreMissing, $sandboxed);
60
+ } catch (SecurityError $e) {
61
+
62
+ // devではエラー画面が表示されるようにする
63
+ $appEnv = env('APP_ENV');
64
+ if ($appEnv === 'dev') {
65
+ throw $e;
66
+ } else {
67
+ // ログ出力
68
+ log_warning($e->getMessage(), ['exception' => $e]);
69
+
70
+ // 例外がスローされた場合、sandboxが効いた状態になってしまうため追加
71
+ $sandbox = $env->getExtension(SandboxExtension::class);
72
+ if (!$sandbox->isSandboxedGlobally()) {
73
+ $sandbox->disableSandbox();
74
+ }
75
+ }
76
+ }
77
+ }
78
+ }
src/Eccube/Twig/Sandbox/SecurityPolicyDecorator.php ADDED
@@ -0,0 +1,47 @@
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of EC-CUBE
5
+ *
6
+ * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
7
+ *
8
+ * http://www.ec-cube.co.jp/
9
+ *
10
+ * For the full copyright and license information, please view the LICENSE
11
+ * file that was distributed with this source code.
12
+ */
13
+
14
+ namespace Eccube\Twig\Sandbox;
15
+
16
+ use Twig\Sandbox\SecurityPolicy as BasePolicy;
17
+ use Twig\Sandbox\SecurityPolicyInterface;
18
+
19
+ class SecurityPolicyDecorator implements SecurityPolicyInterface {
20
+
21
+ /** @var BasePolicy */
22
+ private $securityPolicy;
23
+
24
+ public function __construct(BasePolicy $securityPolicy)
25
+ {
26
+ $this->securityPolicy = $securityPolicy;
27
+ }
28
+
29
+ public function checkSecurity($tags, $filters, $functions)
30
+ {
31
+ $this->securityPolicy->checkSecurity($tags, $filters, $functions);
32
+ }
33
+
34
+ public function checkMethodAllowed($obj, $method)
35
+ {
36
+ // __toStringの場合はチェックをスキップする
37
+ if ($method === '__toString') {
38
+ return;
39
+ }
40
+ $this->securityPolicy->checkMethodAllowed($obj, $method);
41
+ }
42
+
43
+ public function checkPropertyAllowed($obj, $method)
44
+ {
45
+ $this->securityPolicy->checkPropertyAllowed($obj, $method);
46
+ }
47
+ }

問い合わせ先

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

EC-CUBE 運営チーム
MAIL: support@ec-cube.net

謝辞

本脆弱性は、

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