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のバージョン:
- 4.0.0〜4.0.6-p3
詳細:
該当バージョンのEC-CUBEにはRCE可能な脆弱性が存在します。EC-CUBEはテンプレートエンジンとしてTwigを利用していますが、EC-CUBEの一部画面でTwigに対する設定不備が存在し、攻撃者が対象のシステム上で任意のコードを実行できる可能性があります。
JVNからの公表内容 (2023/11/07公開)
JVN#29195731: EC-CUBE 3系および 4系において任意のコードを実行される脆弱性
- EC-CUBE 3系および 4系において任意のコードを実行される脆弱性 CVE-2023-46845
Twigの更新手順
EC-CUBE4.0系で利用している場合、Twigの不具合によりSandBox機能が動作しません。
修正方法を実施する前に、Twigのアップデートを行ってください。
Twigをアップデートするためには、composerを使用する方法とファイルを手動でアップデートする方法の2つがあります。
以下のどちらかを実施してください。
-
composerコマンドにて、Twigをアップデート:
以下のコマンドを実行し、Twigを新しいバージョンに更新してください。
$ composer update twig/twig
$ composer update twig/extensionsまた、以下のコマンドを実行し、Twigが更新されていることを確認してください。
$ composer show twig/twig
※以下のように表示されることを確認してください。
name : twig/twig
versions : * v2.15.5$ composer show twig/extensions
※以下のように表示されることを確認してください。
name : twig/extensions
versions : * v1.5.4
-
Twigのファイルを手動でアップデート:
Twigを手動でアップデートする時は、以下の手順に従ってください。
twig/twigのファイルを以下のURLからダウンロードします。
https://github.com/twigphp/Twig/archive/refs/tags/v2.15.5.zip[EC-CUBEの設置先]/vendor/twig/twigディレクトリ内を削除してください。
ダウンロードしたZIPファイルを[EC-CUBEの設置先]/vendor/twig/twigディレクトリに展開してください。twig/extensionのファイルを以下のURLからダウンロードします。
https://github.com/twigphp/Twig-extensions/archive/refs/tags/v1.5.4.zip[EC-CUBEの設置先]/vendor/twig/extensionsディレクトリ内を削除してください。
ダウンロードしたZIPファイルを[EC-CUBEの設置先]/vendor/twig/extensionsディレクトリに展開してください。ファイルが正しく上書きされたことを確認してください。
また、EC-CUBEの動作を確認し、テンプレートが正しく表示されることを確認してください。
修正方法1: 修正ファイルを利用する場合(4.0系)
※本修正を実施する前に、Twigの更新を必ず行ってください。
開発環境がある場合は、まず開発環境でお試しください。
以下の手順に従って、修正ファイルの反映をお願いいたします。
- 修正ファイルのダウンロード
ご利用中のEC-CUBEのバージョンに該当する修正ファイルをダウンロードしてください。
※EC-CUBEのバージョンはこちらの手順でご確認ください。
※修正ファイルは各バージョンの最新版に対して作成しています。旧バージョンをご利用の場合は、「修正方法2」のご対応をお願いします。
※対象のファイルに対して既にカスタマイズをしている場合は、「修正方法2」のご対応をお願いします。- 修正ファイル(4.0.6-p3) (SHA256:0bcbb847ea1aaf8443f49f30015066122ce27f253574dcc92cae4b5859a6646f)
ダウンロードし、解凍していただきますと、以下の修正ファイルがあります。必ず該当するバージョンのファイルをご利用ください。
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
- EC-CUBEファイルのバックアップ
あらかじめEC-CUBEファイル全体のバックアップを行ってください。
- 修正ファイルの反映
以下のファイルを上書き更新してください。
上書きするファイル
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本体のカスタマイズをしている場合、修正箇所の差分をご確認のうえ反映をお願いします。
※開発環境がある場合は、開発環境での反映・動作確認を行った後に、本番環境への反映をおすすめします。 - キャッシュの削除
EC-CUBE のキャッシュの削除が必要です。
EC-CUBE の管理画面にログインいただき、コンテンツ管理 -> キャッシュ管理 のページからキャッシュの削除をお願いいたします。 - 動作確認
フロント画面と管理画面(ログインが必要)それぞれにおいて、基本操作が正常に行えることをご確認ください。
修正方法2: 修正差分を確認して適宜反映する場合(4.0系)
※本修正を実施する前に、Twigの更新を必ず行ってください。
以下のコード差分情報を参照して頂き、必要な箇所に修正を反映してください。
本修正方法はEC-CUBE 4.0.6-p3のバージョンを例として提示しております。
過去バージョンをご利用の場合は、下記修正対象ファイルの修正差分を参考にご対応お願いいたします。
修正差分
- app/config/eccube/packages/twig_extensions.yaml +143 -0
- src/Eccube/Resource/template/default/Product/detail.twig +1 -1
- src/Eccube/Resource/template/default/default_frame.twig +1 -1
- src/Eccube/Twig/Extension/IgnoreTwigSandboxErrorExtension.php +78 -0
- src/Eccube/Twig/Sandbox/SecurityPolicyDecorator.php +47 -0
@@ -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: []
|
@@ -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>
|
@@ -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">
|
@@ -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
|
+
}
|
@@ -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: [email protected]
謝辞
本脆弱性は、
- 株式会社エヌ・エフ・ラボラトリーズ 三浦 剛様
よりご報告いただきました。
この場をお借りして、厚く御礼申し上げます。