Заказ «оплачен», хотя денег никто не платил
Провайдер давно отключён. А его канал уведомлений об оплате продолжал работать.
Заказчик: · NDA
- Доступанонимно
- Оповещениене сработало
- Деньгине двигали
О продукте
Платформа подключала больше 20 платёжных провайдеров. Каждый сообщал результат оплаты через публичный callback — запрос к API платформы. После отключения части провайдеров маршруты их уведомлений продолжали работать.
Где была ошибка
Один старый маршрут принимал GET-запрос с номером платежа без подписи. Обработчик искал платёж только по этому номеру. Он не проверял, совпадает ли провайдер уведомления с провайдером, который обслуживает платёж.
Поэтому уведомление от отключённого канала меняло статус платежа действующего провайдера с NEW на SUCCESS. Номера платежей были последовательными, что упрощало поиск чужих операций. Платформа считала заказ оплаченным без подтверждения поступления денег.
Чем это грозило
- Товар уходит без оплаты
- Финансовые записи расходятся с деньгами
- Сверка не видит подмену
Как доказали
На тестовой среде анонимный GET-запрос перевёл платёж из NEW в SUCCESS без обращения к его провайдеру. Проверка подтвердила именно подмену между каналами: старый маршрут завершил платёж действующего канала.
В боевой проверке журнал также записал чужого провайдера для платежа; оповещение не сработало. Вывод криптовалюты остановили проверки адреса KYT/KYC. Проверка подлинности уведомления этот риск не блокировала.
Как исправили
Отключённая интеграция живёт, пока отвечает её адрес.
Исправлено