>Number: 4034 >Category: mod_auth-any >Synopsis: htpasswd uses small salt >Confidential: no >Severity: non-critical >Priority: medium >Responsible: apache >State: open >Class: sw-bug >Submitter-Id: apache >Arrival-Date: Wed Mar 10 17:20:01 PST 1999 >Last-Modified: >Originator: [EMAIL PROTECTED] >Organization: apache >Release: 1.3.4 >Environment: FreeBSD wyattearp.stanford.edu 3.1-RELEASE FreeBSD 3.1-RELEASE #1: Sat Mar 6 11:20:34 PST 1999 [EMAIL PROTECTED]:/misc/3.1/usr/src/sys/compile/WYATTEARP i386 >Description: Encrypted passwords created by "htpasswd" use 12-bit (two-byte) salts, even on systems (such as FreeBSD) that use improved password hashing algorithms and can support longer salts. >How-To-Repeat: On a FreeBSD 2.x / 3.x system, configured to use MD5-based password hashing, create a password file with "htpasswd -c" and note that the salt (between the second and third dollar signs) is only two bytes long. Compare with the pass- word strings in /etc/master.passwd, which use longer salts. >Fix: The "add_password" routine in htpasswd.c can be enhanced to generate a longer salt string. Here is a patch that worked for me. Alternatively, the author- ization code could be rewritten to use a different password scheme altogether.
*** src/support/htpasswd.c.orig Mon Jul 13 04:32:58 1998 --- src/support/htpasswd.c Mon Sep 21 16:21:26 1998 *************** *** 12,17 **** --- 12,18 ---- #include "ap_config.h" #include <sys/types.h> + #include <sys/time.h> #include <signal.h> #ifndef CHARSET_EBCDIC *************** *** 114,120 **** static void add_password(char *user, FILE *f) { ! char *pw, *cpw, salt[3]; pw = strd((char *) getpass("New password:")); if (strcmp(pw, (char *) getpass("Re-type new password:"))) { --- 115,122 ---- static void add_password(char *user, FILE *f) { ! char *pw, *cpw, salt[7]; ! struct timeval tv; pw = strd((char *) getpass("New password:")); if (strcmp(pw, (char *) getpass("Re-type new password:"))) { *************** *** 123,131 **** unlink(tn); exit(1); } ! (void) srand((int) time((time_t *) NULL)); ! to64(&salt[0], rand(), 2); ! salt[2] = '\0'; cpw = (char *)crypt(pw, salt); free(pw); fprintf(f, "%s:%s\n", user, cpw); --- 125,138 ---- unlink(tn); exit(1); } ! ! /* generate longer salt (in case enhanced password code can use it) */ ! gettimeofday(&tv, 0); ! srand((unsigned) tv.tv_sec); ! to64(&salt[0], rand(), 3); ! to64(&salt[3], tv.tv_usec, 3); ! salt[6] = '\0'; ! cpw = (char *)crypt(pw, salt); free(pw); fprintf(f, "%s:%s\n", user, cpw); *************** *** 220,225 **** --- 227,236 ---- { fputs(command,f); } + + /* get rid of any excess leftover text in password file */ + fflush(f); + ftruncate(fileno(f), ftell(f)); fclose(f); fclose(tfp); >Audit-Trail: >Unformatted: [In order for any reply to be added to the PR database, ] [you need to include <[EMAIL PROTECTED]> in the Cc line ] [and leave the subject line UNCHANGED. This is not done] [automatically because of the potential for mail loops. ] [If you do not include this Cc, your reply may be ig- ] [nored unless you are responding to an explicit request ] [from a developer. ] [Reply only with text; DO NOT SEND ATTACHMENTS! ]