Перейти к содержимому

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

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

В марте 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.

Исследование «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.