Реальный кейс: как антифрод поймал бы фрод на 4 115 482 ₽ (net)

Реальный кейс 07/2026 (клиент анонимизирован как «клиент-агрегатор»). 4 акта: как копился ущерб при ручной проверке, как те же транзакции увидел бы набор детекторов, что происходит в момент алерта, и во что это обходится в сравнении с ретроспективной симуляцией скоринга.

Легенда сценария

Клиент — «клиент-агрегатор», 24 топливные карты заблокированы административно. Транзакционные сигналы (см. критерии ниже) подтверждены только на 13 картах: 7 «ядро»-карт с последовательными id (…5482, …5483, …5577, …5602, …5653, …6433, …6451), net-оборот 3 570 777 ₽, и 6 более старых картах в «разгонной» фазе, net-оборот 544 705 ₽. Оставшиеся 11 карт (728 501 ₽ оборота) заблокированы превентивно без единого сигнала — в сумму фрода не входят. Две волны по 13 фрод-картам: тихая (02–12.07) — 264 783 ₽ net, 23 покупки, 1 возврат; взрывная (13–20.07), старт по 7 ядро-картам, — 3 850 699 ₽ net, 393 покупки (из 430 транзакций 37 возвратов). Итого 4 115 482 ₽ net, 416 покупок, 38 возвратов. Механика — клонированные реквизиты: одна и та же карта «заправляется» в 3–6 регионах за день, интервалы между транзакциями — 0 минут (физически невозможно для одной машины), 16–37 заправок в сутки на карту ядра (3 показательных дня — см. таблицу профиля ниже). Фрод шёл днём, ночная доля незначительна. Обнаружено и заблокировано вручную ~20.07 — через 8 дней после начала взрывной волны и 19 дней после первых сигналов тихой. Все суммы на странице — чистый оборот (net): покупки за вычетом возвратов топлива (OperationType=Возврат хранится с положительным FullSum, простой SUM без вычета завышал бы обороты).

Методологическая сноска. «Источник: боевая БД fuel_prod1 (PostgreSQL), выгрузка 25.07.2026. Суммы — чистый оборот: покупки за вычетом возвратов топлива (FinanceTransaction.OperationType). Окно кейса: 02–20.07.2026, 13 карт. Все дневные числа и профили карт — фактические строки транзакций, не модель. Регионы — по RegionId АЗС. Ретроспективная симуляция скоринга помечена отдельно.»

День 1 из 19 (02.07)

Акт 1 — как было: 19 дней до обнаружения

7 новых карт (…5482…6451) · взрывная волна 13–20.07 6 старых карт с сигналами · тихая/разгонная волна 02–12.07 остальные карты клиента — визуальный фон, сгенерировано для иллюстрации, не данные
02.07 08.07 13.07 ↓ взрыв 20.07 0 1 млн 2 млн 3 млн 4,12 млн
Накопленный оборот (заблокированные карты)
0 ₽
Оценка невозмещённого ущерба ≈3,5 млн ₽

Подтверждено независимо. Net-оборот ядра из 7 клон-карт — 3 570 777 ₽ (за вычетом всех возвратов топлива) — совпадает с заявленными клиентом ≈3,5 млн ₽ ущерба. Это не оценка «на глаз»: цифра посчитана независимо по прод-БД fuel_prod1.

За всё это время нет ни одного технического сигнала — работающего антифрода на момент кейса не было, обнаружили вручную.

Как это ловится: детекторы и принципы работы

В этом кейсе разом сработали четыре детектора из общего набора — жёсткий факт физически невозможного перемещения и три поведенческих/контекстных сигнала вокруг него. Для каждого: человеческим языком — что он проверяет, по шагам — как считает, и что именно он увидел в реальных данных кейса.

D-04 Impossible travel: физически недостижимые АЗС вес 30–40 · жёсткий факт ✓ главный сигнал кейса

Принцип. Карта не может физически быть на двух АЗС в 400 км друг от друга через 20 минут — считаем скорость перемещения между последовательными заправками.

  1. Берём заправки одной карты подряд по времени за окно в 7 дней.
  2. Считаем расстояние между станциями по координатам — формула хаверсина (сферическое расстояние по широте и долготе).
  3. Делим расстояние на время между заправками — получаем требуемую скорость перемещения.
  4. Если скорость выше 120 км/ч (и между заправками прошло больше минуты) — сигнал.

В этом кейсе: карта …5602 «заправлялась» в 4–5 регионах за один день, минимальный интервал между транзакциями — 0 минут (одновременные заправки в разных регионах). Одна и та же карта физически «в двух местах» — это жёсткий факт клонирования реквизитов, не вероятностная догадка.

D-03 Velocity: серия заправок за короткое окно вес 15–25 · поведенческий ✓ сработал в кейсе

Принцип. Одна машина физически не может заправляться раз в несколько минут весь день. Если карта делает серию заправок с очень короткими паузами между ними — ей пользуются не так, как обычной картой одной машины.

  1. Берём все заправки карты за 7 дней, сортируем по времени.
  2. Считаем интервал между каждой соседней парой заправок.
  3. Если интервал меньше 30 минут — считаем пару «быстрой».
  4. Если таких «быстрых» заправок за сутки набирается 3 и больше — сигнал.

