Ghostfolio — это программное обеспечение для управления активами с открытым исходным кодом. До версии 3.4.0 обработчик URL-адреса успешной проверки Stripe в Ghostfolio по адресу `GET /api/v1/subscription/stripe/callback?checkoutSessionId=<id>` извлекает сеанс Stripe Checkout по идентификатору и безоговорочно предоставляет Премиум-подписку на `client_reference_id` сеанса — без проверки `session.pay_status` или `session.status`. Не существует отдельной конечной точки веб-перехватчика Stripe с проверкой Stripe-Signature; этот обратный вызов — единственный путь кода, который создает подписки, управляемые Stripe.
Любой прошедший аутентификацию пользователь может самостоятельно оформить подписку Premium на 1 год, даже не заплатив. Версия 3.4.0 отклоняет сеансы, если только `session.pay_status === 'paid'` И `session.status === 'complete'` (не удалось закрыть). Кроме того, новый уникальный столбец «stripeCheckoutSessionId» → сеанс не может быть активирован дважды (безопасно для гонок благодаря уникальному ограничению БД).
Показать оригинальное описание (EN)
Ghostfolio is an open source wealth management software. Prior to version 3.4.0, Ghostfolio's Stripe checkout success-URL handler at `GET /api/v1/subscription/stripe/callback?checkoutSessionId=<id>` retrieves the Stripe Checkout Session by ID and unconditionally grants a Premium subscription to the session's `client_reference_id` — without ever checking `session.payment_status` or `session.status`. There is no separate Stripe webhook endpoint with `stripe-signature` verification; this callback is the sole code path that creates Stripe-driven subscriptions. Any authenticated user can self-grant a 1-year Premium subscription without ever paying. Version 3.4.0 rejects sessions unless `session.payment_status === 'paid'` AND `session.status === 'complete'` (fails closed). Additionally, new unique `stripeCheckoutSessionId` column → a session can't be redeemed twice (race-safe via DB unique constraint).
Характеристики атаки
Последствия
Строка CVSS v3.1