Распределенные атаки на отказ в обслуживании, которым подвергаются популярные сайты обычно происходят с тысяч и тысяч взломанных устройств. Эти атаки в основном направлены на подавление целевой системы масштабным трафиком, забиванием канала связи. Эти атаки относятся к layer 3 (сетевой уровень модели ISO/OSI) DoS/DDoS и характеризуются большим количеством пакетов, которыми атакуется ресурс. Layer 7 (прикладной уровень модели ISO/OSI) DoS/DDoS обычно направлен на "слабые" места веб-приложения.
Для начала приведу немного статистики из исследования компании Incapsula — начиная с 2016 года DoS/DDoS атаки на прикладном уровне превалируют над классическими атаками на отказ от обслуживания на сетевом уровне:
Сложность в определении таких атак в том, что веб-приложение не может легко отличить атаку от обычного трафика. Есть много факторов, которые способствуют этой трудности, но одним из наиболее важных является то, что по ряду причин IP-адреса не могут быть полезны в качестве идентификационных данных. При сетевой атаке можно различить нелегитимный трафик и заблокировать атакующие IP-адреса, в случае атак на уровень приложений это сделать затруднительно: необходимо определить именно атакующие признаки, не заблокировав легитимных пользователей. Также, простое использование ресурса (без атак), может привести к исчерпанию его ресурсов — это может быть известный здесь многим Хабраэффект.
Основные типы DoS/DDoS атак:
Volumetric: объемные атаки нацелены на переполнение полосы пропускания веб-приложения хостинговой инфраструктуры, направляя большие объемы сетевого трафика. Обычно такой трафик представлен UDP/ICMP флудом.
Layer 3: эти атаки нацелены на недостатки архитектуры стека протоколов TCP. Атакующий отсылает пакеты, предназначенные для переполнения, искажения или разрушения информация о состоянии соединения, вызывающие дополнительную работу для функций сетевой обработки на целевом устройстве и замедлении ответов. Наиболее распространенными векторами таких атак является TCP SYN flood, фрагментация TCP, teardrop и т.д.
Layer 7: эти атаки ориентированы на логику веб-приложения и нацелены на исчерпание ресурсов веб-сервера при обработке "тяжелых" запросов, интенсивных функций обработки или памяти.
Ресурсы приложения
Большинство веб-серверов могут обрабатывать несколько сотен одновременных пользователей при нормальном использовании ресурса. Проблема заключается в том, что один атакующий может генерировать достаточный трафик с одного хоста для отказа в обслуживании веб-приложения. Балансировка нагрузки в таком случае не поможет от слова "совсем".
Основные проблемы выглядят следующим образом: утилизация CPU — использование 99% CPU заставляет другие критические процессы останавливаться; RAM — недопустимое распределение памяти, утечки, исчерпание памяти — недостаток для других критичных процессов; процессы и потоки — deadlock (заморозка процессов), форки, race condition (состояние гонки); диск — переполнение диска.
Одним из важных ресурсов веб-сервера является RAM. Атаками на исчерпание этого ресурса могут быть следующие:
Рекурсия. Вот неплохой пример рекурсивного кода — include('current_file.php'). PHP выделяет новую память для каждого включения и повторяет процесс до тех пор, пока не останется памяти. Эту уязвимость можно обнаружить в виде классического LFI (local file inclusion).
Zip-бомбы. Веб-приложения, которые позволяют загружать сжатые файлы и извлекать содержимое, могут быть восприимчивы к такой атаке, особенно если приложение (или библиотека, которая обрабатывает декомпрессию) не проведет надлежащую проверку файла.
XML-бомбы. Именованные сущности могут раскрываться не только в символьные строки, но и в последовательности других сущностей. Рекурсия запрещена стандартом, но ограничений на допустимую глубину вложенности нет. Это позволяет добиться компактного представления очень длинных текстовых строк (аналогично тому, как это делают архиваторы) и составляет основу атаки «billion laughs».
Десереализация. Сравнительно новый тип атак, но достаточно серьезный, что внесен в OWASP TOP 10 2017 A8-Insecure Deserialization. Представляет из себя процесс восстановление начального состояния структуры данных из битовой последовательности. При ненадлежащем контроле пользовательского ввода может привести к исчерпанию ресурсов.
Файловые заголовки. Манипулирование значениями файловых заголовков может привести к исчерпанию ресурсов. Если вычисление выполняется во входном файле, где размер файла находится в его заголовке. Это могут быть изображения, видеофайлы, документы и т.д. Пример — pixel flood attack.
Чтение бесконечных потоков данных. Чтение /dev/zero или /dev/urandom через LFI, использование 1TB speedtest и т.д.
Немаловажным параметром веб-сервера является CPU, атаки на исчерпание процессорных мощностей могут привести к неработоспособности веб-приложения.
reDOS — Regular Expression Denial of Service. Сравнительно свежий тип атаки, впервые был выявлен на Stackoverflow. Это была не атака злоумышленника, а действия пользователя, который включил 20 000 пробельных символов в фрагмент кода. Регулярное выражение было написано таким образом, что оно заставляло систему проверять строку из 20000 символов на в 200.010.000 шагов (20 000 + 19 000, +… + 2 + 1). Если веб-приложение позволяет использовать регулярные выражения — стоит тщательно проверять входящие данные.
SQL-инъекции. Эксплуатация SQL-инъекций может значительно снизить работоспособность веб-приложения, особенно при использовании функций типа sleep, benchmark и т.д.
Форк-бомбы. Процессы, которые повторяются снова и снова, используя все ресурсы системы. Наиболее известной является :(){ :|:& };:.
Злоупотребление ресурсами/функциями. Злоумышленник может выявить ресурсоемкую операцию на веб-приложении и послать множество запросов исчерпание ресурсов. Таким примером может служить злоупотребление функциями хэширования паролей.
SSRF. Эксплуатация server side request forgery уязвимостей может позволить злоумышленнику исчерпать ресурсы атакуемого веб-сервера.
Дисковое пространство также является критичным параметром веб-сервера.
Загрузка больших файлов. Наиболее очевидным способом заполнения системы данными является загрузка больших файлов на сервер. Если приложение не применяет надлежащие ограничения, злоумышленник может загружать в систему данные до того момента, пока веб-сервера не исчерпает ресурсы.
Переполнение системных журналов. При отсутствии функций ротации логов атакующий может "забить" системные журналы или послужить катализатором создания огромного количества этих журналов, что приведет к исчерпанию ресурсов дискового пространства.
Утилиты для тестирования веб-приложений:
Я намеренно не буду рассматривать узкоспециализированные утилиты типа LOIC/HOIC, нацеленные как правило на дестабилизацию работу определенных веб-приложений.
Вредоносное использование данных инструментов запрещено и может преследоваться законодательными мерами страны, резидентом который вы являетесь. Используйте данные инструменты для тестирования исключительно собственных серверов, либо серверов, тестирование которых согласовано с их владельцем на законном основании.
Slowloris — довольно известная утилита для тестирования. Существует nse скрипт для nmap.
HULK (HTTP Unbearable Load King) — генерирует большой поток уникальных запросов, который максимально потребляет ресурсы веб-сервера. Чтобы осложнить задачу по фильтрации потока, HULK для каждого запроса подставляет разные user agent, обфусцирует referrer, использует в запросах атрибуты no-cache и keep-alive, а также уникальные URL.
OWASP DoS HTTP POST — утилита от консорциума OWASP для генерации "медленных" http запросов.
GoldenEye HTTP Denial of Service Tool — эксплуатирует векторы HTTP Keep Alive + NoCache.
Превентивные меры защиты
Хорошей практикой превентивной защиты веб-приложения будет нагрузочное тестирование веб-ресурса. Для исследования времени отклика системы на высоких или пиковых нагрузках производится "стресс-тестирование", при котором создаваемая на систему нагрузка превышает нормальные сценарии её использования.
Основная цель нагрузочного тестирования заключается в том, чтобы, создав определённую ожидаемую в системе нагрузку (например, посредством виртуальных пользователей или их действий), наблюдать за показателями производительности системы. Это позволит выявить и усилить узкие/слабые места вашего веб-приложения и избежать возможных рисков недоступности приложения в будущем.
namikiri
Дополню, пожалуй, список утилит для тестирования самой, на мой взгляд, удобной — slowhttptest.