mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-25 12:00:22 +09:00
ksmbd: validate session id and tree id in compound request
[ Upstream commit 3df0411e13 ]
`smb2_get_msg()` in smb2_get_ksmbd_tcon() and smb2_check_user_session()
will always return the first request smb2 header in a compound request.
if `SMB2_TREE_CONNECT_HE` is the first command in compound request, will
return 0, i.e. The tree id check is skipped.
This patch use ksmbd_req_buf_next() to get current command in compound.
Reported-by: zdi-disclosures@trendmicro.com # ZDI-CAN-21506
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
4a027b9651
commit
017d85c94f
@@ -87,9 +87,9 @@ struct channel *lookup_chann_list(struct ksmbd_session *sess, struct ksmbd_conn
|
||||
*/
|
||||
int smb2_get_ksmbd_tcon(struct ksmbd_work *work)
|
||||
{
|
||||
struct smb2_hdr *req_hdr = smb2_get_msg(work->request_buf);
|
||||
struct smb2_hdr *req_hdr = ksmbd_req_buf_next(work);
|
||||
unsigned int cmd = le16_to_cpu(req_hdr->Command);
|
||||
int tree_id;
|
||||
unsigned int tree_id;
|
||||
|
||||
if (cmd == SMB2_TREE_CONNECT_HE ||
|
||||
cmd == SMB2_CANCEL_HE ||
|
||||
@@ -114,7 +114,7 @@ int smb2_get_ksmbd_tcon(struct ksmbd_work *work)
|
||||
pr_err("The first operation in the compound does not have tcon\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (work->tcon->id != tree_id) {
|
||||
if (tree_id != UINT_MAX && work->tcon->id != tree_id) {
|
||||
pr_err("tree id(%u) is different with id(%u) in first operation\n",
|
||||
tree_id, work->tcon->id);
|
||||
return -EINVAL;
|
||||
@@ -560,9 +560,9 @@ int smb2_allocate_rsp_buf(struct ksmbd_work *work)
|
||||
*/
|
||||
int smb2_check_user_session(struct ksmbd_work *work)
|
||||
{
|
||||
struct smb2_hdr *req_hdr = smb2_get_msg(work->request_buf);
|
||||
struct smb2_hdr *req_hdr = ksmbd_req_buf_next(work);
|
||||
struct ksmbd_conn *conn = work->conn;
|
||||
unsigned int cmd = conn->ops->get_cmd_val(work);
|
||||
unsigned int cmd = le16_to_cpu(req_hdr->Command);
|
||||
unsigned long long sess_id;
|
||||
|
||||
/*
|
||||
@@ -588,7 +588,7 @@ int smb2_check_user_session(struct ksmbd_work *work)
|
||||
pr_err("The first operation in the compound does not have sess\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (work->sess->id != sess_id) {
|
||||
if (sess_id != ULLONG_MAX && work->sess->id != sess_id) {
|
||||
pr_err("session id(%llu) is different with the first operation(%lld)\n",
|
||||
sess_id, work->sess->id);
|
||||
return -EINVAL;
|
||||
|
||||
Reference in New Issue
Block a user