未验证 提交 db4e78a0 编写于 作者: O openeuler-ci-bot 提交者: Gitee

!1755 [sync] PR-1737: ksmbd: fix out of bounds read in smb2_sess_setup

Merge Pull Request from: @openeuler-sync-bot 
 

Origin pull request: 
https://gitee.com/openeuler/kernel/pulls/1737 
 
PR sync from: Li Nan <linan122@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/BK3WNMWIWF7LUE5WR6V4SB366MLOBVAY/ 
 
https://gitee.com/openeuler/kernel/issues/I7SVRC 
 
Link:https://gitee.com/openeuler/kernel/pulls/1755 

Reviewed-by: Jialin Zhang <zhangjialin11@huawei.com> 
Signed-off-by: Jialin Zhang <zhangjialin11@huawei.com> 
...@@ -1304,9 +1304,8 @@ static int decode_negotiation_token(struct ksmbd_conn *conn, ...@@ -1304,9 +1304,8 @@ static int decode_negotiation_token(struct ksmbd_conn *conn,
static int ntlm_negotiate(struct ksmbd_work *work, static int ntlm_negotiate(struct ksmbd_work *work,
struct negotiate_message *negblob, struct negotiate_message *negblob,
size_t negblob_len) size_t negblob_len, struct smb2_sess_setup_rsp *rsp)
{ {
struct smb2_sess_setup_rsp *rsp = smb2_get_msg(work->response_buf);
struct challenge_message *chgblob; struct challenge_message *chgblob;
unsigned char *spnego_blob = NULL; unsigned char *spnego_blob = NULL;
u16 spnego_blob_len; u16 spnego_blob_len;
...@@ -1411,10 +1410,10 @@ static struct ksmbd_user *session_user(struct ksmbd_conn *conn, ...@@ -1411,10 +1410,10 @@ static struct ksmbd_user *session_user(struct ksmbd_conn *conn,
return user; return user;
} }
static int ntlm_authenticate(struct ksmbd_work *work) static int ntlm_authenticate(struct ksmbd_work *work,
struct smb2_sess_setup_req *req,
struct smb2_sess_setup_rsp *rsp)
{ {
struct smb2_sess_setup_req *req = smb2_get_msg(work->request_buf);
struct smb2_sess_setup_rsp *rsp = smb2_get_msg(work->response_buf);
struct ksmbd_conn *conn = work->conn; struct ksmbd_conn *conn = work->conn;
struct ksmbd_session *sess = work->sess; struct ksmbd_session *sess = work->sess;
struct channel *chann = NULL; struct channel *chann = NULL;
...@@ -1552,10 +1551,10 @@ static int ntlm_authenticate(struct ksmbd_work *work) ...@@ -1552,10 +1551,10 @@ static int ntlm_authenticate(struct ksmbd_work *work)
} }
#ifdef CONFIG_SMB_SERVER_KERBEROS5 #ifdef CONFIG_SMB_SERVER_KERBEROS5
static int krb5_authenticate(struct ksmbd_work *work) static int krb5_authenticate(struct ksmbd_work *work,
struct smb2_sess_setup_req *req,
struct smb2_sess_setup_rsp *rsp)
{ {
struct smb2_sess_setup_req *req = smb2_get_msg(work->request_buf);
struct smb2_sess_setup_rsp *rsp = smb2_get_msg(work->response_buf);
struct ksmbd_conn *conn = work->conn; struct ksmbd_conn *conn = work->conn;
struct ksmbd_session *sess = work->sess; struct ksmbd_session *sess = work->sess;
char *in_blob, *out_blob; char *in_blob, *out_blob;
...@@ -1637,7 +1636,9 @@ static int krb5_authenticate(struct ksmbd_work *work) ...@@ -1637,7 +1636,9 @@ static int krb5_authenticate(struct ksmbd_work *work)
return 0; return 0;
} }
#else #else
static int krb5_authenticate(struct ksmbd_work *work) static int krb5_authenticate(struct ksmbd_work *work,
struct smb2_sess_setup_req *req,
struct smb2_sess_setup_rsp *rsp)
{ {
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
...@@ -1646,8 +1647,8 @@ static int krb5_authenticate(struct ksmbd_work *work) ...@@ -1646,8 +1647,8 @@ static int krb5_authenticate(struct ksmbd_work *work)
int smb2_sess_setup(struct ksmbd_work *work) int smb2_sess_setup(struct ksmbd_work *work)
{ {
struct ksmbd_conn *conn = work->conn; struct ksmbd_conn *conn = work->conn;
struct smb2_sess_setup_req *req = smb2_get_msg(work->request_buf); struct smb2_sess_setup_req *req;
struct smb2_sess_setup_rsp *rsp = smb2_get_msg(work->response_buf); struct smb2_sess_setup_rsp *rsp;
struct ksmbd_session *sess; struct ksmbd_session *sess;
struct negotiate_message *negblob; struct negotiate_message *negblob;
unsigned int negblob_len, negblob_off; unsigned int negblob_len, negblob_off;
...@@ -1655,6 +1656,8 @@ int smb2_sess_setup(struct ksmbd_work *work) ...@@ -1655,6 +1656,8 @@ int smb2_sess_setup(struct ksmbd_work *work)
ksmbd_debug(SMB, "Received request for session setup\n"); ksmbd_debug(SMB, "Received request for session setup\n");
WORK_BUFFERS(work, req, rsp);
rsp->StructureSize = cpu_to_le16(9); rsp->StructureSize = cpu_to_le16(9);
rsp->SessionFlags = 0; rsp->SessionFlags = 0;
rsp->SecurityBufferOffset = cpu_to_le16(72); rsp->SecurityBufferOffset = cpu_to_le16(72);
...@@ -1756,7 +1759,7 @@ int smb2_sess_setup(struct ksmbd_work *work) ...@@ -1756,7 +1759,7 @@ int smb2_sess_setup(struct ksmbd_work *work)
if (conn->preferred_auth_mech & if (conn->preferred_auth_mech &
(KSMBD_AUTH_KRB5 | KSMBD_AUTH_MSKRB5)) { (KSMBD_AUTH_KRB5 | KSMBD_AUTH_MSKRB5)) {
rc = krb5_authenticate(work); rc = krb5_authenticate(work, req, rsp);
if (rc) { if (rc) {
rc = -EINVAL; rc = -EINVAL;
goto out_err; goto out_err;
...@@ -1768,7 +1771,7 @@ int smb2_sess_setup(struct ksmbd_work *work) ...@@ -1768,7 +1771,7 @@ int smb2_sess_setup(struct ksmbd_work *work)
sess->Preauth_HashValue = NULL; sess->Preauth_HashValue = NULL;
} else if (conn->preferred_auth_mech == KSMBD_AUTH_NTLMSSP) { } else if (conn->preferred_auth_mech == KSMBD_AUTH_NTLMSSP) {
if (negblob->MessageType == NtLmNegotiate) { if (negblob->MessageType == NtLmNegotiate) {
rc = ntlm_negotiate(work, negblob, negblob_len); rc = ntlm_negotiate(work, negblob, negblob_len, rsp);
if (rc) if (rc)
goto out_err; goto out_err;
rsp->hdr.Status = rsp->hdr.Status =
...@@ -1781,7 +1784,7 @@ int smb2_sess_setup(struct ksmbd_work *work) ...@@ -1781,7 +1784,7 @@ int smb2_sess_setup(struct ksmbd_work *work)
le16_to_cpu(rsp->SecurityBufferLength) - 1); le16_to_cpu(rsp->SecurityBufferLength) - 1);
} else if (negblob->MessageType == NtLmAuthenticate) { } else if (negblob->MessageType == NtLmAuthenticate) {
rc = ntlm_authenticate(work); rc = ntlm_authenticate(work, req, rsp);
if (rc) if (rc)
goto out_err; goto out_err;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册