diff options
author | Shawn Emery <Shawn.Emery@Sun.COM> | 2010-01-22 00:35:58 -0700 |
---|---|---|
committer | Shawn Emery <Shawn.Emery@Sun.COM> | 2010-01-22 00:35:58 -0700 |
commit | 77191e8775ec29406dec7210fc064d8fd759dd24 (patch) | |
tree | e578cc3c3c3bb25c336e5d515369d473eb2ba253 | |
parent | 986b458dd38036ac346e3cedf55812c5fad90cde (diff) | |
download | illumos-joyent-77191e8775ec29406dec7210fc064d8fd759dd24.tar.gz |
6913833 smbadm join should use /dev/random
-rw-r--r-- | usr/src/lib/Makefile | 2 | ||||
-rw-r--r-- | usr/src/lib/smbsrv/libmlsvc/common/mlsvc_util.c | 4 | ||||
-rw-r--r-- | usr/src/lib/smbsrv/libsmbns/Makefile.com | 6 | ||||
-rw-r--r-- | usr/src/lib/smbsrv/libsmbns/common/libsmbns.h | 5 | ||||
-rw-r--r-- | usr/src/lib/smbsrv/libsmbns/common/smbns_ads.c | 75 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/netrauth.h | 6 |
6 files changed, 58 insertions, 40 deletions
diff --git a/usr/src/lib/Makefile b/usr/src/lib/Makefile index a4e59dbd14..d428767399 100644 --- a/usr/src/lib/Makefile +++ b/usr/src/lib/Makefile @@ -643,7 +643,7 @@ libshare: libscf libzfs libuuid libfsmgt libsecdb libumem libsmbfs libexacct/demo: libexacct libproject libsocket libnsl libtsalarm: libpcp smbsrv: libsocket libnsl libmd libxnet libpthread librt \ - libshare libidmap pkcs11 libsqlite + libshare libidmap pkcs11 libsqlite libcryptoutil libvrrpadm: libsocket libdladm libscf libvscan: libscf scsi: libnvpair diff --git a/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_util.c b/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_util.c index 80f26918a4..e4e07a416c 100644 --- a/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_util.c +++ b/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_util.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. + * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -128,6 +128,7 @@ mlsvc_join(smb_domainex_t *dxi, char *user, char *plain_text) if (erc != 0) { syslog(LOG_NOTICE, "Failed to update CIFS " "configuration"); + bzero(machine_passwd, sizeof (machine_passwd)); return (NT_STATUS_UNSUCCESSFUL); } @@ -137,6 +138,7 @@ mlsvc_join(smb_domainex_t *dxi, char *user, char *plain_text) status = NT_STATUS_LOGON_FAILURE; } + bzero(machine_passwd, sizeof (machine_passwd)); return (status); } diff --git a/usr/src/lib/smbsrv/libsmbns/Makefile.com b/usr/src/lib/smbsrv/libsmbns/Makefile.com index 16eaaeeec0..ebe8dd1be7 100644 --- a/usr/src/lib/smbsrv/libsmbns/Makefile.com +++ b/usr/src/lib/smbsrv/libsmbns/Makefile.com @@ -19,11 +19,9 @@ # CDDL HEADER END # # -# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Copyright 2010 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # -# ident "%Z%%M% %I% %E% SMI" -# LIBRARY= libsmbns.a VERS= .1 @@ -52,7 +50,7 @@ SRCS= $(OBJS_COMMON:%.o=$(SRCDIR)/%.c) \ $(OBJS_SHARED:%.o=$(SRC)/common/smbsrv/%.c) LDLIBS += $(MACH_LDLIBS) -LDLIBS += -lsmb -lgss -lldap -lresolv -lnsl -lsocket -lc +LDLIBS += -lsmb -lgss -lldap -lresolv -lnsl -lsocket -lc -lcryptoutil CPPFLAGS += -D_REENTRANT # DYNLIB libraries do not have lint libs and are not linted diff --git a/usr/src/lib/smbsrv/libsmbns/common/libsmbns.h b/usr/src/lib/smbsrv/libsmbns/common/libsmbns.h index 2493700e17..ae50db535b 100644 --- a/usr/src/lib/smbsrv/libsmbns/common/libsmbns.h +++ b/usr/src/lib/smbsrv/libsmbns/common/libsmbns.h @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. + * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -59,6 +59,7 @@ typedef struct smb_ads_host_info { typedef enum smb_adjoin_status { SMB_ADJOIN_SUCCESS = 0, SMB_ADJOIN_ERR_GET_HANDLE, + SMB_ADJOIN_ERR_GEN_PWD, SMB_ADJOIN_ERR_GET_DCLEVEL, SMB_ADJOIN_ERR_ADD_TRUST_ACCT, SMB_ADJOIN_ERR_MOD_TRUST_ACCT, @@ -89,7 +90,7 @@ extern int smb_ads_lookup_share(smb_ads_handle_t *, const char *, const char *, char *); extern int smb_ads_add_share(smb_ads_handle_t *, const char *, const char *, const char *); -extern smb_adjoin_status_t smb_ads_join(char *, char *, char *, char *, int); +extern smb_adjoin_status_t smb_ads_join(char *, char *, char *, char *, size_t); extern void smb_ads_join_errmsg(smb_adjoin_status_t); extern boolean_t smb_ads_lookup_msdcs(char *, char *, char *, uint32_t); extern smb_ads_host_info_t *smb_ads_find_host(char *, char *); diff --git a/usr/src/lib/smbsrv/libsmbns/common/smbns_ads.c b/usr/src/lib/smbsrv/libsmbns/common/smbns_ads.c index a54cf7123d..3c11363d44 100644 --- a/usr/src/lib/smbsrv/libsmbns/common/smbns_ads.c +++ b/usr/src/lib/smbsrv/libsmbns/common/smbns_ads.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. + * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -45,6 +45,8 @@ #include <assert.h> #include <sasl/sasl.h> #include <note.h> +#include <errno.h> +#include <cryptoutil.h> #include <smbsrv/libsmbns.h> #include <smbns_dyndns.h> @@ -58,6 +60,13 @@ #define SMB_ADS_SHARE_NUM_ATTR 3 #define SMB_ADS_SITE_MAX MAXHOSTNAMELEN +/* + * [MS-DISO] A machine password is an ASCII string of randomly chosen + * characters. Each character's ASCII code is between 32 and 122 inclusive. + */ +#define SMB_ADS_PWD_CHAR_NUM 91 +#define SMB_ADS_PWD_CHAR_START 32 + #define SMB_ADS_MSDCS_SRV_DC_RR "_ldap._tcp.dc._msdcs" #define SMB_ADS_MSDCS_SRV_SITE_RR "_ldap._tcp.%s._sites.dc._msdcs" @@ -184,7 +193,7 @@ static smb_ads_qstat_t smb_ads_lookup_computer_n_attr(smb_ads_handle_t *, smb_ads_avpair_t *, int, char *); static int smb_ads_update_computer_cntrl_attr(smb_ads_handle_t *, int, char *); static krb5_kvno smb_ads_lookup_computer_attr_kvno(smb_ads_handle_t *, char *); -static void smb_ads_gen_machine_passwd(char *, int); +static int smb_ads_gen_machine_passwd(char *, size_t); static void smb_ads_free_cached_host(void); static int smb_ads_get_spnset(char *, char **); static void smb_ads_free_spnset(char **); @@ -2120,36 +2129,37 @@ smb_ads_lookup_computer_attr_kvno(smb_ads_handle_t *ah, char *dn) return (kvno); } -/* - * smb_ads_gen_machine_passwd - * - * Returned a null-terminated machine password generated randomly - * from [0-9a-zA-Z] character set. In order to pass the password - * quality check (three character classes), an uppercase letter is - * used as the first character of the machine password. - */ -static void -smb_ads_gen_machine_passwd(char *machine_passwd, int bufsz) +static int +smb_ads_gen_machine_passwd(char *machine_passwd, size_t bufsz) { - char *data = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJK" - "LMNOPQRSTUVWXYZ"; - int datalen = strlen(data); - int i, data_idx; + int i; + size_t pwdlen; + uint8_t *random_bytes; - assert(machine_passwd); - assert(bufsz > 0); + errno = 0; + if (machine_passwd == NULL || bufsz == 0) { + errno = EINVAL; + return (-1); + } - /* - * The decimal value of upper case 'A' is 65. Randomly pick - * an upper-case letter from the ascii table. - */ - machine_passwd[0] = (random() % 26) + 65; - for (i = 1; i < bufsz - 1; i++) { - data_idx = random() % datalen; - machine_passwd[i] = data[data_idx]; + pwdlen = bufsz - 1; + random_bytes = calloc(1, pwdlen); + if (random_bytes == NULL) + return (-1); + + if (pkcs11_get_random(random_bytes, pwdlen) != 0) { + free(random_bytes); + return (-1); } - machine_passwd[bufsz - 1] = 0; + for (i = 0; i < pwdlen; i++) + machine_passwd[i] = (random_bytes[i] % SMB_ADS_PWD_CHAR_NUM) + + SMB_ADS_PWD_CHAR_START; + + machine_passwd[pwdlen] = 0; + bzero(random_bytes, pwdlen); + free(random_bytes); + return (0); } /* @@ -2179,7 +2189,7 @@ smb_ads_gen_machine_passwd(char *machine_passwd, int bufsz) */ smb_adjoin_status_t smb_ads_join(char *domain, char *user, char *usr_passwd, char *machine_passwd, - int len) + size_t len) { smb_ads_handle_t *ah = NULL; krb5_context ctx = NULL; @@ -2218,7 +2228,12 @@ smb_ads_join(char *domain, char *user, char *usr_passwd, char *machine_passwd, return (SMB_ADJOIN_ERR_GET_HANDLE); } - smb_ads_gen_machine_passwd(machine_passwd, len); + if (smb_ads_gen_machine_passwd(machine_passwd, len) != 0) { + syslog(LOG_NOTICE, "machine password generation: %m"); + smb_ads_close(ah); + smb_ccache_remove(SMB_CCACHE_PATH); + return (SMB_ADJOIN_ERR_GEN_PWD); + } if ((dclevel = smb_ads_get_dc_level(ah)) == -1) { smb_ads_close(ah); @@ -2378,6 +2393,8 @@ smb_ads_join_errmsg(smb_adjoin_status_t status) } adjoin_table[] = { { SMB_ADJOIN_ERR_GET_HANDLE, "Failed to connect to an " "Active Directory server." }, + { SMB_ADJOIN_ERR_GEN_PWD, "Failed to generate machine " + "password." }, { SMB_ADJOIN_ERR_GET_DCLEVEL, "Unknown functional level of " "the domain controller. The rootDSE attribute named " "\"domainControllerFunctionality\" is missing from the " diff --git a/usr/src/uts/common/smbsrv/netrauth.h b/usr/src/uts/common/smbsrv/netrauth.h index fbfa7e9568..262be0f7c6 100644 --- a/usr/src/uts/common/smbsrv/netrauth.h +++ b/usr/src/uts/common/smbsrv/netrauth.h @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. + * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -96,9 +96,9 @@ typedef struct netr_session_key { #define NETR_FLG_INIT 0x00000002 /* - * 32-byte machine account password (null-terminated) + * 120-byte machine account password (null-terminated) */ -#define NETR_MACHINE_ACCT_PASSWD_MAX 32 + 1 +#define NETR_MACHINE_ACCT_PASSWD_MAX 120 + 1 typedef struct netr_info { DWORD flags; |