From: Eric Biggers <ebiggers@kernel.org> mainline inclusion from mainline-v7.0-rc2 commit c5794709bc9105935dbedef8b9cf9c06f2b559fa category: bugfix bugzilla: https://atomgit.com/src-openeuler/kernel/issues/13917 CVE: CVE-2026-23364 Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?i... -------------------------------- To prevent timing attacks, MAC comparisons need to be constant-time. Replace the memcmp() with the correct function, crypto_memneq(). Fixes: e2f34481b24d ("cifsd: add server-side procedures for SMB3") Cc: stable@vger.kernel.org Signed-off-by: Eric Biggers <ebiggers@kernel.org> Acked-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com> Conflicts: fs/smb/server/Kconfig fs/smb/server/auth.c fs/smb/server/smb2pdu.c [Commit 38c8a9a52082 ("smb: move client and server files to common directory fs/smb") move client and server files to common directory fs/smb; commit 7033b937e21b ("crypto: lib - create utils module and move __crypto_memneq into it") change the config of memneq.c.] Signed-off-by: Li Lingfeng <lilingfeng3@huawei.com> --- fs/ksmbd/Kconfig | 1 + fs/ksmbd/auth.c | 4 +++- fs/ksmbd/smb2pdu.c | 5 +++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/fs/ksmbd/Kconfig b/fs/ksmbd/Kconfig index e1fe17747ed6..832c6a0dd327 100644 --- a/fs/ksmbd/Kconfig +++ b/fs/ksmbd/Kconfig @@ -11,6 +11,7 @@ config SMB_SERVER select CRYPTO_ECB select CRYPTO_LIB_DES select CRYPTO_SHA256 + select LIB_MEMNEQ select CRYPTO_CMAC select CRYPTO_SHA512 select CRYPTO_AEAD2 diff --git a/fs/ksmbd/auth.c b/fs/ksmbd/auth.c index c5916064b85e..fb4a6f9e4e98 100644 --- a/fs/ksmbd/auth.c +++ b/fs/ksmbd/auth.c @@ -13,6 +13,7 @@ #include <linux/xattr.h> #include <crypto/hash.h> #include <crypto/aead.h> +#include <crypto/algapi.h> #include <linux/random.h> #include <linux/scatterlist.h> @@ -280,7 +281,8 @@ int ksmbd_auth_ntlmv2(struct ksmbd_conn *conn, struct ksmbd_session *sess, goto out; } - if (memcmp(ntlmv2->ntlmv2_hash, ntlmv2_rsp, CIFS_HMAC_MD5_HASH_SIZE) != 0) + if (crypto_memneq(ntlmv2->ntlmv2_hash, ntlmv2_rsp, + CIFS_HMAC_MD5_HASH_SIZE)) rc = -EINVAL; out: if (ctx) diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c index 1588867b4e71..d75de3035327 100644 --- a/fs/ksmbd/smb2pdu.c +++ b/fs/ksmbd/smb2pdu.c @@ -4,6 +4,7 @@ * Copyright (C) 2018 Samsung Electronics Co., Ltd. */ +#include <crypto/algapi.h> #include <linux/inetdevice.h> #include <net/addrconf.h> #include <linux/syscalls.h> @@ -8344,7 +8345,7 @@ int smb2_check_sign_req(struct ksmbd_work *work) signature)) return 0; - if (memcmp(signature, signature_req, SMB2_SIGNATURE_SIZE)) { + if (crypto_memneq(signature, signature_req, SMB2_SIGNATURE_SIZE)) { pr_err("bad smb2 signature\n"); return 0; } @@ -8456,7 +8457,7 @@ int smb3_check_sign_req(struct ksmbd_work *work) if (ksmbd_sign_smb3_pdu(conn, signing_key, iov, 1, signature)) return 0; - if (memcmp(signature, signature_req, SMB2_SIGNATURE_SIZE)) { + if (crypto_memneq(signature, signature_req, SMB2_SIGNATURE_SIZE)) { pr_err("bad smb2 signature\n"); return 0; } -- 2.52.0