[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: Re: [PATCH 1/1] login: add support for shadow passwords
From: tito <farmatito () tiscali ! it>
Date: 2023-09-13 21:08:01
Message-ID: 20230913230801.4e763157 () devuan
[Download RAW message or body]
On Wed, 13 Sep 2023 10:39:43 +0200
Joachim Wiberg <troglobit@gmail.com> wrote:
> login, on fallback from PAM, or when PAM support is not enabled, checks
> pw->pw_passwd for locked ("!") or passwordless ("*") accounts. However,
> on systems with shadow passwords the first character will always be "x".
>
> This patch adds shadow password support from the passwd tool, letting
> the user end up in "Login incorrect" rather than the "login: bad salt"
> case, which could be used by an attacker to guess the state of accounts.
>
> Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
> ---
> loginutils/login.c | 15 +++++++++++++++
> 1 file changed, 15 insertions(+)
>
> diff --git a/loginutils/login.c b/loginutils/login.c
> index b02be2176..0e7f20844 100644
> --- a/loginutils/login.c
> +++ b/loginutils/login.c
> @@ -345,6 +345,11 @@ int login_main(int argc UNUSED_PARAM, char **argv)
> #endif
> #if ENABLE_LOGIN_SESSION_AS_CHILD
> pid_t child_pid;
> +#endif
> +#if ENABLE_FEATURE_SHADOWPASSWDS
> + /* Using _r function to avoid pulling in static buffers */
> + struct spwd spw, *result = NULL;
> + char buffer[256];
> #endif
> IF_FEATURE_UTMP(pid_t my_pid;)
>
> @@ -493,6 +498,16 @@ int login_main(int argc UNUSED_PARAM, char **argv)
> goto fake_it;
> }
>
> +#if ENABLE_FEATURE_SHADOWPASSWDS
> + if (getspnam_r(pw->pw_name, &spw, buffer, sizeof(buffer), &result)
> + || !result || strcmp(result->sp_namp, pw->pw_name)) {
> + strcpy(username, "UNKNOWN");
> + goto fake_it;
> + } else {
> + pw->pw_passwd = result->sp_pwdp;
> + }
> +#endif
> +
> if (pw->pw_passwd[0] == '!' || pw->pw_passwd[0] == '*')
> goto auth_failed;
>
Hi,
I wonder if this could be fixed for all applets that use ask_and_check_password
(login, su, sulogin, vlock) in libbb/correct_password.c. The following patch
is untested (not even compile tested) and only a idea as I haven't touched
C code for long time.
Ciao,
Tito
--- libbb/correct_password.c.orig 2020-01-13 00:23:02.432939000 +0100
+++ libbb/correct_password.c 2023-09-13 23:01:40.804878693 +0200
@@ -42,7 +42,7 @@ static const char *get_passwd(const stru
{
const char *pass;
- if (!pw)
+ if (!pw || pw->pw_passwd[0] == '!')
return "aa"; /* "aa" will never match */
pass = pw->pw_passwd;
@@ -55,7 +55,7 @@ static const char *get_passwd(const stru
* At least glibc 2.4 does this. Be extra paranoid here. */
struct spwd *result = NULL;
r = getspnam_r(pw->pw_name, &spw, buffer, SHADOW_BUFSIZE, &result);
- pass = (r || !result) ? "aa" : result->sp_pwdp;
+ pass = (r || !result || result->sp_pwdp[0] == '!' || \
(result->sp_pwdp[0] == '*' && !result->sp_pwdp[1])) ? "aa" : result->sp_pwdp; }
#endif
return pass;
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic