Всем привет! Меня зовут Мария Анисимова, я программист-исследователь команды машинного обучения Антиспама Почты Mail.ru  В этой статье я хочу рассказать вам о фишинге. И о том, как мы с ним боремся. 

Фишинговые атаки стали популярны с момента появления электронной почты. Это один из самых распространённых способов, которые хакеры используют для вторжения в учётные записи и социальные сети своих жертв. Только за октябрь 2023 года системы Антиспама Почты Mail.ru заблокировали 2 140 000 фишинговых писем, при том что три года назад за месяц их насчитывалось 1 140 000. Не только количество, но и качество фишинговых писем ежедневно улучшается, растёт и количество потенциальных жертв.

Слева — так выглядел фишинг под mail.ru три года назад. Справа — так он выглядит сейчас.
Слева — так выглядел фишинг под mail.ru три года назад. Справа — так он выглядит сейчас.

Антиспам регулярно пишет антифишинговые правила. Однако мошенники совершенствуют свои возможности для обхода фильтров. Кроме того, существует целевой вид фишинга, при котором спам-атака направлена на конкретный аккаунт или компанию. Сложность в том, что такой вид мошенничества сложно отследить, поскольку фильтры антиспама настроены на массовую рассылку, при этом атакуемый пользователь может получать по несколько фишинговых писем в день.

Сегодня машинное обучение предоставляет новые возможности для борьбы с фишингом. Благодаря способности находить закономерности в больших объемах данных и обнаруживать аномалии, а также возможности настраивать автоматическое обучение моделей, можно эффективно бороться с фишинговыми письмами с минимальным вовлечением человека.

История 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 тест автоматически, без апрува человека. Но как же выучить новые примеры и не сильно отклониться от старой модели?

Чтобы сделать модель похожей на предыдущую и при этом выучить новые примеры, мы взяли такую функцию потерь:

LogLoss(y\_true, y\_predict\_new) + \alpha \cdot MSE(y\_predict\_new, y\_predict\_old)\cdot I_{new\_data}

где:

I_{new\_data}=\begin{cases} & \text{1, } x\in {\{new\_data\}} \\  & \text{0, } x\in {\{old\_data\}}  \end{cases}

y_true — правильные метки;

y_predict_old — вероятности исходной модели;

y_predict_new — вероятности новой модели.

Данная функция потерь представляет собой сумму из двух частей:

  1. LogLoss — определяет то, насколько хорошо наша новая модель будет решать поставленную ей задачу

  2. MSE — ограничивает модель и вынуждает ее быть похожей на предыдущую

Также у нас есть коэффициент alpha, который позволяет управлять соотношением между слагаемыми и тем самым модель будет либо точной копией старой модели, либо абсолютно новой, которая может вести себя на потоке абсолютно непредсказуемо. В нашем случае, мы даем модели свободу на новых точках и ограничиваем на всем остальном датасете. Почему используем именно вероятности — если регуляризоваться на логиты или веса модели, то регуляризация получается слишком жесткой, что не позволяет модели выучивать новые примеры.

Теперь давайте вспомним, что имея даже несколько источников данных для дообучения, примеров набирается мало. А мы хотим иметь разбиение на обучение, валидацию и тест, что оставляет для обучения ещё меньше примеров. Более того, какие‑то примеры фишинга могут залететь только в «тест» и не попасть в выборку для обучения.

Как мы решили эту проблему:

  • учим модель с проверкой k-fold; валидацией

  • для каждого фолда выбираем модель с лучшими метриками;

  • усредняем веса полученных моделей. 

За счет усреднения весов — мы не теряем знания о данных, которые могли попасть в тест, и благодаря k‑fold оптимально подбираем гиперпараметры.

Залогом качественного Антиспама является умение быстро и автоматически реагировать на новые спамные рассылки, в том числе путем регулярного дообучения. Но на этом история ML в Антиспаме не заканчивается, ведь уже сейчас есть методологии "взлома" моделей - Adversarial attacks, а это значит нас ждет интересное будущее, в котором обучение моделей будет включать в себя механизмы защиты от таких взломов.

Комментарии (5)


  1. dprotopopov
    06.12.2023 19:33

    один ML учится пробивать, другой ML учится отвергать.

    Сейчас вы что-то улучшили. Потом спамеры что-то улучшат.

    В среднем на периоде доля спама видимо такой же и останется.

    ЗЫ. Это всё не концепция решения проблемы, а очередная затычка (или как говорят сантехники - чопик https://otvet.mail.ru/question/13803296)


    1. Mariia-Anisimova Автор
      06.12.2023 19:33
      +2

      Привет! Согласна, что это вечная гонка щита и меча без конечной точки, но основная идея в том - что когда что-то улучшают спамеры, ML-автоматика и наша команда быстро адаптируются и закрывают новый спам. А для обхода ML-модели, в отличие от простых эвристик, надо потратить немало времени. Поэтому это более долгосрочное решение, чем "очередная затычка" :)

      PS Чопики используют не только сантехники)


    1. Vlagor
      06.12.2023 19:33
      +1

      Это вечное соревнование щита и меча , продолжите мысль - что им следует сделать? Совсем не развивать защиту? Ну так злоумышленники тогда приспособятся настолько что существующая вообще не будет работать. Просто взять и решить проблему? Отличная идея , но ,очевидно, они не знают как это сделать, может быть вы знаете? Предложите свой вариант решения проблемы.


  1. kdduha
    06.12.2023 19:33
    +1

    Спасибо за статью, есть вопрос скорее к технической реализации лосса. Как я понимаю, в logloss подаются логиты (если речь о torch) и метки классов, а что идёт в MSE? Речь идёт о сравнении логитов старой и новой моделей или смотрят на proba (но тогда просто разница двух вероятностей всегда будет < 1, а при возведении в квадрат ещё ближе к 0, или множитель альфа как раз и решает эту проблему?)


    1. Mariia-Anisimova Автор
      06.12.2023 19:33
      +2

      Привет! спасибо что обратили внимание) Да, в MSE идет именно proba и разница всегда < 1, как следствие при возведении в квадрат становится еще меньше. Нам это подходит, поскольку нет цели прибить модель к прошлой 1 в 1 (если есть такая цель - то лучше использовать логиты), достаточно чтобы они были близки, а насколько сильно обращать внимание на это слагаемое - здесь уже помогает alpha. В целом, если модель хорошо учится и другие слагаемые в лоссе не выдают запредельных значений, то и alpha особо выкручивать не приходится)