[ https://issues.apache.org/jira/browse/KAFKA-17345 ]


    Tim Fox deleted comment on KAFKA-17345:
    ---------------------------------

was (Author: purplefox):
Adding a bit more information:

* I think the fix should be straightfoward - ScramSaslServer needs to keep 
track of the nonce sent back in response 1 and verify that it's the same as the 
none received in request 2. Here's the equivalent check in xdg-go 
[https://github.com/xdg-go/scram/blob/master/server_conv.go#L129]
* Fixing this will break librdkafka - as librdkafka currently sends an 
incorrect nonce in request 2. So any fix will need to co-ordinate with that 
team to avoid breaking user apps.
* The Kafka Java client looks at first glance to be sending the correct nonce, 
so should not break. (Needs to be verified).

> Client nonce is not checked during SASL-SCRAM-256 authentication
> ----------------------------------------------------------------
>
>                 Key: KAFKA-17345
>                 URL: https://issues.apache.org/jira/browse/KAFKA-17345
>             Project: Kafka
>          Issue Type: Bug
>          Components: security
>    Affects Versions: 3.8.0
>            Reporter: Tim Fox
>            Priority: Critical
>
> It appears that the SCRAM server side implementation in Apache Kafka is not 
> checking that the nonce sent during the second request from the client during 
> authentication using SASL-SCRAM-256 is the same as the nonce returned from 
> the server in the first response from the server.
> SCRAM RFC is here [https://datatracker.ietf.org/doc/html/rfc5802]
> The part of the RFC that says the client returns the same response that it 
> received from the server is here:
> {quote}The client then responds by sending a "client-final-message" with the 
> *same nonce* and a ClientProof computed using the selected hash function as 
> explained earlier.
> {quote}
>  
> Here's the part of the RFC saying to check nonces:
> {quote}The server *_verifies the nonce_* and the proof, verifies that the 
> authorization identity (if supplied by the client in the first
> message) is authorized to act as the authentication identity, and, finally, 
> it responds with a "server-final-message", concluding the authentication 
> exchange.
> {quote}
> It appears that latest Apache Kafka _does not_ verify the nonces are the 
> same, contrary to the RFC. I.e. 
> [https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/common/security/scram/internals/ScramSaslServer.java#L152]
>  - i.e. there is no check on the nonce.
>  
> According to the RFC, verifying the nonce on the server is *not* optional:
> {quote}
> The server MUST verify that the  nonce sent by the client in the second 
> message is the same as the one sent by the server in its first message.
> {quote}
> I stumbled upon this while creating a Kafka compatible server in golang and 
> using the xdg golang library - which is known to be strictly RFC compliant. 
> [https://github.com/xdg-go/scram]
> This implementation *does* check that the nonce sent from the client in the 
> second request is the same as the one returned from the server in the first 
> request, and this results in an authentication failure when using it with a 
> librdkafka client as it appears that librdkafka *does not* send the same 
> nonce it received from the server in the second request. I have filed a 
> related issue with librdkafka to cover that: 
> [https://github.com/confluentinc/librdkafka/issues/4814]
> In summary, this means, that a client (for example librdkafka) which sends an 
> incorrect nonce in the second request of SASL-SCRAM-256 authentication 
> (contrary to the RFC) can still pass authentication with Apache Kafka. 
> I am not a security expert and I do not know if this enables an exploit or 
> vulnerability in Apache Kafka, but I have filed this as critical to be on the 
> safe so you can take a closer look.
> I believe there is a significant possibility that not checking the nonce 
> makes current Apache Kafka installations that use SCRAM susceptible to replay 
> attacks.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to