]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
CIFS: Enable encryption during session setup phase
authorPavel Shilovsky <pshilov@microsoft.com>
Tue, 8 Nov 2016 02:20:50 +0000 (18:20 -0800)
committerBrian Maly <brian.maly@oracle.com>
Wed, 27 Mar 2019 18:57:14 +0000 (14:57 -0400)
In order to allow encryption on SMB connection we need to exchange
a session key and generate encryption and decryption keys.

Signed-off-by: Pavel Shilovsky <pshilov@microsoft.com>
(cherry picked from commit cabfb3680f78981d26c078a26e5c748531257ebb)

Orabug: 29338239
CVE: CVE-2018-1066

Signed-off-by: John Donnelly <John.P.Donnelly@oracle.com>
Reviewed-by: Allen Pais <allen.pais@oracle.com>
Signed-off-by: Brian Maly <brian.maly@oracle.com>
Conflicts:
fs/cifs/smb2pdu.c

Signed-off-by: Brian Maly <brian.maly@oracle.com>
fs/cifs/sess.c
fs/cifs/smb2pdu.c

index bb92215263fea6b3710b44e077770991c8653aca..587191c504aacfe033a4f427da0ddcc23543bca0 100644 (file)
@@ -344,13 +344,12 @@ void build_ntlmssp_negotiate_blob(unsigned char *pbuffer,
        /* BB is NTLMV2 session security format easier to use here? */
        flags = NTLMSSP_NEGOTIATE_56 |  NTLMSSP_REQUEST_TARGET |
                NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
-               NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC;
-       if (ses->server->sign) {
+               NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC |
+               NTLMSSP_NEGOTIATE_SEAL;
+       if (ses->server->sign)
                flags |= NTLMSSP_NEGOTIATE_SIGN;
-               if (!ses->server->session_estab ||
-                               ses->ntlmssp->sesskey_per_smbsess)
-                       flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
-       }
+       if (!ses->server->session_estab || ses->ntlmssp->sesskey_per_smbsess)
+               flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
 
        sec_blob->NegotiateFlags = cpu_to_le32(flags);
 
@@ -407,13 +406,12 @@ int build_ntlmssp_auth_blob(unsigned char **pbuffer,
        flags = NTLMSSP_NEGOTIATE_56 |
                NTLMSSP_REQUEST_TARGET | NTLMSSP_NEGOTIATE_TARGET_INFO |
                NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
-               NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC;
-       if (ses->server->sign) {
+               NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC |
+               NTLMSSP_NEGOTIATE_SEAL;
+       if (ses->server->sign)
                flags |= NTLMSSP_NEGOTIATE_SIGN;
-               if (!ses->server->session_estab ||
-                               ses->ntlmssp->sesskey_per_smbsess)
-                       flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
-       }
+       if (!ses->server->session_estab || ses->ntlmssp->sesskey_per_smbsess)
+               flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
 
        tmp = *pbuffer + sizeof(AUTHENTICATE_MESSAGE);
        sec_blob->NegotiateFlags = cpu_to_le32(flags);
index 4e94a587c6039161c48bcd29b92f5dcff0d9dc52..b1f94d27b7915e1b7c9e5fcef8b314007391cdf1 100644 (file)
@@ -744,7 +744,7 @@ ssetup_exit:
 
        if (!rc) {
                mutex_lock(&server->srv_mutex);
-               if (server->sign && server->ops->generate_signingkey) {
+               if (server->ops->generate_signingkey) {
                        rc = server->ops->generate_signingkey(ses);
                        kfree(ses->auth_key.response);
                        ses->auth_key.response = NULL;
@@ -752,7 +752,7 @@ ssetup_exit:
                                cifs_dbg(FYI,
                                        "SMB3 session key generation failed\n");
                                mutex_unlock(&server->srv_mutex);
-                               goto keygen_exit;
+                               return rc;
                        }
                }
                if (!server->session_estab) {
@@ -769,10 +769,6 @@ ssetup_exit:
        }
 
 keygen_exit:
-       if (!server->sign) {
-               kfree(ses->auth_key.response);
-               ses->auth_key.response = NULL;
-       }
        if (spnego_key) {
                key_invalidate(spnego_key);
                key_put(spnego_key);