diff options
author | Tobias Stoeckmann <tobias@stoeckmann.org> | 2024-01-24 18:57:42 +0100 |
---|---|---|
committer | Dmitry V. Levin <ldv@strace.io> | 2024-01-24 21:48:21 +0000 |
commit | b7b96362087414e52524d3d9d9b3faa21e1db620 (patch) | |
tree | f9784174d769012b7f193150a37553ec11fd6760 /modules/pam_unix/pam_unix_acct.c | |
parent | 54a0aee65b3d8129a55ece62ab8540f1cac3e929 (diff) | |
download | pam-b7b96362087414e52524d3d9d9b3faa21e1db620.tar.gz pam-b7b96362087414e52524d3d9d9b3faa21e1db620.tar.bz2 pam-b7b96362087414e52524d3d9d9b3faa21e1db620.zip |
pam_unix: try to set uid to 0 for unix_chkpwd
The geteuid check does not cover all cases. If a program runs with
elevated capabilities like CAP_SETUID then we can still check
credentials of other users.
Keep logging for future analysis though.
Resolves: https://github.com/linux-pam/linux-pam/issues/747
Fixes: b3020da7da38 ("pam_unix/passverify: always run the helper to obtain shadow password file entries")
Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
Diffstat (limited to 'modules/pam_unix/pam_unix_acct.c')
-rw-r--r-- | modules/pam_unix/pam_unix_acct.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/modules/pam_unix/pam_unix_acct.c b/modules/pam_unix/pam_unix_acct.c index 8f5ed3e0..7ffcb9e3 100644 --- a/modules/pam_unix/pam_unix_acct.c +++ b/modules/pam_unix/pam_unix_acct.c @@ -110,14 +110,15 @@ int _unix_run_verify_binary(pam_handle_t *pamh, unsigned long long ctrl, _exit(PAM_AUTHINFO_UNAVAIL); } - if (geteuid() == 0) { - /* must set the real uid to 0 so the helper will not error - out if pam is called from setuid binary (su, sudo...) */ - if (setuid(0) == -1) { - pam_syslog(pamh, LOG_ERR, "setuid failed: %m"); - printf("-1\n"); - fflush(stdout); - _exit(PAM_AUTHINFO_UNAVAIL); + /* must set the real uid to 0 so the helper will not error + out if pam is called from setuid binary (su, sudo...) */ + if (setuid(0) == -1) { + uid_t euid = geteuid(); + pam_syslog(pamh, euid == 0 ? LOG_ERR : LOG_DEBUG, "setuid failed: %m"); + if (euid == 0) { + printf("-1\n"); + fflush(stdout); + _exit(PAM_AUTHINFO_UNAVAIL); } } |