This series of mails concluded that channel-binding together with SCRAM (or 
OPAQUE) provides for the highest additional security beyond TLS.

But channel-binding can only be used, if a MITM isn't able to deactivate it 
before it can detect the MITM.
The security considerations of XEP-0440 ( https://xmpp.org/extensions/
xep-0440.html#security ) show a scenario where a MITM is able to change the 
server-announced list of supported channel-binding types to only include a 
dummy type the client certainly does not support or to contain no channel-
bindings at all.

A client in this situation has two possible actions at hand:
1. Signal in it's SCRAM handshake, that it does support channel-binding, but 
not the one the server advertised (use "y" for the channel-binding flag as 
described in RFC 5802).
The server will fail authentication if it supports channel-binding.
That's bad UX if the problem only arose because no mutual channel-binding type 
could be found rather than because a MITM occurred.

2. Signal in its SCRAM handshake that it does not support channel-binding at 
all (use "n" for the channel-binding flag as described in RFC 5802).
That won't fail the authentication but leaves a possible MITM undetected.

XEP 0440 tries to mitigate this by suggesting to use pinning for the channel-
binding types. But that introduces other problems: A server operator deciding 
to offload TLS termination to an extra box would not be able to offer "tls-
exporter" on his server anymore (only the weaker "tls-server-end-point").
Pinning will not allow this downgrade in security and fail the connection/
authentication.

I've written my ProtoXEP ("SASL SCRAM Downgrade Protection") to overcome 
exactly this problem.
(Side note: Naming it "SASL SCRAM Downgrade Detection" would have been a 
better choice.)
As long as PLAIN is not supported by the client (and not the only mechanism 
announced by the server), this protocol can be used to detect downgrades on 
the channel-binding types, even if channel-binding is not used, and fail the 
authentication if a downgrade was detected.

Some clients can not support channel-binding (for example web-clients).
To allow some level of downgrade detection even for those type of clients, 
I've added the list of announced SASL mechanisms as perceived by the client 
alongside the list of channel-binding types as perceived by the client.
A downgrade from SCRAM-SHA-256 to, say, SCRAM-SHA-1 could be detected even 
without channel-binding in place and may some day be valuable, if SCRAM-SHA-1 
get broken.

Yes, that downgrade detection of SASL mechanisms is of limited use in case of 
SCRAM, because the downgrade can only be detected after the client-final-
message was sent, which already contains the client proof based upon the 
password. But that's a limitation of SCRAM itself, my downgrade detection 
could be defined for OPAQUE as well and OPAQUE does not have this weakness that 
SCRAM has. But the downgrade detection of SCRAM mechanisms could still be used 
to inform the user that a password change could be helpful.
(For the record: that same limitation holds for channel-binding using SCRAM as 
well: the mismatch in channel-binding data will only be detected by the server 
after the client-final-message was sent.)

To make it clear: The main goal of my ProtoXEP is to protect the list of 
channel-binding types, not the list of SASL mechanisms. But while I was at it, 
I thought it was trivial to add at least some level of protection for the SASL 
mechanisms as well.

An implementation of this ProtoXEP for Prosody and Monal already exists and 
works well.

-tmolitor




_______________________________________________
Standards mailing list
Info: https://mail.jabber.org/mailman/listinfo/standards
Unsubscribe: standards-unsubscr...@xmpp.org
_______________________________________________

Reply via email to