FAILED: patch "[PATCH] ksmbd: avoid out of bounds access in decode_preauth_ctxt()" failed to apply to 5.15-stable tree
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.15.y
git checkout FETCH_HEAD
git cherry-pick -x e7067a446264a7514fa1cfaa4052cdb6803bc6a2
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023041754-retread-approach-96af@gregkh' --subject-prefix 'PATCH 5.15.y' HEAD^..
Possible dependencies:
e7067a446264 ("ksmbd: avoid out of bounds access in decode_preauth_ctxt()")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From e7067a446264a7514fa1cfaa4052cdb6803bc6a2 Mon Sep 17 00:00:00 2001
From: David Disseldorp <[email protected]>
Date: Thu, 13 Apr 2023 23:49:57 +0900
Subject: [PATCH] ksmbd: avoid out of bounds access in decode_preauth_ctxt()
Confirm that the accessed pneg_ctxt->HashAlgorithms address sits within the SMB request boundary; deassemble_neg_contexts() only checks that the eight byte smb2_neg_context header + (client controlled) DataLength are within the packet boundary, which is insufficient.
Checking for sizeof(struct smb2_preauth_neg_context) is overkill given that the type currently assumes SMB311_SALT_SIZE bytes of trailing Salt.
fs/ksmbd/smb2pdu.c +14 -9
@@ -876,17 +876,21 @@ static void assemble_neg_contexts(struct ksmbd_conn *conn, }static __le32 decode_preauth_ctxt (struct ksmbd_conn *conn, -struct smb2_preauth_neg_context *pneg_ctxt) +struct smb2_preauth_neg_context *pneg_ctxt, +int len_of_ctxts) { -__le32 err =STATUS_NO_PREAUTH_INTEGRITY_HASH_OVERLAP ; +/* +* sizeof(smb2_preauth_neg_context) assumes SMB311_SALT_SIZE Salt, +* which may not be present. Only check for used HashAlgorithms[1]. +*/ +if (len_of_ctxts <MIN_PREAUTH_CTXT_DATA_LEN ) +return STATUS_INVALID_PARAMETER ; -if (pneg_ctxt->HashAlgorithms ==SMB2_PREAUTH_INTEGRITY_SHA512 ) { - conn->preauth_info->Preauth_HashId = -SMB2_PREAUTH_INTEGRITY_SHA512 ; - err =STATUS_SUCCESS ; - } +if (pneg_ctxt->HashAlgorithms !=SMB2_PREAUTH_INTEGRITY_SHA512 ) +return STATUS_NO_PREAUTH_INTEGRITY_HASH_OVERLAP ; -return err; + conn->preauth_info->Preauth_HashId =SMB2_PREAUTH_INTEGRITY_SHA512 ; +return STATUS_SUCCESS ; } static void decode_encrypt_ctxt(struct ksmbd_conn *conn,
@@ -1014,7 +1018,8 @@ static __le32 deassemble_neg_contexts(struct ksmbd_conn *conn,break ; status =decode_preauth_ctxt (conn, - (struct smb2_preauth_neg_context *)pctx); + (struct smb2_preauth_neg_context *)pctx, + len_of_ctxts);if (status !=STATUS_SUCCESS )break ; }else if (pctx->ContextType ==SMB2_ENCRYPTION_CAPABILITIES ) {