Серверы и приложения на JavaScript уязвимы к ReDoS-атакам
О проблеме известно еще с 2012 года, однако до сих пор она оставалась недооцененной.
Web-приложения на JavaScript уязвимы к атакам отказа в обслуживании с использованием регулярных выражений (Regular expression denial of service, ReDoS). Атака известна уже давно, однако до сих пор оставалась недооцененной. ReDoS предполагает отправку злоумышленником объемных и сложных текстов web-серверу на JavaScript или приложению. Если компонент сервера или библиотека приложения не настроена специально для обработки краевых случаев, вводимые атакующим данные могут заблокировать работу приложения или сервера на секунды или даже на минуты, пока сервер будет анализировать эти данные и искать соответствия.
ReDoS-атаки на серверы на базе JavaScript были описаны исследователями еще в 2012 году. Однако в то время JavaScript, в частности Node.js, не пользовался такой популярностью у web-разработчиков, как сейчас, поэтому над исправлением проблемы никто не задумывался. Согласно прошлогоднему исследованию , 5% от всех уязвимостей в библиотеках и приложениях Node.js – это ReDoS-уязвимости.
Как сообщают специалисты Дармштадтского технического университета, сейчас проблема становится все более серьезной. Кристиан-Александру Стаику (Cristian-Alexandru Staicu) и Михаэль Прадел (Michael Pradel) обнаружили в популярных модулях Node.js 25 ранее неизвестных уязвимостей. По их словам, злоумышленник может создать специальные пакеты и с их помощью атаковать сервер через эти уязвимости.
Данные пакеты на несколько секунд или даже минут заблокируют работу сервера. Дело в том, что сервер будет пытаться сопоставить текст внутри пакетов с регулярными выражениями (regex) и решить, как дальше поступать с полученными данными. Подобные regex-фильтры в полях для ввода данных весьма распространены, поскольку являются основой для XSS-фильтров.
Сама по себе атака может вызвать неприятные последствия, однако повторяющаяся отправка пакетов способна причинить еще больший ущерб.
Регулярные выражения – формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов. Для поиска используется строка-образец, состоящая из символов и метасимволов и задающая правило поиска.