[SCM] Samba Shared Repository - branch v4-5-stable updated

Karolin Seeger kseeger at samba.org
Thu Aug 31 06:59:41 UTC 2017


The branch, v4-5-stable has been updated
       via  3c9bc04 VERSION: Disable GIT_SNAPSHOTS for the 4.5.13 release.
       via  0247ece WHATSNEW: Add release notes for Samba 4.5.13.
       via  2339d4b vfs_fruit: factor out common code from ad_get() and ad_fget()
       via  b559efc vfs_fruit: return fake pipe fd in fruit_open_meta_netatalk()
       via  379dbb5 vfs_fruit: don't open basefile in ad_open() and simplify API
       via  d6c9916 vfs_fruit: use path based setxattr call in ad_fset()
       via  12c818b s4/torture: additional tests for kernel-oplocks
       via  c03af9f s4/torture: reproducer for kernel oplocks issue with streams
       via  38d8b62 vfs_streams_xattr: return a fake fd in streams_xattr_open()
       via  f7e96ae vfs_streams_xattr: implement all missing handle based VFS functions
       via  62c9719 vfs_streams_xattr: always pass NULL as fsp arg to get_ea_value()
       via  10b04e9 vfs_streams_xattr: remove fsp argument from get_xattr_size()
       via  c642283 vfs_streams_xattr: remove all uses of fd, use name based functions
       via  da22be9 vfs_streams_xattr: invalidate stat info if xattr was not found
       via  715e1c9 s3: torture: Add a test for cli_setpathinfo_basic() to smbtorture3.
       via  57f129b s3: libsmb: Implement cli_smb2_setatr() by calling cli_smb2_setpathinfo().
       via  a6f4924 s3: libsmb: Add cli_smb2_setpathinfo(), to be called by cli_setpathinfo_basic().
       via  bfa7ac0 s3: libsmbclient: Fix cli_setpathinfo_basic() to treat mode == -1 as no change.
       via  ad113e0 vfs_gpfs: handle EACCES when fetching DOS attributes from xattr
       via  c493d8e s3/smbd: handle EACCES when fetching DOS attributes from xattr
       via  5b3f031 s3/smbd: handling of failed DOS attributes reading
       via  9792ec2 s3: libsmb: Reverse sense of 'clear all attributes', ignore attribute change in SMB2 to match SMB1.
       via  3475d11 vfs_ceph: fix cephwrap_chdir()
       via  cfa8c18 s3: smbd: Fix a read after free if a chained SMB1 call goes async.
       via  5d740e4 s3: libsmb: Fix use-after-free when accessing pointer *p.
       via  5659328 s3/notifyd: ensure notifyd doesn't return from smbd_notifyd_init
       via  dbb2814 vfs_fruit: don't use MS NFS ACEs with Windows clients
       via  35cba47 vfs_fruit: add fruit:model = <modelname> parametric option
       via  6512059 selftest:Samba3: call "net primarytrust dumpinfo" setup_nt4_member() after the join
       via  6c728cc s3:secrets: remove unused secrets_store_[prev_]machine_password()
       via  ad1e456 s3:libads: make use of secrets_*_password_change() in ads_change_trust_account_password()
       via  7d86014 net: make use of secrets_*_password_change() for "net changesecretpw"
       via  ab5109f s3:trusts_util: make use the workstation password change more robust
       via  75a05ad s3:libnet: make use of secrets_store_JoinCtx()
       via  d9a2394 net: add "net primarytrust dumpinfo" command that dumps the details of the workstation trust
       via  f3da295 s3:secrets: add infrastructure to use secrets_domain_infoB to store credentials
       via  97b72e3 secrets.idl: add secrets_domain_info that will be used in secrets.tdb for machine account trusts
       via  4d66652 netlogon.idl: use lsa_TrustType and lsa_TrustAttributes in netr_trust_extension
       via  19addd1 netlogon.idl: make netr_TrustFlags [public]
       via  e635a4f lsa.idl: make lsa_DnsDomainInfo [public]
       via  1e5489d s3:trusts_util: also pass the previous_nt_hash to netlogon_creds_cli_auth()
       via  399945b libcli/auth: pass the cleartext blob to netlogon_creds_cli_ServerPasswordSet*()
       via  0c7de3c libcli/auth: add const to set_pw_in_buffer()
       via  09461fe libcli/auth: pass an array of nt_hashes to netlogon_creds_cli_auth*()
       via  c1d6f18 s3:trusts_util: pass dcname to trust_pw_change()
       via  9afd00e s3:secrets: use secrets_delete for all keys in secrets_delete_machine_password_ex()
       via  3c3765f s3:secrets: let secrets_delete_machine_password_ex() also remove the des_salt key
       via  64b3919 s3:secrets: let secrets_delete_machine_password_ex() remove SID and GUID too
       via  04384a4 s3:secrets: rewrite secrets_delete_machine_password_ex() using helper variables
       via  a920733 s3:secrets: replace secrets_delete_prev_machine_password() by secrets_delete()
       via  fdbf0de s3:secrets: let secrets_store_machine_pw_sync() delete the des_salt_key when there's no value
       via  96319f6 s3:secrets: make use of secrets_delete() in secrets_store_machine_pw_sync()
       via  1bbefc1 s3:secrets: re-add secrets_delete() helper to simplify deleting optional keys
       via  f5dc61c s3:secrets: rename secrets_delete() to secrets_delete_entry()
       via  f30adda s3:secrets: make use of des_salt_key() in secrets_store_machine_pw_sync()
       via  0a36325 s3:secrets: add some const to secrets_store_domain_guid()
       via  ec6b939 s3:secrets: split out a domain_guid_keystr() function
       via  de0f730 s3:secrets: rework des_salt_key() to take the realm as argument
       via  fd161f1 s3:secrets: move kerberos_secrets_*salt related functions to machine_account_secrets.c
       via  701361c s3:libads: remove unused kerberos_fetch_salt_princ_for_host_princ()
       via  24478a5 s3:libads: make use of kerberos_secrets_fetch_salt_princ() in ads_keytab_add_entry()
       via  aa2f79b s3:libnet: make use of kerberos_secrets_fetch_salt_princ()
       via  0aa6bfd s3:gse_krb5: simplify fill_keytab_from_password() by using kerberos_fetch_salt_princ()
       via  2ef7d5a s3:libads: provide a simpler kerberos_fetch_salt_princ() function
       via  0f4d181 s3:libads: remove kerberos_secrets_fetch_salting_principal() fallback
       via  87b27a5 s3:libnet_join: move kerberos_secrets_store_des_salt() to libnet_join_joindomain_store_secrets()
       via  00a2ce6 s3:libnet_join: move libnet_join_joindomain_store_secrets() to libnet_join_post_processing()
       via  a210289 s3:libnet_join: call do_JoinConfig() after we did remote changes on the server
       via  7110ea3 s3:libnet_join: split libnet_join_post_processing_ads() into modify/sync
       via  4765cb4 s3:libnet_join: move kerberos_secrets_store_des_salt() out of libnet_join_derive_salting_principal()
       via  9d818ce s3:libnet_join: remember r->out.krb5_salt in libnet_join_derive_salting_principal()
       via  18cd978 s3:libnet_join.idl: add krb5_salt to libnet_JoinCtx
       via  f18c0ca s3:libnet_join: remember the domain_guid for AD domains
       via  d68b34b s3:libnet_join.idl: return the domain_guid in libnet_JoinCtx
       via  35b6d50 s3:libnet_join: calculate r->out.account_name in libnet_join_pre_processing()
       via  77980ad s3:libnet_join: remove dead code from libnet_join_connect_ads()
       via  cef8c67 krb5_wrap: add smb_krb5_salt_principal2data()
       via  5b96252 krb5_wrap: add smb_krb5_salt_principal()
       via  88abba9 s3:libads: remove unused kerberos_secrets_store_salting_principal()
       via  208c771 s3:librpc: let NDR_SECRETS depend on NDR_SECURITY
       via  899c0d5 idl_types.h: add NDR_SECRET shortcut
       via  9bbacf5 librpc/ndr: add LIBNDR_FLAG_IS_SECRET handling
       via  7b3bfd5 librpc/ndr: align the definition of LIBNDR_STRING_FLAGS with currently defined flags
       via  0c8ae83 pidl:NDR/Parser: add missing {start,end}_flags() to ParseElementPrint()
       via  941aaa9 werror: replace WERR_SETUP_NOT_JOINED with WERR_NERR_SETUPNOTJOINED in source3/libnet/libnet_join.c
       via  3a491cd krb5_wrap: add smb_krb5_free_data_contents() compat define (for v4-5)
       via  82f9cba s3:smbd: consistently use talloc_tos() memory for rpc_pipe_open_interface()
       via  2cae38b selftest: add a test for accessing previous version of directories with snapdirseverywhere
       via  911e3ab s3/smbd: let non_widelink_open() chdir() to directories directly
       via  3de773e VERSION: Bump version up to 4.5.13...
      from  6e6361e VERSION: Release Samba 4.5.12 for CVE-2017-11103

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-5-stable


