Всем привет! Меня зовут Мария Анисимова, я программист-исследователь команды машинного обучения Антиспама Почты Mail.ru В этой статье я хочу рассказать вам о фишинге. И о том, как мы с ним боремся.
Фишинговые атаки стали популярны с момента появления электронной почты. Это один из самых распространённых способов, которые хакеры используют для вторжения в учётные записи и социальные сети своих жертв. Только за октябрь 2023 года системы Антиспама Почты Mail.ru заблокировали 2 140 000 фишинговых писем, при том что три года назад за месяц их насчитывалось 1 140 000. Не только количество, но и качество фишинговых писем ежедневно улучшается, растёт и количество потенциальных жертв.
Антиспам регулярно пишет антифишинговые правила. Однако мошенники совершенствуют свои возможности для обхода фильтров. Кроме того, существует целевой вид фишинга, при котором спам-атака направлена на конкретный аккаунт или компанию. Сложность в том, что такой вид мошенничества сложно отследить, поскольку фильтры антиспама настроены на массовую рассылку, при этом атакуемый пользователь может получать по несколько фишинговых писем в день.
Сегодня машинное обучение предоставляет новые возможности для борьбы с фишингом. Благодаря способности находить закономерности в больших объемах данных и обнаруживать аномалии, а также возможности настраивать автоматическое обучение моделей, можно эффективно бороться с фишинговыми письмами с минимальным вовлечением человека.
История ML в антифишинге, или Как мы учим ML
Поскольку ML модели обладают большей обобщающей способностью по сравнению с правилами, в 2018 году появилась первая ML-модель Антифишинга. Со временем модель Антифишинга совершенствовалась, и от простой логистической регрессии над мешком слов доросла до нейронной сети над трансформерами.
Перед построением классификатора, нужно разобраться с признаковым пространством. У нас в арсенале есть:
Текст из письма.
Картинки из письма.
Репутация по отправителю.
Репутация по URL.
Для построения признаков на основе картинок у нас используется отдельная CV-модель, обученная распознавать определенные объекты. На основе вероятностей этой модели формируются признаки, которые сообщают о том, есть объект на картинке или нет. Как работать с репутационными признаками понятно, давайте разберем, как можно работать с текстом.
Самый первый и простой способ работы с текстом — это мешок слов (bag of words).
Сочетание bag of words, репутаций и признаков по картинкам
Такая модель фокусируется на словах, характерных для фишинговых писем, а также на «обеляющих» словах. Из них формируется словарь (он же «мешок слов»). Пример:
Таким образом, текст этого письма трансформируется в набор слов, а затем в словарь. Если элемент есть в словаре, то ему присваивается 1, если нет — 0.
Текст превращается в вектор признаков, который можно расширять и дополнять, например, признаками по отправителю и по картинкам, тем самым обучая и развивая ML модель. На полученном векторе можно обучать модели. В качестве первого бейзлайна отлично подходит логистическая регрессия.
Такой простой подход работает неплохо и по сей день находит фишинговые письма. У него есть свои достоинства и недостатки.
Достоинства:
быстро;
просто;
интерпретируемо.
Недостатки:
не учитывает синонимы;
не учитывает семантические связи;
не умеет работать с новыми словами из‑за фиксированного словаря;
много ложно‑положительных срабатываний.
Важно помнить, что спамеры быстро адаптируются к таким решениям и могут обойти их, заменяя ключевые слова на синонимы. Даже с учетом регулярного расширения словаря и дообучения модели, постоянно будут находиться новые паттерны, которые модель будет пропускать. Избежать проблем с синонимами и новыми словами, не встречающимися на этапе обучения модели, можно с помощью текстового эмбеддинга.
Комбинация FastText, репутаций и признаков по картинкам
Word2vec — это способ построения сжатого пространства векторов слов, который принимает на вход корпус текста и сопоставляет каждому слову вектор. Векторное представление основывается на контекстной близости.
FastText — улучшение Word2vec, которое вместо слов использует N‑граммы, что помогает работать с неизвестными словами. Так же в FastText реализованы несколько оптимизаций, которые помогают значительно ускорить обучение.
Аналогично «мешку слов» мы конкатенируем к Fasttext‑вектору оставшиеся признаки и обучаем модель. Логистическая регрессия на текстовом эмбеддинге заводится плохо, поскольку это просто линейная комбинация компонентов эмбеддинга. Поэтому лучше сразу брать полносвязную нейронную сеть.
Достоинства:
устойчив к синонимам;
умеет работать с незнакомыми словами за счет ngram.
Недостатки:
много ложноположительных срабатываний;
не учитывают всю семантику предложения;
плохо дообучается.
Сложность текстовых моделей растёт, и Fasttext можно заменять на более сложные решения, такие как RoBERTa.
Комбинация RoBERTa, репутаций и признаков по картинкам
RoBerta — это нейронная сеть, которая позволяет учитывать порядок слов в предложениях и семантику текстов за счет механизма внимания.
Аналогично предыдущим методам, добавляем к эмбеддингу оставшиеся признаки и обучаем модель.
Достоинства:
устойчив к синонимам;
умеет работать с незнакомыми словами;
учитывает семантику предложения.
Недостатки:
тяжело дообучается.
Благодаря RoBERTa, стало тяжелее менять текст так, чтобы и обойти модель, и донести «фишерскую» информацию до пользователя. А это значит, что будет меньше ручных реактивных блокировок, а автоматические дообучение модели более эффективным.
Автоматическое дообучение моделей
Несмотря на то, что модель стала лучше понимать переформулировки и вытаскивать смысл текста, обучать её проще не стало. Модель по прежнему продолжала определять как фишинг абсолютно легитимные рассылки.
Чтобы исправить такое поведение модели, мы взяли за основу следующий подход: получить точную модель с невысоким recall»ом и постепенно дообучать её. Практика показывает, что даже самая хорошая модель нуждается в постоянной поддержке и дообучении. В дообучении есть 2 главных вопроса: на каких данных и как дообучать. Сначала разберемся с данными.
Еще одна из проблем в задаче детекции фишинга — сбор false negative для дообучения. Качественный фишинг тяжело распознать обычному пользователю. Но даже если пользователь распознал — то как из всех нажатий кнопки «Это спам» выделить именно фишинговые письма? Для этого у нас есть «небольшая» модель фильтрации. При помощи нее мы из всех нажатий кнопки спам находим именно фишинговые письма. Еще один источник данных — это жалобы пользователей в поддержку.
А как мы хотим дообучать модель? Давайте зафиксируем требования к нашему дообучению:
учиться с валидацией и тестом;
выучивать новые примеры;
не сильно отличаться от предыдущей модели.
Для чего нужно регуляризация на предыдущую модель? Так как модель учится на неполном срезе данных, мы не знаем как она поведет себя на всем потоке. В то же время мы знаем качество старой модели и регуляризация на нее исключает увеличение ошибочных блокировок. И как только мы исключаем риск увеличения false‑positive срабатываний и уменьшения общего числа блокировок — модель может выкатываться в AB тест автоматически, без апрува человека. Но как же выучить новые примеры и не сильно отклониться от старой модели?
Чтобы сделать модель похожей на предыдущую и при этом выучить новые примеры, мы взяли такую функцию потерь:
где:
y_true
— правильные метки;
y_predict_old
— вероятности исходной модели;
y_predict_new
— вероятности новой модели.
Данная функция потерь представляет собой сумму из двух частей:
LogLoss — определяет то, насколько хорошо наша новая модель будет решать поставленную ей задачу
MSE — ограничивает модель и вынуждает ее быть похожей на предыдущую
Также у нас есть коэффициент alpha, который позволяет управлять соотношением между слагаемыми и тем самым модель будет либо точной копией старой модели, либо абсолютно новой, которая может вести себя на потоке абсолютно непредсказуемо. В нашем случае, мы даем модели свободу на новых точках и ограничиваем на всем остальном датасете. Почему используем именно вероятности — если регуляризоваться на логиты или веса модели, то регуляризация получается слишком жесткой, что не позволяет модели выучивать новые примеры.
Теперь давайте вспомним, что имея даже несколько источников данных для дообучения, примеров набирается мало. А мы хотим иметь разбиение на обучение, валидацию и тест, что оставляет для обучения ещё меньше примеров. Более того, какие‑то примеры фишинга могут залететь только в «тест» и не попасть в выборку для обучения.
Как мы решили эту проблему:
учим модель с проверкой k-fold; валидацией
для каждого фолда выбираем модель с лучшими метриками;
усредняем веса полученных моделей.
За счет усреднения весов — мы не теряем знания о данных, которые могли попасть в тест, и благодаря k‑fold оптимально подбираем гиперпараметры.
Залогом качественного Антиспама является умение быстро и автоматически реагировать на новые спамные рассылки, в том числе путем регулярного дообучения. Но на этом история ML в Антиспаме не заканчивается, ведь уже сейчас есть методологии "взлома" моделей - Adversarial attacks, а это значит нас ждет интересное будущее, в котором обучение моделей будет включать в себя механизмы защиты от таких взломов.