EC-CUBE メルマガ管理プラグインにおける CSRFの脆弱性 (JVN#67108459)
更新履歴
- 2022/02/22 16:00
- 「脆弱性の概要」に、JVNからの公表内容情報へのリンクを追加
- 2022/02/21 12:00
- プラグイン最新版のリリースに伴い、修正方法1 を更新
- 謝辞の追加
- 2022/02/09 13:00
- パートナー向けの事前告知としてページ公開
EC-CUBE メルマガ管理プラグインにおける CSRFの脆弱性のお知らせ
EC-CUBE メルマガ管理プラグインに脆弱性(緊急度: 低)があることが判明いたしました。
脆弱性そのものは、修正ファイルの反映によりすぐに解決するものです。以下のいずれかの方法により、ご対応をお願いいたします。
- 修正方法1: プラグインのバージョンアップを行う場合
- 修正方法2: 修正差分を確認して適宜反映する場合
皆様にはお手数おかけし誠に申し訳ございません。
本脆弱性における被害報告は現時点でございませんが、できるだけ速やかにご対応をお願いいたします。
脆弱性の概要
メルマガ管理プラグインにおける CSRF
危険度:
低
不具合が存在するメルマガ管理プラグインのバージョン:
- 4.0.0〜4.1.1 (EC-CUBE 4系対応)
- 1.0.0〜1.0.4 (EC-CUBE 3系対応)
詳細:
管理画面にログインした状態の管理者権限を持つユーザが、細工されたページに誘導され特定のURLにアクセスした場合、意図せず送信履歴やメルマガテンプレートを削除される CSRF脆弱性。
JVNからの公表内容 (2022/02/22公開)
JVN#67108459: EC-CUBE 用プラグイン「メルマガ管理プラグイン」におけるクロスサイトリクエストフォージェリの脆弱性
修正方法1: プラグインのバージョンアップを行う場合
メルマガ管理プラグインを最新版にバージョンアップしていただくことで、本件の脆弱性は修正されます。
ご利用の方は、速やかにプラグインのバージョンアップをお願いいたします。
修正済みプラグインのバージョン
- バージョン 4.1.2 (EC-CUBE 4系対応)
- バージョン 1.0.5 (EC-CUBE 3系対応)
修正方法2: 修正差分を確認して適宜反映する場合
下記のコード差分情報を参照して頂き、必要な箇所に修正を反映してください。
対象バージョン
- バージョン 4.1.1 (EC-CUBE 4系対応)
- バージョン 1.0.4 (EC-CUBE 3系対応)
修正差分
■ バージョン 4.1.1 (EC-CUBE 4系対応)
対象ファイル
- /app/Plugin/MailMagazine4/Controller/MailMagazineHistoryController.php
- /app/Plugin/MailMagazine4/Controller/MailMagazineTemplateController.php
- /app/Plugin/MailMagazine4/Resource/template/admin/history_list.twig
- /app/Plugin/MailMagazine4/Resource/template/admin/template_list.twig
Controller/MailMagazineHistoryController.php
CHANGED
@@ -213,6 +213,7 @@ class MailMagazineHistoryController extends AbstractController
|
|
213
213
|
public function delete(MailMagazineSendHistory $mailMagazineSendHistory)
|
214
214
|
{
|
215
215
|
try {
|
216
|
+
$this->isTokenValid();
|
216
217
|
$id = $mailMagazineSendHistory->getId();
|
217
218
|
$this->mailMagazineSendHistoryRepository->delete($mailMagazineSendHistory);
|
218
219
|
$this->entityManager->flush();
|
Controller/MailMagazineTemplateController.php
CHANGED
@@ -95,6 +95,7 @@ class MailMagazineTemplateController extends AbstractController
|
|
95
95
|
// パラメータ$idにマッチするデータが存在するか判定
|
96
96
|
// POSTかつ$idに対応するdtb_mailmagazine_templateのレコードがあれば、del_flg = 1に設定して更新
|
97
97
|
try {
|
98
|
+
$this->isTokenValid();
|
98
99
|
$this->mailMagazineTemplateRepository->delete($mailMagazineTemplate);
|
99
100
|
$this->entityManager->flush();
|
100
101
|
$this->addSuccess('admin.delete.complete', 'admin');
|
Resource/template/admin/history_list.twig
CHANGED
@@ -76,6 +76,7 @@ $(function () {
|
|
76
76
|
|
77
77
|
{% block main %}
|
78
78
|
<form name="form1" id="form1" method="post" action="">
|
79
|
+
<input type="hidden" name="_token" value="{{ csrf_token(constant('Eccube\\Common\\Constant::TOKEN_NAME')) }}">
|
79
80
|
<div class="c-outsideBlock__contents mb-5">
|
80
81
|
{% if pagination %}
|
81
82
|
<span class="font-weight-bold ml-2">{{ 'admin.mailmagazine.history.search_count'|trans({'%count%':pagination.totalItemCount}) }}</span>
|
Resource/template/admin/template_list.twig
CHANGED
@@ -69,6 +69,7 @@
|
|
69
69
|
{{ 'common.cancel'|trans }}
|
70
70
|
</button>
|
71
71
|
<form action="{{ url('plugin_mail_magazine_template_delete', { id: Template.id }) }}" method="post" enctype="application/x-www-form-urlencoded">
|
72
|
+
<input type="hidden" name="_token" value="{{ csrf_token(constant('Eccube\\Common\\Constant::TOKEN_NAME')) }}">
|
72
73
|
<button type="submit" class="btn btn-ec-delete">
|
73
74
|
{{ 'common.delete'|trans }}
|
74
75
|
</button>
|
■ バージョン 1.0.4 (EC-CUBE 3系対応)
対象ファイル
- /app/Plugin/MailMagazine/Controller/MailMagazineHistoryController.php
- /app/Plugin/MailMagazine/Controller/MailMagazineTemplateController.php
- /app/Plugin/MailMagazine/Resource/template/admin/history_list.twig
- /app/Plugin/MailMagazine/Resource/template/admin/template_list.twig
Controller/MailMagazineHistoryController.php
CHANGED
@@ -13,6 +13,7 @@ namespace Plugin\MailMagazine\Controller;
|
|
13
13
|
|
14
14
|
use Eccube\Application;
|
15
15
|
use Eccube\Common\Constant;
|
16
|
+
use Eccube\Controller\AbstractController;
|
16
17
|
use Eccube\Entity\Master\Pref;
|
17
18
|
use Knp\Component\Pager\Paginator;
|
18
19
|
use Plugin\MailMagazine\Entity\MailMagazineSendHistory;
|
@@ -23,7 +24,7 @@ use Symfony\Component\HttpFoundation\Request;
|
|
23
24
|
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
|
24
25
|
use Doctrine\Common\Collections\ArrayCollection;
|
25
26
|
|
26
|
-
class MailMagazineHistoryController
|
27
|
+
class MailMagazineHistoryController extends AbstractController
|
27
28
|
{
|
28
29
|
public function __construct()
|
29
30
|
{
|
@@ -234,6 +235,7 @@ class MailMagazineHistoryController
|
|
234
235
|
*/
|
235
236
|
public function delete(Application $app, Request $request, $id)
|
236
237
|
{
|
238
|
+
$this->isTokenValid($app);
|
237
239
|
// POSTかどうか判定
|
238
240
|
if ('POST' !== $request->getMethod()) {
|
239
241
|
throw new BadRequestHttpException();
|
Controller/MailMagazineTemplateController.php
CHANGED
@@ -12,12 +12,13 @@
|
|
12
12
|
namespace Plugin\MailMagazine\Controller;
|
13
13
|
|
14
14
|
use Eccube\Application;
|
15
|
+
use Eccube\Controller\AbstractController;
|
15
16
|
use Plugin\MailMagazine\Entity\MailMagazineTemplate;
|
16
17
|
use Plugin\MailMagazine\Repository\MailMagazineTemplateRepository;
|
17
18
|
use Symfony\Component\HttpFoundation\Request;
|
18
19
|
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
|
19
20
|
|
20
|
-
class MailMagazineTemplateController
|
21
|
+
class MailMagazineTemplateController extends AbstractController
|
21
22
|
{
|
22
23
|
public function __construct()
|
23
24
|
{
|
@@ -85,6 +86,7 @@ class MailMagazineTemplateController
|
|
85
86
|
// POSTかどうか判定
|
86
87
|
// パラメータ$idにマッチするデータが存在するか判定
|
87
88
|
// POSTかつ$idに対応するdtb_mailmagazine_templateのレコードがあれば、del_flg = 1に設定して更新
|
89
|
+
$this->isTokenValid($app);
|
88
90
|
if ('POST' === $request->getMethod()) {
|
89
91
|
// idがからの場合はメルマガテンプレート一覧へリダイレクト
|
90
92
|
if (is_null($id) || strlen($id) == 0) {
|
Resource/template/admin/history_list.twig
CHANGED
@@ -84,6 +84,7 @@ $(function () {
|
|
84
84
|
{% block main %}
|
85
85
|
<form name="form1" id="form1" method="post" action="">
|
86
86
|
|
87
|
+
<input type="hidden" name="{{ constant('Eccube\\Common\\Constant::TOKEN_NAME') }}" value="{{ csrf_token(constant('Eccube\\Common\\Constant::TOKEN_NAME')) }}">
|
87
88
|
{% if pagination %}
|
88
89
|
<div class="row">
|
89
90
|
<div class="col-md-12">
|
Resource/template/admin/template_list.twig
CHANGED
@@ -46,6 +46,7 @@ function changeAction(action) {
|
|
46
46
|
</div><!-- /.box-header -->
|
47
47
|
<div class="box-body">
|
48
48
|
<form name="form1" id="form1" method="post" action="">
|
49
|
+
<input type="hidden" name="{{ constant('Eccube\\Common\\Constant::TOKEN_NAME') }}" value="{{ csrf_token(constant('Eccube\\Common\\Constant::TOKEN_NAME')) }}">
|
49
50
|
<div class="table_list">
|
50
51
|
<div class="table-responsive with-border">
|
51
52
|
<table class="table table-striped">
|
問い合わせ先
本脆弱性に関するお問合せ:
EC-CUBE 運営チーム
MAIL: [email protected]
謝辞
本脆弱性は、三井物産セキュアディレクション株式会社 山本健太様よりご報告いただきました。
この場をお借りして、厚く御礼申し上げます。