- Log -----------------------------------------------------------------
-----------------------------------------------------------------------

Summary of changes:
 VERSION                                  |    2 +-
 WHATSNEW.txt                             |   70 +-
 docs-xml/manpages/vfs_fruit.8.xml        |    9 +
 lib/krb5_wrap/krb5_samba.c               |  187 ++++
 lib/krb5_wrap/krb5_samba.h               |   12 +
 libcli/auth/netlogon_creds_cli.c         |   78 +-
 libcli/auth/netlogon_creds_cli.h         |   16 +-
 libcli/auth/proto.h                      |    2 +-
 libcli/auth/smbencrypt.c                 |    2 +-
 librpc/idl/idl_types.h                   |    6 +
 librpc/idl/lsa.idl                       |    2 +-
 librpc/idl/netlogon.idl                  |    6 +-
 librpc/ndr/libndr.h                      |   24 +-
 librpc/ndr/ndr.c                         |   23 +
 librpc/ndr/ndr_basic.c                   |   44 +
 pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm |    4 +
 selftest/target/Samba3.pm                |   10 +
 source3/include/proto.h                  |    1 +
 source3/include/secrets.h                |   38 +-
 source3/libads/kerberos.c                |  200 ----
 source3/libads/kerberos_keytab.c         |   14 +-
 source3/libads/kerberos_proto.h          |    8 -
 source3/libads/util.c                    |  106 +-
 source3/libnet/libnet_join.c             |  133 ++-
 source3/libnet/libnet_keytab.c           |    5 +-
 source3/librpc/crypto/gse_krb5.c         |   40 +-
 source3/librpc/idl/libnet_join.idl       |    4 +-
 source3/librpc/idl/secrets.idl           |   92 +-
 source3/librpc/wscript_build             |    2 +-
 source3/libsmb/cli_smb2_fnum.c           |   94 +-
 source3/libsmb/cli_smb2_fnum.h           |    5 +
 source3/libsmb/clirap.c                  |   27 +-
 source3/libsmb/libsmb_dir.c              |    6 +-
 source3/libsmb/trusts_util.c             |  276 ++++-
 source3/modules/vfs_ceph.c               |    7 -
 source3/modules/vfs_fruit.c              |  270 ++---
 source3/modules/vfs_gpfs.c               |   69 +-
 source3/modules/vfs_streams_xattr.c      |  574 +++++++++--
 source3/passdb/machine_account_secrets.c | 1661 ++++++++++++++++++++++++++++--
 source3/passdb/secrets.c                 |   25 +-
 source3/passdb/secrets_lsa.c             |    2 +-
 source3/rpc_client/cli_netlogon.c        |   15 +-
 source3/rpcclient/cmd_netlogon.c         |    2 +
 source3/script/tests/test_shadow_copy.sh |   23 +
 source3/smbd/dosmode.c                   |   43 +-
 source3/smbd/lanman.c                    |   20 +-
 source3/smbd/open.c                      |   30 +-
 source3/smbd/process.c                   |    2 +-
 source3/smbd/reply.c                     |    2 +-
 source3/smbd/server.c                    |    8 +-
 source3/torture/torture.c                |  137 +++
 source3/utils/net.c                      |  142 ++-
 source3/utils/net_rpc.c                  |    8 +
 source3/winbindd/winbindd_dual.c         |    1 +
 source3/winbindd/winbindd_dual_srv.c     |    2 +
 source4/torture/smb2/oplock.c            |  346 +++++++
 source4/torture/vfs/fruit.c              |    8 +-
 57 files changed, 4113 insertions(+), 832 deletions(-)