В этом кейсе: карта …5602 делала 16–37 заправок в сутки (3 показательных дня, см. таблицу профиля в акте 2) при разумной норме 1–3 заправки в день — velocity сработал в первый же день взрывной волны, 13.07.

D-02 Объём/сумма вне персональной нормы карты вес 15 ✓ сработал в кейсе

Принцип. У каждой карты есть свой типичный объём разовой заправки. Когда новая карта без истории сразу начинает лить по 100+ литров за раз — это выше нормального разового объёма и требует объяснения.

  1. Строим персональный 99-й процентиль объёма заправки карты по истории за 180 дней (нужно минимум 20 заправок).
  2. Сравниваем каждую новую заправку с этим порогом.
  3. Если объём больше чем в 1,5 раза выше порога и превышает 100 литров — сигнал.
  4. Для карт без собственной истории — сравнение с нормой компании.

В этом кейсе: 7 карт взрывной волны не имели вообще никакой истории — выпущены пачкой и сразу в бой — и с первого же дня шли чеки на 115–180 литров, 11–14 тыс ₽: далеко за пределами любого разумного разового объёма для новой карты.

D-11 Дрейф поведения (карта и компания) вес 10–15 · контекстный ✓ сработал в кейсе

Принцип. У карты и у компании в целом есть привычный недельный оборот. Если он резко и статистически значимо вырастает по сравнению с историей — это ранний сигнал дрейфа поведения, даже если ни одна отдельная транзакция сама по себе не выглядит подозрительной.

  1. Считаем сумму по карте и по компании за каждую неделю.
  2. Строим скользящий базлайн — среднее и разброс по 12 предыдущим неделям.
  3. Считаем z-score текущей недели относительно этого базлайна.
  4. Если z-score 3 и больше (статистически значимый выброс) — сигнал.

В этом кейсе: дневная сумма компании выросла в 5–10 раз к базлайну в день взрыва (13.07). При рабочем скоринге тихая волна 02.07 тоже дала бы жёлтый сигнал — за 11 дней до взрыва.

Скоринг. Каждый детектор — вес в скоринге карты: жёсткие факты (impossible travel, дубли транзакций, мёртвая карта) — 30–40 баллов, поведенческие (velocity, ночная активность, круглые суммы) — 15–25, контекстные — 10–15. Сумма активных сигналов за 7 дней = скор карты (максимум 100). При 50 — жёлтый алерт в очередь на разбор, при 75 — красный алерт с автоматическим фризом карты по конфигу.

В этом кейсе сработали 4 из 14 детекторов системы — остальные 10 (дубли номеров транзакций, круглые суммы, смена типа топлива, добор лимитов, offline-операции и другие) не проявились в этом конкретном паттерне мошенничества, но работают на общем потоке транзакций. Полный каталог всех 14 детекторов, их принципов и алгоритмов → «Детекторы».

Почему это фрод

24 карты клиента заблокированы административно, но в сумму фрода на этой странице попали только 13 из них — каждая по проверяемому факту из транзакций, не по мнению:

  1. Одновременность. Интервал между заправками одной карты 0–5 минут — у 7 карт ядра минимальный интервал 0 минут.
  2. География. Одна карта за один день заправляется в 3–6 разных регионах — физически недостижимо для одной машины.
  3. Темп. 16–37 заправок в день (3 показательных дня карты …5602) при норме парка 1–3.
  4. Синхронный старт. 7 карт с последовательными номерами выпуска включаются в один день (13.07) сразу с максимальным темпом — у легитимных новых карт есть период раскатки.

Карты, не прошедшие ни по одному критерию (11 шт., 728 501 ₽ оборота), из суммы фрода исключены, хотя тоже были заблокированы превентивно.

Раскладка срабатываний детекторов (акты 2–3) — ретроспективная симуляция по правилам из каталога детекторов D-01…D-14: реального антифрода на момент кейса не было, фрод поймали вручную (акт 1). Схема данных — реальная fuel_prod1.

«Кейс реальный: агрегаты сняты с прод-БД fuel_prod1 22–25.07.2026, карты и компания анонимизированы. Точная сумма ущерба (≈3,5 млн ₽) — независимо подтверждена как net-оборот ядра из 7 клон-карт (3 570 777 ₽); оборот по 13 картам с подтверждёнными фрод-сигналами (из 24 заблокированных) за окно — 4 115 482 ₽ net, 416 покупок, 38 возвратов. Сумма фрода включает только карты с объективными транзакционными сигналами (одновременность, география, темп); превентивно заблокированные карты без сигналов в неё не входят. Раскладка срабатываний детекторов — ретроспективная симуляция по описанным правилам». Все суммы на странице — чистый оборот (покупки за вычетом возвратов топлива, OperationType=Возврат). Числа страницы: дней в сценарии 19, день алерта (счёт от начала окна) 12.