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 メルマガ管理プラグインに脆弱性(緊急度: 低)があることが判明いたしました。

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

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

脆弱性の概要

メルマガ管理プラグインにおける CSRF

危険度:

不具合が存在するメルマガ管理プラグインのバージョン:

詳細:

管理画面にログインした状態の管理者権限を持つユーザが、細工されたページに誘導され特定のURLにアクセスした場合、意図せず送信履歴やメルマガテンプレートを削除される CSRF脆弱性。


JVNからの公表内容 (2022/02/22公開)

JVN#67108459: EC-CUBE 用プラグイン「メルマガ管理プラグイン」におけるクロスサイトリクエストフォージェリの脆弱性

修正方法1: プラグインのバージョンアップを行う場合

メルマガ管理プラグインを最新版にバージョンアップしていただくことで、本件の脆弱性は修正されます。
ご利用の方は、速やかにプラグインのバージョンアップをお願いいたします。

修正済みプラグインのバージョン

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

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

対象バージョン

修正差分

■ バージョン 4.1.1 (EC-CUBE 4系対応)

対象ファイル

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系対応)

対象ファイル

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: support@ec-cube.net

謝辞

本脆弱性は、三井物産セキュアディレクション株式会社 山本健太様よりご報告いただきました。
この場をお借りして、厚く御礼申し上げます。