Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Как создать быстрый WAF. Построение высокопроизводительной системы анализа сетевого трафика

Как создать быстрый WAF. Построение высокопроизводительной системы анализа сетевого трафика

Доклад Михаила Бадина (Wallarm) для PDUG-секции на PHDays 8.

More Decks by Positive Development User Group

Other Decks in Technology

Transcript

  1. Заголовок • Работает с HTTP, HTTPS; • OWASP Top Ten;

    • Обработка запроса в зависимости от структуры Web-приложения; • ACL (Access Control List); • Виртуальный патчинг; • AI, ML (жаль что пока нет Blockchain); • И много другого. Введение: Что такое WAF
  2. Заголовок Введение: Стадии обработки пакета в WAF Прием пакета -

    Прием пакета с сетевого интерфейса; - Обработка множества соединений. Определение структуры - Разбор запроса на составные части; - Парсинг структуры запроса. Первичная обработка - Токенизация, обработка с помощью регулярных выражений; - Принятие решения о наличии атаки по одному запросу. Пост обработка - Поведенческий анализ; - Принятие решения о наличии атаки по нескольким запросам.
  3. Заголовок Прием пакета Прием пакета - Прием пакета с сетевого

    интерфейса; - Обработка множества соединений. Определение структуры - Разбор запроса на составные части; - Парсинг структуры запроса. Первичная обработка - Токенизация, обработка с помощью регулярных выражений; - Принятие решения о наличии атаки по одному запросу. Пост обработка - Поведенческий анализ; - Принятие решения о наличии атаки по нескольким запросам.
  4. Заголовок Прием пакета: Традиционный подход 1. Слушаем сокет. 2. При

    инициализации нового соединения делаем fork(). 3. Дочерний процесс начинает обрабатывать пакет. 4. Родительский процесс продолжает слушать сокет.
  5. Заголовок Прием пакета: Традиционный подход Переход в Kernel Space при:

    • Исчерпание процессорного времени; • Чтение / Запись; • IPC; • Создание / Завершение процессов; • Другие системные вызовы.
  6. Заголовок Прием пакета: Алгоритм работы Event Loop while (there_are_still_events_to_process) {

    e = get_the_next_event(event_loop); if (there_is_a_callback_associated_with_e) { call_the_callback(); } } callback_func() { do_something(); non_block_func(param, other_callback()); }
  7. Заголовок Прием пакета: Асинхронный прием запроса Разделение процесса обработки запроса

    на стадии: • Прием заголовков, тела; • Первичная обработка; • Отправка метаданных на пост аналитику; • Проксирование на нужный веб-сервер; • Логирование, отправка отчетов и т.д.
  8. Заголовок А что дальше? Разговор двух коллег: Программист: Хорошо. Допустим

    мы получили запрос. Что теперь с ним делать? Аналитик ИБ: Ну у меня есть несколько регулярок. Можно попробовать поматчить их с реквестом. Программист: Т.е. мне просто натравить их на весь запрос? Аналитик ИБ: А знаешь, не все так просто.. На URI надо использовать одни регулярки. На хедера другие.. Аналитик ИБ: Ну ты придумай что нибудь.. Тыж программист. Программист: Ох.. Программист Аналитик ИБ
  9. Заголовок Определение структуры запроса Прием пакета - Прием пакета с

    сетевого интерфейса; - Обработка множества соединений. Определение структуры - Разбор запроса на составные части; - Парсинг структуры запроса. Первичная обработка - Токенизация, обработка с помощью регулярных выражений; - Принятие решения о наличии атаки по одному запросу. Пост обработка - Поведенческий анализ; - Принятие решения о наличии атаки по нескольким запросам.
  10. Заголовок • Разделить HTTP-request на составные части; ◦ Starting Line:

    Method, URI (внутри много чего интересного), HTTP/Version ◦ Headers (General, Request, Entity); ◦ Message Body (html, json, etc); • Применять парсеры для разбора “матрешки” запроса; • Должны понимать к какому компоненту веб-приложения соотносится запрос (в идеале какие фреймворки используются); • “Стараться” парсить так, как это делает веб-приложение. Определение структуры запроса: Общие понятия
  11. Заголовок На что стоит обратить внимание Аналитик ИБ: Не забудь

    что нас могут вывести из строя. > dd if=/dev/zero of=zero.txt bs=1000000 count=10000 # zero.txt (9.4G) > brotli ./zero.txt # zero.txt.br (130K) > brotli ./zero.txt.br # zero.txt.br.br (23.4K) > curl -X POST \ -H 'Content-Type: text/plain' \ -H 'Content-Encoding: br, br' \ -d @./zero.txt.br.br http://example.com/upload # WAF RIP... Я знаю тысячу способов как забайпасить WAF!
  12. Заголовок Первичная обработка запроса Прием пакета - Прием пакета с

    сетевого интерфейса; - Обработка множества соединений. Определение структуры - Разбор запроса на составные части; - Парсинг структуры запроса. Первичная обработка - Токенизация, обработка с помощью регулярных выражений; - Принятие решения о наличии атаки по одному запросу. Пост обработка - Поведенческий анализ; - Принятие решения о наличии атаки по нескольким запросам.
  13. Заголовок Лексический анализ Программист: Вот хорошо бы обратабывать токены вместо

    сырых данных и по ним находить уязвимости. Аналитик ИБ: Мне без разницы.. Лучше пойду посмотрю пока презентации с Black Hat USA 2017.. Программист: А я пока открою книгу ДРАКОНА! УАХАХАХА!!.
  14. Заголовок Лексический анализ: Токены, Шаблоны, Лексемы Токен - пара, состоящая

    из имени токена и параметра • Имя токена (некое символическое имя) • Параметр (в нем содержится дополнительная информация о токене). Шаблон - описание вида, которое может принимать токен. Лексема - некоторая последовательность символов, которое подходит под описание шаблона и идентифицируется как токен.
  15. Заголовок Лексический анализ: Примеры токенов Токен Шаблон Лексема select Символы

    ‘s’, ’e’, ’l’, ’e’, ’c’, ’t’ select compration ‘<’, или ‘>’, или ‘=’, или ‘!=’, или ‘>=’, или ‘<=’ >, >=, == number Любая числовая константа 1, 3.5, 3.3e10, -100500 literal Все, кроме “, заключенное в двойные кавычки “Hello world”, “Core dumped”
  16. Заголовок Лексический анализ: Пример разбора на токены Исходная строка: Е

    = M * C ** 2 Токены: <id, указатель на запись в таблице символов для E> <assign_op> <id, указатель на запись в таблице символов для M> <mult_op> <id, указатель на запись в таблице символов для C> <exp_op> <number, целое значение для 2>
  17. Заголовок Лексический анализ: Диаграмма переходов Состоит из: 1. Состояний. Каждое

    состояние представляет ситуацию, которая может возникнуть в процессе сканирования входного потока в поисках лексемы. 2. Дуг. Представляет собой линию из одного состояния в другое.
  18. Заголовок Пример диаграммы переходов Давайте попробуем составить шаблон для токена

    ”number” (надеюсь все помнят формат записи регулярных выражений) digit → [0 - 9] digits → digit+ number → digit(.digits)?(E[+-]?digits)?
  19. Заголовок Лексический анализ Аналитик ИБ: Лексемы… Токены… Диаграммы переходов… Я

    почти уснул, когда тебя слушал. Программист: Да почему? Математика такая интересная! Аналитик ИБ: Очень… Теперь все готово для написания кода? Программист: Ну почти. Еще осталось узнать про НКА и ДКА! Аналитик ИБ: Что за НКА и ДКА??? О боже... Программист: Да ладно, это совсем просто! Аналитик ИБ: Я в этом сомневаюсь…
  20. Заголовок Детерминированный конечный автомат (ДКА) Абстрактное устройство, которое описывается следующими

    параметрами: • Q - конечное множество состояний; • Σ - конечное множество входных символов; • δ - функция переходов. Аргументы - состояние и входной символ, результат - состояние. Более формальная, но менее понятная запись - δ: Q x Σ ➝ Q; • q0 - начальное состояние. q0 ∊ Q; • F - множество допускающих состояний, является подмножеством Q. F ⊂ Q. И работает следующим образом: • Начинает работу в начальном состоянии q0 ; • Если автомат находится в состоянии qi а на вход поступает символ b, то автомат переходит в состояние qj = δ(qi , b)
  21. Заголовок Пример ДКА ДКА, принимающий язык (a|b)*abb Вх. символ Состояние

    a b q0 (начальное) q1 q0 q1 q1 q2 q2 q1 q3 q3 (допускающее) q1 q0 Таблица переходов для (a|b)*abb
  22. Заголовок Недетерминированный конечный автомат (НКА) Абстрактное устройство, которое описывается следующими

    параметрами: • Q - конечное множество состояний; • Σ - конечное множество входных символов; • δ - функция переходов. Аргументы - состояние и входной символ, результат - множество состояний (возможно пустое); • q0 - начальное состояние. q0 ∊ Q; • F - множество допускающих состояний, является подмножеством Q. F ⊂ Q. И работает следующим образом: • Начинает работу в начальном состоянии q0 ; • Если автомат находится в состоянии qi а на вход поступает символ b, то автомат переходит в множество состояний {qj }next = δ(qi , b), где qi ∊ {qi }current
  23. Заголовок Пример НКА НКА, принимающий язык (a|b)*abb Вх. символ Состояние

    a b ε q0 (начальное) {q0 , q1 } {q0 } Ø q1 Ø {q1 } Ø q2 Ø {q3 } Ø q3 (допускающее) Ø Ø Ø Таблица переходов для (a|b)*abb
  24. Заголовок ДКА и НКА. Сравнение производительности Генерация автоматов из регулярок:

    • ДКА - O(S3) (типичный случай) • ДКА - O(S22s) (худший случай) • НКА - O(S) Скорость обработки входных символов: • ДКА - O(N) • НКА - O(S*N) Примечание: S - длина регулярки N - длина входной строки
  25. Заголовок Первичная обработка запроса Прием пакета - Прием пакета с

    сетевого интерфейса; - Обработка множества соединений. Определение структуры - Разбор запроса на составные части; - Парсинг структуры запроса. Первичная обработка - Токенизация, обработка с помощью регулярных выражений; - Принятие решения о наличии атаки по одному запросу. Пост обработка - Поведенческий анализ; - Принятие решения о наличии атаки по нескольким запросам.
  26. Заголовок Пост обработка запроса • Необходима для в случае поведенческого

    анализа (когда мы не можем однозначно идентифицировать атаку по одному запросу); • Должны быть определены параметры запроса по которым будет проводится анализ; • В случае наличия нескольких WAFов имеет смысл объединить пост-обработку в одно место; • Не слишком критична к ресурсам, возможно немного “пропустить” запросов для накопления статистики.
  27. Заголовок Эпилог Аналитик ИБ: Отлично! Теперь наконец то мы сможем

    реализовать неплохой WAF! Программист: Ага! И при правильной настройки его будет очень трудно забайпасить. Аналитик ИБ: Слушай тут надо еще прикрутить пару интересных фич… Программист: Каких? Аналитик ИБ: Например виртуальный патчинг. И обработку ответов. И крутую панель управления, и т.д.. Аналитик ИБ: И да, нужен искусственный интеллект и машинное обучение! На дворе 2018 год как никак! Программист: Хорошо. Но только подними мне заработную плату!