Реальный кейс: как антифрод поймал бы фрод на 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 АЗС. Ретроспективная симуляция скоринга помечена
отдельно.»
Обнаружен prefers-reduced-motion: анимация отключена,
показаны финальные кадры каждого акта. Скраббер и вкладки акта работают как обычно.
Акт 1 — как было: 19 дней до обнаружения
Подтверждено независимо. Net-оборот ядра из
7 клон-карт — 3 570 777 ₽ (за вычетом всех возвратов топлива) — совпадает с
заявленными клиентом ≈3,5 млн ₽ ущерба. Это не оценка «на глаз»: цифра посчитана независимо
по прод-БД fuel_prod1.
За всё это время нет ни одного технического сигнала — работающего антифрода на момент кейса не было, обнаружили вручную.
Акт 2 — как видит антифрод
Та же дневная серия прогоняется через панель детекторов. Тихая волна (02–12.07) технически не поднимает ни одного детектора — это честный итог, не упрощение: фрод шёл в рамках профиля обычных заправок. 13.07, в первые часы взрывной волны, разом загораются четыре детектора. D-01 (ночная активность) в этом кейсе не применим — фрод дневной, доля ночных транзакций незначительна; его карточка ниже всегда неактивна, честно помечено.
Скор карты …5602 держится на 70 — жёлтая зона (50–74), красный порог по одной карте не пройден: D-04(35)+D-03(20)+D-02(15) = 70. D-11 (дрейф) — сигнал уровня компании, отдельный от скора конкретной карты, поэтому в сумму выше не входит. Как совокупный скор компании всё же пересекает красный порог 75 в тот же вечер — акт 3.
| Дата | Заправок | Возвратов | АЗС | Регионов | Сумма (net) |
|---|---|---|---|---|---|
| 14.07 | 16 | 2 | 5 | 4 | 188 066 ₽ |
| 17.07 | 37 | 0 | 6 | 5 | 301 579 ₽ |
| 20.07 | 20 | 1 | 6 | 5 | 222 175 ₽ |
17.07 — пиковый день профиля. 37 заправок за сутки на одной карте, на 6 АЗС в 5 регионах — физически невозможно для одной машины.
Минимальный интервал между транзакциями карты — 0 минут (одновременные заправки в разных регионах): физически невозможно для одной машины ⇒ клонированные реквизиты.
Акт 3 — алерт
Вечером 13.07 скор карты …5602 держится на 70 (жёлтая зона). Совокупный скор компании пересекает красный порог 75 в тот же день за счёт второй карты той же пачки с похожим паттерном.
↑ + вторая карта пачки → совокупный скор компании ≥75 — красный алерт
Акт 4 — счёт
Два независимых сравнения — ущерб в рублях и время до реакции в днях — на своих шкалах, без совмещения разных единиц на одном графике. Столбцы «Фактически» — прод-данные; столбцы «С антифродом» — оценочный контрфактический сценарий (не факт): что случилось бы, работай нынешний набор детекторов в реальном времени на этих же транзакциях.
Оценочный сценарий, не факт: предотвратимо ≈85–90% ущерба, если алерт вечером 13.07 (скор 70→75+ по D-04+D-03+D-02) привёл бы к фризу 13–14.07 — ущерб ограничился бы днём начала взрыва плюс хвостом до фриза (0,3–0,7 млн ₽, оценочный диапазон) против фактических 4 115 482 ₽ net-оборота 13 фрод-карт (оценка невозмещённого ущерба — ≈3,5 млн ₽, подтверждена как net-оборот ядра 7 карт — 3 570 777 ₽).
Жёлтый сигнал по разгонной фазе (6 старых карт с сигналами: интервалы 3 минуты, 2 региона в день) был технически возможен уже 03.07 — за 10 дней до начала взрывной волны 13.07. Цена ложноположительных при пороге 75 в этом кейсе не считалась отдельно — оценка на исторических данных компании, не на портфеле всех клиентов.
Как это ловится: детекторы и принципы работы
В этом кейсе разом сработали четыре детектора из общего набора — жёсткий факт физически невозможного перемещения и три поведенческих/контекстных сигнала вокруг него. Для каждого: человеческим языком — что он проверяет, по шагам — как считает, и что именно он увидел в реальных данных кейса.
Принцип. Карта не может физически быть на двух АЗС в 400 км друг от друга через 20 минут — считаем скорость перемещения между последовательными заправками.
- Берём заправки одной карты подряд по времени за окно в 7 дней.
- Считаем расстояние между станциями по координатам — формула хаверсина (сферическое расстояние по широте и долготе).
- Делим расстояние на время между заправками — получаем требуемую скорость перемещения.
- Если скорость выше 120 км/ч (и между заправками прошло больше минуты) — сигнал.
В этом кейсе: карта …5602 «заправлялась» в 4–5 регионах за один день, минимальный интервал между транзакциями — 0 минут (одновременные заправки в разных регионах). Одна и та же карта физически «в двух местах» — это жёсткий факт клонирования реквизитов, не вероятностная догадка.
Принцип. Одна машина физически не может заправляться раз в несколько минут весь день. Если карта делает серию заправок с очень короткими паузами между ними — ей пользуются не так, как обычной картой одной машины.
- Берём все заправки карты за 7 дней, сортируем по времени.
- Считаем интервал между каждой соседней парой заправок.
- Если интервал меньше 30 минут — считаем пару «быстрой».
- Если таких «быстрых» заправок за сутки набирается 3 и больше — сигнал.
В этом кейсе: карта …5602 делала 16–37 заправок в сутки (3 показательных дня, см. таблицу профиля в акте 2) при разумной норме 1–3 заправки в день — velocity сработал в первый же день взрывной волны, 13.07.
Принцип. У каждой карты есть свой типичный объём разовой заправки. Когда новая карта без истории сразу начинает лить по 100+ литров за раз — это выше нормального разового объёма и требует объяснения.
- Строим персональный 99-й процентиль объёма заправки карты по истории за 180 дней (нужно минимум 20 заправок).
- Сравниваем каждую новую заправку с этим порогом.
- Если объём больше чем в 1,5 раза выше порога и превышает 100 литров — сигнал.
- Для карт без собственной истории — сравнение с нормой компании.
В этом кейсе: 7 карт взрывной волны не имели вообще никакой истории — выпущены пачкой и сразу в бой — и с первого же дня шли чеки на 115–180 литров, 11–14 тыс ₽: далеко за пределами любого разумного разового объёма для новой карты.
Принцип. У карты и у компании в целом есть привычный недельный оборот. Если он резко и статистически значимо вырастает по сравнению с историей — это ранний сигнал дрейфа поведения, даже если ни одна отдельная транзакция сама по себе не выглядит подозрительной.
- Считаем сумму по карте и по компании за каждую неделю.
- Строим скользящий базлайн — среднее и разброс по 12 предыдущим неделям.
- Считаем z-score текущей недели относительно этого базлайна.
- Если z-score 3 и больше (статистически значимый выброс) — сигнал.
В этом кейсе: дневная сумма компании выросла в 5–10 раз к базлайну в день взрыва (13.07). При рабочем скоринге тихая волна 02.07 тоже дала бы жёлтый сигнал — за 11 дней до взрыва.
В этом кейсе сработали 4 из 14 детекторов системы — остальные 10 (дубли номеров транзакций, круглые суммы, смена типа топлива, добор лимитов, offline-операции и другие) не проявились в этом конкретном паттерне мошенничества, но работают на общем потоке транзакций. Полный каталог всех 14 детекторов, их принципов и алгоритмов → «Детекторы».
Почему это фрод
24 карты клиента заблокированы административно, но в сумму фрода на этой странице попали только 13 из них — каждая по проверяемому факту из транзакций, не по мнению:
- Одновременность. Интервал между заправками одной карты 0–5 минут — у 7 карт ядра минимальный интервал 0 минут.
- География. Одна карта за один день заправляется в 3–6 разных регионах — физически недостижимо для одной машины.
- Темп. 16–37 заправок в день (3 показательных дня карты …5602) при норме парка 1–3.
- Синхронный старт. 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.