]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
sctp: Fix MAC comparison to be constant-time
authorEric Biggers <ebiggers@kernel.org>
Mon, 18 Aug 2025 20:54:23 +0000 (13:54 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 19 Oct 2025 14:23:15 +0000 (16:23 +0200)
commit dd91c79e4f58fbe2898dac84858033700e0e99fb upstream.

To prevent timing attacks, MACs need to be compared in constant time.
Use the appropriate helper function for this.

Fixes: bbd0d59809f9 ("[SCTP]: Implement the receive and verification of AUTH chunk")
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Cc: stable@vger.kernel.org
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
Link: https://patch.msgid.link/20250818205426.30222-3-ebiggers@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/sctp/sm_make_chunk.c
net/sctp/sm_statefuns.c

index c7503fd6491593fc749b9af182c646a39ed2ddbc..088764ba47a1731b1377c075dc77818e7d076bab 100644 (file)
@@ -31,6 +31,7 @@
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <crypto/hash.h>
+#include <crypto/algapi.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/ip.h>
@@ -1796,7 +1797,7 @@ struct sctp_association *sctp_unpack_cookie(
                }
        }
 
-       if (memcmp(digest, cookie->signature, SCTP_SIGNATURE_SIZE)) {
+       if (crypto_memneq(digest, cookie->signature, SCTP_SIGNATURE_SIZE)) {
                *error = -SCTP_IERROR_BAD_SIG;
                goto fail;
        }
index 1ca9073c9583554b6d5dad21401a3bec0b111aa8..beae92ad25bb0507c43c712b53085d9c8c249369 100644 (file)
@@ -30,6 +30,7 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include <crypto/algapi.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/ip.h>
@@ -4418,7 +4419,7 @@ static enum sctp_ierror sctp_sf_authenticate(
                                 sh_key, GFP_ATOMIC);
 
        /* Discard the packet if the digests do not match */
-       if (memcmp(save_digest, digest, sig_len)) {
+       if (crypto_memneq(save_digest, digest, sig_len)) {
                kfree(save_digest);
                return SCTP_IERROR_BAD_SIG;
        }