Re: Back to work

Eric Kinnear <ekinnear@apple.com> Wed, 28 October 2020 02:55 UTC

Return-Path: <ekinnear@apple.com>
X-Original-To: quic@ietfa.amsl.com
Delivered-To: quic@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 1A1493A0BC6 for <quic@ietfa.amsl.com>; Tue, 27 Oct 2020 19:55:29 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.098
X-Spam-Level:
X-Spam-Status: No, score=-2.098 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_MESSAGE=0.001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=apple.com
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 Lp4zaXBy2jJ9 for <quic@ietfa.amsl.com>; Tue, 27 Oct 2020 19:55:23 -0700 (PDT)
Received: from ma1-aaemail-dr-lapp03.apple.com (ma1-aaemail-dr-lapp03.apple.com [17.171.2.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 1EDE03A0BEC for <quic@ietf.org>; Tue, 27 Oct 2020 19:54:34 -0700 (PDT)
Received: from pps.filterd (ma1-aaemail-dr-lapp03.apple.com [127.0.0.1]) by ma1-aaemail-dr-lapp03.apple.com (8.16.0.42/8.16.0.42) with SMTP id 09S2m9Vl017043; Tue, 27 Oct 2020 19:54:29 -0700
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=apple.com; h=from : message-id : content-type : mime-version : subject : date : in-reply-to : cc : to : references; s=20180706; bh=/RaCXaWGuJOtTxMwhd0MTxiG4Gdn09HD65Kt72MLdQ8=; b=rvjeC9vKm9IkqoOid1n/WdYTajNSNFbHza5j60fm6tqkK22bVZ/J30tFbF91MRsBwbQB 7xFLbHXWwynDubcHUUeevmLZrJW13AQTJA7eQPcDkgIXGDpNEkid0IcSfOJM/90IMJQe +/bmXURCIJW/LLB4zr8nYufi5d9dZU98bk4zZ7R2toyViT/jO6CyO2ArV8073k1KMW/v Gy/TfmDW9bgH8rVQmDoooVHECJHrVX/kx3w1df+4sKvdrJksmXNq3mVa32hX8KFSp534 l2/rh0iimbiWggy0a4Jy311wrbXc3j4Gxr3H1CRnVgSwcaab6U/L3BiZ499dGSdDIhRK OQ==
Received: from rn-mailsvcp-mta-lapp01.rno.apple.com (rn-mailsvcp-mta-lapp01.rno.apple.com [10.225.203.149]) by ma1-aaemail-dr-lapp03.apple.com with ESMTP id 34ck8vbsxc-13 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO); Tue, 27 Oct 2020 19:54:29 -0700
Received: from rn-mailsvcp-mmp-lapp04.rno.apple.com (rn-mailsvcp-mmp-lapp04.rno.apple.com [17.179.253.17]) by rn-mailsvcp-mta-lapp01.rno.apple.com (Oracle Communications Messaging Server 8.1.0.6.20200729 64bit (built Jul 29 2020)) with ESMTPS id <0QIW00AUW5ESRP00@rn-mailsvcp-mta-lapp01.rno.apple.com>; Tue, 27 Oct 2020 19:54:28 -0700 (PDT)
Received: from process_milters-daemon.rn-mailsvcp-mmp-lapp04.rno.apple.com by rn-mailsvcp-mmp-lapp04.rno.apple.com (Oracle Communications Messaging Server 8.1.0.6.20200729 64bit (built Jul 29 2020)) id <0QIW00Z00591K600@rn-mailsvcp-mmp-lapp04.rno.apple.com>; Tue, 27 Oct 2020 19:54:28 -0700 (PDT)
X-Va-A:
X-Va-T-CD: 01a37c4388be431533d60b3d58eeb299
X-Va-E-CD: f9547cdfcf1db34a2e58b4894fc4b8f8
X-Va-R-CD: 2ba71f0fef3449a5a37d3b7967c49b1e
X-Va-CD: 0
X-Va-ID: 70205e4e-5a1c-4fcc-9d29-157ec321d6d1
X-V-A:
X-V-T-CD: 01a37c4388be431533d60b3d58eeb299
X-V-E-CD: f9547cdfcf1db34a2e58b4894fc4b8f8
X-V-R-CD: 2ba71f0fef3449a5a37d3b7967c49b1e
X-V-CD: 0
X-V-ID: dc201491-3e31-4968-bc9e-dae55046fc77
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.312, 18.0.737 definitions=2020-10-27_17:2020-10-26, 2020-10-27 signatures=0
Received: from [17.232.194.161] (unknown [17.232.194.161]) by rn-mailsvcp-mmp-lapp04.rno.apple.com (Oracle Communications Messaging Server 8.1.0.6.20200729 64bit (built Jul 29 2020)) with ESMTPSA id <0QIW002455EQ9T00@rn-mailsvcp-mmp-lapp04.rno.apple.com>; Tue, 27 Oct 2020 19:54:28 -0700 (PDT)
From: Eric Kinnear <ekinnear@apple.com>
Message-id: <41A07550-1BFA-43E6-83A0-93FA96DF1E9B@apple.com>
Content-type: multipart/alternative; boundary="Apple-Mail=_A18AC40E-B5D9-4870-B748-C4740A071D6C"
MIME-version: 1.0 (Mac OS X Mail 13.4 \(3608.120.23.2.4\))
Subject: Re: Back to work
Date: Tue, 27 Oct 2020 19:54:25 -0700
In-reply-to: <efe63bdf-7af2-49c0-932d-3a36de61bdd6@www.fastmail.com>
Cc: Magnus Westerlund <magnus.westerlund@ericsson.com>, "quic@ietf.org" <quic@ietf.org>
To: Martin Thomson <mt@lowentropy.net>
References: <0f150dec-e408-48bf-8e54-05e3e96e7a85@www.fastmail.com> <CALZ3u+a1fBq1MB52H-h-JYY=OOkOo9=jEu7smNVeyy_9U3abEw@mail.gmail.com> <CAKcm_gNoB=nP050VRfw5MXAAw-HhpnKHp6pAx9onaA4a5CH5-Q@mail.gmail.com> <b80cf41524865c171712bfcfca7ef92e2a472044.camel@ericsson.com> <efe63bdf-7af2-49c0-932d-3a36de61bdd6@www.fastmail.com>
X-Mailer: Apple Mail (2.3608.120.23.2.4)
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.312, 18.0.737 definitions=2020-10-27_17:2020-10-26, 2020-10-27 signatures=0
Archived-At: <https://mailarchive.ietf.org/arch/msg/quic/boCQbdkAHH9Mhbebt7-dplWqqaQ>
X-BeenThere: quic@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Main mailing list of the IETF QUIC working group <quic.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/quic>, <mailto:quic-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/quic/>
List-Post: <mailto:quic@ietf.org>
List-Help: <mailto:quic-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/quic>, <mailto:quic-request@ietf.org?subject=subscribe>
X-List-Received-Date: Wed, 28 Oct 2020 02:55:29 -0000

This is an interesting PR, and likely accomplishes the goals at the moment.
I do really like how we’ve kept some bidirectionally of the approach and the padding can stay as is. 

Just thinking things through a little bit: 
(This is all discussed below by Ian/Magnus/Martin/Kazuho, and others, just restating so we have it in one place)

At any point, either endpoint can choose to send a PATH_CHALLENGE.
The presence of a PATH_CHALLENGE always evokes a PATH_RESPONSE.

Therefore, we assume that in order to restrict folks from being able to spoof a source address when sending a PATH_CHALLENGE and attack the real owner of that source address with the PATH_RESPONSE, we need to make the PATH_CHALLENGE very large as well. 

However, there’s another situation where PATH_CHALLENGE is sent, and that's whenever we receive a non-probing packet that arrives on a new path without any prior validation, and we send that PATH_CHALLENGE on both the old and the new path.

This is where we haven’t fully plugged the amplification hole, since an attacker can use any other, smaller datagram to cause the other endpoint to generate full-size datagrams containing PATH_CHALLENGE. This wasn’t previously a huge issue since PATH_CHALLENGE wasn’t meaningfully larger than the smallest packet you’d otherwise be able to send (slash the per-packet costs were potentially higher than the cost of the data inside that packet).

——— 

One other approach we could take here would be to restrict ourselves to only covering the cases where you’re actively generating a PATH_CHALLENGE to validate a new path, not responding to a new non-probing packet on an unvalidated path. 

In other words: 
Only the client needs to pad PATH_CHALLENGE and any response to a padded PATH_CHALLENGE should also be padded. That also fits nicely into the unidirectionality of path validation as it stands today.


The other option that we haven’t discussed much is if we’d rather live with the previous pre-padding problem and remove the padding. 
My initial inclination was to avoid this, but actually we’d be returning to a state where the main risk was that the path wasn’t MTU compatible and any implementation migrating is likely already dealing with cases where packets aren’t going through on a path in at least one direction. So, the natural responses to path validation failures (for MTU reasons or otherwise), if you map them all out, generally result in the “correct” behavior. We could then say “any endpoint using a new path is encouraged to do PMTUD or otherwise be careful that the path may not work in at least one direction” and leave it at that.

——— 

Overall, I suspect we’re probably headed in the right direction by making the 3x limit more universal, although it does seem like it introduces some really interesting cases to code around, and that limit and double path validation might be more painful than just checking for “am I client, therefore I should pad” which is annoying because it has a client/server distinction but does likely cause less churn and risk for later fallout.

Thanks,
Eric


> On Oct 27, 2020, at 7:41 PM, Martin Thomson <mt@lowentropy.net> wrote:
> 
> Thanks to everyone for the feedback.
> 
> I've written up a draft pull request here: https://github.com/quicwg/base-drafts/pull/4264
> 
> This does something like what Magnus suggests below.  It's not pretty, because in some very common cases path validation could take twice as long, and it's more complicated, but I think that it is at least principled.
> 
> On Wed, Oct 28, 2020, at 04:04, Magnus Westerlund wrote:
>> On Tue, 2020-10-27 at 09:12 -0400, Ian Swett wrote:
>>> Thanks for summarizing this issue. I think the above discussion is about
>>> immediate migration and repeated immediate migrations, but I also wonder if
>>> we've introduced a single packet amplification attack by requiring
>>> PATH_RESPONSEs be padded on new paths without a requirement on the size of
>>> PATH_CHALLENGE(see first item)?
>>> 
>>> Validating a new path
>>> If one receives only a PATH_CHALLENGE on a new path, then the server
>>> responds with a full-sized PATH_RESPONSE.  This seems safe.  If a non-padded
>>> PATH_CHALLENGE is received on a new path, then the peer is supposed to send a
>>> fully padded PATH_RESPONSE on the path, which could be >20x larger.  I'm not
>>> sure if we care about this, but I wanted to point it out. 
>>> 
>>> Immediately migrating to a new path
>>> I think we should remove the text about allowing kMinimumWindow each
>>> kInitialRtt after migration and change it to the 3x limit.  I'm actually
>>> surprised the text about 2*kInitialWindow still exists, since recovery says
>>> "Until the server has validated the client's address on the path, the amount
>>> of data it can send is limited to three times the amount of data received, as
>>> specified in Section 8.1 of {{QUIC-TRANSPORT}}.".
>>> 
>>> In order to not get deadlocked by the 3x factor, I think we should change the
>>> newly added MUSTs to only apply to path validation prior to migration, not the
>>> peer responding to migration.
>>> 
>>> My reasoning is that if a peer migrates prior to validating the path, it means
>>> it's either unintentional or they have no other choice, so the migrating peer
>>> has implicitly decided that validating PathMTU is not a prerequisite to
>>> migrating.
>> 
>> So some quesitons and ideas as I think it is relevant to resolve this as best as
>> possible.
>> 
>> So isn't this recreating the issue that if the client initiates a migration to a
>> new path that is not QUIC compatible, by responding with a minimal size packet
>> and completing the migration and then if the server performs the path
>> verification with 1200 bytes UDP payload it fails. Thus maintaining a broken
>> path. 
>> 
>> So is there need for the non pre-validated path migration case that one need
>> need to do a two step process where one will ACK with minimal packet while
>> initiating path validation. If path validatation fails then maybe one need to
>> close down the connection as the migration ended up on a path that was unable to
>> support QUIC. The question here is how to avoid the DoS attack this may open up
>> if an attack rewrites source address of packets. 
>> 
>> So Maybe the path validation needs to be a two step process. First a return
>> routability over the new path to verify that it is bi-directional. When that has
>> been verified one does a test with minimal MTU to prove it to be QUIC
>> compatible. This might even be done with application data if there is some that
>> are available to send. 
>> 
>> But, I think that one needs to work through the criterias for when the QUIC
>> connection is shut down under the conditions that the path available is not
>> supporting 1200 bytes. Also do we end up in a situation where the client needs
>> to do the second step itself towards the server to verify the path so that it
>> can determine if it needs to try another path if this one doesn't work? 
>> 
>> Cheers
>> 
>> Magnus
>> 
>> 
>> Attachments:
>> * smime.p7s
>