]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
drbd: Fix a hole in the challange-response connection authentication
authorPhilipp Reisner <philipp.reisner@linbit.com>
Mon, 28 Apr 2014 16:43:30 +0000 (18:43 +0200)
committerJens Axboe <axboe@fb.com>
Wed, 30 Apr 2014 19:46:55 +0000 (13:46 -0600)
In the implementation as it was, the two peers sent each other
a challenge, and expects the challenge hashed with the shared
secret back.

A attacker could simply wait for the challenge of the peer, and
send the same challenge back. Then it waits for the response, and
sends the same response back.

Prevent this by not accepting a challenge from the peer that is
the same as the challenge sent to the peer.

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
drivers/block/drbd/drbd_receiver.c

index 3fa3b78e2ea10caaff42d1470cdc965afe84038e..b6c8aaf4931bc8434635e74efa004f9ddf8c0304 100644 (file)
@@ -4846,6 +4846,12 @@ static int drbd_do_auth(struct drbd_connection *connection)
                goto fail;
        }
 
+       if (pi.size < CHALLENGE_LEN) {
+               drbd_err(connection, "AuthChallenge payload too small.\n");
+               rv = -1;
+               goto fail;
+       }
+
        peers_ch = kmalloc(pi.size, GFP_NOIO);
        if (peers_ch == NULL) {
                drbd_err(connection, "kmalloc of peers_ch failed\n");
@@ -4859,6 +4865,12 @@ static int drbd_do_auth(struct drbd_connection *connection)
                goto fail;
        }
 
+       if (!memcmp(my_challenge, peers_ch, CHALLENGE_LEN)) {
+               drbd_err(connection, "Peer presented the same challenge!\n");
+               rv = -1;
+               goto fail;
+       }
+
        resp_size = crypto_hash_digestsize(connection->cram_hmac_tfm);
        response = kmalloc(resp_size, GFP_NOIO);
        if (response == NULL) {