Re: Об одной малоизвестной уязвимости в веб сайтах

Maxim Dounin mdounin at mdounin.ru
Tue Jun 17 06:30:46 UTC 2014


Hello!

On Mon, Jun 16, 2014 at 11:20:57PM +0300, Gena Makhomed wrote:

> On 16.06.2014 15:00, Maxim Dounin wrote:
> 
> >>озвученные в 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).
> >>
> >>- это ведь требования к синтаксису, которые обязательны для выполнения.
> >
> >Нет, это не требования к синтаксису, это требования к семантике.
> 
> Запись target URI в виде valid request message - это разве не syntax?

Синтаксис - это то, что нарушает требования приведённых нормативных 
грамматик, см. http://tools.ietf.org/html/rfc7231#section-1.2 и 
далее.

[...]

> >>Разве ответить на такой запрос 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",
> >когда считает нужным/возможным.
> 
> "SHOULD NOT" - это не запрет, а только лишь рекомендация:
> http://tools.ietf.org/html/rfc2119#section-4
> так что формально и фактически Chrome ничего не нарушает.

Фактически - упомянутый "SHOULD NOT" на тот момент безусловно 
отклонялся Apache'ом, а противоречащие друг другу Host + 
Request-Line - формально вообще ничего не нарушали до выхода 
HTTPbis.  И что на самом деле происходит в реальной жизни - это 
отдельный интересный вопрос.

Среди прочего, например, HTTPbis явно требует возвращать 400, если 
запрос содержит несколько заголовков Host.  В своё время, однако, 
nginx'у потребовалось от этой практики отказаться:

http://hg.nginx.org/nginx/rev/b9de93d804ea

Если мне не изменяет память, причина была всё та же - реальная 
жизнь заставила.

-- 
Maxim Dounin
http://nginx.org/



Подробная информация о списке рассылки nginx-ru