Subject: Alternate Version + Salt in Alt-Svc

From: Ryan Hamilton <[email-masked]>
Date: Mon, 4 Nov 2019 12:34:06 -0800

Howdy Folks,

We've discussed the idea of attempting to reduce ossification by allowing
the server to deliver an alternative version and initial salt to the client
which can be used to speak "QUIC v1". One such mechanism for delivering
this version to the client is Alt-Svc. In the context of HTTP/3 this has
the wonderful property that even the first connection from a client to the
server can use this alternative version.

However, it seems that there might be a privacy/linkability issue with this
approach that I'm curious to get the groups' take on. If this information
were delivered via Alt-Svc, I would imagine that the naïve implementation
would be to cache the Alt-Svc info as until it expires (via the ma=
attribute) and use the alternative version/salt in each subsequent QUIC
connection. Since the version field is 32 bits, that potentially allows
each user to use a distinct version. This is great for anti-ossification,
but seems problematic for linkability/privacy.

I can think of solutions/mitigations for this issue (like restricting the
number of bits which can be flipped by the server, or expiring the
alternative version in the client on first use, etc) but I'd be curious if
this seems like an issue to other folks first.

Cheers,

Ryan

---

From: Tommy Pauly <[email-masked]>
Date: Mon, 04 Nov 2019 12:41:12 -0800

I do think that this privacy concern is a valid issue to think about and try to mitigate, or at least reduce in scope. Good to discuss!

Clients could of course choose to not use a version received via Alt-Svc when they don't want to be linked (in which case they would also not want to do 0-RTT, etc). So there could be guidance on when to use these versions. That may reduce the amount that the alternate version gets used, though; and even end up causing failures only of some categories of connections.

Another way out here is to use the Alt-Svc value that comes from another source, like the proposal in HTTPSSVC. That would be harder to target users with.

Best,
Tommy

> On Nov 4, 2019, at 12:34 PM, Ryan Hamilton <rch=[email-masked]> wrote:
> 
> Howdy Folks,
> 
> We've discussed the idea of attempting to reduce ossification by allowing the server to deliver an alternative version and initial salt to the client which can be used to speak "QUIC v1". One such mechanism for delivering this version to the client is Alt-Svc. In the context of HTTP/3 this has the wonderful property that even the first connection from a client to the server can use this alternative version.
> 
> However, it seems that there might be a privacy/linkability issue with this approach that I'm curious to get the groups' take on. If this information were delivered via Alt-Svc, I would imagine that the naïve implementation would be to cache the Alt-Svc info as until it expires (via the ma= attribute) and use the alternative version/salt in each subsequent QUIC connection. Since the version field is 32 bits, that potentially allows each user to use a distinct version. This is great for anti-ossification, but seems problematic for linkability/privacy.
> 
> I can think of solutions/mitigations for this issue (like restricting the number of bits which can be flipped by the server, or expiring the alternative version in the client on first use, etc) but I'd be curious if this seems like an issue to other folks first.
> 
> Cheers,
> 
> Ryan

---

From: Mikkel Fahnøe Jørgensen <[email-masked]>
Date: Mon, 4 Nov 2019 13:36:45 -0800

Some random observations reading through the document

- Is the order relevant in the receiver version list?

- It is tempting to just hash the received version list, but that requires
agreeing on an algorithm, unless the algorithm is stated to be specific to
that version, which is complicated.

- VERSION_NEGOTIATION_ERROR vs drop - I’m not sure it is a good idea to
close the connection. The initials are public so it is possible to inject
false versions. There are probably many other similar attacks we don’t
bother with, but still …

- Checking that a transport parameter field is the same as the long header
version seems redundant - why have those fields? Is it because the Initial
header fields are not sufficiently protected via TLS magic (or similar)?

- We generally use varint, but why have varints mixed with 32-bit version
lists? I suggest making the list length 32-bit for easier processing.

- Downgrade - I’m a bit worried about state management and server
redeployments. A server could reject a valid packet because an Initial was
routed to a new server. (Reading further, I see this is addressed). This is
probably a pragmatic solution, but it has an assumption about eventual
global coordination. I suspect something could be done here with tokens or
CID routing, but it is not trivial.

- Security Considerations - perhaps it is worth noting the transport
parameters need additional protection beyond the Initial packet protection?
This follows from TLS, but if TLS is not being used, this can version
negotiation even if other parts of the protocol version is not sensitive to
this in that particular version.

- Greasing 0x?a?a?a?a - I’m not really sure about the point of this.
Especially if we get salted versions in separate proposal.

- It is not immediately obvious if version negotiation can go on and on, or
if it settles after at most one roundtrip one way or the other. This might
depend on the client QUIC version, but that is a fuzzy term in this context.

- Improve discussion of Previously Attempted Version. While the
requirements are readable, the purpose of doing this check is less obvious.
Presumably this deals with downgrade attacks, but more explanation would be
appreciated.

Mikkel

On 4 November 2019 at 21.41.30, Tommy Pauly (
tpauly=[email-masked]) wrote:

I do think that this privacy concern is a valid issue to think about and
try to mitigate, or at least reduce in scope. Good to discuss!

Clients could of course choose to not use a version received via Alt-Svc
when they don't want to be linked (in which case they would also not want
to do 0-RTT, etc). So there could be guidance on when to use these
versions. That may reduce the amount that the alternate version gets used,
though; and even end up causing failures only of some categories of
connections.

Another way out here is to use the Alt-Svc value that comes from another
source, like the proposal in HTTPSSVC. That would be harder to target users
with.

Best,
Tommy

On Nov 4, 2019, at 12:34 PM, Ryan Hamilton <rch=[email-masked]>
wrote:

Howdy Folks,

Cheers,

Ryan

---

From: "Martin Thomson" <[email-masked]>
Date: Tue, 05 Nov 2019 08:42:44 +1100

On Tue, Nov 5, 2019, at 07:34, Ryan Hamilton wrote:
> I can think of solutions/mitigations for this issue (like restricting 
> the number of bits which can be flipped by the server, or expiring the 
> alternative version in the client on first use, etc) but I'd be curious 
> if this seems like an issue to other folks first.

Yes, this is an issue.  Thanks for identifying it.  We hadn't gotten to Alt-Svc for this yet, we're having enough trouble with NEW_TOKEN :)

The general rule we follow for these things is to require confidentiality for the initial signaling and to only use the value once.  That works for session tickets, it works for NEW_TOKEN, and I see no reason not to have it apply here also.  That means falling back to version==1 for connection attempts after the first.

That diminishes the value of the addition a little, but I don't think that it is enough to be concerned.  The alternative service still exists and can be used, and successful connection attempts should provision the client with more tokens for future connections.

---

From: Mikkel Fahnøe Jørgensen <[email-masked]>
Date: Mon, 4 Nov 2019 22:47:05 +0100

Sorry, my response was on the wrong topic. It was in relation to version
negotation.

Kind Regards,
Mikkel Fahnøe Jørgensen

On 4 November 2019 at 22.43.42, Martin Thomson ([email-masked]) wrote:

Mikkel