Post on 22-Nov-2014
description
Завалить в один запрос: уязвимости веб-
приложений, приводящие к DoS
Иван Новиков, ONsec
Откуда ноги растут?
• ONsec – аудиты информационной безопасности с 2009• Только веб, только хардкор• Анализ более 1000 веб-приложений, включая ресурсы, на
которые вы заходите каждый день• Программы вознаграждения за обнаруженные уязвимости (bug-
bounty и reward-программы)• http://lab.onsec.ru – технический блог (EN)
Что такое DoS для веба?
• Отказ в обслуживании• Функционал веб-приложения или его часть перестают работать• У сайта была возможность делать что-либо, а теперь нет• «Не логинит», «не показывает», «не добавляет», и другие «не …»
• Функционал можно разделить на критически важный и остальной• Критически важный – приносит деньги или мешает их приносить• Оформление заказа (от выбора до оплаты) для магазина - пример
DoS не DDoS
• Качество против количества• Мы говорим о логических атаках, а не сетевых• Представьте, что существует всего один запрос, который может
вызвать отключение какой-то функции веб-приложения на какое-то время
• Проблема DDoS решается сторонними мерами• Логические уязвимости DoS можно исправить только в коде веб-
приложения
Немного очевидной теории
•CGI/mod_*/FastCGI/AppServer (Tomcat)•N обработчиков (workers) выполняют код
приложения•Отличия между CGI/mod_(php|…)/FastCGI/Tomcat
только на уровне инициализации интерпретатора/вирт. машины перед исполнением запроса
Имеем N обработчиков, исполняющих логику веб-приложения
===>
Минимальное число запросов, чтобы занять их всех «делом» = N
НЕТ
ПОТОМУ ЧТООТКАЗОУСТОЙЧИВОСТЬ
Немного менее очевидной практики• Веб – он такой веб…• Что сделает фронт (балансер), если поймет, что бэкэнд (фронт) не
отвечает на запрос время T?• Перешлет тот же самый запрос другому бэкэнду (фронту)!• А если причина ответа больше времени T в самом запросе?
Первопричины• Исчерпан не дискретный системный
ресурс• CPU – квантуется тиками, в случае большой
нагрузки со стороны одного процесса, ресурса достанется мало, но всем• Дисковая подсистема – iops, SSD спасает• PID, количество соединений с базой,
inodes – квантуются большими значениями• Нужный ресурс залочен• Искусственное ограничение с целью
сохранить консистентность данных
Причины
• уязвимости обработки форматов данных• классические уязвимости• уязвимости логики работы приложений• уязвимости архитектуры/администрирования
Обработка форматов данных
•А какой у вашего парсера порог вложенности?•XML/SOAP bombs
НЕТ
у меня REST ;)
Обработка форматов данных
•А какой у вашего парсера порог вложенности?
/rest/api/is/pretty/good/also/for/logic/bombs?a[][][][][][][][][][][][][][][]=123&b[1][2][3][4][][][][7][8][][][]…
Обработка форматов данных
•XML, JSON, CSV и многие другие…•Проще проверить векторами атак, чем вычитывать
код• ZIP и другие архивы – распакуй мне
папку/папку/папку/папку/папку/папку/папку/папку/папку/папку/папку/папку/папку/папку/папку/папку/папку/папку/папку/папку/папку/папку/папку/папку/СИМЛИНК
И ЕЩЕ
Ресайзь меня полностью!
Не стоит давать возможность задавать любоые размеры пользователю при ресайсе:/resize.me?width=99999999&height=9999999
Важно проверять не только вес загружаемой картинки перед обработкой, но и ее линейные размеры:1.png - 1kb - 1x999999 px
Пример с реварда
Классические уязвимости
• SQL-инъекции•XXE• SSRF
•И почти все остальные серверные уязвимости•Могут отправить сервер куда-нибудь, например,
читать /dev/urandom до EOF
Классические уязвимости
•Почему не спасет max_execution_time?
•не распространяется на сокетные операции и другое чтение!
•Сервер может «цедить» вашему приложению по байту, удерживая сокет
Уязвимости логики работы приложения•В простонародье – тормозящий поиск• Также известны как «сунь мне в LIKE процентов»
•Более интересные случаи атаки на классификаторы «человечных» поисковых механизмов
красное, но синее, шоколад, быстрый, для девушки
Уязвимости логики работы приложения• Типичная ошибка при проектировании защиты –
положиться на ограничение поисковой строки для LIKE по длине
•СУБД все-равно:AND word LIKE ‘%’AND word LIKE ‘%%%%%%%%%’
Уязвимости логики работы приложения• Типичная ошибка при проектировании защиты –
фильтровать только символ %
• Siri, help me: “LIKE operator wildcards”[^gasddsd][!abcgfsdt]_a_b_c_d_e
Уязвимости администрирования
•Разработчики пишут код•Админы этот код обслуживают•Кто отвечает за баги на стыке этих процессов?
АРХИТЕКТОР
Классика – кончились соединения с базойПул соединений в случае с сервером приложений
Что сделает приложение, когда каждое из соединений пула будет читать/писать что-то в момент, когда новый воркер тоже хочет к базе?
Ничего не сделает – будет ждать
Сессии в файловой системе
/tmp/sess_ag6YTFfrsdsyRT2sS• сколько файлов может быть создано в tmpfs?
nr_inodes = The maximum number of inodes for this instance. The default is half of the number of your physical RAM pages, or (on a machine with highmem) the number of lowmem RAM pages, whichever is the lower
Сессии в файловой системе
RAM i-nodes4Gb 512k8Gb 1М16Gb 2М32Gb 4М48Gb 6М64Gb 8М
НЕТ
У МЕНЯ MEMCACHED
Memcached хранилище сессий
Дело не в том, какое у вас хранилищеДело в том, ЧТО вы там храните :)User-agent, login, историю посещенных страниц – а сколько это может занимать ГИГАБАЙТ ?
Размер memcached всегда ограничен памятьюКак обработано истощение памяти?
Злоумышленник может держать весь пул на своих сессиях и не давать никому установить новые
Вопросы?
Спасибо за внимание!
@d0znpphttp://lab.onsec.ru