Skip to content

Commit 92e4701

Browse files
namjaejeonSteve French
authored andcommitted
ksmbd: validate mech token in session setup
If client send invalid mech token in session setup request, ksmbd validate and make the error if it is invalid. Cc: stable@vger.kernel.org Reported-by: zdi-disclosures@trendmicro.com # ZDI-CAN-22890 Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent fdfd6dd commit 92e4701

File tree

3 files changed

+23
-5
lines changed

3 files changed

+23
-5
lines changed

fs/smb/server/asn1.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,10 +214,15 @@ static int ksmbd_neg_token_alloc(void *context, size_t hdrlen,
214214
{
215215
struct ksmbd_conn *conn = context;
216216

217+
if (!vlen)
218+
return -EINVAL;
219+
217220
conn->mechToken = kmemdup_nul(value, vlen, GFP_KERNEL);
218221
if (!conn->mechToken)
219222
return -ENOMEM;
220223

224+
conn->mechTokenLen = (unsigned int)vlen;
225+
221226
return 0;
222227
}
223228

fs/smb/server/connection.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ struct ksmbd_conn {
8888
__u16 dialect;
8989

9090
char *mechToken;
91+
unsigned int mechTokenLen;
9192

9293
struct ksmbd_conn_ops *conn_ops;
9394

fs/smb/server/smb2pdu.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1414,7 +1414,10 @@ static struct ksmbd_user *session_user(struct ksmbd_conn *conn,
14141414
char *name;
14151415
unsigned int name_off, name_len, secbuf_len;
14161416

1417-
secbuf_len = le16_to_cpu(req->SecurityBufferLength);
1417+
if (conn->use_spnego && conn->mechToken)
1418+
secbuf_len = conn->mechTokenLen;
1419+
else
1420+
secbuf_len = le16_to_cpu(req->SecurityBufferLength);
14181421
if (secbuf_len < sizeof(struct authenticate_message)) {
14191422
ksmbd_debug(SMB, "blob len %d too small\n", secbuf_len);
14201423
return NULL;
@@ -1505,7 +1508,10 @@ static int ntlm_authenticate(struct ksmbd_work *work,
15051508
struct authenticate_message *authblob;
15061509

15071510
authblob = user_authblob(conn, req);
1508-
sz = le16_to_cpu(req->SecurityBufferLength);
1511+
if (conn->use_spnego && conn->mechToken)
1512+
sz = conn->mechTokenLen;
1513+
else
1514+
sz = le16_to_cpu(req->SecurityBufferLength);
15091515
rc = ksmbd_decode_ntlmssp_auth_blob(authblob, sz, conn, sess);
15101516
if (rc) {
15111517
set_user_flag(sess->user, KSMBD_USER_FLAG_BAD_PASSWORD);
@@ -1778,8 +1784,7 @@ int smb2_sess_setup(struct ksmbd_work *work)
17781784

17791785
negblob_off = le16_to_cpu(req->SecurityBufferOffset);
17801786
negblob_len = le16_to_cpu(req->SecurityBufferLength);
1781-
if (negblob_off < offsetof(struct smb2_sess_setup_req, Buffer) ||
1782-
negblob_len < offsetof(struct negotiate_message, NegotiateFlags)) {
1787+
if (negblob_off < offsetof(struct smb2_sess_setup_req, Buffer)) {
17831788
rc = -EINVAL;
17841789
goto out_err;
17851790
}
@@ -1788,8 +1793,15 @@ int smb2_sess_setup(struct ksmbd_work *work)
17881793
negblob_off);
17891794

17901795
if (decode_negotiation_token(conn, negblob, negblob_len) == 0) {
1791-
if (conn->mechToken)
1796+
if (conn->mechToken) {
17921797
negblob = (struct negotiate_message *)conn->mechToken;
1798+
negblob_len = conn->mechTokenLen;
1799+
}
1800+
}
1801+
1802+
if (negblob_len < offsetof(struct negotiate_message, NegotiateFlags)) {
1803+
rc = -EINVAL;
1804+
goto out_err;
17931805
}
17941806

17951807
if (server_conf.auth_mechs & conn->auth_mechs) {

0 commit comments

Comments
 (0)