Re: New Version Notification for draft-thomson-http-replay-00.txt

I agree with your analysis and that the proposed mitigation should have
the desired effect.

It's probably worth calling out that the scenario assumes the client
sends non-idempotent stuff over 0-RTT, which the client is not supposed
to do.  And, as you note, a server with a separate API/stream for early
data would know that the request in question came over early data.

-Ben

On 07/19/2017 09:20 AM, Subodh Iyengar wrote:
> Martin, a few others and I discussed this draft offline just after the
> HTTP WG meeting and I believe there is an extension of the dkg style
> attack possible on the proposal currently.
>
> I'm making the following assumptions:
>      * There is no special API to handle 0-rtt data by the TLS
> terminator, i.e. it is treated as a part of the same 1-rtt stream of data
>
>   * A Terminating proxy uses one of 2 approaches to decide to
>     set Early-Data upstream: 
>       o The terminating proxy just checks for isHandshakeFinished() to
>         determine whether or not the data was send on 0-rtt or not,
>         and sets the Early-Data accordingly
>       o The server buffers the entire request till it gets the
>         Finished message and then forwards the requests without early
>         data header
>   * There are 2 timeouts on the client, a transport timeout which is
>     larger and a request timeout which is smaller
>   * The client will potentially retry requests that timeout
>     potentially on a new connection
>   * A client decides to send a non-idempotent request over 0-rtt and
>     relies on the server to reject it 
>
>
> Let's say the following things happen:
>
>   * Aclient sends a request to the Terminating proxy over 0-rtt.
>   * A MITM forwards the client hello to the proxy, gets the server
>     hello etc. and forwards it to the client and gets the earlydata
>     and finished message. 
>   * The MITM then holds back the request and the finished message. 
>   * The request would time out on the client and the client retries on
>     a new connection over 1-rtt to another server. 
>   * The transport has not timed out yet. 
>   * The MITM then releases the original data to the proxy
>   * Since the proxy received the data and finished together, it would
>     consider it to not be early data and not forward the early data
>     header to the upstream
>   * The upstream server now has received the same request twice
>     without knowing that it was sent over 0-rtt so it would not reject
>     them and if it didn't have another idempotency mechanism, would
>     execute it twice.
>
> Any strategy that does not provide a custom API for servers to tell
> the difference between 0-rtt and non 0-rtt data suffers from this
> problem. However custom APIs are painful to work with.
>
> Fortunately I think there is a simple fix to this though which is
> setting the early data header from the client directly and then the
> proxy can just forward it through. I understand that this cannot be
> exactly determined by the client, but it could be conservative about it.
>
> Subodh
> ------------------------------------------------------------------------
> *From:* Mike Bishop <Michael.Bishop@microsoft.com>
> *Sent:* Thursday, June 22, 2017 3:40:03 PM
> *To:* Martin Thomson
> *Cc:* HTTP Working Group
> *Subject:* RE: New Version Notification for
> draft-thomson-http-replay-00.txt
>  
> Ah, just terminology, then.  I was reading "gateway" as
> "intermediary," not as "reverse proxy."  A reverse proxy is much more
> likely to have a close configuration relationship with its back-end
> server(s).
>
> -----Original Message-----
> From: Martin Thomson [mailto:martin.thomson@gmail.com]
> Sent: Thursday, June 22, 2017 3:24 PM
> To: Mike Bishop <Michael.Bishop@microsoft.com>
> Cc: HTTP Working Group <ietf-http-wg@w3.org>
> Subject: Re: New Version Notification for draft-thomson-http-replay-00.txt
>
> On 23 June 2017 at 03:38, Mike Bishop <Michael.Bishop@microsoft.com>
> wrote:
> > I like most of it, but the second paragraph in 5 seems a little
> hand-wavy.  The gateway is supposed to "know" the server supports this
> new standard, which it can only fully do if it has received a 4NN in
> the past, which would only happen if it knew in the past, which.... 
> Chicken, meet egg.
>
> I don't think that it is as hand-wavy as all that.  Keep in mind that
> as a gateway for HTTPS, the gateway has the keys for the origin
> server.  That means that there is a pretty strong relationship there.
> The gateway can use that.  For instance, a CDN might delay requests
> unconditionally unless their customer has provided an override that
> enables immediate forwarding.
>
> This is less of a chicken and egg issue even if the gateway is forced
> to hold requests.  As we well know, the number of requests that can
> fit into the first round trip is limited.  That's why header
> compression is so useful.  Early data gives the client a little more
> space for sending requests.  It's not much, but it's something.

Received on Wednesday, 19 July 2017 16:06:13 UTC