lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 035/846] ksmbd: fix guest connection failure with nautilus
    Date
    From: Namjae Jeon <linkinjeon@kernel.org>

    commit ac090d9c90b087d6fb714e54b2a6dd1e6c373ed6 upstream.

    MS-SMB2 describe session sign like the following.
    Session.SigningRequired MUST be set to TRUE under the following conditions:
    - If the SMB2_NEGOTIATE_SIGNING_REQUIRED bit is set in the SecurityMode
    field of the client request.
    - If the SMB2_SESSION_FLAG_IS_GUEST bit is not set in the SessionFlags
    field and Session.IsAnonymous is FALSE and either Connection.ShouldSign
    or global RequireMessageSigning is TRUE.

    When trying guest account connection using nautilus, The login failure
    happened on session setup. ksmbd does not allow this connection
    when the user is a guest and the connection sign is set. Just do not set
    session sign instead of error response as described in the specification.
    And this change improves the guest connection in Nautilus.

    Fixes: e2f34481b24d ("cifsd: add server-side procedures for SMB3")
    Cc: stable@vger.kernel.org # v5.15+
    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/smb2pdu.c | 64 ++++++++++++++++++++++++-----------------------------
    1 file changed, 30 insertions(+), 34 deletions(-)

    --- a/fs/ksmbd/smb2pdu.c
    +++ b/fs/ksmbd/smb2pdu.c
    @@ -1457,11 +1457,6 @@ static int ntlm_authenticate(struct ksmb

    sess->user = user;
    if (user_guest(sess->user)) {
    - if (conn->sign) {
    - ksmbd_debug(SMB, "Guest login not allowed when signing enabled\n");
    - return -EPERM;
    - }
    -
    rsp->SessionFlags = SMB2_SESSION_FLAG_IS_GUEST_LE;
    } else {
    struct authenticate_message *authblob;
    @@ -1474,38 +1469,39 @@ static int ntlm_authenticate(struct ksmb
    ksmbd_debug(SMB, "authentication failed\n");
    return -EPERM;
    }
    + }

    - /*
    - * If session state is SMB2_SESSION_VALID, We can assume
    - * that it is reauthentication. And the user/password
    - * has been verified, so return it here.
    - */
    - if (sess->state == SMB2_SESSION_VALID) {
    - if (conn->binding)
    - goto binding_session;
    - return 0;
    - }
    + /*
    + * If session state is SMB2_SESSION_VALID, We can assume
    + * that it is reauthentication. And the user/password
    + * has been verified, so return it here.
    + */
    + if (sess->state == SMB2_SESSION_VALID) {
    + if (conn->binding)
    + goto binding_session;
    + return 0;
    + }

    - if ((conn->sign || server_conf.enforced_signing) ||
    - (req->SecurityMode & SMB2_NEGOTIATE_SIGNING_REQUIRED))
    - sess->sign = true;
    -
    - if (smb3_encryption_negotiated(conn) &&
    - !(req->Flags & SMB2_SESSION_REQ_FLAG_BINDING)) {
    - rc = conn->ops->generate_encryptionkey(sess);
    - if (rc) {
    - ksmbd_debug(SMB,
    - "SMB3 encryption key generation failed\n");
    - return -EINVAL;
    - }
    - sess->enc = true;
    - rsp->SessionFlags = SMB2_SESSION_FLAG_ENCRYPT_DATA_LE;
    - /*
    - * signing is disable if encryption is enable
    - * on this session
    - */
    - sess->sign = false;
    + if ((rsp->SessionFlags != SMB2_SESSION_FLAG_IS_GUEST_LE &&
    + (conn->sign || server_conf.enforced_signing)) ||
    + (req->SecurityMode & SMB2_NEGOTIATE_SIGNING_REQUIRED))
    + sess->sign = true;
    +
    + if (smb3_encryption_negotiated(conn) &&
    + !(req->Flags & SMB2_SESSION_REQ_FLAG_BINDING)) {
    + rc = conn->ops->generate_encryptionkey(sess);
    + if (rc) {
    + ksmbd_debug(SMB,
    + "SMB3 encryption key generation failed\n");
    + return -EINVAL;
    }
    + sess->enc = true;
    + rsp->SessionFlags = SMB2_SESSION_FLAG_ENCRYPT_DATA_LE;
    + /*
    + * signing is disable if encryption is enable
    + * on this session
    + */
    + sess->sign = false;
    }

    binding_session:

    \
     
     \ /
      Last update: 2022-01-24 21:40    [W:4.059 / U:0.312 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site