Тем, кто разрабатывает или поддерживает работу веб-сайтов и API, кто еще не использует WAF или использует, но устал от ложных срабатываний и сложных настроек, а также хочет красивые графики и все бесплатно, посвящается.
Недавно мы выпустили очередной релиз Nemesida WAF Free — бесплатный WAF для NGINX, обеспечивающую базовую защиту веб-приложения от атак класса OWASP на основе сигнатурного анализа. Nemesida WAF Free доступен для популярных дистрибутивов (Debian, Ubuntu, CentOS) и без проблем интегрируется к установленному из репозитория или же скомпилированному вручную экземпляру NGINX.
Проблемы сигнатурного анализа WAF
Две основные проблемы, которые возникают при использовании решений такого класса — пропуски атак и ложные срабатывания. Как правило, первое вытекает из второго — чтобы минимизировать количество ложных срабатываний производят «ослабление» сигнатур и создают правила исключения, таким образом увеличивая количество пропусков.
Проблема False Positive и False Negative для сигнатурного метода, на мой взгляд, частично решается за счет качества написания правил, верного определения области их применения и установки корректных значений показателя «веса».
К слову, если написать правило, которое будет блокировать запрос с вхождением
select
и or
(оба слова используются в качестве операторов SQL) в попытках защитить веб-ресурс от эксплуатации SQL-инъекций, это приведет к появлению множества ложных срабатываний (например, обращения к selector.png будут блокироваться). Такие примеры хорошо знакомы тем, кому приходится настраивать сигнатурные WAF. Для того, чтобы снизить количество ложных срабатываний и пропусков атак, в Nemesida WAF Free используются регулярные выражения и конструкции. Еще мы используем «вес» правил и зоны их применения, что снижает как количество ложных срабатываний, так и время обработки запроса. Актуальная версия сигнатур Nemesida WAF Free находится в общем доступе по ссылке: rlinfo.nemesida-security.com.
Другая проблема, которая возникает при анализе содержимого запроса — бинарные данные в теле запроса. Суть проблемы — бинарные данные анализируются сигнатурным методом, приводя к увеличению времени обработки запроса и ложным срабатываниями, или же от большого количества символов приводят просто к «поломке» PCRE.
Чтобы решить эту проблему, необходимо исключать бинарные данные из обработки. Для решения задачи мы исходим из специфики работы протокола HTTP:
- исключаем бинарное содержимое из тела запроса для
multipart/form-data
при наличии заголовковContent-Disposition: form-data; name="..."; filename="..."
- исключаем тело запроса из обработки для PUT-запросов через управляемый параметр
nwaf_put_body_exclude
.
Последний параметр будет полезен при использовании Nemesida WAF для защиты веб-приложений, предназначенных для обмена файлами (например, ownCloud). Владельцам файловых веб-ресурсов будет полезна еще одна опция — анализ содержимого файлов средствами ClamAV (опция
nwaf_clamav
). Все аномалии доступны в личном кабинете:Обход WAF (WAF Bypass)
Для тестирования работы WAF мы решили поделиться скриптом: https://github.com/nemesida-waf/waf_bypass
Скрипт содержит известные (и не очень) техники обхода WAF (waf bypass), поможет быстро оценить возможность пропуска атак и лучше разобраться в работе веб-приложений и техник обхода, которыми пользуются атакующие. Скрипт, написанный на Python3, позволяет выявить возможность обхода WAF для проведения атак класса LFI, RCE, SQLi и XSS, а также убедиться, насколько эффективно машинное обучение при выявлении этих атак — модуль машинного обучения для коммерческой версии Nemesida WAF распознал все 100% атак из набора, при этом сигнатурный метод пропустил примерно треть (некоторые техники перекрыть сигнатурами без увеличения ложных срабатываний невозможно).
Если вы разрабатываете или администрируете веб-приложения (особенно, публичные) — сайт, личный кабинет, API, что угодно, работающее по протоколу HTTP — попробуйте Nemesida WAF. Вся аномальная статистика будет доступна в локальном личном кабинете. Для наглядности мы настроили демонстрационный стенд с личным кабинетом: demo.lk.nemesida-security.com (u: demo@pentestit.ru / p: pentestit), где собрали распространенные атаки по типам, в том числе попытки загрузить вредоносное содержимое (на примере EICAR test file).
Ежедневно мы фиксируем сотни нецелевых атак (сканирования, попытки эксплуатации популярной уязвимости, подбор файлов с дампом и пр.), большинство из которых без использования WAF вы можете просто не заметить, поскольку по умолчанию в access/error журнал не выводится информация о содержимом тела запроса и его заголовках. После установки Nemesida WAF Free вы увидите, как часто веб-ресурс подвергается атакам, большая из которых, скорее всего, будут нецелевыми и выглядеть примерно так:
... '"--></style></scRipt><scRipt>some_string(0x054EAF)</scRipt> ...
... "><script >alert(String.fromCharCode(88,83,83))</script> ...
... '+eval(compile('for x in range(1):\n import time\n time.sleep(20)','a','single'))+'; _csrf-frontend= ...
... '">//<svg/onload=alert(0)//&EditProfileForm[email]= ...
... /wp-admin/admin-ajax.php?action=revslider_show_image&img=../wp-config.php ...
Инструкция по установке и настройке динамического модуля Nemesida WAF Free для NGINX доступна по ссылке: waf.pentestit.ru/about/2511. Подробная документация на русском языке и инструкция по установке вспомогательных компонентов (Nemesida WAF API, Личный кабинет Nemesida WAF) доступны на официальном сайте продукта. В большинстве случаев Nemesida WAF будет работать «из коробки» и без ложных срабатываний (не считая специфичных запросов от администраторов/модераторов ресурса, адреса которых рекомендуем переводить в LM или WL режим).
Zero Trust
Nemesida WAF Free — часть коммерческого проекта Nemesida WAF, поэтому мы не торопимся раскрывать его исходный код. Если вы (как и мы) по умолчанию не доверяете ПО с закрытым исходным кодом (хотя сразу вспоминается ситуация о критической уязвимости Heartbleed в открытом коде, которую не находили несколько лет), то можете заблокировать обращения к nemesida-security.com, чтобы мы даже не догадывались об использовании Nemesida WAF Free. Но в таком случае обновление сигнатурной базы придется выполнять вручную:
curl https://nemesida-security.com/nw/update/binupdate > /etc/nginx/nwaf/rules.bin && service nginx restart
По умолчанию загрузка обновлений происходит в автоматическом режиме сервисом
nwaf_update
.Доменное имя example.com используется в качестве примера
Security through obscurity
Есть такая тенденция — публиковать разработку на поддоменах test.example.com, dev.example.com и т.д. для тестирования или демонстрации. Все мы знаем, какого качества код там публикуется, при этом он может работать сразу с «боевой» базой данных, открывая простой вектор атаки на ресурсы. Атакующий может узнать о временно размещенном dev-проекте, используя, например, поисковые системы, NSE-скрипт для nmap или theharvester:
theharvester -d example.com -l 500 -b google
А еще он может найти много интересного: случайно открытый приватный GIT-репозиторий, непропатченную CRM, которую изначально не планировалось публиковать в паблик и другое. Причем такой проблемой «страдают» не только веб-сайты, но и API, а подход «security by obscurity» — еще один миф защищенности.
В заключение немного об особенностях Nemesida WAF Free:
- бесплатный, быстрый и «легкий»
- установка и настройка за 10 минут;
- минимум ложных срабатываний;
- установка и обновление из репозитория;
- возможность подключения к уже установленному Nginx, начиная с версии 1.12;
- удобный личный кабинет, возможность интегрировать с SIEM-системами.