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

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

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Как создать быстрый 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 год как никак! Программист: Хорошо. Но только подними мне заработную плату!