Описание проблемы
Processors\Api\Customer\Login (и аналогично Register) при наличии cookie/session API-токена привязывает его к аккаунту (set('customer_id', $customer->id)) без проверки прежнего владельца и без выдачи нового значения токена.
Это классический token fixation: украденный/подставленный guest token после логина жертвы даёт полный доступ к аккаунту.
Шаги воспроизведения
- Attacker получает guest token
T (/customer/token/get или любой protected route с auto-create).
- Victim получает cookie
ms3_token=T (XSS, shared browser, malware, mis-set cookie).
- Victim делает
POST /api/v1/customer/login.
T привязывается к аккаунту victim; attacker с T получает доступ к profile/addresses/orders.
Ожидаемое поведение
На login/register/verify: ротация API-токена (revoke старого guest или выдача нового), session_regenerate_id(true).
Фактическое поведение
// Login.php ~84-98
if ($tokenObj) {
$tokenObj->set('customer_id', $customer->id);
// TTL extend, save — значение token не меняется
}
Окружение
- MiniShop3: beta / REST API
- MODX: 3.x
- PHP: 8.2+
Дополнительный контекст
Отдельно от #369 (checkout email capture). Здесь вектор — login/register bind существующего cookie-токена.
Описание проблемы
Processors\Api\Customer\Login(и аналогично Register) при наличии cookie/session API-токена привязывает его к аккаунту (set('customer_id', $customer->id)) без проверки прежнего владельца и без выдачи нового значения токена.Это классический token fixation: украденный/подставленный guest token после логина жертвы даёт полный доступ к аккаунту.
Шаги воспроизведения
T(/customer/token/getили любой protected route с auto-create).ms3_token=T(XSS, shared browser, malware, mis-set cookie).POST /api/v1/customer/login.Tпривязывается к аккаунту victim; attacker сTполучает доступ к profile/addresses/orders.Ожидаемое поведение
На login/register/verify: ротация API-токена (revoke старого guest или выдача нового),
session_regenerate_id(true).Фактическое поведение
Окружение
Дополнительный контекст
Отдельно от #369 (checkout email capture). Здесь вектор — login/register bind существующего cookie-токена.