Changeset truncated at 500 lines:

diff --git a/VERSION b/VERSION
index b5eaa03..6c1c849 100644
--- a/VERSION
+++ b/VERSION
@@ -25,7 +25,7 @@
 ########################################################
 SAMBA_VERSION_MAJOR=4
 SAMBA_VERSION_MINOR=5
-SAMBA_VERSION_RELEASE=12
+SAMBA_VERSION_RELEASE=13
 
 ########################################################
 # If a official release has a serious bug              #
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index a519b6c..f3fccf7 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -1,4 +1,70 @@
                    ==============================
+                   Release Notes for Samba 4.5.13
+                           August 31, 2017
+                   ==============================
+
+
+This is the latest stable release of the Samba 4.5 release series.
+
+
+Changes since 4.5.12:
+---------------------
+
+o  Jeremy Allison <jra at samba.org>
+   * BUG 12836: s3: smbd: Fix a read after free if a chained SMB1 call goes
+     async.
+   * BUG 12899: 'smbclient setmode' no longer works to clear attribute bits due
+     to dialect upgrade.
+   * BUG 12913: SMBC_setatr() initially uses an SMB1 call before falling back.
+
+o  Ralph Boehme <slow at samba.org>
+   * BUG 12791: Fix kernel oplock issues with named streams.
+   * BUG 12897: vfs_fruit: Don't use MS NFS ACEs with Windows clients.
+   * BUG 12910: s3/notifyd: Ensure notifyd doesn't return from
+     smbd_notifyd_init.
+   * BUG 12944: vfs_gpfs: handle EACCES when fetching DOS attributes from xattr.
+   * BUG 12885: Let non_widelink_open() chdir() to directories directly.
+
+o  Günther Deschner <gd at samba.org>
+   * BUG 12840: vfs_fruit: Add fruit:model = <modelname> parametric option.
+
+o  David Disseldorp <ddiss at samba.org>
+   * BUG 12911: vfs_ceph: fix cephwrap_chdir().
+
+o  Thomas Jarosch <thomas.jarosch at intra2net.com>
+   * BUG 12927: s3: libsmb: Fix use-after-free when accessing pointer *p.
+
+o  Stefan Metzmacher <metze at samba.org>
+   * BUG 12782: winbindd changes the local password and gets
+     NT_STATUS_WRONG_PASSWORD for the remote change.
+   * BUG 12890: s3:smbd: consistently use talloc_tos() memory for
+     rpc_pipe_open_interface().
+
+
+#######################################
+Reporting bugs & Development Discussion
+#######################################
+
+Please discuss this release on the samba-technical mailing list or by
+joining the #samba-technical IRC channel on irc.freenode.net.
+
+If you do report problems then please try to send high quality
+feedback. If you don't provide vital information to help us track down
+the problem then you will probably be ignored.  All bug reports should
+be filed under the "Samba 4.1 and newer" product in the project's Bugzilla
+database (https://bugzilla.samba.org/).
+
+
+======================================================================
+== Our Code, Our Bugs, Our Responsibility.
+== The Samba Team
+======================================================================
+
+
+Release notes for older releases follow:
+----------------------------------------
+
+                   ==============================
                    Release Notes for Samba 4.5.12
                             July 12, 2017
                    ==============================
@@ -48,8 +114,8 @@ database (https://bugzilla.samba.org/).
 ======================================================================
 
 
-Release notes for older releases follow:
-----------------------------------------
+----------------------------------------------------------------------
+
 
                    ==============================
                    Release Notes for Samba 4.5.11
diff --git a/docs-xml/manpages/vfs_fruit.8.xml b/docs-xml/manpages/vfs_fruit.8.xml
index e2e696c..08b8700 100644
--- a/docs-xml/manpages/vfs_fruit.8.xml
+++ b/docs-xml/manpages/vfs_fruit.8.xml
@@ -162,6 +162,15 @@
 	    </listitem>
 	  </varlistentry>
 
+	  <varlistentry>
+	    <term>fruit:model = MacSamba</term>
+	    <listitem>
+	      <para>This option defines the model string inside the AAPL
+	      extension and will determine the appearance of the icon representing the
+	      Samba server in the Finder window.</para>
+	      <para>The default is <emphasis>MacSamba</emphasis>.</para>
+	    </listitem>
+	  </varlistentry>
 	</variablelist>
 </refsect1>
 
diff --git a/lib/krb5_wrap/krb5_samba.c b/lib/krb5_wrap/krb5_samba.c
index 76e8795..fe29386 100644
--- a/lib/krb5_wrap/krb5_samba.c
+++ b/lib/krb5_wrap/krb5_samba.c
@@ -324,6 +324,193 @@ int smb_krb5_get_pw_salt(krb5_context context,
 #error UNKNOWN_SALT_FUNCTIONS
 #endif
 
+/**
+ * @brief This constructs the salt principal used by active directory
+ *
+ * Most Kerberos encryption types require a salt in order to
+ * calculate the long term private key for user/computer object
+ * based on a password.
+ *
+ * The returned _salt_principal is a string in forms like this:
+ * - host/somehost.example.com at EXAMPLE.COM
+ * - SomeAccount at EXAMPLE.COM
+ * - SomePrincipal at EXAMPLE.COM
+ *
+ * This is not the form that's used as salt, it's just
+ * the human readable form. It needs to be converted by
+ * smb_krb5_salt_principal2data().
+ *
+ * @param[in]  realm              The realm the user/computer is added too.
+ *
+ * @param[in]  sAMAccountName     The sAMAccountName attribute of the object.
+ *
+ * @param[in]  userPrincipalName  The userPrincipalName attribute of the object
+ *                                or NULL is not available.
+ *
+ * @param[in]  is_computer        The indication of the object includes
+ *                                objectClass=computer.
+ *
+ * @param[in]  mem_ctx            The TALLOC_CTX to allocate _salt_principal.
+ *
+ * @param[out]  _salt_principal   The resulting principal as string.
+ *
+ * @retval 0 Success; otherwise - Kerberos error codes
+ *
+ * @see smb_krb5_salt_principal2data
+ */
+int smb_krb5_salt_principal(const char *realm,
+			    const char *sAMAccountName,
+			    const char *userPrincipalName,
+			    bool is_computer,
+			    TALLOC_CTX *mem_ctx,
+			    char **_salt_principal)
+{
+	TALLOC_CTX *frame = talloc_stackframe();
+	char *upper_realm = NULL;
+	const char *principal = NULL;
+	int principal_len = 0;
+
+	*_salt_principal = NULL;
+
+	if (sAMAccountName == NULL) {
+		TALLOC_FREE(frame);
+		return EINVAL;
+	}
+
+	if (realm == NULL) {
+		TALLOC_FREE(frame);
+		return EINVAL;
+	}
+
+	upper_realm = strupper_talloc(frame, realm);
+	if (upper_realm == NULL) {
+		TALLOC_FREE(frame);
+		return ENOMEM;
+	}
+
+	/* Many, many thanks to lukeh at padl.com for this
+	 * algorithm, described in his Nov 10 2004 mail to
+	 * samba-technical at lists.samba.org */
+
+	/*
+	 * Determine a salting principal
+	 */
+	if (is_computer) {
+		int computer_len = 0;
+		char *tmp = NULL;
+
+		computer_len = strlen(sAMAccountName);
+		if (sAMAccountName[computer_len-1] == '$') {
+			computer_len -= 1;
+		}
+
+		tmp = talloc_asprintf(frame, "host/%*.*s.%s",
+				      computer_len, computer_len,
+				      sAMAccountName, realm);
+		if (tmp == NULL) {
+			TALLOC_FREE(frame);
+			return ENOMEM;
+		}
+
+		principal = strlower_talloc(frame, tmp);
+		TALLOC_FREE(tmp);
+		if (principal == NULL) {
+			TALLOC_FREE(frame);
+			return ENOMEM;
+		}
+		principal_len = strlen(principal);
+
+	} else if (userPrincipalName != NULL) {
+		char *p;
+
+		principal = userPrincipalName;
+		p = strchr(principal, '@');
+		if (p != NULL) {
+			principal_len = PTR_DIFF(p, principal);
+		} else {
+			principal_len = strlen(principal);
+		}
+	} else {
+		principal = sAMAccountName;
+		principal_len = strlen(principal);
+	}
+
+	*_salt_principal = talloc_asprintf(mem_ctx, "%*.*s@%s",
+					   principal_len, principal_len,
+					   principal, upper_realm);
+	if (*_salt_principal == NULL) {
+		TALLOC_FREE(frame);
+		return ENOMEM;
+	}
+
+	TALLOC_FREE(frame);
+	return 0;
+}
+
+/**
+ * @brief Converts the salt principal string into the salt data blob
+ *
+ * This function takes a salt_principal as string in forms like this:
+ * - host/somehost.example.com at EXAMPLE.COM
+ * - SomeAccount at EXAMPLE.COM
+ * - SomePrincipal at EXAMPLE.COM
+ *
+ * It generates values like:
+ * - EXAMPLE.COMhost/somehost.example.com
+ * - EXAMPLE.COMSomeAccount
+ * - EXAMPLE.COMSomePrincipal
+ *
+ * @param[in]  realm              The realm the user/computer is added too.
+ *
+ * @param[in]  sAMAccountName     The sAMAccountName attribute of the object.
+ *
+ * @param[in]  userPrincipalName  The userPrincipalName attribute of the object
+ *                                or NULL is not available.
+ *
+ * @param[in]  is_computer        The indication of the object includes
+ *                                objectClass=computer.
+ *
+ * @param[in]  mem_ctx            The TALLOC_CTX to allocate _salt_principal.
+ *
+ * @param[out]  _salt_principal   The resulting principal as string.
+ *
+ * @retval 0 Success; otherwise - Kerberos error codes
+ *
+ * @see smb_krb5_salt_principal
+ */
+int smb_krb5_salt_principal2data(krb5_context context,
+				 const char *salt_principal,
+				 TALLOC_CTX *mem_ctx,
+				 char **_salt_data)
+{
+	krb5_error_code ret;
+	krb5_principal salt_princ = NULL;
+	krb5_data salt;
+
+	*_salt_data = NULL;
+
+	ret = krb5_parse_name(context, salt_principal, &salt_princ);
+	if (ret != 0) {
+		return ret;
+	}
+
+	ret = smb_krb5_get_pw_salt(context, salt_princ, &salt);
+	krb5_free_principal(context, salt_princ);
+	if (ret != 0) {
+		return ret;
+	}
+
+	*_salt_data = talloc_strndup(mem_ctx,
+				     (char *)salt.data,
+				     salt.length);
+	smb_krb5_free_data_contents(context, &salt);
+	if (*_salt_data == NULL) {
+		return ENOMEM;
+	}
+
+	return 0;
+}
+
 #if defined(HAVE_KRB5_GET_PERMITTED_ENCTYPES)
  krb5_error_code get_kerberos_allowed_etypes(krb5_context context,
 					    krb5_enctype **enctypes)
diff --git a/lib/krb5_wrap/krb5_samba.h b/lib/krb5_wrap/krb5_samba.h
index 2d31619..116bffc 100644
--- a/lib/krb5_wrap/krb5_samba.h
+++ b/lib/krb5_wrap/krb5_samba.h
@@ -362,6 +362,16 @@ krb5_error_code ms_suptypes_to_ietf_enctypes(TALLOC_CTX *mem_ctx,
 int smb_krb5_get_pw_salt(krb5_context context,
 			 krb5_const_principal host_princ,
 			 krb5_data *psalt);
+int smb_krb5_salt_principal(const char *realm,
+			    const char *sAMAccountName,
+			    const char *userPrincipalName,
+			    bool is_computer,
+			    TALLOC_CTX *mem_ctx,
+			    char **_salt_principal);
+int smb_krb5_salt_principal2data(krb5_context context,
+				 const char *salt_principal,
+				 TALLOC_CTX *mem_ctx,
+				 char **_salt_data);
 
 int smb_krb5_create_key_from_string(krb5_context context,
 				    krb5_const_principal host_princ,
@@ -408,4 +418,6 @@ int cli_krb5_get_ticket(TALLOC_CTX *mem_ctx,
 			time_t *tgs_expire,
 			const char *impersonate_princ_s);
 
+#define smb_krb5_free_data_contents(a, b) kerberos_free_data_contents(a, b)
+
 #endif /* _KRB5_SAMBA_H */
diff --git a/libcli/auth/netlogon_creds_cli.c b/libcli/auth/netlogon_creds_cli.c
index d55142e..29baae4 100644
--- a/libcli/auth/netlogon_creds_cli.c
+++ b/libcli/auth/netlogon_creds_cli.c
@@ -36,6 +36,7 @@
 #include "source3/include/messages.h"
 #include "source3/include/g_lock.h"
 #include "libds/common/roles.h"
+#include "lib/crypto/crypto.h"
 
 struct netlogon_creds_cli_locked_state;
 
@@ -942,9 +943,10 @@ struct netlogon_creds_cli_auth_state {
 	struct tevent_context *ev;
 	struct netlogon_creds_cli_context *context;
 	struct dcerpc_binding_handle *binding_handle;
-	struct samr_Password current_nt_hash;
-	struct samr_Password previous_nt_hash;
-	struct samr_Password used_nt_hash;
+	uint8_t num_nt_hashes;
+	uint8_t idx_nt_hashes;
+	const struct samr_Password * const *nt_hashes;
+	const struct samr_Password *used_nt_hash;
 	char *srv_name_slash;
 	uint32_t current_flags;
 	struct netr_Credential client_challenge;
@@ -956,7 +958,6 @@ struct netlogon_creds_cli_auth_state {
 	bool try_auth3;
 	bool try_auth2;
 	bool require_auth2;
-	bool try_previous_nt_hash;
 	struct netlogon_creds_cli_locked_state *locked_state;
 };
 
@@ -967,8 +968,8 @@ struct tevent_req *netlogon_creds_cli_auth_send(TALLOC_CTX *mem_ctx,
 				struct tevent_context *ev,
 				struct netlogon_creds_cli_context *context,
 				struct dcerpc_binding_handle *b,
-				struct samr_Password current_nt_hash,
-				const struct samr_Password *previous_nt_hash)
+				uint8_t num_nt_hashes,
+				const struct samr_Password * const *nt_hashes)
 {
 	struct tevent_req *req;
 	struct netlogon_creds_cli_auth_state *state;
@@ -984,12 +985,19 @@ struct tevent_req *netlogon_creds_cli_auth_send(TALLOC_CTX *mem_ctx,
 	state->ev = ev;
 	state->context = context;
 	state->binding_handle = b;
-	state->current_nt_hash = current_nt_hash;
-	if (previous_nt_hash != NULL) {
-		state->previous_nt_hash = *previous_nt_hash;
-		state->try_previous_nt_hash = true;
+	if (num_nt_hashes < 1) {
+		tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER_MIX);
+		return tevent_req_post(req, ev);
+	}
+	if (num_nt_hashes > 4) {
+		tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER_MIX);
+		return tevent_req_post(req, ev);
 	}
 
+	state->num_nt_hashes = num_nt_hashes;
+	state->idx_nt_hashes = 0;
+	state->nt_hashes = nt_hashes;
+
 	if (context->db.locked_state != NULL) {
 		tevent_req_nterror(req, NT_STATUS_LOCK_NOT_GRANTED);
 		return tevent_req_post(req, ev);
@@ -1019,7 +1027,7 @@ struct tevent_req *netlogon_creds_cli_auth_send(TALLOC_CTX *mem_ctx,
 		state->require_auth2 = true;
 	}
 
-	state->used_nt_hash = state->current_nt_hash;
+	state->used_nt_hash = state->nt_hashes[state->idx_nt_hashes];
 	state->current_flags = context->client.proposed_flags;
 
 	if (context->db.g_ctx != NULL) {
@@ -1141,7 +1149,7 @@ static void netlogon_creds_cli_auth_challenge_done(struct tevent_req *subreq)
 						  state->context->client.type,
 						  &state->client_challenge,
 						  &state->server_challenge,
-						  &state->used_nt_hash,
+						  state->used_nt_hash,
 						  &state->client_credential,
 						  state->current_flags);
 	if (tevent_req_nomem(state->creds, req)) {
@@ -1283,7 +1291,8 @@ static void netlogon_creds_cli_auth_srvauth_done(struct tevent_req *subreq)
 			return;
 		}
 
-		if (!state->try_previous_nt_hash) {
+		state->idx_nt_hashes += 1;
+		if (state->idx_nt_hashes >= state->num_nt_hashes) {
 			/*
 			 * we already retried, giving up...
 			 */
@@ -1294,8 +1303,7 @@ static void netlogon_creds_cli_auth_srvauth_done(struct tevent_req *subreq)
 		/*
 		 * lets retry with the old nt hash.
 		 */
-		state->try_previous_nt_hash = false;
-		state->used_nt_hash = state->previous_nt_hash;
+		state->used_nt_hash = state->nt_hashes[state->idx_nt_hashes];
 		state->current_flags = state->context->client.proposed_flags;
 		netlogon_creds_cli_auth_challenge_start(req);
 		return;
@@ -1330,43 +1338,52 @@ static void netlogon_creds_cli_auth_srvauth_done(struct tevent_req *subreq)
 	tevent_req_done(req);
 }
 
-NTSTATUS netlogon_creds_cli_auth_recv(struct tevent_req *req)
+NTSTATUS netlogon_creds_cli_auth_recv(struct tevent_req *req,
+				      uint8_t *idx_nt_hashes)
 {
+	struct netlogon_creds_cli_auth_state *state =
+		tevent_req_data(req,
+		struct netlogon_creds_cli_auth_state);
 	NTSTATUS status;
 
+	*idx_nt_hashes = 0;
+
 	if (tevent_req_is_nterror(req, &status)) {
 		tevent_req_received(req);
 		return status;
 	}
 
+	*idx_nt_hashes = state->idx_nt_hashes;
 	tevent_req_received(req);
 	return NT_STATUS_OK;
 }
 
 NTSTATUS netlogon_creds_cli_auth(struct netlogon_creds_cli_context *context,
 				 struct dcerpc_binding_handle *b,
-				 struct samr_Password current_nt_hash,
-				 const struct samr_Password *previous_nt_hash)
+				 uint8_t num_nt_hashes,
+				 const struct samr_Password * const *nt_hashes,
+				 uint8_t *idx_nt_hashes)
 {
 	TALLOC_CTX *frame = talloc_stackframe();
 	struct tevent_context *ev;
 	struct tevent_req *req;
 	NTSTATUS status = NT_STATUS_NO_MEMORY;
 
+	*idx_nt_hashes = 0;
+
 	ev = samba_tevent_context_init(frame);
 	if (ev == NULL) {
 		goto fail;
 	}
 	req = netlogon_creds_cli_auth_send(frame, ev, context, b,
-					   current_nt_hash,
-					   previous_nt_hash);
+					   num_nt_hashes, nt_hashes);


-- 
Samba Shared Repository



More information about the samba-cvs mailing list