Заметки по безопасности: RegEx
Может ли RegEx быть уязвимым?
Photo by Markus Spiske on Unsplash
Denial-of-Service с помощью регулярных выражений: ReDOS
Одна из самых неожиданно, но трудно обнаруживаемых уязвимостей, с которыми я сталкивался, связана с регулярными выражениями.
То — плохо написанные, то — плохо реализованные.
Большие или специально сформированные пользовательские данные могут исчерпать память или процессор.
Это уязвимость типа отказа в обслуживании, а не просто «запах» производительности. Если враждебный ввод может удерживать процессор достаточно долго, чтобы лишить реальных пользователей ресурсов, его следует включить в модель угроз безопасности.
Признаки предупреждения
- Вложенные квантификаторы, повторяющиеся группы или перекрывающиеся альтернативы
- Движки с интенсивным откатом без тайм‑аутов или ограничений длины ввода
- Выражение применяется к непроверенным пользовательским данным
- Проверка регуляркой выполняется в горячем пути запроса
Смягчение / Решение
- Регулярные выражения — сложная тема.
- Например, вот как «по‑умному» советуют работать с проверкой IP‑адресов в [OWASP][owasp]:
^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ - Это длиннее, чем (старый) твит, для всего лишь 4‑байтового IP‑адреса!!!
- Например, вот как «по‑умному» советуют работать с проверкой IP‑адресов в [OWASP][owasp]:
- Ограничьте длину ввода до применения регулярного выражения.
- Добавьте тайм‑ауты, статический анализ или используйте движок без отката, если платформа это поддерживает.
- Это касается почти всех языков и платформ: .NET, Node, Python, PERL, Java.