Рубрики

Понимание ReDoS-атаки

ReDoS означает «Отказ в обслуживании с регулярными выражениями». ReDoS — это атака алгоритмической сложности, которая вызывает отказ в обслуживании , предоставляя регулярное выражение , для оценки которого требуется очень много времени. Атака использует тот факт, что большинство реализаций регулярных выражений имеют экспоненциальную сложность в наихудшем случае по времени, поэтому для более крупных входных строк («злое регулярное выражение») время, затрачиваемое механизмом регулярных выражений на поиск соответствия, увеличивается в геометрической прогрессии.

Цель атакующего состоит в том, чтобы предоставить такое регулярное выражение (я), чтобы оно занимало неопределенное количество времени вычислений, что, в свою очередь, либо замедлит работу приложения, либо полностью его остановит.
Таким образом, эта атака в основном использует тот факт, что движок регулярных выражений будет проверять каждую возможную перестановку и комбинацию символов, чтобы найти совпадение.

Регулярные выражения можно найти по всей сети, а ReDoS-атаку можно использовать для нацеливания на различные компоненты сети.

Пример выражения атак ReDOS

Регулярное выражение : ^ ((ab) *) + $ (это регулярное выражение ищет ab и его повторение)
Вход: Абабаб
В этом случае механизм регулярных выражений найдет совпадение с первой попытки, поскольку ababab соответствует шаблону регулярных выражений. Теперь мы можем очень легко усложнить ситуацию, добавив в качестве ввода абабабу. Это exta a в конце концов вызовет всевозможные проблемы, поскольку оно не соответствует шаблону и заставит механизм регулярных выражений запускать все виды перестановок в поисках возможного соответствия.

(ababab) - NOT A MATCH
(abab)(ab) - NOT A MATCH
(ab)(abab) - NOT A MATCH
(ab)(ab)(ab) - NOT A MATCH
()(ababab) - NOT A MATCH
()(abab)(ab) - NOT A MATCH
()(ab)(abab) - NOT A MATCH
()(ab)(ab)(ab) - NOT A MATCH

Вы можете попробовать это сами в этом онлайн- редакторе регулярных выражений . Теперь представьте, что этот вход был длиннее

abababababababababababababababababababababababababab......

какой хаос это создаст.

Злой Регекс

Это регулярные выражения, которые делают приложение уязвимым для ReDoS-атак, они возникают всякий раз, когда возникают следующие факторы:

  • регулярное выражение применяет повторение («+», «*») к сложному подвыражению
  • для повторного подвыражения существует совпадение, которое также является суффиксом другого действительного совпадения.

Примеры вредоносных регулярных выражений включают в себя следующее:

  • (А +) +
  • ([A-Za-Z] +) *
  • (А | аа) +
  • (А |? А) +
  • (. * a) {x} для x> 10

Атака на веб-приложение через Evil Regex:

  • Откройте JavaScript и найдите злое регулярное выражение
  • Создайте вредоносный ввод для найденного Regex и отправьте действительное значение через перехватывающий прокси
  • Измените запрос, чтобы он содержал вредоносный ввод, и вы готовы к атаке ReDos

ReDoS через Regex Injection

В следующем примере проверяется, является ли имя пользователя частью пароля, введенного пользователем.

String userName = textBox1.Text;
String password = textBox2.Text;
Regex testPassword = new Regex(userName);
Match match = testPassword.Match(password);
if (match.Success)
{
MessageBox.Show("Do not include name in password.");
}
else
{
MessageBox.Show("Good password.");
}

Если злоумышленник вводит ^ (([az]) +.) + [AZ] ([az]) + $ в качестве имени пользователя и aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa! в качестве пароля программа будет зависать.

Предупреждение:

  1. Используйте атомарную группировку в своем регулярном выражении. Атомная группа — это группа, которая, когда из нее выходит механизм регулярных выражений, автоматически отбрасывает все позиции возврата, запомненные любыми токенами внутри группы.
  2. Если регулярное выражение занимает слишком много времени, немедленно убейте его и сообщите пользователю, что регулярное выражение занимало слишком много времени.
  3. Предварительно отформатируйте / проверьте правильность своих регулярных выражений или позвольте людям искать текст напрямую, а не вводить регулярное выражение напрямую.

Ссылки:

  • https://www.linkedin.com/pulse/redos-attacks-python-application-architectures-akshat-mahajan
  • http://stackoverflow.com/questions/12841970/how-can-i-recognize-an-evil-regex
  • https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS
  • Источник изображения: https://www.owasp.org/index.php/Main_Page

Эта статья предоставлена Palash Nigam . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Понимание ReDoS-атаки

0.00 (0%) 0 votes