Linux CIFS filesystem development
 help / color / mirror / Atom feed
From: Simo <simo-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org>
To: Namjae Jeon <namjae.jeon-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
Cc: Steve French <smfrench-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	Jeff Layton <jlayton-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org>,
	Ashish Sangwan
	<a.sangwan-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
Subject: Re: [PATCH] cifs: set client time as MsvAvTimestamp from CHALLENGE_MESSAGE.TargetInfo
Date: Mon, 25 Aug 2014 09:12:39 -0400	[thread overview]
Message-ID: <1408972359.11134.26.camel@pico.ipa.ssimo.org> (raw)
In-Reply-To: <001301cfc025$940767f0$bc1637d0$@samsung.com>

On Mon, 2014-08-25 at 14:29 +0900, Namjae Jeon wrote:
> Windows machine has extended security feature which refuse to allow
> authentication when there is time difference between server time and
> client time when ntlmv2 negotiation is used. This problem is prevalent
> in embedded enviornment where system time is set to default 1970.
> 
> Modern servers send the server timestamp in the TargetInfo Av_Pair
> structure in the challenge message [see MS-NLMP 2.2.2.1]
> In [MS-NLMP 3.1.5.1.2] it is explicitly mentioned that the client must
> use the server provided timestamp if present OR current time if it is
> not.
> 
> Cc: Simo <simo-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org>
> Signed-off-by: Namjae Jeon <namjae.jeon-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
> Signed-off-by: Ashish Sangwan <a.sangwan-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
> ---
>  fs/cifs/cifsencrypt.c |    6 ++++--
>  fs/cifs/cifsglob.h    |    2 ++
>  fs/cifs/sess.c        |   21 +++++++++++++++++++++
>  3 files changed, 27 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c
> index 4934347..3ec44f8 100644
> --- a/fs/cifs/cifsencrypt.c
> +++ b/fs/cifs/cifsencrypt.c
> @@ -671,8 +671,10 @@ setup_ntlmv2_rsp(struct cifs_ses *ses, const struct nls_table *nls_cp)
>  			(ses->auth_key.response + CIFS_SESS_KEY_SIZE);
>  	ntlmv2->blob_signature = cpu_to_le32(0x00000101);
>  	ntlmv2->reserved = 0;
> -	/* Must be within 5 minutes of the server */
> -	ntlmv2->time = cpu_to_le64(cifs_UnixTimeToNT(CURRENT_TIME));
> +	if (ses->serverTime)
> +		ntlmv2->time = ses->serverTime;
> +	else
> +		ntlmv2->time = cpu_to_le64(cifs_UnixTimeToNT(CURRENT_TIME));
>  	get_random_bytes(&ntlmv2->client_chal, sizeof(ntlmv2->client_chal));
>  	ntlmv2->reserved2 = 0;
>  
> diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
> index ce24c1f..1102822 100644
> --- a/fs/cifs/cifsglob.h
> +++ b/fs/cifs/cifsglob.h
> @@ -796,6 +796,8 @@ struct cifs_ses {
>  	enum securityEnum sectype; /* what security flavor was specified? */
>  	bool sign;		/* is signing required? */
>  	bool need_reconnect:1; /* connection reset, uid now invalid */
> +	__u64   serverTime;	/* Keeps a track of server time sent by server
> +				   during NTLM challenge in little endian */
>  #ifdef CONFIG_CIFS_SMB2
>  	__u16 session_flags;
>  	char smb3signingkey[SMB3_SIGN_KEY_SIZE]; /* for signing smb3 packets */
> diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c
> index 07fe97a..0762377 100644
> --- a/fs/cifs/sess.c
> +++ b/fs/cifs/sess.c
> @@ -277,6 +277,26 @@ static void decode_ascii_ssetup(char **pbcc_area, __u16 bleft,
>  	cifs_dbg(FYI, "ascii: bytes left %d\n", bleft);
>  }
>  
> +static void
> +get_ntlmv2_server_time(struct cifs_ses *ses)
> +{
> +#define MsvAvEOL	0x0000
> +#define MsvAvTimestamp	0x0007
> +	char *payload = ses->auth_key.response;
> +	u16 AvId, AvLen;
> +
> +	do {
> +		AvId = le16_to_cpu(*payload);
> +		AvLen = le16_to_cpu(*(payload + sizeof(u16)));
> +		payload += AvLen + (2 * sizeof(u16));
> +	} while (AvId != MsvAvTimestamp && AvId != MsvAvEOL);
> +
> +	if (AvId == MsvAvTimestamp)
> +		memcpy(&(ses->serverTime), (payload - AvLen), sizeof(__u64));
> +	else
> +		ses->serverTime = 0;
> +}
> +
>  int decode_ntlmssp_challenge(char *bcc_ptr, int blob_len,
>  				    struct cifs_ses *ses)
>  {
> @@ -322,6 +342,7 @@ int decode_ntlmssp_challenge(char *bcc_ptr, int blob_len,
>  			return -ENOMEM;
>  		}
>  		ses->auth_key.len = tilen;
> +		get_ntlmv2_server_time(ses);
>  	}
>  
>  	return 0;

I'll let a cifs maintainer ack or nack the implementation, but from a
logic pov it looks good.

Simo.

  reply	other threads:[~2014-08-25 13:12 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-25  5:29 [PATCH] cifs: set client time as MsvAvTimestamp from CHALLENGE_MESSAGE.TargetInfo Namjae Jeon
2014-08-25 13:12 ` Simo [this message]
     [not found]   ` <1408972359.11134.26.camel-fj0lwfvWodpMy5p6ylGyhR2eb7JE58TQ@public.gmane.org>
2014-08-26  0:19     ` Namjae Jeon
2014-08-25 15:12 ` Shirish Pargaonkar
     [not found]   ` <CADT32eKrh_ZGa3kEeGvz2MSm8qeY+F7VK0d94w2yazJtxk1x8w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-08-26  0:20     ` Namjae Jeon
2014-08-26  0:28       ` Steve French
     [not found]         ` <CAH2r5muK8t6GmU5k0jN3MCkzUW02GuOpvYH3K6szYmiNBgEFNQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-08-26  0:34           ` Namjae Jeon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1408972359.11134.26.camel@pico.ipa.ssimo.org \
    --to=simo-eunubhrolfbytjvyw6ydsg@public.gmane.org \
    --cc=a.sangwan-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org \
    --cc=jlayton-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org \
    --cc=linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=namjae.jeon-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org \
    --cc=smfrench-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox