Skip to content

Commit 3021094

Browse files
namjaejeonSteve French
authored andcommitted
ksmbd: fix racy issue under cocurrent smb2 tree disconnect
There is UAF issue under cocurrent smb2 tree disconnect. This patch introduce TREE_CONN_EXPIRE flags for tcon to avoid cocurrent access. Cc: stable@vger.kernel.org Reported-by: zdi-disclosures@trendmicro.com # ZDI-CAN-20592 Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent abcc506 commit 3021094

File tree

3 files changed

+14
-2
lines changed

3 files changed

+14
-2
lines changed

fs/ksmbd/mgmt/tree_connect.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,15 @@ int ksmbd_tree_conn_disconnect(struct ksmbd_session *sess,
109109
struct ksmbd_tree_connect *ksmbd_tree_conn_lookup(struct ksmbd_session *sess,
110110
unsigned int id)
111111
{
112-
return xa_load(&sess->tree_conns, id);
112+
struct ksmbd_tree_connect *tcon;
113+
114+
tcon = xa_load(&sess->tree_conns, id);
115+
if (tcon) {
116+
if (test_bit(TREE_CONN_EXPIRE, &tcon->status))
117+
tcon = NULL;
118+
}
119+
120+
return tcon;
113121
}
114122

115123
struct ksmbd_share_config *ksmbd_tree_conn_share(struct ksmbd_session *sess,

fs/ksmbd/mgmt/tree_connect.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ struct ksmbd_share_config;
1414
struct ksmbd_user;
1515
struct ksmbd_conn;
1616

17+
#define TREE_CONN_EXPIRE 1
18+
1719
struct ksmbd_tree_connect {
1820
int id;
1921

@@ -25,6 +27,7 @@ struct ksmbd_tree_connect {
2527

2628
int maximal_access;
2729
bool posix_extensions;
30+
unsigned long status;
2831
};
2932

3033
struct ksmbd_tree_conn_status {

fs/ksmbd/smb2pdu.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2053,11 +2053,12 @@ int smb2_tree_disconnect(struct ksmbd_work *work)
20532053

20542054
ksmbd_debug(SMB, "request\n");
20552055

2056-
if (!tcon) {
2056+
if (!tcon || test_and_set_bit(TREE_CONN_EXPIRE, &tcon->status)) {
20572057
struct smb2_tree_disconnect_req *req =
20582058
smb2_get_msg(work->request_buf);
20592059

20602060
ksmbd_debug(SMB, "Invalid tid %d\n", req->hdr.Id.SyncId.TreeId);
2061+
20612062
rsp->hdr.Status = STATUS_NETWORK_NAME_DELETED;
20622063
smb2_set_err_rsp(work);
20632064
return 0;

0 commit comments

Comments
 (0)