Выявление fraud-ring по графу транзакций: device fingerprint и общие реквизиты карт

В марте 2026 года колумбийский финтех Addi подтвердил утечку 34,5 миллиона записей — device information, email-адреса, государственные ID (данные Have I Been Pwned). Для антифрод-команд такая утечка — стартовый выстрел: злоумышленники получают связки «карта + устройство + документ» и собирают из них координированные сети подставных аккаунтов — fraud-ring-и (мошеннические кольца). Классические правила антифрода тут бесполезны. Каждая транзакция по отдельности выглядит чистой. Но стоит загрузить данные в граф — связи между аккаунтами, картами и устройствами складываются в кластеры, которых в плоской таблице просто не видно.
Зачем мошенники объединяются: бизнес-логика fraud-ring
Fraud-ring — группа аккаунтов, которые координированно проводят мошеннические операции. Один аккаунт принимает платёж, другой выводит деньги через mule-аккаунт (подставной счёт для транзита средств), третий маскирует цепочку. Весь смысл кольца — распределение рисков: ни один аккаунт не набирает достаточно аномалий, чтобы сработало стандартное правило по сумме или частоте.
Если переложить на язык MITRE ATT&CK (открытая база тактик и техник атак; каждая техника имеет T-код — уникальный идентификатор, например T1657), конечная цель кольца — Financial Theft (T1657, тактика Impact). Отдельно в ATT&CK описаны Impersonation (T1656) — маскировка под легитимных пользователей с помощью украденных данных — и подмена Browser Fingerprint (T1036.012) через антидетект-браузеры. Обе техники относятся к тактике Defense Evasion, а не Impact, и формально не образуют единую kill chain с T1657. Но на практике fraud-ring-ы комбинируют всё вместе: сначала уклонение от детекции, потом вывод денег.
Масштаб: по данным IBM X-Force Threat Intelligence Index 2025, infostealers (программы для кражи учётных данных) стали самым распространённым типом малвари — 32% всех инцидентов. В dark web, по оценке IBM, ежедневно появляется более 6 000 свежих наборов кредов. Каждый такой набор — потенциальное сырьё для нового fraud-ring. Финансовый сектор входил в тройку наиболее атакуемых отраслей в 2024 году (Mandiant M-Trends 2025). Именно граф транзакций позволяет видеть не одиночные операции, а целые мошеннические сети.
Антифрод анализ транзакций через граф: базовые понятия
Граф — структура данных из узлов (nodes) и рёбер (edges). В антифрод-контексте узлы — сущности: аккаунты пользователей, банковские карты, устройства, IP-адреса. Рёбра — связи между ними: «аккаунт X использовал карту Y», «транзакция прошла через устройство Z».
В табличном формате (SQL-выгрузка из ClickHouse или Snowflake) связи размазаны по строкам. Два аккаунта, использующих одну карту, окажутся в разных строках и визуально не пересекутся. Когда те же данные попадают в граф, общий узел-карта соединяет оба аккаунта — кластер становится видимым. На этом принципе строится весь graph-based fraud detection.
Hard links и soft links — два класса связей в антифроде
Исследование «Fraud Detection Through Large-Scale Graph Clustering with Heterogeneous Link Transformation» (arxiv) формализовало разделение, которое меняет подход к построению графа транзакций.
Hard links (жёсткие связи) — высокодоверительные идентификаторы, почти наверняка указывающие на одного владельца: номер телефона, полный PAN банковской карты, государственный ID (паспорт, ИНН, SSN), email-адрес, номер банковского счёта.
Soft links (мягкие связи) — поведенческие ассоциации, которые могут возникать случайно: device fingerprint (отпечаток устройства), cookie, IP-адрес, User-Agent строка браузера.
Почему это деление критично. Если строить граф только по hard links — точность высокая, но покрытие низкое. Мошенники намеренно не переиспользуют телефоны и карты между аккаунтами кольца. Если добавить все soft links без фильтрации — граф превращается в шум: сотни аккаунтов на одном корпоративном IP создают гигантский ложный кластер.
Авторы предложили двухэтапный подход: сначала объединить аккаунты по hard links в super-nodes (суперузлы — кластеры, которые почти наверняка принадлежат одному человеку), а затем связать суперузлы через soft links с весами. На реальных данных крупной платёжной платформы это сократило граф с 25 миллионов узлов до 7,7 миллионов и удвоило покрытие детекции по сравнению с подходом «только hard links». Для кластеризации авторы применили комбинацию LINE (Large-scale Information Network Embedding — метод векторного представления узлов графа) и HDBSCAN (алгоритм плотностной кластеризации, который сам определяет число кластеров — свойство, без которого невозможно работать, когда количество fraud-ring-ов заранее неизвестно).
Device fingerprint для выявления мошенничества
Device fingerprint — набор технических характеристик, по которому идентифицируется конкретный браузер или приложение: разрешение экрана, установленные шрифты, canvas fingerprint (результат отрисовки скрытого элемента через HTML5 Canvas), WebGL renderer, часовой пояс, язык системы. Вместе эти параметры дают уникальную «подпись» устройства.
В антифроде fingerprint работает как soft link: если 30 аккаунтов проходят через устройство с одинаковым canvas fingerprint — это сильный сигнал fraud-ring-а. По данным Neo4j, паттерн «один fingerprint — много аккаунтов» входит в число базовых graph-based детекций.
Мошенники, впрочем, не стоят на месте. Антидетект-браузеры (Multilogin, GoLogin и аналоги) генерируют уникальный fingerprint для каждого профиля — техника Browser Fingerprint (T1036.012) из MITRE ATT&CK. Антидетект решает проблему на стороне фродстера, но не полностью:
- Canvas fingerprint спуфится, но поведенческие метрики (скорость набора, паттерн движения мыши) часто совпадают между профилями одного оператора
- IP ротируются через прокси, однако пул прокси конечен — один адрес может мелькнуть у нескольких аккаунтов кольца
- Антидетект меняет fingerprint, но не меняет привычки: время активности, интервалы между кликами, последовательность действий в интерфейсе
Поэтому device fingerprint — один из слоёв анализа связей карт и устройств, а не единственный детектор. Его ценность раскрывается в комбинации с другими soft links и hard links внутри графа.
Анализ связей карт и устройств: строим граф на Python
Требования к окружению
Перед началом убедись, что есть:
- Python 3.9+ (проверить:
python3 --version) - Библиотеки:
pandas>=1.0.4,networkx(установка:pip install "pandas>=1.0.4" networkx; версии pandas до 1.0.4 содержат уязвимость PYSEC-2020-73) - RAM: от 4 ГБ для учебного датасета до 1 млн строк. Для продакшн-графов с десятками миллионов узлов потребуется 32+ ГБ и специализированные решения (Neo4j, TigerGraph)
- Данные: CSV-выгрузка транзакций с полями
account_id,card_bin,card_last4,device_fp,ip_address,amount,timestamp
От CSV до fraud-кластера: пошаговый разбор
Шаг 1. Загрузка данных и построение графа.
Задача — превратить плоскую таблицу транзакций в граф, где аккаунты соединяются через общие атрибуты (карты, устройства, IP). Каждая пара «аккаунт — атрибут» становится ребром.
import pandas as pd
import networkx as nx
df = pd.read_csv("transactions.csv")
G = nx.Graph()
for _, row in df.iterrows():
# NB: BIN+last4 — слабый идентификатор карты; на больших датасетах возможны коллизии.
# В продакшне используйте токенизированный/хэшированный PAN (card_hash) как hard link.
G.add_edge(row["account_id"], f"card_{row['card_bin']}_{row['card_last4']}")
G.add_edge(row["account_id"], f"dev_{row['device_fp']}")
G.add_edge(row["account_id"], f"ip_{row['ip_address']}")
Что происходит: для каждой транзакции создаются рёбра между аккаунтом и тремя типами атрибутных узлов. Если два аккаунта используют одну карту — они окажутся соединены через общий узел card_.... Проверка: print(G.number_of_nodes(), G.number_of_edges()) покажет размер графа. На датасете в 100 тысяч транзакций ожидай десятки тысяч узлов.
Шаг 2. Поиск связных компонент — кандидатов на fraud-ring.
Связная компонента (connected component) — группа узлов, где от любого узла можно добраться до любого другого по рёбрам. Компонента с большим числом аккаунтов, привязанных к малому числу устройств — потенциальное мошенническое кольцо.
components = list(nx.connected_components(G))
suspicious = [
c for c in components
if sum(1 for n in c if not n.startswith(("card_","dev_","ip_"))) >= 3
]
print(f"Всего компонент: {len(components)}")
print(f"Подозрительных (3+ аккаунтов): {len(suspicious)}")
Ожидаемый вывод: большинство компонент маленькие — один пользователь с его картой и устройством. Компоненты с 3 и более аккаунтами — пользователи, делящие общие реквизиты. Именно их стоит разбирать дальше.
Шаг 3. Разбор конкретного кластера.
Для каждого подозрительного кластера определяем структуру: какие атрибуты разделяют аккаунты и каков финансовый объём транзакций.
cluster = suspicious[0]
# Предполагается, что account_id не начинается с 'card_', 'dev_', 'ip_'.
# Для надёжности в продакшне добавляйте префикс 'acc_' при создании узлов
# или используйте nx.set_node_attributes для хранения типа узла.
accounts = [n for n in cluster if not n.startswith(("card_","dev_","ip_"))]
shared = [n for n in cluster if n.startswith(("card_","dev_","ip_"))]
total = df[df["account_id"].isin(accounts)]["amount"].sum()
print(f"Аккаунтов: {len(accounts)}, общих атрибутов: {len(shared)}, сумма: {total:.2f}")
Если в кластере 8 аккаунтов делят 2 устройства и 3 карты — это классический паттерн поиска fraud-ring по общим реквизитам. Сумма транзакций покажет масштаб потенциального ущерба. Для визуализации можно экспортировать подграф в Gephi через nx.write_gexf(G.subgraph(cluster), "cluster.gexf") — кольцо сразу становится наглядным.
Детекция мошеннических сетей: от кластера к расследованию
Не каждый кластер — fraud-ring. Семья из четырёх человек с одним Wi-Fi-роутером и двумя смартфонами даст плотный кластер, неотличимый от мошеннического на уровне топологии. После кластеризации нужна интерпретация.
Признаки реального fraud-ring-а:
| Признак | Легитимный кластер | Fraud-ring |
|---|---|---|
| Аккаунтов на устройство | 1-2 | 5+ |
| Временной паттерн | Разное время активности | Одновременная или строго интервальная |
| Тип IP | Домашний / мобильный провайдер | Дата-центр / VPN / proxy |
| BIN карт | Разные банки-эмитенты | Один BIN-диапазон |
| Суммы транзакций | Естественный разброс | Одинаковые или «ступеньками» ниже порога мониторинга |
Для формализации используют risk scoring кластера. Простой вариант: весовая формула, где каждый признак вносит долю в итоговый балл. Более продвинутый — обученная модель (XGBoost или аналогичная) на размеченных кластерах, которая учитывает десятки признаков одновременно.
В промышленных антифрод-системах (Sift, внутренние решения банков) после скоринга кластер уходит аналитику на ручную проверку. Автоматическая блокировка всего кольца — редкость: false positive на 8 аккаунтов обходится куда дороже, чем на одном.
Ограничения графового подхода и когда он не работает
Масштаб. networkx справляется с графами до ~10 миллионов рёбер на одной машине. Для платёжных платформ с сотнями миллионов транзакций нужны другие инструменты: Neo4j с Cypher-запросами для поиска fraud-ring, TigerGraph для real-time аналитики с deep link запросами через 8+ хопов, или распределённые решения вроде Apache Spark GraphX. networkx — инструмент для прототипирования и анализа выборок, не для продакшна.
Антидетект-браузеры. Если каждый аккаунт кольца работает через отдельный антидетект-профиль с уникальным canvas и WebGL — связь по device fingerprint не возникнет. Графовый анализ в таком случае опирается на другие soft links: пересечения IP, утечки cookie, поведенческие метрики.
Ложные кластеры. Корпоративные сети, университеты, публичный Wi-Fi генерируют шум: сотни аккаунтов с одного IP — это офис, а не кольцо. Фильтрация требует whitelist-ов IP-диапазонов и учёта контекста (рабочие часы, тип провайдера).
Холодный старт. Для новых аккаунтов с одной-двумя транзакциями граф не успевает накопить рёбер. Здесь детекцию дополняют velocity-правилами (контроль частоты операций) и внешними базами device intelligence.
Регуляторные ограничения. Хранение связок «PAN + fingerprint + IP» подпадает под ФЗ-152 (о персональных данных) и требует мер по приказам ФСТЭК №21 (управление доступом, аудит) и ФСБ №378 (криптозащита). Граф транзакций — фактически система обработки ПДн, и доступ к ней ограничивается ролевой моделью. Отдельная проблема: если транзакционные логи изначально не содержат device fingerprint или IP, графу нечего анализировать. По классификации OWASP это относится к Security Logging and Monitoring Failures (A09:2021).
Большинство антифрод-команд, с которыми я работал, начинают с правил: «если сумма больше X и страна не совпадает — заблокировать». Правила ловят одиночных фродстеров, но систематически пропускают кольца — потому что анализируют транзакцию, а не контекст. Переход к графовому анализу — не замена правил, а следующий уровень.
По моей оценке, через год-два graph-based методы станут нормой в антифрод-системах среднего размера, а не только у top-10 банков. Исследования вроде упомянутой работы с LINE + HDBSCAN показывают: unsupervised-методы на графах удваивают покрытие детекции относительно правиловых систем. Порог входа снижается — Neo4j Community Edition бесплатна, networkx — пара импортов, готовые шаблоны Cypher-запросов для network analysis лежат в документации.
Но неудобная правда в том, что команды застревают не на технологии, а на данных. Нет единой выгрузки «аккаунт + карта + устройство + IP» — данные размазаны по трём системам с разными ключами и форматами. Первый практический шаг — не «установить Neo4j», а добиться от DWH-команды консистентного JOIN по session_id. Всё остальное — надстройка. Если переходите из аналитики или разработки в ИБ и хотите пройти базу системно, а не собирать по частям — IB Basics в Codeby Academy закрывает этот трек за пару месяцев.
Эту тему и смежные навыки разбирают на практике в курсе «Антифрод-аналитик» Codeby Academy.