Security
Headlines
HeadlinesLatestCVEs

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.

CVE
#csrf#vulnerability

更新履歴

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]

謝辞

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

CVE: Latest News

CVE-2023-50976: Transactions API Authorization by oleiman · Pull Request #14969 · redpanda-data/redpanda
CVE-2023-6905
CVE-2023-6903
CVE-2023-6904
CVE-2023-3907