]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ksmbd: set SMB2_SESSION_FLAG_ENCRYPT_DATA when enforcing data encryption for this...
authorNamjae Jeon <linkinjeon@kernel.org>
Mon, 18 Dec 2023 15:33:25 +0000 (00:33 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 23 Dec 2023 09:41:53 +0000 (10:41 +0100)
[ Upstream commit 37ba7b005a7a4454046bd8659c7a9c5330552396 ]

Currently, SMB2_SESSION_FLAG_ENCRYPT_DATA is always set session setup
response. Since this forces data encryption from the client, there is a
problem that data is always encrypted regardless of the use of the cifs
seal mount option. SMB2_SESSION_FLAG_ENCRYPT_DATA should be set according
to KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION flags, and in case of
KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF, encryption mode is turned off for
all connections.

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>
fs/ksmbd/ksmbd_netlink.h
fs/ksmbd/smb2ops.c
fs/ksmbd/smb2pdu.c

index dd760c78af7bcd1afadbf25adb4ad16118eb216b..fb9626383f865fb68de8e7d42653d63231f5bea5 100644 (file)
@@ -74,6 +74,7 @@ struct ksmbd_heartbeat {
 #define KSMBD_GLOBAL_FLAG_SMB2_LEASES          BIT(0)
 #define KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION      BIT(1)
 #define KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL    BIT(2)
+#define KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF  BIT(3)
 
 /*
  * IPC request for ksmbd server startup
index f0a5b704f301ce549b0dbf48719f4efc415c435f..9138e1c29b22a0a56d459a878e507cd626b38278 100644 (file)
@@ -248,8 +248,9 @@ void init_smb3_02_server(struct ksmbd_conn *conn)
        if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
                conn->vals->capabilities |= SMB2_GLOBAL_CAP_LEASING;
 
-       if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION &&
-           conn->cli_cap & SMB2_GLOBAL_CAP_ENCRYPTION)
+       if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION ||
+           (!(server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF) &&
+            conn->cli_cap & SMB2_GLOBAL_CAP_ENCRYPTION))
                conn->vals->capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION;
 
        if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL)
@@ -272,6 +273,11 @@ int init_smb3_11_server(struct ksmbd_conn *conn)
        if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
                conn->vals->capabilities |= SMB2_GLOBAL_CAP_LEASING;
 
+       if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION ||
+           (!(server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF) &&
+            conn->cli_cap & SMB2_GLOBAL_CAP_ENCRYPTION))
+               conn->vals->capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION;
+
        if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL)
                conn->vals->capabilities |= SMB2_GLOBAL_CAP_MULTI_CHANNEL;
 
index 8c30fd05f7856498017e73d71add3e83a85e2584..54d6aef237c9c7fd4e109f82c244c5cf3ad69322 100644 (file)
@@ -934,7 +934,7 @@ static void decode_encrypt_ctxt(struct ksmbd_conn *conn,
                return;
        }
 
-       if (!(server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION))
+       if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF)
                return;
 
        for (i = 0; i < cph_cnt; i++) {
@@ -1538,7 +1538,8 @@ static int ntlm_authenticate(struct ksmbd_work *work)
                        return -EINVAL;
                }
                sess->enc = true;
-               rsp->SessionFlags = SMB2_SESSION_FLAG_ENCRYPT_DATA_LE;
+               if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION)
+                       rsp->SessionFlags = SMB2_SESSION_FLAG_ENCRYPT_DATA_LE;
                /*
                 * signing is disable if encryption is enable
                 * on this session
@@ -1629,7 +1630,8 @@ static int krb5_authenticate(struct ksmbd_work *work)
                        return -EINVAL;
                }
                sess->enc = true;
-               rsp->SessionFlags = SMB2_SESSION_FLAG_ENCRYPT_DATA_LE;
+               if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION)
+                       rsp->SessionFlags = SMB2_SESSION_FLAG_ENCRYPT_DATA_LE;
                sess->sign = false;
        }