Как обнаружить бот-фарму: velocity-check и графовый анализ связей аккаунтов

Финтех-проект, утро понедельника. За ночь в базе появилось 12 тысяч новых аккаунтов. Время заполнения регистрационной формы у каждого — от 3.8 до 4.3 секунды. Разброс настолько мал, что ни один живой человек не способен его воспроизвести. По данным Imperva Bad Bot Report 2024, почти треть интернет-трафика генерируется вредоносными ботами, а глобальные потери от бот-атак измеряются миллиардами долларов ежегодно. CAPTCHA бот-фармы обходят давно — это не защита, а спид-бамп. Ниже разбираю методы, которыми антифрод-аналитик реально отделяет ботов от людей: velocity-check правила, графовый анализ связей и поведенческую аналитику сессий.
Зачем фродерам бот-фармы: бизнес-логика атаки
Перед тем как разбирать детекцию, нужно понять — зачем атакующему тысячи аккаунтов. Без этого правила будут шаблонными, без привязки к реальным угрозам.
Бот-фарма — набор устройств (физических или виртуальных), которые массово создают и «прогревают» аккаунты для последующего фрода. Если говорить на языке MITRE ATT&CK (это открытая база тактик и техник атак; T-коды вроде T1585 — её идентификаторы, по ним удобно искать описание конкретной техники), создание фейковых аккаунтов попадает в тактику Resource Development:
- T1585.001 — Social Media Accounts: массовое создание аккаунтов в соцсетях для дальнейших операций
- T1585.002 — Email Accounts: регистрация почтовых ящиков как подготовка к атаке
- T1585.003 — Cloud Accounts: облачные аккаунты для инфраструктуры
- T1583.005 — Botnet: покупка или создание ботнета для автоматизации
Конечная цель — T1657 Financial Theft (тактика Impact): кража денег через промо-абьюз, кардинг, отмывание средств или накрутку реферальных программ.
Фрод-цепочка на практике:
- Подготовка инфраструктуры — закупка прокси, SIM-карт, виртуальных устройств
- Массовая регистрация — создание сотен или тысяч аккаунтов
- Прогрев — имитация активности, чтобы обойти начальные фильтры сервиса
- Монетизация — вывод промо-бонусов, кардинг, перепродажа «прогретых» аккаунтов
По OWASP API Security Top 10 (2023) этот сценарий напрямую соответствует API6:2023 — Unrestricted Access to Sensitive Business Flows: бизнес-логика (регистрация, промо-акции) доступна для автоматизированного злоупотребления без должной защиты. Антифрод-аналитик вмешивается на этапах 2 и 3 — чем раньше обнаружен кластер фейковых аккаунтов, тем меньше ущерб на этапе 4.
Антифрод-аналитик и паттерны сессий: что выдаёт бот-фарму
Сессия — непрерывный период взаимодействия пользователя с сервисом: от захода на сайт до закрытия вкладки или таймаута. У реального человека каждая сессия уникальна: он отвлекается, перечитывает, ошибается. У бота сессии воспроизводимы с минимальным разбросом.
На что антифрод-аналитик смотрит в первую очередь:
Одинаковые тайминги форм. Живой пользователь заполняет регистрационную форму за 15–90 секунд с большим разбросом. Бот-фарма показывает кластер в диапазоне 3–5 секунд. Если 200 аккаунтов за час показывают время заполнения 4.1 ± 0.3 секунды — это автоматизация.
Линейные переходы между страницами. Человек ходит по сайту хаотично: заходит на главную, кликает в каталог, возвращается, идёт в корзину. Бот идёт строго по маршруту: главная → регистрация → подтверждение → выход. Никаких возвратов, никаких «лишних» кликов.
Отсутствие ошибок. По данным Feedzai, люди регулярно забывают пароли, делают опечатки, возвращаются к редактированию полей формы. Боты не ошибаются. Сессия без единой коррекции ввода — подозрительный сигнал.
Неестественные паттерны мыши и клавиатуры. По исследованиям Transmit Security Research Labs, мышь бота движется по прямым линиям или рандомным дугам без характерных человеческих «подрагиваний». Скорость набора текста у бота либо аномально ровная (каждый символ через одинаковый интервал), либо мгновенная — вставка из буфера обмена.
Совпадающее разрешение экрана и User-Agent. 500 новых аккаунтов с одного разрешения (скажем, 1920×1080) и одного User-Agent — ещё не приговор. Но в комбинации с другими сигналами — весомый индикатор.
Velocity-check: считаем частоту событий за окно времени
Velocity-check (проверка скорости) — правило, которое считает количество определённых событий за заданный временной промежуток. Превышен порог — аккаунт или IP помечается как подозрительный. Логика простая: бот-фарма создаёт аккаунты быстрее людей, и velocity-check ловит этот «темп» количественно.
По данным Transmit Security, ключевые velocity-фичи при детекции bot-фарм:
- Количество регистраций с одного IP за час или сутки
- Число неудачных логинов с одного устройства
- Частота переходов между страницами за минуту
- Количество промо-активаций с одного device fingerprint (отпечатка устройства — уникального набора параметров браузера и железа, подробнее о нём ниже)
Правило строится по шаблону: «если больше N событий типа X с группировкой по Y за окно Z минут — пометить».
Пример SQL-запроса для velocity-check регистраций по IP (синтаксис PostgreSQL; в ClickHouse интервал записывается без кавычек: INTERVAL 1 HOUR):
SELECT ip_address, COUNT(*) AS reg_count
FROM registrations
WHERE created_at >= NOW() - INTERVAL '1 hour'
GROUP BY ip_address
HAVING COUNT(*) > 5
ORDER BY reg_count DESC;
Что делает запрос: выбирает все IP-адреса, с которых за последний час зарегистрировано больше 5 аккаунтов. Порог «5» — стартовая точка; для конкретного сервиса (маркетплейс, банк, игровая платформа) его подбирают по историческим данным. Запрос вернул IP с reg_count = 47? Это либо корпоративный NAT, либо бот-фарма. Разница определяется другими сигналами.
Предусловия и ограничения velocity-check
| Параметр | Значение |
|---|---|
| Эффективен против | Массовая регистрация, brute-force логины, промо-абьюз |
| Не работает если | Атакующий использует пул ротируемых резидентных прокси (каждый запрос — новый IP) |
| Ложные срабатывания | Корпоративные NAT, CGNAT мобильных операторов, общедоступный Wi-Fi |
| Зависимость | База данных с историей событий и метками времени |
Velocity-check — первый барьер. Для продвинутых фарм нужен следующий слой.
Граф связей аккаунтов: кластеризация фродовых аккаунтов
Граф связей — структура данных, где узлы (nodes) — аккаунты, устройства, IP-адреса, номера телефонов, а рёбра (edges) — факты их совместного использования. Аккаунт A и аккаунт B зарегистрированы с одного устройства — между ними есть ребро.
Зачем нужен граф: бот-фарма переиспользует инфраструктуру. Даже при ротации IP остаются общие device fingerprint, cookie-значения, идентификаторы SIM-карт. Граф собирает эти связи и выявляет кластеры — группы подозрительно связанных аккаунтов. Такие атаки называют Sybil-атаками (термин из области распределённых систем — когда один оператор контролирует множество фейковых идентичностей; в номенклатуру MITRE ATT&CK не входит, но суть та же).
По данным Sardine, антифрод-системы строят граф из следующих элементов:
- Device fingerprint — хэш параметров устройства (разрешение, шрифты, GPU, аудио-стек)
- IP-адрес и ASN (Autonomous System Number — идентификатор сетевого провайдера; по нему видно, откуда пришёл трафик — от домашнего пользователя, из дата-центра или с прокси-фермы)
- Телефон и email — один номер на 50 аккаунтов = очевидный кластер
- Поведенческие сигнатуры — одинаковый порядок действий в сессии
- Cookie и localStorage — следы предыдущих сессий в браузере
Для работы с графами антифрод-аналитик использует Neo4j (графовая СУБД — база данных, оптимизированная под хранение и обход связей между объектами) или Gephi (визуализатор графов). Пример Cypher-запроса (язык запросов Neo4j) для поиска кластера аккаунтов с общим устройством:
MATCH (a:Account)-[:USED_DEVICE]->(d:Device)<-[:USED_DEVICE]-(b:Account)
WHERE a <> b
WITH d, COLLECT(DISTINCT a) AS accounts
WHERE SIZE(accounts) > 10
RETURN d.fingerprint, SIZE(accounts) AS cluster_size
ORDER BY cluster_size DESC;
Что делает запрос: находит устройства (Device), к которым привязано больше 10 разных аккаунтов. Fingerprint fp_abc123 связан с 87 аккаунтами? Кандидат на бот-фарму. На выходе — таблица с fingerprint и числом аккаунтов, отсортированная по убыванию.
Интерпретация графа
Кластер бот-фармы выглядит как «звезда»: одно или несколько устройств в центре, десятки аккаунтов по краям. У реальных пользователей граф — «паутина» с неравномерными связями и разной плотностью.
Ещё один индикатор — временная плотность. 50 аккаунтов в кластере созданы за 2 часа — фарма. За 3 года — семейный планшет.
По данным Sardine, эффективный подход — не блокировать отдельные аккаунты, а действовать на уровне кластера: заблокировать bot ring целиком вместо реагирования на ротацию IP отдельных участников. Это переводит защиту из реактивного режима в системный.
Device fingerprinting и поведенческий анализ пользователей
Отпечаток устройства при детекции bot-фарм
Device fingerprinting (дактилоскопия устройства) — сбор технических параметров браузера и железа для создания уникального идентификатора без cookie. Антифрод-системы используют решения вроде FingerprintJS или SEON.
Что входит в fingerprint: Canvas и WebGL рендеринг (GPU оставляет уникальный «почерк» при отрисовке — два разных видеочипа рисуют один и тот же элемент с микроскопическими различиями), установленные шрифты и плагины, характеристики аудио-стека (AudioContext API), часовой пояс и язык системы, точные характеристики CPU.
Бот-фарма на эмуляторах оставляет артефакты: несоответствие между заявленным User-Agent (например, «iPhone 15») и реальными показателями сенсоров (отсутствие акселерометра, нулевое давление тача). Антифрод-решения вроде Sardine выявляют эмулируемые устройства, клонированные приложения и средства удалённого доступа по комбинации признаков: индикаторы виртуальной машины, несоответствие сенсоров, рутованное окружение.
Поведенческая биометрия против ботов
Поведенческая биометрия (behavioral biometrics) — анализ того, как пользователь взаимодействует с интерфейсом: скорость набора, траектория мыши, паттерны свайпов. Не что он делает, а как именно — и здесь бот проваливается.
По данным Transmit Security Research Labs, ключевые поведенческие фичи для ML-моделей детекции ботов:
- Скорость набора текста и дельты между нажатиями клавиш
- Скорость и ускорение движений мыши
- Углы кривизны траектории мыши
- Дисперсия изменений этих параметров во времени
Исследователи визуализировали разницу: на графике движений мыши бота видны прямые линии и повторяющиеся паттерны, у человека — хаотичные кривые с микрокоррекциями. Даже продвинутые LLM-боты, которым явно указали «имитируй человеческое поведение», проваливаются на поведенческих метаданных. AI-агенты автоматизации браузера детектируются по скорости набора, движениям мыши и расхождению timezone с location.
Практика: выявление фродовых аккаунтов за 5 шагов
Требования к окружению
| Компонент | Минимум | Рекомендуется |
|---|---|---|
| ОС | Любая с SQL-клиентом | Linux Ubuntu 22.04+ |
| RAM | 4 ГБ (SQL-запросы к небольшой БД) | 16 ГБ (Neo4j + визуализация) |
| База данных | PostgreSQL 14+ или ClickHouse | ClickHouse для >10M событий |
| Графовая СУБД | Neo4j Community 5.x (бесплатно) | Neo4j Enterprise |
| Визуализация | Kibana 8.x или Grafana 10+ | Kibana + Neo4j Browser |
| Сеть | Доступ к логам сервиса | Онлайн (для проверки IP-репутации) |
Шаг 1: собираем логи сессий
Убедитесь, что сервис пишет в лог: timestamp, user_id, session_id, IP, User-Agent, device_fingerprint (если есть), время заполнения формы, количество кликов в сессии.
Если device fingerprint ещё не собирается — начните с FingerprintJS (open-source версия). Без fingerprint velocity-check работает только по IP, а это слабый сигнал из-за NAT и прокси.
Ожидаемый результат: таблица логов с полями, по которым можно группировать и считать.
Шаг 2: запускаем velocity-check по IP и fingerprint
Выполните SQL-запрос из раздела выше, подставив свою таблицу и пороги. Начните с порога 5 регистраций в час для IP и 3 регистрации в сутки для одного fingerprint.
Ожидаемый результат: список IP и fingerprint с превышением порога. Список пуст — снижайте порог или расширяйте окно.
Шаг 3: проверяем IP-репутацию
Подозрительные IP проверьте через AbuseIPDB (бесплатный тариф: 1000 запросов в день). Confidence Score выше 75 — рекомендуемый порог для блокировки. Перед блокировкой исключите Tor exit-ноды (список на torproject.org/exit-addresses), ASN облачных провайдеров (Cloudflare, Fastly, Akamai) и корпоративные NAT-выходы партнёров. Ложные срабатывания на CGNAT мобильных операторов — частая ошибка, на ней спотыкаются почти все новички.
Ожидаемый результат: часть IP получит высокий confidence, что подтверждает бот-активность.
Шаг 4: строим граф связей
Загрузите в Neo4j аккаунты, устройства и IP как узлы. Создайте рёбра USED_DEVICE и USED_IP. Выполните Cypher-запрос из раздела выше.
Ожидаемый результат: кластеры с размером 10+ аккаунтов на один fingerprint. В Neo4j Browser «звёздные» кластеры видны сразу — их ни с чем не перепутаешь.
Шаг 5: добавляем поведенческие фильтры
По каждому кластеру из шага 4 проверьте три условия: одинаковое ли время заполнения формы (разброс менее 1 секунды), совпадает ли порядок страниц в сессии, есть ли ошибки ввода. Все три условия совпали — кластер с высокой вероятностью принадлежит бот-фарме.
Ожидаемый результат: подтверждённые кластеры для блокировки или ручного ревью.
Аномалии сессий пользователей: когда что применять
| Метод | Преимущества | Ограничения | Когда использовать | Когда не использовать |
|---|---|---|---|---|
| Velocity-check | Простота, работает сразу, минимум ресурсов | Обходится ротацией IP/fingerprint; FP на NAT | Первая линия; массовые регистрации и brute-force | Против фарм с резидентными прокси |
| Граф связей | Выявляет скрытые связи; работает при ротации IP | Нужна графовая СУБД; сложность масштабирования | Координированные кампании; Sybil-атаки | Малый объём данных (<1000 аккаунтов) |
| Device fingerprinting | Устойчив к смене IP; работает без cookie | Обходится рандомизацией на эмуляторах | Multi-accounting; корреляция сессий | Tor/privacy-браузеры (высокий FP-rate) |
| Поведенческая биометрия | Сложен для обхода; боты не имитируют моторику | Нужна ML-модель; задержка на обучение | Продвинутые боты; human-assisted fraud | Нет данных для обучения; 1–2 клика в сессии |
Оптимальный подход — многослойный: velocity-check как быстрый фильтр первой линии, device fingerprinting для корреляции, граф для поиска скрытых связей и поведенческая биометрия для финального подтверждения. Каждый слой ловит то, что пропустил предыдущий.
В реальных проектах вижу перевёрнутый порядок: команды тратят недели на настройку ML-моделей скоринга (XGBoost, isolation forest) для обнаружения аномалий, но при этом у них нет базового velocity-check на регистрацию с одного IP. Velocity-правила на SQL покрывают основную массу примитивных бот-фарм за день работы. Граф связей в Neo4j добивает следующий пласт — тех, кто прошёл через ротацию прокси. И только оставшийся хвост требует поведенческой биометрии и полноценного ML.
Второе наблюдение: антифрод часто воспринимают как «поставил систему и забыл». Но бот-операторы адаптируются быстрее, чем обновляются правила. Тот кейс с таймингами 4.2 секунды? Через месяц тайминги стали 12–45 секунд с рандомным разбросом — оператор фармы добавил задержку с рандомизацией в скрипт. Velocity-check по времени формы перестал работать. Зато граф связей показал: все 8 тысяч «новых» аккаунтов по-прежнему привязаны к 12 device fingerprint. Инфраструктура — последнее, что меняет фродер, потому что это дорого.
Ещё один тренд — human-assisted fraud: бот проходит основную часть пути, а CAPTCHA решает живой человек из клик-фармы. Sardine называет это «спектром между ботом и человеком». Чистый velocity-check здесь бесполезен, потому что скорость — человеческая. Работает только комбинация: device fingerprint связывает сессии, граф показывает кластер, поведенческая биометрия ловит «переключение» между автоматическим заполнением и ручным решением CAPTCHA — паттерн мыши резко меняется в середине сессии. Если хочется разобраться в подобных механиках системно, а не собирать по кускам — на IB Basics в Codeby Academy показывают, как делать первые задачи в ИБ без академического тона.
Эту тему и смежные навыки разбирают на практике в курсе «Антифрод-аналитик» Codeby Academy.