Στις 05/08/2017 09:52 πμ, ο Amos Jeffries έγραψε:
On 01/08/17 04:40, Alex Rousskov wrote:
On 07/31/2017 09:24 AM, Amos Jeffries wrote:

To do so otherwise would randomly
allow replay attacks to succeed

Please give a specific example where the proposed changes would allow a
new kind of replay attacks to succeed, given a correctly functioning
Squid and a correctly functioning helper. I cannot think of any
realistic examples, but this is not my area of expertise.



In NTLM the TT (type-2) tokens are generated by a particular helper and only that helper can authenticate the corresponding KK (type-3) token.

Annoyingly NTLM does not authenticate the client, nor the HTTP message it is attached to - it is specifically (and only) authenticating that the TCP connection is being used by the specific end-client able to generate the KK token proof-of-identity.


With the current code reserved helpers are tied to a particular TCP connection through Auth::UserRequest. As such an attacker would have to inject replay attempts into the same TCP connection the client was using. Which is protected by the TCP SEQNO mechanism - not impossible to subvert, but a high difficulty level. Any attempt to send the KK on another TCP connection would reach a different helper and be rejected as a 'secret' value embedded in the TT was reserved by the originating helper >

With the proposed changes all an attacker needs to do is peek at the KK token from the client then race it to be the first one to deliver any token to the originating helper (which can succeed at or after reuse timeout) - using as many other TCP connections as it likes. Which is a MUCH easier thing to do than SEQNO subverting. > As far as the TT generating helper is concerned there is no difference between an attackers KK token after timeout, or Squid just waiting some period timeout+N until the real clients KK token arrived.

And as I mentioned earlier there are other things the attacker can do to slow traffic down and bias the race towards itself. Those things do not have any effect on the client TCP connection use of SEQNO - so are relatively benign with the current code.


Note that under the attack conditions the TT generating helper *does not* receive a fresh YR query which it might use to reset its

If I am not wrong this is prevented by ntlm/UserRequest.cc code.

The ntlm/* code for each new connection:
1) expects a type1 message in Authorization header (and send a YR request to helper)
   2) sends back to the client a type2 message in WWW-Authenticate header
3) expects a type3 message in Authorization header (and send a KK request to helper)

If squid did not receive with that order the authentication info from the client will just reject/deny the connection.

The ntlm helpers designed to be idiots. They expect a YR and then a KK. Every new YR resets their state.
They are not responsible to check for more and must not do it.

Squid code is responsible for this, and I believe this patch does not break anything in this area: Any expired reservation results to close client connection. A any new connection still have to repeat the 3 NTLM authentication steps to authenticate.

Am I missing something?

reservation state. The victim client generates the YR, then after timeout the attacker supplies the KK. The TT goes out on one TCP connection, and the KK returns via a different one.


PS. also note that this is only an issue for NTLM. However the existence of Negotiate/NTLM flavour of Negotiate makes that interface hit the same problem at times. This whole reservation thing is irrelevant with Kerberos.


Amos
_______________________________________________
squid-dev mailing list
squid-dev@lists.squid-cache.org
http://lists.squid-cache.org/listinfo/squid-dev

_______________________________________________
squid-dev mailing list
squid-dev@lists.squid-cache.org
http://lists.squid-cache.org/listinfo/squid-dev

Reply via email to