linux-cifs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
To: Sachin Prabhu <sprabhu-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
	linux-cifs <linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: Re: [PATCH v2] smb2: Enforce sec= mount option
Date: Wed, 25 Jan 2017 08:36:42 -0500	[thread overview]
Message-ID: <1485351402.2736.2.camel@redhat.com> (raw)
In-Reply-To: <20170118100557.19668-1-sprabhu-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>

On Wed, 2017-01-18 at 15:35 +0530, Sachin Prabhu wrote:
> If the security type specified using a mount option is not supported,
> the SMB2 session setup code changes the security type to RawNTLMSSP. We
> should instead fail the mount and return an error.
> 
> The patch changes the code for SMB2 to make it similar to the code used
> for SMB1. Like in SMB1, we now use the global security flags to select
> the security method to be used when no security method is specified and
> to return an error when the requested auth method is not available.
> 
> For SMB2, we also use ntlmv2 as a synonym for nltmssp.
> 
> Signed-off-by: Sachin Prabhu <sprabhu-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
> ---
>  fs/cifs/cifsglob.h  |  3 +++
>  fs/cifs/cifsproto.h |  2 ++
>  fs/cifs/connect.c   |  3 ++-
>  fs/cifs/sess.c      |  4 ++--
>  fs/cifs/smb1ops.c   |  1 +
>  fs/cifs/smb2ops.c   |  4 ++++
>  fs/cifs/smb2pdu.c   | 37 +++++++++++++++++++++++++++++++++----
>  fs/cifs/smb2proto.h |  2 ++
>  8 files changed, 49 insertions(+), 7 deletions(-)
> 
> diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
> index 7ea8a33..417af3f 100644
> --- a/fs/cifs/cifsglob.h
> +++ b/fs/cifs/cifsglob.h
> @@ -433,6 +433,9 @@ struct smb_version_operations {
>  	bool (*dir_needs_close)(struct cifsFileInfo *);
>  	long (*fallocate)(struct file *, struct cifs_tcon *, int, loff_t,
>  			  loff_t);
> +	enum securityEnum (*select_sectype)(struct TCP_Server_Info *,
> +			    enum securityEnum);
> +
>  };
>  
>  struct smb_version_values {
> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
> index c7b3c84..88da716 100644
> --- a/fs/cifs/cifsproto.h
> +++ b/fs/cifs/cifsproto.h
> @@ -519,4 +519,6 @@ int cifs_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
>  int __cifs_calc_signature(struct smb_rqst *rqst,
>  			struct TCP_Server_Info *server, char *signature,
>  			struct shash_desc *shash);
> +enum securityEnum cifs_select_sectype(struct TCP_Server_Info *,
> +					enum securityEnum);
>  #endif			/* _CIFSPROTO_H */
> diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
> index 35ae49e..327a6cb 100644
> --- a/fs/cifs/connect.c
> +++ b/fs/cifs/connect.c
> @@ -2057,7 +2057,8 @@ match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
>  	 * that was specified, or "Unspecified" if that sectype was not
>  	 * compatible with the given NEGOTIATE request.
>  	 */
> -	if (select_sectype(server, vol->sectype) == Unspecified)
> +	if (server->ops->select_sectype(server, vol->sectype)
> +	     == Unspecified)
>  		return false;
>  
>  	/*
> diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c
> index 538d9b5..55c337d 100644
> --- a/fs/cifs/sess.c
> +++ b/fs/cifs/sess.c
> @@ -500,7 +500,7 @@ int build_ntlmssp_auth_blob(unsigned char **pbuffer,
>  }
>  
>  enum securityEnum
> -select_sectype(struct TCP_Server_Info *server, enum securityEnum requested)
> +cifs_select_sectype(struct TCP_Server_Info *server, enum securityEnum requested)
>  {
>  	switch (server->negflavor) {
>  	case CIFS_NEGFLAVOR_EXTENDED:
> @@ -1390,7 +1390,7 @@ static int select_sec(struct cifs_ses *ses, struct sess_data *sess_data)
>  {
>  	int type;
>  
> -	type = select_sectype(ses->server, ses->sectype);
> +	type = cifs_select_sectype(ses->server, ses->sectype);
>  	cifs_dbg(FYI, "sess setup type %d\n", type);
>  	if (type == Unspecified) {
>  		cifs_dbg(VFS,
> diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c
> index fc537c2..1399671 100644
> --- a/fs/cifs/smb1ops.c
> +++ b/fs/cifs/smb1ops.c
> @@ -1087,6 +1087,7 @@ struct smb_version_operations smb1_operations = {
>  	.is_read_op = cifs_is_read_op,
>  	.wp_retry_size = cifs_wp_retry_size,
>  	.dir_needs_close = cifs_dir_needs_close,
> +	.select_sectype = cifs_select_sectype,
>  #ifdef CONFIG_CIFS_XATTR
>  	.query_all_EAs = CIFSSMBQAllEAs,
>  	.set_EA = CIFSSMBSetEA,
> diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
> index 5d456eb..8d9fda2 100644
> --- a/fs/cifs/smb2ops.c
> +++ b/fs/cifs/smb2ops.c
> @@ -1623,6 +1623,7 @@ struct smb_version_operations smb20_operations = {
>  	.clone_range = smb2_clone_range,
>  	.wp_retry_size = smb2_wp_retry_size,
>  	.dir_needs_close = smb2_dir_needs_close,
> +	.select_sectype = smb2_select_sectype,
>  };
>  
>  struct smb_version_operations smb21_operations = {
> @@ -1704,6 +1705,7 @@ struct smb_version_operations smb21_operations = {
>  	.wp_retry_size = smb2_wp_retry_size,
>  	.dir_needs_close = smb2_dir_needs_close,
>  	.enum_snapshots = smb3_enum_snapshots,
> +	.select_sectype = smb2_select_sectype,
>  };
>  
>  struct smb_version_operations smb30_operations = {
> @@ -1791,6 +1793,7 @@ struct smb_version_operations smb30_operations = {
>  	.dir_needs_close = smb2_dir_needs_close,
>  	.fallocate = smb3_fallocate,
>  	.enum_snapshots = smb3_enum_snapshots,
> +	.select_sectype = smb2_select_sectype,
>  };
>  
>  #ifdef CONFIG_CIFS_SMB311
> @@ -1879,6 +1882,7 @@ struct smb_version_operations smb311_operations = {
>  	.dir_needs_close = smb2_dir_needs_close,
>  	.fallocate = smb3_fallocate,
>  	.enum_snapshots = smb3_enum_snapshots,
> +	.select_sectype = smb2_select_sectype,
>  };
>  #endif /* CIFS_SMB311 */
>  
> diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
> index 8745722..316045a 100644
> --- a/fs/cifs/smb2pdu.c
> +++ b/fs/cifs/smb2pdu.c
> @@ -596,6 +596,28 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon)
>  	return -EIO;
>  }
>  
> +enum securityEnum
> +smb2_select_sectype(struct TCP_Server_Info *server, enum securityEnum requested)
> +{
> +	switch (requested) {
> +	case Kerberos:
> +	case RawNTLMSSP:
> +		return requested;
> +	case NTLMv2:
> +		return RawNTLMSSP;
> +	case Unspecified:
> +		if (server->sec_ntlmssp &&
> +			(global_secflags & CIFSSEC_MAY_NTLMSSP))
> +			return RawNTLMSSP;
> +		if ((server->sec_kerberos || server->sec_mskerberos) &&
> +			(global_secflags & CIFSSEC_MAY_KRB5))
> +			return Kerberos;
> +		/* Fallthrough */
> +	default:
> +		return Unspecified;
> +	}
> +}
> +
>  struct SMB2_sess_data {
>  	unsigned int xid;
>  	struct cifs_ses *ses;
> @@ -958,10 +980,17 @@ SMB2_sess_auth_rawntlmssp_authenticate(struct SMB2_sess_data *sess_data)
>  static int
>  SMB2_select_sec(struct cifs_ses *ses, struct SMB2_sess_data *sess_data)
>  {
> -	if (ses->sectype != Kerberos && ses->sectype != RawNTLMSSP)
> -		ses->sectype = RawNTLMSSP;
> +	int type;
> +
> +	type = smb2_select_sectype(ses->server, ses->sectype);
> +	cifs_dbg(FYI, "sess setup type %d\n", type);
> +	if (type == Unspecified) {
> +		cifs_dbg(VFS,
> +			"Unable to select appropriate authentication method!");
> +		return -EINVAL;
> +	}
>  
> -	switch (ses->sectype) {
> +	switch (type) {
>  	case Kerberos:
>  		sess_data->func = SMB2_auth_kerberos;
>  		break;
> @@ -969,7 +998,7 @@ SMB2_select_sec(struct cifs_ses *ses, struct SMB2_sess_data *sess_data)
>  		sess_data->func = SMB2_sess_auth_rawntlmssp_negotiate;
>  		break;
>  	default:
> -		cifs_dbg(VFS, "secType %d not supported!\n", ses->sectype);
> +		cifs_dbg(VFS, "secType %d not supported!\n", type);
>  		return -EOPNOTSUPP;
>  	}
>  
> diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h
> index f2d511a..2f0a5a2 100644
> --- a/fs/cifs/smb2proto.h
> +++ b/fs/cifs/smb2proto.h
> @@ -175,4 +175,6 @@ extern int SMB2_lease_break(const unsigned int xid, struct cifs_tcon *tcon,
>  			    __u8 *lease_key, const __le32 lease_state);
>  extern int smb3_validate_negotiate(const unsigned int, struct cifs_tcon *);
>  
> +extern enum securityEnum smb2_select_sectype(struct TCP_Server_Info *,
> +					enum securityEnum);
>  #endif			/* _SMB2PROTO_H */

Acked-by: Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>

  parent reply	other threads:[~2017-01-25 13:36 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-18 10:05 [PATCH v2] smb2: Enforce sec= mount option Sachin Prabhu
     [not found] ` <20170118100557.19668-1-sprabhu-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2017-01-25 13:36   ` Jeff Layton [this message]
     [not found]     ` <1485351402.2736.2.camel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2017-03-02 20:41       ` Pavel Shilovsky
2017-03-02 23:29       ` Steve French

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=1485351402.2736.2.camel@redhat.com \
    --to=jlayton-h+wxahxf7alqt0dzr+alfa@public.gmane.org \
    --cc=linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=sprabhu-H+wXaHxf7aLQT0dZR+AlfA@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;
as well as URLs for NNTP newsgroup(s).