mirror of
https://github.com/sheumann/hush.git
synced 2024-08-20 19:29:02 +00:00
make pw_encrypt() return malloc'ed string.
text data bss dec hex filename 759802 604 6684 767090 bb472 busybox_old 759804 604 6676 767084 bb46c busybox_unstripped
This commit is contained in:
parent
4ea83bf562
commit
fdddab0c61
@ -1031,7 +1031,7 @@ extern int restricted_shell(const char *shell);
|
|||||||
*/
|
*/
|
||||||
extern void setup_environment(const char *shell, int clear_env, int change_env, const struct passwd *pw);
|
extern void setup_environment(const char *shell, int clear_env, int change_env, const struct passwd *pw);
|
||||||
extern int correct_password(const struct passwd *pw);
|
extern int correct_password(const struct passwd *pw);
|
||||||
/* Returns a ptr to static storage */
|
/* Returns a malloced string */
|
||||||
extern char *pw_encrypt(const char *clear, const char *salt, int cleanup);
|
extern char *pw_encrypt(const char *clear, const char *salt, int cleanup);
|
||||||
extern int obscure(const char *old, const char *newval, const struct passwd *pwdp);
|
extern int obscure(const char *old, const char *newval, const struct passwd *pwdp);
|
||||||
/* rnd is additional random input. New one is returned.
|
/* rnd is additional random input. New one is returned.
|
||||||
|
@ -40,6 +40,7 @@ int correct_password(const struct passwd *pw)
|
|||||||
{
|
{
|
||||||
char *unencrypted, *encrypted;
|
char *unencrypted, *encrypted;
|
||||||
const char *correct;
|
const char *correct;
|
||||||
|
int r;
|
||||||
#if ENABLE_FEATURE_SHADOWPASSWDS
|
#if ENABLE_FEATURE_SHADOWPASSWDS
|
||||||
/* Using _r function to avoid pulling in static buffers */
|
/* Using _r function to avoid pulling in static buffers */
|
||||||
struct spwd spw;
|
struct spwd spw;
|
||||||
@ -72,6 +73,8 @@ int correct_password(const struct passwd *pw)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
encrypted = pw_encrypt(unencrypted, correct, 1);
|
encrypted = pw_encrypt(unencrypted, correct, 1);
|
||||||
|
r = (strcmp(encrypted, correct) == 0);
|
||||||
|
free(encrypted);
|
||||||
memset(unencrypted, 0, strlen(unencrypted));
|
memset(unencrypted, 0, strlen(unencrypted));
|
||||||
return strcmp(encrypted, correct) == 0;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ static void my_crypt_cleanup(void)
|
|||||||
|
|
||||||
char *pw_encrypt(const char *clear, const char *salt, int cleanup)
|
char *pw_encrypt(const char *clear, const char *salt, int cleanup)
|
||||||
{
|
{
|
||||||
static char *cipher;
|
char *encrypted;
|
||||||
|
|
||||||
#if 0 /* was CONFIG_FEATURE_SHA1_PASSWORDS, but there is no such thing??? */
|
#if 0 /* was CONFIG_FEATURE_SHA1_PASSWORDS, but there is no such thing??? */
|
||||||
if (strncmp(salt, "$2$", 3) == 0) {
|
if (strncmp(salt, "$2$", 3) == 0) {
|
||||||
@ -62,11 +62,10 @@ char *pw_encrypt(const char *clear, const char *salt, int cleanup)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
free(cipher);
|
encrypted = my_crypt(clear, salt);
|
||||||
cipher = my_crypt(clear, salt);
|
|
||||||
|
|
||||||
if (cleanup)
|
if (cleanup)
|
||||||
my_crypt_cleanup();
|
my_crypt_cleanup();
|
||||||
|
|
||||||
return cipher;
|
return encrypted;
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,7 @@ int chpasswd_main(int argc ATTRIBUTE_UNUSED, char **argv)
|
|||||||
bb_info_msg("Password for '%s' changed", name);
|
bb_info_msg("Password for '%s' changed", name);
|
||||||
logmode = LOGMODE_STDIO;
|
logmode = LOGMODE_STDIO;
|
||||||
free(name);
|
free(name);
|
||||||
|
free(pass);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -16,22 +16,24 @@ static char* new_password(const struct passwd *pw, uid_t myuid, int algo)
|
|||||||
char salt[sizeof("$N$XXXXXXXX")]; /* "$N$XXXXXXXX" or "XX" */
|
char salt[sizeof("$N$XXXXXXXX")]; /* "$N$XXXXXXXX" or "XX" */
|
||||||
char *orig = (char*)"";
|
char *orig = (char*)"";
|
||||||
char *newp = NULL;
|
char *newp = NULL;
|
||||||
char *cipher = NULL;
|
|
||||||
char *cp = NULL;
|
char *cp = NULL;
|
||||||
char *ret = NULL; /* failure so far */
|
char *ret = NULL; /* failure so far */
|
||||||
|
|
||||||
if (myuid && pw->pw_passwd[0]) {
|
if (myuid && pw->pw_passwd[0]) {
|
||||||
|
char *encrypted;
|
||||||
|
|
||||||
orig = bb_askpass(0, "Old password:"); /* returns ptr to static */
|
orig = bb_askpass(0, "Old password:"); /* returns ptr to static */
|
||||||
if (!orig)
|
if (!orig)
|
||||||
goto err_ret;
|
goto err_ret;
|
||||||
cipher = pw_encrypt(orig, pw->pw_passwd, 1); /* returns ptr to static */
|
encrypted = pw_encrypt(orig, pw->pw_passwd, 1); /* returns malloced str */
|
||||||
if (strcmp(cipher, pw->pw_passwd) != 0) {
|
if (strcmp(encrypted, pw->pw_passwd) != 0) {
|
||||||
syslog(LOG_WARNING, "incorrect password for '%s'",
|
syslog(LOG_WARNING, "incorrect password for '%s'",
|
||||||
pw->pw_name);
|
pw->pw_name);
|
||||||
bb_do_delay(FAIL_DELAY);
|
bb_do_delay(FAIL_DELAY);
|
||||||
puts("Incorrect password");
|
puts("Incorrect password");
|
||||||
goto err_ret;
|
goto err_ret;
|
||||||
}
|
}
|
||||||
|
if (ENABLE_FEATURE_CLEAN_UP) free(encrypted);
|
||||||
}
|
}
|
||||||
orig = xstrdup(orig); /* or else bb_askpass() will destroy it */
|
orig = xstrdup(orig); /* or else bb_askpass() will destroy it */
|
||||||
newp = bb_askpass(0, "New password:"); /* returns ptr to static */
|
newp = bb_askpass(0, "New password:"); /* returns ptr to static */
|
||||||
@ -55,8 +57,8 @@ static char* new_password(const struct passwd *pw, uid_t myuid, int algo)
|
|||||||
strcpy(salt, "$1$");
|
strcpy(salt, "$1$");
|
||||||
crypt_make_salt(salt + 3, 4, 0);
|
crypt_make_salt(salt + 3, 4, 0);
|
||||||
}
|
}
|
||||||
/* pw_encrypt returns ptr to static */
|
/* pw_encrypt returns malloced str */
|
||||||
ret = xstrdup(pw_encrypt(newp, salt, 1));
|
ret = pw_encrypt(newp, salt, 1);
|
||||||
/* whee, success! */
|
/* whee, success! */
|
||||||
|
|
||||||
err_ret:
|
err_ret:
|
||||||
@ -64,7 +66,6 @@ static char* new_password(const struct passwd *pw, uid_t myuid, int algo)
|
|||||||
if (ENABLE_FEATURE_CLEAN_UP) free(orig);
|
if (ENABLE_FEATURE_CLEAN_UP) free(orig);
|
||||||
nuke_str(newp);
|
nuke_str(newp);
|
||||||
if (ENABLE_FEATURE_CLEAN_UP) free(newp);
|
if (ENABLE_FEATURE_CLEAN_UP) free(newp);
|
||||||
nuke_str(cipher);
|
|
||||||
nuke_str(cp);
|
nuke_str(cp);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -72,6 +72,9 @@ int sulogin_main(int argc ATTRIBUTE_UNUSED, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
char *encrypted;
|
||||||
|
int r;
|
||||||
|
|
||||||
/* cp points to a static buffer that is zeroed every time */
|
/* cp points to a static buffer that is zeroed every time */
|
||||||
cp = bb_askpass(timeout,
|
cp = bb_askpass(timeout,
|
||||||
"Give root password for system maintenance\n"
|
"Give root password for system maintenance\n"
|
||||||
@ -81,7 +84,10 @@ int sulogin_main(int argc ATTRIBUTE_UNUSED, char **argv)
|
|||||||
bb_info_msg("Normal startup");
|
bb_info_msg("Normal startup");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (strcmp(pw_encrypt(cp, pwd->pw_passwd, 1), pwd->pw_passwd) == 0) {
|
encrypted = pw_encrypt(cp, pwd->pw_passwd, 1);
|
||||||
|
r = strcmp(encrypted, pwd->pw_passwd);
|
||||||
|
free(encrypted);
|
||||||
|
if (r == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
bb_do_delay(FAIL_DELAY);
|
bb_do_delay(FAIL_DELAY);
|
||||||
|
@ -1721,7 +1721,6 @@ static int checkPerm(const char *path, const char *request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ENABLE_FEATURE_HTTPD_AUTH_MD5) {
|
if (ENABLE_FEATURE_HTTPD_AUTH_MD5) {
|
||||||
char *cipher;
|
|
||||||
char *pp;
|
char *pp;
|
||||||
|
|
||||||
if (strncmp(p, request, u - request) != 0) {
|
if (strncmp(p, request, u - request) != 0) {
|
||||||
@ -1732,9 +1731,10 @@ static int checkPerm(const char *path, const char *request)
|
|||||||
if (pp && pp[1] == '$' && pp[2] == '1'
|
if (pp && pp[1] == '$' && pp[2] == '1'
|
||||||
&& pp[3] == '$' && pp[4]
|
&& pp[3] == '$' && pp[4]
|
||||||
) {
|
) {
|
||||||
pp++;
|
char *encrypted = pw_encrypt(u+1, ++pp, 1);
|
||||||
cipher = pw_encrypt(u+1, pp, 1);
|
int r = strcmp(encrypted, pp);
|
||||||
if (strcmp(cipher, pp) == 0)
|
free(encrypted);
|
||||||
|
if (r == 0)
|
||||||
goto set_remoteuser_var; /* Ok */
|
goto set_remoteuser_var; /* Ok */
|
||||||
/* unauthorized */
|
/* unauthorized */
|
||||||
continue;
|
continue;
|
||||||
|
Loading…
Reference in New Issue
Block a user