Skip to content

Commit fad4f7f

Browse files
committed
fix: MFAバイパス脆弱性の修正
2FA設定済みユーザーが未認証状態で設定画面にアクセスし、 既存の2FAキーを上書きできる脆弱性を修正 - TwoFactorAuthController: 2FAキー設定済みの場合は認証画面にリダイレクト - TwoFactorAuthListener: admin_two_factor_auth_setを条件付き除外に変更
1 parent cd8fa98 commit fad4f7f

2 files changed

Lines changed: 24 additions & 3 deletions

File tree

src/Eccube/Controller/Admin/Setting/System/TwoFactorAuthController.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,13 @@ public function set(Request $request)
109109
if (!$this->twoFactorAuthService->isEnabled() || $this->twoFactorAuthService->isAuth($Member)) {
110110
return $this->redirectToRoute('admin_homepage');
111111
}
112+
113+
// 既に2FAキーが設定されている場合は、認証画面にリダイレクト
114+
// 2FA未認証状態での再設定を防ぐ(MFAバイパス脆弱性対策)
115+
if ($Member->getTwoFactorAuthKey()) {
116+
return $this->redirectToRoute('admin_two_factor_auth');
117+
}
118+
112119
$res = $this->createResponse($request);
113120

114121
return $res;

src/Eccube/EventListener/TwoFactorAuthListener.php

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ class TwoFactorAuthListener implements EventSubscriberInterface
2828
/**
2929
* @var array 2段階認証のチェックを除外するroute
3030
*/
31-
public const ROUTE_EXCLUDE = ['admin_two_factor_auth', 'admin_two_factor_auth_set'];
31+
public const ROUTE_EXCLUDE = ['admin_two_factor_auth'];
32+
33+
/**
34+
* @var array 2段階認証キー未設定時のみ除外するroute
35+
*/
36+
public const ROUTE_EXCLUDE_WHEN_NOT_CONFIGURED = ['admin_two_factor_auth_set'];
3237

3338
/**
3439
* @var EccubeConfig
@@ -89,9 +94,18 @@ public function onKernelController(ControllerArgumentsEvent $event)
8994
return;
9095
}
9196

97+
$Member = $this->requestContext->getCurrentUser();
98+
99+
// 2FAキー未設定時のみ除外するルートのチェック
100+
// 既に2FAキーが設定されている場合は除外しない(認証が必要)
101+
if (in_array($route, self::ROUTE_EXCLUDE_WHEN_NOT_CONFIGURED)) {
102+
if ($Member instanceof Member && !$Member->getTwoFactorAuthKey()) {
103+
return;
104+
}
105+
}
106+
92107
if (
93-
($Member = $this->requestContext->getCurrentUser())
94-
&& $Member instanceof Member
108+
$Member instanceof Member
95109
&& $Member->isTwoFactorAuthEnabled()
96110
&& !$this->twoFactorAuthService->isAuth($Member)
97111
) {

0 commit comments

Comments
 (0)