В популярном наборе правил 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) за предыдущий период. Следует искать подозрительные составные запросы, в которых могли использоваться запрещенные кодировки символов. Это поможет выявить возможные попытки эксплуатации до установки исправлений.
Ссылки
- https://www.cve.org/CVERecord?id=CVE-2026-21876
- https://github.com/coreruleset/coreruleset/security/advisories/GHSA-36fv-25j3-r2c5
- https://github.com/coreruleset/coreruleset/commit/80d80473abf71bd49bf6d3c1ab221e3c74e4eb83
- https://github.com/coreruleset/coreruleset/commit/9917985de09a6cf38b3261faf9105e909d67a7d6
- https://github.com/coreruleset/coreruleset/releases/tag/v3.3.8
- https://github.com/coreruleset/coreruleset/releases/tag/v4.22.0