On 10/19/22 11:28 AM, Stefan Eissing via dev wrote:
>
>
>> Am 18.10.2022 um 21:20 schrieb Roy T. Fielding <field...@gbiv.com>:
>>
>>> On Oct 6, 2022, at 2:17 AM, Stefan Eissing via dev <dev@httpd.apache.org>
>>> wrote:
>>>
>>>> Am 05.10.2022 um 19:34 schrieb Stefan Eissing via dev
>>>> <dev@httpd.apache.org>:
>>>>
>>>>
>>>>
>>>>> Am 05.10.2022 um 18:48 schrieb Eric Covener <cove...@gmail.com>:
>>>>>
>>>>> On Wed, Oct 5, 2022 at 12:44 PM Roy T. Fielding <field...@gbiv.com> wrote:
>>>>>>
>>>>>>> On Sep 26, 2022, at 5:29 AM, ic...@apache.org wrote:
>>>>>>>
>>>>>>> Author: icing
>>>>>>> Date: Mon Sep 26 12:29:47 2022
>>>>>>> New Revision: 1904269
>>>>>>>
>>>>>>> URL: http://svn.apache.org/viewvc?rev=1904269&view=rev
>>>>>>> Log:
>>>>>>> *) mod_http2: new directive "H2HeaderStrictness" to control the
>>>>>>> compliance
>>>>>>> level of header checks as defined in the HTTP/2 RFCs. Default is 7540.
>>>>>>> 9113 activates the checks for forbidden leading/trailing whitespace in
>>>>>>> field values (available from nghttp2 v1.50.0 on).
>>>>>>
>>>>>> I am not seeing why that should be optional. It adds overhead, but it
>>>>>> reduces
>>>>>> variability (for HPACK) and might prevent some downstream
>>>>>> vulnerabilities, IIRC.
>>>>>> Maybe an internal switch for testing with default on?
>>>
>>> To add some more detail:
>>>
>>> - rfc9113 ch 8.2.1 states: "A field value MUST NOT start or end with an
>>> ASCII whitespace character"
>>> - nghttp2 v1.49.0 implemented that check, non-optional. Things broke.
>>> - nghttp2 v1.50.0 added to its API so that the application can control the
>>> behaviour on request of Daniel Stenberg
>>> - I added "H2HeaderStrictness" (in trunk only for now) to steer that.
>>>
>>> This is not a normalization issue, it's a hard "MUST NOT" e.g. rejection of
>>> the request/response carrying such a field. While I agree that there are
>>> many advantages in having fields more strict, the way to get there is not
>>> clear.
>>>
>>> I am totally in favour of avoiding "H2HeaderStrictness", but just enforcing
>>> rfc9113 here will not do. What would our response be for people whose
>>> legacy clients/fronted applications will no longer work?
>>
>> Well, normally, I don't have a problem with just breaking them.
>> They are broken. Someone can fix them.
>>
>> It isn't a normalization issue. Whitespace that magically appeared when h2
>> changed the framing of header field values immediately became a security
>> vulnerability for all downstream recipients of h2/h3 messages that use
>> generic HTTP (semantic) field values expecting that stuff to have
>> been excluded during parsing.
>>
>> IOW, it's a security hole and our code either fixes it or gets a CVE.
>> We MUST NOT forward the malformed data in fields. That is not an option.
>>
>> OTOH, how we deal with a request containing malformed data in fields
>> (after making it well-formed) is a SHOULD send 400, not a MUST.
>> If we want to be super nice to the folks shipping bad code (or running pen
>> testers) and have an option to strip the naughty bits out while forwarding
>> the message, that's fine with me as an optional directive. But that won't
>> help them interop with the rest of the Internet.
>
> Speaking about our implementation, I just added tests to trunk. Configuring
> 'Header add name "$value"' and making http/1.1 requests, curl sees the
> returned headers as:
>
> configured, returned
> ['123 ', '123 '], # trailing space stays
> ['123\t', '123\t'], # trailing tab stays
> [' 123', '123'], # leading space is stripped
> [' 123', '123'], # leading spaces are stripped
> ['\t123', '123'], # leading tab is stripped
>
> Test case 'test_h1_007_02'.
>
> Linking nghttp2 v1.49.0 and newer, without further config, will RST_STREAM
> cases 1 and 2 when using HTTP/2. While succeeding with HTTP/1.1. I would find
> that highly confusing.
Thanks. Initially I thought it was about request headers, but the tests are
about response headers. Does the "no leading/trailing
whitespace" rule apply to both?
>
> I understand that in the definition of Core HTTP, leading/trailing whitespace
> MUST NOT carry any semantics and SHOULD be avoided. If Apache httpd, in its
> version-independent field handling, should decide to universally strip such
> ws, that would be totally fine with me.
>
> The question in implementing mod_http2 is when cases 1+2 should FAIL and when
> we should serve them. If we have any other config I can derive that from, I'd
> happily remove "H2HeaderStrictness" again.
As far as I understand Roy, we should deny by default but have a directive that
allows us to strip leading/trailing whitespaces
from the header values and accept them then (provided they are ok otherwise).
But I would be also fine if we just silently strip the leading/trailing ws
always.
Regards
RĂ¼diger