!129 fix CVE-2024-10041
From: @jade_t Reviewed-by: @houmingyong Signed-off-by: @houmingyong
This commit is contained in:
commit
ba85ca0166
@ -0,0 +1,79 @@
|
|||||||
|
From b7b96362087414e52524d3d9d9b3faa21e1db620 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Tobias Stoeckmann <tobias@stoeckmann.org>
|
||||||
|
Date: Wed, 24 Jan 2024 18:57:42 +0100
|
||||||
|
Subject: [PATCH] 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>
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://github.com/linux-pam/linux-pam/commit/b7b96362087414e52524d3d9d9b3faa21e1db620
|
||||||
|
---
|
||||||
|
modules/pam_unix/pam_unix_acct.c | 17 +++++++++--------
|
||||||
|
modules/pam_unix/support.c | 14 +++++++-------
|
||||||
|
2 files changed, 16 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/modules/pam_unix/pam_unix_acct.c b/modules/pam_unix/pam_unix_acct.c
|
||||||
|
index 8f5ed3e..7ffcb9e 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/modules/pam_unix/support.c b/modules/pam_unix/support.c
|
||||||
|
index 4052868..ff46155 100644
|
||||||
|
--- a/modules/pam_unix/support.c
|
||||||
|
+++ b/modules/pam_unix/support.c
|
||||||
|
@@ -513,13 +513,13 @@ static int _unix_run_helper_binary(pam_handle_t *pamh, const char *passwd,
|
||||||
|
_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) {
|
||||||
|
- D(("setuid failed"));
|
||||||
|
- _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) {
|
||||||
|
+ D(("setuid failed"));
|
||||||
|
+ if (geteuid() == 0) {
|
||||||
|
+ _exit(PAM_AUTHINFO_UNAVAIL);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* exec binary helper */
|
||||||
|
--
|
||||||
|
2.46.0
|
||||||
|
|
||||||
95
backport-CVE-2024-10041.patch
Normal file
95
backport-CVE-2024-10041.patch
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
From b3020da7da384d769f27a8713257fbe1001878be Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Dmitry V. Levin" <ldv@strace.io>
|
||||||
|
Date: Mon, 1 Jan 2024 12:00:00 +0000
|
||||||
|
Subject: [PATCH] pam_unix/passverify: always run the helper to obtain shadow
|
||||||
|
password file entries
|
||||||
|
|
||||||
|
Initially, when pam_unix.so verified the password, it used to try to
|
||||||
|
obtain the shadow password file entry for the given user by invoking
|
||||||
|
getspnam(3), and only when that didn't work and the effective uid
|
||||||
|
was nonzero, pam_unix.so used to invoke the helper as a fallback.
|
||||||
|
|
||||||
|
When SELinux support was introduced by commit
|
||||||
|
67aab1ff5515054341a438cf9804e9c9b3a88033, the fallback was extended
|
||||||
|
also for the case when SELinux was enabled.
|
||||||
|
|
||||||
|
Later, commit f220cace205332a3dc34e7b37a85e7627e097e7d extended the
|
||||||
|
fallback conditions for the case when pam_modutil_getspnam() failed
|
||||||
|
with EACCES.
|
||||||
|
|
||||||
|
Since commit 470823c4aacef5cb3b1180be6ed70846b61a3752, the helper is
|
||||||
|
invoked as a fallback when pam_modutil_getspnam() fails for any reason.
|
||||||
|
|
||||||
|
The ultimate solution for the case when pam_unix.so does not have
|
||||||
|
permissions to obtain the shadow password file entry is to stop trying
|
||||||
|
to use pam_modutil_getspnam() and to invoke the helper instead.
|
||||||
|
Here are two recent examples.
|
||||||
|
|
||||||
|
https://github.com/linux-pam/linux-pam/pull/484 describes a system
|
||||||
|
configuration where libnss_systemd is enabled along with libnss_files
|
||||||
|
in the shadow entry of nsswitch.conf, so when libnss_files is unable
|
||||||
|
to obtain the shadow password file entry for the root user, e.g. when
|
||||||
|
SELinux is enabled, NSS falls back to libnss_systemd which returns
|
||||||
|
a synthesized shadow password file entry for the root user, which
|
||||||
|
in turn locks the root user out.
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2150155 describes
|
||||||
|
essentially the same problem in a similar system configuration.
|
||||||
|
|
||||||
|
This commit is the final step in the direction of addressing the issue:
|
||||||
|
for password verification pam_unix.so now invokes the helper instead of
|
||||||
|
making the pam_modutil_getspnam() call.
|
||||||
|
|
||||||
|
* modules/pam_unix/passverify.c (get_account_info) [!HELPER_COMPILE]:
|
||||||
|
Always return PAM_UNIX_RUN_HELPER instead of trying to obtain
|
||||||
|
the shadow password file entry.
|
||||||
|
|
||||||
|
Complements: https://github.com/linux-pam/linux-pam/pull/386
|
||||||
|
Resolves: https://github.com/linux-pam/linux-pam/pull/484
|
||||||
|
Link: https://github.com/authselect/authselect/commit/1e78f7e048747024a846fd22d68afc6993734e92
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://github.com/linux-pam/linux-pam/commit/b3020da7da384d769f27a8713257fbe1001878be
|
||||||
|
---
|
||||||
|
modules/pam_unix/passverify.c | 21 +++++++++++----------
|
||||||
|
1 file changed, 11 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/modules/pam_unix/passverify.c b/modules/pam_unix/passverify.c
|
||||||
|
index 1aee153..9f349e5 100644
|
||||||
|
--- a/modules/pam_unix/passverify.c
|
||||||
|
+++ b/modules/pam_unix/passverify.c
|
||||||
|
@@ -237,20 +237,21 @@ PAMH_ARG_DECL(int get_account_info,
|
||||||
|
return PAM_UNIX_RUN_HELPER;
|
||||||
|
#endif
|
||||||
|
} else if (is_pwd_shadowed(*pwd)) {
|
||||||
|
+#ifdef HELPER_COMPILE
|
||||||
|
/*
|
||||||
|
- * ...and shadow password file entry for this user,
|
||||||
|
+ * shadow password file entry for this user,
|
||||||
|
* if shadowing is enabled
|
||||||
|
*/
|
||||||
|
- *spwdent = pam_modutil_getspnam(pamh, name);
|
||||||
|
- if (*spwdent == NULL) {
|
||||||
|
-#ifndef HELPER_COMPILE
|
||||||
|
- /* still a chance the user can authenticate */
|
||||||
|
- return PAM_UNIX_RUN_HELPER;
|
||||||
|
-#endif
|
||||||
|
- return PAM_AUTHINFO_UNAVAIL;
|
||||||
|
- }
|
||||||
|
- if ((*spwdent)->sp_pwdp == NULL)
|
||||||
|
+ *spwdent = getspnam(name);
|
||||||
|
+ if (*spwdent == NULL || (*spwdent)->sp_pwdp == NULL)
|
||||||
|
return PAM_AUTHINFO_UNAVAIL;
|
||||||
|
+#else
|
||||||
|
+ /*
|
||||||
|
+ * The helper has to be invoked to deal with
|
||||||
|
+ * the shadow password file entry.
|
||||||
|
+ */
|
||||||
|
+ return PAM_UNIX_RUN_HELPER;
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return PAM_USER_UNKNOWN;
|
||||||
|
--
|
||||||
|
2.46.0
|
||||||
|
|
||||||
7
pam.spec
7
pam.spec
@ -4,7 +4,7 @@
|
|||||||
%define _pamconfdir %{_sysconfdir}/pam.d
|
%define _pamconfdir %{_sysconfdir}/pam.d
|
||||||
Name: pam
|
Name: pam
|
||||||
Version: 1.5.3
|
Version: 1.5.3
|
||||||
Release: 5
|
Release: 6
|
||||||
Summary: Pluggable Authentication Modules for Linux
|
Summary: Pluggable Authentication Modules for Linux
|
||||||
License: BSD and GPLv2+
|
License: BSD and GPLv2+
|
||||||
URL: http://www.linux-pam.org/
|
URL: http://www.linux-pam.org/
|
||||||
@ -25,6 +25,8 @@ Patch2: backport-CVE-2024-22365-pam_namespace-protect_dir-use-O_DIRECTORY-to-pre
|
|||||||
Patch3: backport-pam_pwhistory-fix-passing-NULL-filename-argument-to-pwhistory-helper.patch
|
Patch3: backport-pam_pwhistory-fix-passing-NULL-filename-argument-to-pwhistory-helper.patch
|
||||||
Patch4: backport-pam_access-make-non-resolveable-hostname-a-debug-out.patch
|
Patch4: backport-pam_access-make-non-resolveable-hostname-a-debug-out.patch
|
||||||
Patch5: backport-CVE-2024-10963.patch
|
Patch5: backport-CVE-2024-10963.patch
|
||||||
|
Patch6: backport-CVE-2024-10041.patch
|
||||||
|
Patch7: backport-CVE-2024-10041-pam_unix-try-to-set-uid-to-0-for-unix_chkpwd.patch
|
||||||
|
|
||||||
Patch9000:change-ndbm-to-gdbm.patch
|
Patch9000:change-ndbm-to-gdbm.patch
|
||||||
Patch9001:add-sm3-crypt-support.patch
|
Patch9001:add-sm3-crypt-support.patch
|
||||||
@ -179,6 +181,9 @@ make check
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Dec 17 2024 dongyuzhen <dongyuzhen@h-partners.com> - 1.5.3-6
|
||||||
|
- fix CVE-2024-10041
|
||||||
|
|
||||||
* Fri Nov 29 2024 hugel <gengqihu2@h-partners.com> - 1.5.3-5
|
* Fri Nov 29 2024 hugel <gengqihu2@h-partners.com> - 1.5.3-5
|
||||||
- fix CVE-2024-10963
|
- fix CVE-2024-10963
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user