Re: Об одной малоизвестной уязвимости в веб сайтах
Maxim Dounin
mdounin at mdounin.ru
Mon Jun 16 12:00:53 UTC 2014
Hello!
On Sun, Jun 15, 2014 at 11:07:58PM +0300, Gena Makhomed wrote:
> On 14.06.2014 21:14, Maxim Dounin wrote:
>
> >>>>>>>>>>>>http://habrahabr.ru/post/166855/
> ...
> >Прокси-сервер, помимо всего прочего, является сервером, и
> >процитированное требование вернуть 400 в ответ на "Host header
> >field with an invalid field-value" - к нему тоже относится.
> >Соответственно, если трактовать термин "invalid field-value" как
> >включающий проверку не только синтаксиса, но и требований,
> >предъявляемых к формированию заголовка Host клиентом, то
> >требование "ignore the received Host header" теряет смысл.
>
> Максим, теперь я понял, в чем была моя ошибка, спасибо!
>
> >Теримн "field-value" расшифровывается в "3.2. Header Fields",
> >http://tools.ietf.org/html/rfc7230#section-3.2:
> >
> > field-value = *( field-content / obs-fold )
> >
> >Соответственно invalid - это то, что не соответствует указанному
> >синтаксису.
>
> Понял, спасибо!
>
> Но есть один не совсем понятный нюанс -
> озвученные в RFC 7230 требования к клиенту:
>
> http://tools.ietf.org/html/rfc7230#section-5.4
>
> A client MUST send a Host header field in all HTTP/1.1 request
> messages. If the target URI includes an authority component, then a
> client MUST send a field-value for Host that is identical to that
> authority component, excluding any userinfo subcomponent and its "@"
> delimiter (Section 2.7.1).
>
> - это ведь требования к синтаксису, которые обязательны для выполнения.
Нет, это не требования к синтаксису, это требования к семантике.
И они обязательны для клиента, но не для сервера. Соответственно,
что делать в случае, если клиент их не выполнил - на совести
сервера.
> А вот что есть в RFC 7231:
>
> http://tools.ietf.org/html/rfc7231#section-6.5.1
>
> 6.5.1. 400 Bad Request
>
> The 400 (Bad Request) status code indicates that the server cannot or
> will not process the request due to something that is perceived to be
> a client error (e.g., malformed request syntax, invalid request
> message framing, or deceptive request routing).
>
> Следовательно, сервер имеет право вернуть 400 статус,
> если получит запрос с разными authority component
> в заголовке Host и в absolute Request URI ?
Сервер имеет право вернуть 400 более или менее в любой момент.
> Кроме того, в разделе 5.5. Effective Request URI
> http://tools.ietf.org/html/rfc7230#section-5.5
>
> даже прямо говорят, что запрос может быть misdirected,
> deliberately or accidentally, и что origin server должен
> сам решить, обрабатывать такой запрос или нет, потому что
> "it might indicate an attempt to bypass security filters,
> trick the server into delivering non-public content,
> or poison a cache."
>
> именно это ведь и происходит в случае запроса
>
> GET http://apple.com/ HTTP/1.1
> Host: samsung.com
>
> Разве ответить на такой запрос 400-м статусом не будет лучше?
Это зависит от многих факторов. Вот тут Валентин давеча
напрограммировал возврат 400, если имя, указанное в SNI, не
совпадало с именем, используемым в запросе, ибо RFC 6066 говорит:
... If the server_name is
established in the TLS session handshake, the client SHOULD NOT
attempt to request a different server name at the application layer.
Так пришлось распрограмировать обратно - потому что Chrome
использует "a different server name at the application layer",
когда считает нужным/возможным.
То, как ведёт себя nginx по умолчанию - вполне себе безопасно, и
проблемы нет. Какая-либо проблема появляется тогда и только
тогда, когда администратор начинает писать в конфиге $http_host,
не думая о последствиях. Есть мнение, что совсем простое решение
этой проблемы - не делать так (c) анекдот.
--
Maxim Dounin
http://nginx.org/
Подробная информация о списке рассылки nginx-ru