Дропы
Репозиторий проекта:
Ссылка
Диаграммы: Подробная диаграмма структуры генератора
Генерация дропов реализована в первую очередь через
классы в отличии от легальных и compromised транзакций, где основа - это
функции. Просто на дропах я решил попробовать применить классы и понял,
что это удобнее т.к. удобно контролировать состояния и передавать их.
Ноутбуки:
-
Дроп фрод основные инструменты
-
Дропы генерация транзакций
-
Дропы симуляция активности
Указатель
- Суть генерации
- Конфиги и данные для генерации
- Базовые классы
- Генерация транзакций
- Обработка партии полученных денег
- Управление жизненным циклом дропа
- Генерация активности множества дропов
- Оркестрация генерации
Суть генерации
Дропов два типа:
- распределители. Переводом получают деньги и просто
занимаются их распределением и перенаправлением. Т.е. либо переводят
дальше, либо снимают в банкомате, либо покупают криптовалюту.
- покупатели. Переводом получают деньги и совершают покупки в
интернете. Подразумевается что они собираются продавать купленное для
отмывания денег.
У каждого дропа есть “жизненный цикл”: от первой
транзакции до блокировки.
Активность дропа реализована следующим способом:
- начало “жизни” первая входящая транзакция, первая партия денег
- дроп распределяет/тратит эти деньги
- когда потратил то снова входящая транзакция
- снова распределение/трата полученной партии денег
- во время всего жизненного цикла ведется подсчет входящих исходящих
транзакций
- перед любой транзакцией происходит проверка должна ли она быть
отклонена. Транзакция отклоняется если какой-то их лимитов достигнут -
вх./исх. Лимиты выставляются в
drops.yaml
файле
- Если отклонена исходящая транзакция, то происходит генерация
случайного числа попыток. Сколько попыток, столько раз дроп попытается
еще совершить операцию. Если попыток 0, то дроп не пытается после первой
отклоненной транзакции. Если например 3, то будет пробовать 3 раза.
- Когда дроп больше не пытается или вообще не пытается совершать
операции, то происходит попытка перевода дропу денег и она отклоняется.
На этом “жизненный цикл” дропа заканчивается, ему больше не пытаются
перевести деньги и сам он заблокирован
- После этого переходим к созданию следующего дропа и так далее.
Подразумеваются сценарии того как дроп работает с
полученными деньгами.
У распределителей их четыре:
- полученные деньги переводятся дальше по частям - возможны покупки
криптовалюты
- полученные деньги переводятся дальше одним переводом - или
покупается криптовалюта на все
- полученные деньги снимаются целиком
- полученные деньги частично снимаются, а остальное переводится дальше
по частям - возможны покупки криптовалюты
У покупателей их два:
- покупка на все деньги
- разбивка денег на несколько покупок
Конфиги и данные для
генерации
Также как и в легальных транзакциях и у compromised фрода у дропов
есть свои конфиги и данные в которых они нуждаются для генерации. Все
это точно также упаковывается в конфиг класс и передается в функции и
классы относящиеся к дропам. Для каждого типа дропа создается свой
конфиг класс т.к. есть различия в конфигурациях и потому что генерация
транзакций для обоих типов происходит по отдельности.
- конфиг классы
DropDistributorCfg
и
DropPurchaserCfg
- конструктор конфиг классов
DropConfigBuilder
Базовые классы
Основа генерации дропов. В них входят:
DropAccountHandler
класс управления счетами транзакций
дропов
DropAmountHandler
класс генерации сумм транзакций,
контроль баланса дропа
DropTimeHandler
класс управления и генерации времени
дропа
DistBehaviorHandler
и PurchBehaviorHandler
классы управления поведением дропов, у каждого типа дропа свой класс:
- общие элементы функционала для обоих классов: выбор сценария работы
с деньгами, генерация попыток операций после блокировки, вычитание
попыток, контроль прекращения попыток,
- элементы только для дропов распределителей: случайное решение будет
ли транз-ция покупкой криптовалюты; случайное решение будет ли перевод
переводом другому дропу внутри банка
DropTxnPartData
класс генерации частичных данных
транзакции: мерчант id, координаты, IP-адрес, город, id устройства,
канал, тип транзакции
Как устроена генерация времени дропов
- начало “жизни” дропа, входящая транзакция, время берется случайное
из диапазона таймстемпов, которые в конфиг классе
- Время дропа генерируется по периодам активности. Период это когда
дроп совершает операции через небольшие промежутки времени до нескольких
часов, например от получаса до трех часов - промежутки определяются в в
конфигах
drops.yaml
- также в конфигах
drops.yaml
выставляются лимиты на
активность в периоде, если лимит на вх. или исх. транзакции достигнут,
то дроп уходит на паузу, которая рассчитывается так: время
первой транзакции в текущем периоде активности +
случайная положительная разница (подразумевается что
это несколько часов, например 24 часа) + случайная либо
положительная либо отрицательная небольшая разница =
время начала нового периода. Последняя разница нужна
чтобы время начала нового периода не совпадало точь-в-точь с временем
начала нового периода
Генерация транзакций
Реализована через один класс - CreateDropTxn
, который
использует все базовые классы. Класс непосредственно генерирует любые
транзакции: входящий перевод, исходящий, снятие, покупка криптовалюты,
покупка товаров в интернете. Он приспособлен для использования для обоих
типов дропов.
Также этот класс считает количество входящих и исходящих транзакций и
определяет достигнут ли какой-то из лимитов
Обработка партии полученных
денег
Реализована через отдельный класс - DropBatchHandler
. В
этом классе два отдельных метода под каждый тип дропа. Но они
имеют в целом общую логику:
- Подразумевается что баланс дропа больше 0 на момент вызова метода.
Баланс пополняется через генерацию входящей транзакции вне метода. О
балансе метод узнает через класс управления балансом и суммами
транз-ций
- Пока баланс больше 0 дроп совершает операции или одну операцию,
зависит от того какой сценарий выпал - сценарий выбирается вне метода и
передается через класс управления поведением дропа
- Перед каждой операцией происходит проверка на то, будет ли она
отклонена
- Если не было отклонения транзакции и баланс обнулен, то партия денег
обработана
- Если баланс не 0 и транзакция отклоняется, то баланс не
изменяется
- После первой отклоненной транзакции определяется случайное число
попыток совершить операцию
- Если не выпало 0 попыток, то дроп пробует совершить операцию пока
попытки не равны 0. Когда они равны 0, то обработка партии
закончена
Отличия
Метод distributor()
дропы распределители:
- есть случайный выбор между переводом/снятием и покупкой
криптовалюты
- если выпал перевод, то есть случайный выбор отправлять ли деньги
другому дропу внутри банка
Метод purchaser()
дропы покупатели:
- не имеет своих собственных особенностей, в нем то, что указано в
общей логике
Управление жизненным циклом
дропа
Реализовано через отдельный класс
DropLifecycleManager
.
Основная логика
- получаем счет текущего клиента
- помечаем текущего клиента как дропа в таблице
accounts
,
которая находится в атрибуте
DropAccountHandler.accounts
- переводим дропу деньги - создаем вх. транз-цию и добавляем в список
транзакций текущего дропа. Перед этим проверяем будет
ли входящая транзакция отклонена, но при первой транзакции такого не
бывает.
- Если транзакция отклонена, то генерация прерывается. Но для первой
транзакции это не актуально.
- случайно выбираем сценарий, как дроп будет распределять полученные
деньги
- в соответствии с выбранным сценарием определяем будут ли полученные
деньги распределены на части или будет одна операция
- запускаем метод обработки батча полученных денег
DropBatchHandler.process_batch()
, который обрабатывает
полученный батч в соответствии с типом дропа
- сгенерированные при обработке батча транзакции добавляем в список
транзакций текущего дропа
- снова возвращаемся к п.3 - перевод новой партии
денег дропу. Если при обработке предыдущего батча был достигнут
абсолютный лимит транз-ций дропа, то входящая транзакция будет отклонена
и жизненный цикл дропа закончится, будто после первой отклоненной
входящей транзакции дропу больше не пытаются послать деньги
- если транзакция не отклонена, то снова запускается
DropBatchHandler.process_batch()
и так далее
Генерация активности
множества дропов
Реализована через один класс - DropSimulator
.
Фактически этот класс осуществляет полную генерацию активности дропов
выбранного типа, включая запись результатов в файл.
Основная логика
- проход циклом через клиентов семплированных под определенный тип
дроп фрода
- на каждой итерации симуляция полного жизненного цикла текущего
дропа
- запись созданных транзакций дропа в общий список всех транзакций
дропов данного типа
- в конце запись измененного датафрейма
accounts
в файл в
двух директориях. Запись нужна, чтобы при генерации другого типа дропов
можно было узнать изменения т.к. там помечается кто из клиентов дроп; и,
возможно для выгрузки актуальной таблицы в БД
- запись сгенерированных транзакций в файл в две директории: созданную
под текущий запуск генератора транзакций и директорию последнего запуска
генератора - делается при помощи класса записи фрод транзакций -
FraudTxnsRecorder
Оркестрация генерации
Для дропов есть отдельный класс оркестратор -
DropsRunner
, который получает на вход данные конфиг файлов,
путь к директории текущего запуска и тип дропов. Исходя из этих данных
он создает объект конфиг билдера.
При вызове метода run()
через конфиг билдер создается
объект конфиг класса для указанного типа дропов и объекты других нужных
классов. И происходит полный процесс генерации транзакций дропов
указанного типа.