- From: Willy Tarreau <w@1wt.eu>
- Date: Thu, 20 Jul 2017 06:25:24 +0200
- To: Subodh Iyengar <subodh@fb.com>
- Cc: Mike Bishop <Michael.Bishop@microsoft.com>, Martin Thomson <martin.thomson@gmail.com>, HTTP Working Group <ietf-http-wg@w3.org>
Hi, On Wed, Jul 19, 2017 at 02:20:14PM +0000, 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 Does such an implementation really exist ? I mean, for openssl, it's clearly different : https://www.openssl.org/docs/manmaster/man3/SSL_read_early_data.html So you read early data using SSL_read_early_data() and this one returning even one single byte indicates that you're getting early data. SSL_read() will not work before the handshake completes. I understand how having such an implementation could be an issue but then this is probably something that should be documented in the draft, explaining that one of the prerequisites to map HTTP on top of 0-RTT TLS, it's critical that the API clearly distinguishes early data from regular data. (...) > 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. One more reason for documenting this case clearly so that there is no confusion about it! > 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. Interestingly, we started with this initially, and figured that this was completely covered by the distinction of early data from regular data, and caused two other issues : - for some clients, changing a header field after a request was attempted and before operating a retry might be complicated (ie: the retry will very likely happen only at the transport layer) - whenever a proxy doesn't support early data, and would receive the whole request over regular data, it would have to strip this header field from the request. This results in having to deal with 3 values for this header field to know whether an attempt to use early data was made by the client, and whether at least one proxy in the chain received the request as early data. While I agree that APIs are difficult, I tend to think that the purpose of the draft is to explain the prerequisites to map HTTP on top of 0-RTT and that instead of complexifying all implementations and making them more fragile, we should rather indicate in which cases it's forbidden to enable 0-RTT (ie: SSL implementation doesn't provide a clear distinction between early data and regular data). This could possibly be justified by using your attack as an example. Regards, Willy
Received on Thursday, 20 July 2017 04:25:55 UTC