EC-CUBE / EC-CUBE/ec-cube2

[Security] 認証: パスワードリセットとセッション管理の改善

Open
#1,336 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
PHP
Stars
92
Forks
97
Avg merge
4d 2h
Merged PRs (30d)
9

Description

## 概要

パスワードリセット機能、セッション管理、CSRFトークン生成、ログイン試行制限において、セキュリティ上の不備が複数存在します。

## 深刻度: Critical / High / Medium

## 脆弱性詳細

### 1. [Critical] 脆弱なパスワードリセット機構

**ファイル:** `data/class/pages/forgot/LC_Page_Forgot.php` (L228-238)

```php
$new_password = GC_Utils_Ex::gfMakePassword(8);
$sqlval['password'] = $new_password;
SC_Helper_Customer_Ex::sfEditCustomerData($sqlval, $result[0]['customer_id']);
```

**問題点:**
- セキュアなリセットトークンを使用せず、パスワードを即時変更
- 新パスワードをメールで平文送信
- `FORGOT_MAIL == 0` の場合、通知なしにパスワードが変更される
- セキュリティ質問によるリセットは推測・ブルートフォースに脆弱

**修正案:**
- 時限付き(1時間等)リセットトークンをメールで送信するフローに変更
- `bin2hex(random_bytes(32))` でトークン生成
- トークン検証後にユーザー自身が新パスワードを設定

### 2. [High] ログアウト時のセッション固定

**ファイル:** `data/class/SC_Customer.php` (L210-232)

```php
public function EndSession()
{
unset($_SESSION['customer']);
SC_Helper_Purchase_Ex::unsetAllShippingTemp(true);
SC_Helper_Session_Ex::destroyToken();
// session_regenerate_id() が呼ばれていない
}
```

**修正案:** `SC_Session_Ex::regenerateSID()` をログアウト処理に追加

### 3. [Medium-High] 弱いCSRFトークン生成

**ファイル:** `data/class/helper/SC_Helper_Session.php` (L189-192)

```php
public static function createToken()
{
return sha1(uniqid(rand(), true));
}
```

**問題点:**
- `uniqid()` はマイクロ秒ベースで予測可能
- `rand()` は暗号学的に安全ではない

**修正案:**
```php
public static function createToken()
{
return bin2hex(random_bytes(32));
}
```

### 4. [Medium] ログイン試行のレート制限不足

**ファイル:** `data/class/pages/frontparts/LC_Page_FrontParts_LoginCheck.php` (L145-148)

```php
sleep(LOGIN_RETRY_INTERVAL);
```

**問題点:**
- `sleep()` のみでアカウントロックアウト機構なし
- IP ベースのレート制限なし
- 分散ブルートフォース攻撃に対して無防備

**修正案:**
- 失敗回数のDB記録とアカウントロックアウト実装
- 指数バックオフの導入
- 一定回数失敗後のCAPTCHA要求

## 影響範囲

アカウント乗っ取り、セッションハイジャック、ブルートフォース攻撃によるアカウント侵害の可能性。

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.