Re: Sections 3.3.2 and 3.3.3 allow bogus Content-Length?

"Adrien de Croy" <adrien@qbik.com> Tue, 14 February 2017 21:14 UTC

Return-Path: <ietf-http-wg-request+bounce-httpbisa-archive-bis2juki=lists.ie@listhub.w3.org>
X-Original-To: ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com
Delivered-To: ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 793B6129887 for <ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com>; Tue, 14 Feb 2017 13:14:48 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -6.902
X-Spam-Level:
X-Spam-Status: No, score=-6.902 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, HEADER_FROM_DIFFERENT_DOMAINS=0.001, RCVD_IN_DNSWL_HI=-5, RP_MATCHES_RCVD=-0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id AiJs9QuAVxao for <ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com>; Tue, 14 Feb 2017 13:14:44 -0800 (PST)
Received: from frink.w3.org (frink.w3.org [128.30.52.56]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 43D971295AE for <httpbisa-archive-bis2Juki@lists.ietf.org>; Tue, 14 Feb 2017 13:14:44 -0800 (PST)
Received: from lists by frink.w3.org with local (Exim 4.80) (envelope-from <ietf-http-wg-request@listhub.w3.org>) id 1cdkPW-0000lW-D6 for ietf-http-wg-dist@listhub.w3.org; Tue, 14 Feb 2017 21:13:18 +0000
Resent-Date: Tue, 14 Feb 2017 21:13:18 +0000
Resent-Message-Id: <E1cdkPW-0000lW-D6@frink.w3.org>
Received: from titan.w3.org ([128.30.52.76]) by frink.w3.org with esmtps (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from <adrien@qbik.com>) id 1cdkPS-0000jR-RE for ietf-http-wg@listhub.w3.org; Tue, 14 Feb 2017 21:13:14 +0000
Received: from smtp.qbik.com ([122.56.26.1]) by titan.w3.org with esmtps (TLS1.2:ECDHE_RSA_ARCFOUR_128_SHA1:128) (Exim 4.84_2) (envelope-from <adrien@qbik.com>) id 1cdkPM-0008Ue-3M for ietf-http-wg@w3.org; Tue, 14 Feb 2017 21:13:09 +0000
Received: From [192.168.1.146] (unverified [192.168.1.146]) by SMTP Server [192.168.1.3] (WinGate SMTP Receiver v9.0.4 (Build 5915)) with SMTP id <0000964437@smtp.qbik.com>; Wed, 15 Feb 2017 10:12:38 +1300
From: Adrien de Croy <adrien@qbik.com>
To: Loïc Hoguin <essen@ninenines.eu>, "ietf-http-wg@w3.org" <ietf-http-wg@w3.org>
Date: Tue, 14 Feb 2017 21:12:38 +0000
Message-Id: <ema747b801-6dcc-4b2d-ac95-9a027e10c0b4@bodybag>
In-Reply-To: <e01c4945-1116-d258-7004-ea917843bf3d@ninenines.eu>
References: <emdcb96fc0-0d2f-436c-9f1f-05beffe7593e@bodybag> <e01c4945-1116-d258-7004-ea917843bf3d@ninenines.eu>
Reply-To: Adrien de Croy <adrien@qbik.com>
User-Agent: eM_Client/7.0.27943.0
Mime-Version: 1.0
Content-Type: text/plain; format="flowed"; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Received-SPF: pass client-ip=122.56.26.1; envelope-from=adrien@qbik.com; helo=smtp.qbik.com
X-W3C-Hub-Spam-Status: No, score=-4.7
X-W3C-Hub-Spam-Report: AWL=-0.785, BAYES_00=-1.9, RP_MATCHES_RCVD=-0.001, SPF_PASS=-0.001, W3C_AA=-1, W3C_WL=-1
X-W3C-Scan-Sig: titan.w3.org 1cdkPM-0008Ue-3M 27dc20221a58d4b07eb0a6b4d8c3aef9
X-Original-To: ietf-http-wg@w3.org
Subject: Re: Sections 3.3.2 and 3.3.3 allow bogus Content-Length?
Archived-At: <http://www.w3.org/mid/ema747b801-6dcc-4b2d-ac95-9a027e10c0b4@bodybag>
Resent-From: ietf-http-wg@w3.org
X-Mailing-List: <ietf-http-wg@w3.org> archive/latest/33491
X-Loop: ietf-http-wg@w3.org
Resent-Sender: ietf-http-wg-request@w3.org
Precedence: list
List-Id: <ietf-http-wg.w3.org>
List-Help: <http://www.w3.org/Mail/>
List-Post: <mailto:ietf-http-wg@w3.org>
List-Unsubscribe: <mailto:ietf-http-wg-request@w3.org?subject=unsubscribe>

I did quote that section, but it doesn't define what an invalid C-L is.

Nowhere does it explicitly state that C-L value must equal the body size 
in order to be valid.  Sure it should be obvious, but the language at 
the start of 3.3.2 doesn't help there.

It says

"Any Content-Length field value greater than or equal to zero is
valid."

well no, to be valid it must match the body size.

The first sentence in 3.3.2

"When a message does not have a Transfer-Encoding header field, a
Content-Length header field can provide the anticipated size, as a
decimal number of octets, for a potential payload body."

"can provide"???
"anticipated size"???
"potential payload body"???

There's either a payload or there isn't.
C-L is either required or it isn't.
If size isn't known you can't send C-L, If it's a request you must use 
T-E chunked, since you can't close after sending and still receive the 
reply.

Adrien




------ Original Message ------
From: "Loïc Hoguin" <essen@ninenines.eu>
To: "Adrien de Croy" <adrien@qbik.com>; "ietf-http-wg@w3.org" 
<ietf-http-wg@w3.org>
Sent: 15/02/2017 10:05:46 AM
Subject: Re: Sections 3.3.2 and 3.3.3 allow bogus Content-Length?

>On 02/14/2017 09:49 PM, Adrien de Croy wrote:
>>
>>The language in RFC 7230 section 3.3.2 is extremely non-commital about
>>whether Content-Length needs to be correct or not.
>>
>>I'm currently having a dispute about this with someone who quoted 
>>these
>>sections at me as being proof that you can use any value for C-L
>>regardless of the body length.
>>
>>I think it could be a lot more forcefully written
>>
>>Or is the person correct and we don't need to have C-L match the body
>>length?
>
>It sounds pretty explicit to me:
>
>    4.  If a message is received without Transfer-Encoding and with
>        either multiple Content-Length header fields having differing
>        field-values or a single Content-Length header field having an
>        invalid value, then the message framing is invalid and the
>        recipient MUST treat it as an unrecoverable error.  If this is a
>        request message, the server MUST respond with a 400 (Bad 
>Request)
>        status code and then close the connection.
>
>If it's both invalid and required for handling the request, send a 400 
>and close the connection.
>
>I suppose the spec allows you to have an invalid Content-Length if and 
>only if the request also has a Transfer-Encoding header, however:
>
>        If a message is received with both a Transfer-Encoding and a
>        Content-Length header field, the Transfer-Encoding overrides the
>        Content-Length.  Such a message might indicate an attempt to
>        perform request smuggling (Section 9.5) or response splitting
>        (Section 9.4) and ought to be handled as an error.
>
>So sending a 400 and closing does not sound crazy even in that case, 
>despite the spec not requiring it.
>
>-- Loïc Hoguin
>https://ninenines.eu