Headline
CVE-2022-21179: EC-CUBE メルマガ管理プラグインにおける CSRFの脆弱性 (JVN#67108459)
Cross-site request forgery (CSRF) vulnerability in EC-CUBE plugin ‘Mail Magazine Management Plugin’ ver4.0.0 to 4.1.1 (for EC-CUBE 4 series) and ver1.0.0 to 1.0.4 (for EC-CUBE 3 series) allows a remote unauthenticated attacker to hijack the authentication of an administrator via a specially crafted page, and Mail Magazine Templates and/or transmitted history information may be deleted unintendedly.
更新履歴
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
@@ -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();
@@ -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’);
@@ -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>
@@ -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
@@ -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();
@@ -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) {
@@ -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">
@@ -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]
謝辞
本脆弱性は、三井物産セキュアディレクション株式会社 山本健太様よりご報告いただきました。
この場をお借りして、厚く御礼申し上げます。