Критическая уязвимость в OWASP CRS позволяет обойти проверку кодировок в веб-брандмауэрах

vulnerability

В популярном наборе правил OWASP Core Rule Set (CRS), который используется для защиты веб-приложений, обнаружена опасная уязвимость. Она позволяет злоумышленникам обходить проверку кодировок символов (charset) в межсетевых экранах уровня приложений (WAF). Как следствие, опасные полезные нагрузки (payload) могут достигать защищаемых бэкенд-приложений.

Детали уязвимости

Уязвимости присвоен идентификатор CVE-2026-21876, а её критичность оценена в 9.3 балла по шкале CVSS v3.1. Проблема затрагивает правило с номером 922110 в составе CRS. Эксплуатация этой уязвимости может открыть приложения для атак, основанных на кодировании данных, таких как межсайтовый скриптинг (XSS). Администраторам настоятельно рекомендуется немедленно обновить используемые версии CRS и провести аудит журналов на предмет подозрительных запросов.

Механизм обхода защиты

Правило 922110 относится к первому уровню паранойи (Paranoia Level 1, PL1) и включено по умолчанию. Его задача - проверять параметр кодировки (charset) в заголовках "Content-Type" запросов типа "multipart/form-data". Оно блокирует потенциально опасные кодировки, например, UTF-7, UTF-16, UTF-32, Shift-JIS и EUC-JP, разрешая только набор из белого списка.

Однако из-за логической ошибки в обработке цепочек правил для составных (multipart) запросов, правило валидировало только кодировку последней части запроса. При этом оно игнорировало вредоносные (malicious) кодировки, использованные в предыдущих частях. Данная проблема связана с особенностями обработки коллекций в ModSecurity.

В реальной атаке злоумышленник мог разместить вредоносную XSS-полезную нагрузку, закодированную в UTF-7, в первой части составного запроса, указав "charset=utf-7". Затем следовала бы безобидная финальная часть с безопасной кодировкой, например, "charset=utf-8". Поскольку захваченное значение кодировки перезаписывалось в процессе итерации и оценивалось только один раз в конце, WAF проверял исключительно безопасную кодировку и пропускал весь запрос целиком.

Таким образом, атаки с использованием UTF-7 XSS и других методов, основанных на подмене кодировок, могли обходить защиту CRS и достигать уязвимых бэкенд-приложений.

Область воздействия и исправление

Уязвимость затрагивает версии CRS 3.3.x, а также все выпуски с 4.0.0 по 4.21.0. Она проявляется во всех поддерживаемых движках, включая ModSecurity 2.x, ModSecurity 3.x (libmodsecurity) и Coraza. Поскольку проблема кроется в логике самого правила, а не в движке, подвержены риску все развертывания, использующие уязвимые версии.

Высокий рейтинг уязвимости в 9.3 балла отражает возможность удаленной эксплуатации, отсутствие необходимости в аутентификации или взаимодействии с пользователем, низкую сложность атаки и критичность последствий - успешная атака полностью обходит границу защиты, которую обеспечивает WAF.

Для устранения проблемы команда разработчиков CRS полностью переработала правило 922110 и ввела два вспомогательных правила: 922140 и 922150. Исправление изменяет механизм валидации. Теперь значение "Content-Type" каждой части составного запроса сохраняется в уникально индексируемых переменных транзакции, а проверяется каждая обнаруженная кодировка, а не только последняя.

Этот подход обеспечивает стабильную работу во всех поддерживаемых движках, не использует неподдерживаемые функции регулярных выражений и добавляет минимальную нагрузку на производительность. Исправления выпущены в версиях CRS 4.22.0 и CRS 3.3.8. Администраторам критически важно как можно скорее обновить свои системы до этих версий.

После обновления рекомендуется провести ретроспективный анализ журналов (logs) за предыдущий период. Следует искать подозрительные составные запросы, в которых могли использоваться запрещенные кодировки символов. Это поможет выявить возможные попытки эксплуатации до установки исправлений.

Ссылки

Комментарии: 0