Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cfda35d9 authored by Stefan Metzmacher's avatar Stefan Metzmacher Committed by Steve French
Browse files

fs/cifs: correctly to anonymous authentication via NTLMSSP

See [MS-NLMP] 3.2.5.1.2 Server Receives an AUTHENTICATE_MESSAGE from the Client:

   ...
   Set NullSession to FALSE
   If (AUTHENTICATE_MESSAGE.UserNameLen == 0 AND
      AUTHENTICATE_MESSAGE.NtChallengeResponse.Length == 0 AND
      (AUTHENTICATE_MESSAGE.LmChallengeResponse == Z(1)
       OR
       AUTHENTICATE_MESSAGE.LmChallengeResponse.Length == 0))
       -- Special case: client requested anonymous authentication
       Set NullSession to TRUE
   ...

Only server which map unknown users to guest will allow
access using a non-null NTChallengeResponse.

For Samba it's the "map to guest = bad user" option.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=11913



CC: Stable <stable@vger.kernel.org>
Signed-off-by: default avatarStefan Metzmacher <metze@samba.org>
Signed-off-by: default avatarSteve French <smfrench@gmail.com>
parent 11e31647
Loading
Loading
Loading
Loading
+20 −12
Original line number Original line Diff line number Diff line
@@ -400,6 +400,7 @@ int build_ntlmssp_auth_blob(unsigned char *pbuffer,
	sec_blob->LmChallengeResponse.MaximumLength = 0;
	sec_blob->LmChallengeResponse.MaximumLength = 0;


	sec_blob->NtChallengeResponse.BufferOffset = cpu_to_le32(tmp - pbuffer);
	sec_blob->NtChallengeResponse.BufferOffset = cpu_to_le32(tmp - pbuffer);
	if (ses->user_name != NULL) {
		rc = setup_ntlmv2_rsp(ses, nls_cp);
		rc = setup_ntlmv2_rsp(ses, nls_cp);
		if (rc) {
		if (rc) {
			cifs_dbg(VFS, "Error %d during NTLMSSP authentication\n", rc);
			cifs_dbg(VFS, "Error %d during NTLMSSP authentication\n", rc);
@@ -413,6 +414,13 @@ int build_ntlmssp_auth_blob(unsigned char *pbuffer,
				cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
				cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
		sec_blob->NtChallengeResponse.MaximumLength =
		sec_blob->NtChallengeResponse.MaximumLength =
				cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
				cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
	} else {
		/*
		 * don't send an NT Response for anonymous access
		 */
		sec_blob->NtChallengeResponse.Length = 0;
		sec_blob->NtChallengeResponse.MaximumLength = 0;
	}


	if (ses->domainName == NULL) {
	if (ses->domainName == NULL) {
		sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer);
		sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer);