Назад | Перейти на главную страницу

Почему modsecurity требует Content-Length в запросах POST?

У меня есть веб-служба RESTful, которая принимает запрос POST к ресурсу без тела объекта, например пустой запрос POST. Конфигурация modsecurity по умолчанию требует, чтобы все запросы POST имели Content-Length:

# Require Content-Length to be provided with every POST request
SecFilterSelective REQUEST_METHOD "^POST$" chain
SecFilterSelective HTTP_Content-Length "^$"

Консоль modsecurity сообщает об этом как PROTOCOL_VIOLATION / EVASION. Однако я не считаю это верным, когда читаю HTTP / 1.1 RFC. Серверу разрешено требовать Content-Length (возвращая либо 400, либо 411), но я не вижу ничего, что говорило бы, что сервер должен (или рекомендации, что он должен) вести себя таким образом.

Возможно, это зависит от браузера, но клиенты Flash, выполняющие запросы POST без тел сущностей, не отправляют заголовок запроса. Также не происходит curl, когда вы выполняете 'curl -XPOST ...'. По этим причинам и поскольку я считаю, что правило modsecurity неверно истолковывает спецификацию HTTP, я рассматриваю возможность отмены требования для заголовка Content-Length в запросах POST в нашей конфигурации.

Кто-нибудь знает, был ли конкретный эксплойт для устранения этого правила? Многочисленные поиски в Google, и я нашел только ссылки на то, что это часть стандартной конфигурации modsecurity.

Прежде всего, вы должны знать, что вы используете устаревшую версию ModSecurity (ветка 1.x). Если вы используете Apache 2.0.x, вам следует перейти на ModSecurity 2.x. Если вы все еще используете Apache 1.3.x, я боюсь, что у вас нет выбора, поскольку ModSecurity 2.x не будет работать с ним. Сам ModSecurity 1.x не известен как уязвимый, но его механизм правил слишком негибкий для сегодняшних требований.

Если я правильно помню, ModSecurity 1.x требовал POST-запросов для указания длины содержимого просто потому, что он не поддерживал фрагментированные тела запросов (альтернативный способ отправки тел запросов, при котором общая длина неизвестна до конца). Тогда фрагментированные тела запросов были невероятно редкими (мы говорим о 2003, 2004 годах) и все еще редки (хотя некоторые мобильные устройства их используют).

В ModSecurity 2.x таких ограничений нет.

Если вы удалите это правило, вы создадите большую дыру, через которую кто-то может незаметно проникнуть в атаку. С другой стороны, я могу утверждать, что, когда вы используете ModSecurity 1.x, есть и другие способы сделать то же самое. В качестве альтернативы можно настроить правило, чтобы отклонять запросы, для которых установлен заголовок запроса Transfer-Encoding. Вы должны быть в безопасности с этим.

Раскрытие информации: я написал ModSecurity.

Я считаю, что это требование является частью спецификации xml-rpc, а не спецификации http. Если вам не нужен xml-rpc, я бы подумал, что было бы неплохо пропустить.

Я мало что знаю о причинах его общего включения в mod_security, если только он не был изначально создан для предотвращения какого-то эзотерического переполнения буфера.