diff --git a/.gitignore b/.gitignore index 28c7b90..0244ad4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -SOURCES/Linux-PAM-1.3.1.tar.xz -SOURCES/pam-redhat-0.99.11.tar.bz2 +Linux-PAM-1.6.1.tar.xz +pam-redhat-1.2.0.tar.xz diff --git a/.pam.metadata b/.pam.metadata deleted file mode 100644 index ff5cf70..0000000 --- a/.pam.metadata +++ /dev/null @@ -1,2 +0,0 @@ -e89b6d279c9bf8cb495dfc0b3f3931eb50f818e9 SOURCES/Linux-PAM-1.3.1.tar.xz -42206fe8319723ef23ab646b2eab496c86de3f5b SOURCES/pam-redhat-0.99.11.tar.bz2 diff --git a/Linux-PAM-1.6.1.tar.xz.asc b/Linux-PAM-1.6.1.tar.xz.asc new file mode 100644 index 0000000..3e67bc4 --- /dev/null +++ b/Linux-PAM-1.6.1.tar.xz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIcBAABCgAGBQJmFWt/AAoJEKgEH6g54W42NCwP/iWl8igdScTreVF6zV79Dqu1 +sl+ZjBr/dL+DOTcotsRnoAZUOy4ug3iktMZr1t0BMpWUorNmUofH4SZuhsX0CgRq +47t5mVqCakwn4JLq8J9cLOciMno6ips5ZT4RbMgzRYd1WcBurCAxQSNLP3aQGgub +RFObkqw5814ksz9Ge6QVhJ4l9P0wUoKfcpkzHj2Vq+cy0EzlBtnBGCHrMDgrz5aT +mXqGVvWTPO+lR2S+7wOLUtPoRv0uvN6h97ZszaoGoJ6wa6yYwOYz12/AiIsVQhet +cnr29ymuwPDqlrYGD1Hb0+ZUQExjVDQY90hdJ/ZntUlK7CY/2SotpDGB9kR8dTYJ +fpIVmR6GEZ+xSjBqa7RaiL8ieZCgT3TIvsMqteiFkqI+2lhlSGHX3g3oNSd3sbqd +PLok6W4L+xWDp89aMyYDDs/ISjBt5sSNK4NOOTZIMK4oeScGJJvrDL3S5DOSk1ku +o3l9N62WStD7fk0LYnyUGZORg/ccK6Yy2fV22zBMm/76PoyA1yHfFxCW+HwwmcqR +0riaFjA8cesZ3Dj79q24U3FRVdW5fTF9gS/5mK/Yj51KMMzTkUmbjksEC/AEBKzB +9laXxPdIeKUwNlGs7Heo/NE87u4OZfyihwpzLaTcOzbpN3zDyH6aH5poDs1FSaQ2 +UoUkHsbCWJU/ksn/9BIQ +=Dbz2 +-----END PGP SIGNATURE----- diff --git a/SOURCES/Linux-PAM-1.3.1.tar.xz.asc b/SOURCES/Linux-PAM-1.3.1.tar.xz.asc deleted file mode 100644 index 7057c18..0000000 --- a/SOURCES/Linux-PAM-1.3.1.tar.xz.asc +++ /dev/null @@ -1,7 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2 - -iD8DBQBa/r62bRp/BS5ZJLsRArnKAJ9pGaJHpsEsbOVa5dBQLHYC4DhPuACeJNrg -+DaNc8W13E4Z2ZEUSsgUGe4= -=aSTW ------END PGP SIGNATURE----- diff --git a/SOURCES/fingerprint-auth.pamd b/SOURCES/fingerprint-auth.pamd deleted file mode 100644 index aae6ecc..0000000 --- a/SOURCES/fingerprint-auth.pamd +++ /dev/null @@ -1,19 +0,0 @@ -#%PAM-1.0 -# This file is auto-generated. -# User changes will be destroyed the next time authselect is run. -auth required pam_env.so -auth sufficient pam_fprintd.so -auth required pam_deny.so - -account required pam_unix.so -account sufficient pam_localuser.so -account sufficient pam_succeed_if.so uid < 500 quiet -account required pam_permit.so - -password required pam_deny.so - -session optional pam_keyinit.so revoke -session required pam_limits.so --session optional pam_systemd.so -session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid -session required pam_unix.so diff --git a/SOURCES/pam-1.1.0-console-nochmod.patch b/SOURCES/pam-1.1.0-console-nochmod.patch deleted file mode 100644 index e41adad..0000000 --- a/SOURCES/pam-1.1.0-console-nochmod.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff -up Linux-PAM-1.1.0/modules/pam_console/console.handlers.nochmod Linux-PAM-1.1.0/modules/pam_console/console.handlers ---- Linux-PAM-1.1.0/modules/pam_console/console.handlers.nochmod 2008-12-16 13:37:52.000000000 +0100 -+++ Linux-PAM-1.1.0/modules/pam_console/console.handlers 2009-09-01 17:20:08.000000000 +0200 -@@ -15,5 +15,3 @@ - # touch unlock wait /var/run/console-unlocked - - console consoledevs tty[0-9][0-9]* vc/[0-9][0-9]* :[0-9]+\.[0-9]+ :[0-9]+ --/sbin/pam_console_apply lock logfail wait -t tty -s --/sbin/pam_console_apply unlock logfail wait -r -t tty -s -diff -up Linux-PAM-1.1.0/modules/pam_console/Makefile.am.nochmod Linux-PAM-1.1.0/modules/pam_console/Makefile.am ---- Linux-PAM-1.1.0/modules/pam_console/Makefile.am.nochmod 2008-12-16 13:37:52.000000000 +0100 -+++ Linux-PAM-1.1.0/modules/pam_console/Makefile.am 2009-09-01 17:42:47.000000000 +0200 -@@ -38,7 +38,6 @@ sbin_PROGRAMS = pam_console_apply - - - secureconf_DATA = console.perms console.handlers --permsd_DATA = 50-default.perms - - FLEX_OPTS = -Cr - BISON_OPTS = -d -@@ -62,4 +61,5 @@ configfile.c: configfile.tab.c configfil - - install-data-local: - mkdir -p $(DESTDIR)$(secureconfdir)/console.apps -+ mkdir -p $(DESTDIR)$(permsddir) - mkdir -m $(LOCKMODE) -p -p $(DESTDIR)$(LOCKDIR) diff --git a/SOURCES/pam-1.1.0-notally.patch b/SOURCES/pam-1.1.0-notally.patch deleted file mode 100644 index 0a98952..0000000 --- a/SOURCES/pam-1.1.0-notally.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up Linux-PAM-1.1.0/modules/Makefile.am.notally Linux-PAM-1.1.0/modules/Makefile.am ---- Linux-PAM-1.1.0/modules/Makefile.am.notally 2009-07-27 17:39:25.000000000 +0200 -+++ Linux-PAM-1.1.0/modules/Makefile.am 2009-09-01 17:40:16.000000000 +0200 -@@ -10,7 +10,7 @@ SUBDIRS = pam_access pam_cracklib pam_de - pam_mkhomedir pam_motd pam_namespace pam_nologin \ - pam_permit pam_pwhistory pam_rhosts pam_rootok pam_securetty \ - pam_selinux pam_sepermit pam_shells pam_stress \ -- pam_succeed_if pam_tally pam_tally2 pam_time pam_timestamp \ -+ pam_succeed_if pam_time pam_timestamp \ - pam_tty_audit pam_umask \ - pam_unix pam_userdb pam_warn pam_wheel pam_xauth - diff --git a/SOURCES/pam-1.1.1-console-errmsg.patch b/SOURCES/pam-1.1.1-console-errmsg.patch deleted file mode 100644 index f2fe846..0000000 --- a/SOURCES/pam-1.1.1-console-errmsg.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up Linux-PAM-1.1.1/modules/pam_console/pam_console_apply.c.errmsg Linux-PAM-1.1.1/modules/pam_console/pam_console_apply.c ---- Linux-PAM-1.1.1/modules/pam_console/pam_console_apply.c.errmsg 2008-12-16 13:37:52.000000000 +0100 -+++ Linux-PAM-1.1.1/modules/pam_console/pam_console_apply.c 2014-06-19 13:23:28.948343737 +0200 -@@ -65,7 +65,7 @@ parse_files(void) - on system locale */ - oldlocale = setlocale(LC_COLLATE, "C"); - -- rc = glob(PERMS_GLOB, GLOB_NOCHECK, NULL, &globbuf); -+ rc = glob(PERMS_GLOB, 0, NULL, &globbuf); - setlocale(LC_COLLATE, oldlocale); - if (rc) - return; diff --git a/SOURCES/pam-1.1.3-nouserenv.patch b/SOURCES/pam-1.1.3-nouserenv.patch deleted file mode 100644 index f3a742c..0000000 --- a/SOURCES/pam-1.1.3-nouserenv.patch +++ /dev/null @@ -1,27 +0,0 @@ -diff -up pam/modules/pam_env/pam_env.c.nouserenv pam/modules/pam_env/pam_env.c ---- pam/modules/pam_env/pam_env.c.nouserenv 2010-10-20 09:59:30.000000000 +0200 -+++ pam/modules/pam_env/pam_env.c 2010-11-01 14:42:01.000000000 +0100 -@@ -10,7 +10,7 @@ - #define DEFAULT_READ_ENVFILE 1 - - #define DEFAULT_USER_ENVFILE ".pam_environment" --#define DEFAULT_USER_READ_ENVFILE 1 -+#define DEFAULT_USER_READ_ENVFILE 0 - - #include "config.h" - -diff -up pam/modules/pam_env/pam_env.8.xml.nouserenv pam/modules/pam_env/pam_env.8.xml ---- pam/modules/pam_env/pam_env.8.xml.nouserenv 2010-10-20 09:59:30.000000000 +0200 -+++ pam/modules/pam_env/pam_env.8.xml 2010-11-01 14:42:01.000000000 +0100 -@@ -147,7 +147,10 @@ - - - Turns on or off the reading of the user specific environment -- file. 0 is off, 1 is on. By default this option is on. -+ file. 0 is off, 1 is on. By default this option is off as user -+ supplied environment variables in the PAM environment could affect -+ behavior of subsequent modules in the stack without the consent -+ of the system administrator. - - - diff --git a/SOURCES/pam-1.1.6-limits-user.patch b/SOURCES/pam-1.1.6-limits-user.patch deleted file mode 100644 index 3c17b78..0000000 --- a/SOURCES/pam-1.1.6-limits-user.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff -up Linux-PAM-1.1.6/modules/pam_limits/limits.conf.limits Linux-PAM-1.1.6/modules/pam_limits/limits.conf ---- Linux-PAM-1.1.6/modules/pam_limits/limits.conf.limits 2012-08-15 13:08:43.000000000 +0200 -+++ Linux-PAM-1.1.6/modules/pam_limits/limits.conf 2013-03-14 16:43:37.615087671 +0100 -@@ -1,5 +1,16 @@ - # /etc/security/limits.conf - # -+#This file sets the resource limits for the users logged in via PAM. -+#It does not affect resource limits of the system services. -+# -+#Also note that configuration files in /etc/security/limits.d directory, -+#which are read in alphabetical order, override the settings in this -+#file in case the domain is the same or more specific. -+#That means for example that setting a limit for wildcard domain here -+#can be overriden with a wildcard setting in a config file in the -+#subdirectory, but a user specific setting here can be overriden only -+#with a user specific setting in the subdirectory. -+# - #Each line describes a limit for a user in the form: - # - # diff --git a/SOURCES/pam-1.1.8-audit-user-mgmt.patch b/SOURCES/pam-1.1.8-audit-user-mgmt.patch deleted file mode 100644 index 277a569..0000000 --- a/SOURCES/pam-1.1.8-audit-user-mgmt.patch +++ /dev/null @@ -1,31 +0,0 @@ -diff -up Linux-PAM-1.1.8/modules/pam_tally2/pam_tally2.c.audit-user-mgmt Linux-PAM-1.1.8/modules/pam_tally2/pam_tally2.c ---- Linux-PAM-1.1.8/modules/pam_tally2/pam_tally2.c.audit-user-mgmt 2013-06-18 16:11:21.000000000 +0200 -+++ Linux-PAM-1.1.8/modules/pam_tally2/pam_tally2.c 2014-10-17 12:09:12.965490940 +0200 -@@ -997,9 +997,9 @@ main( int argc UNUSED, char **argv ) - #ifdef HAVE_LIBAUDIT - char buf[64]; - int audit_fd = audit_open(); -- snprintf(buf, sizeof(buf), "pam_tally2 uid=%u reset=%hu", uid, cline_reset); -- audit_log_user_message(audit_fd, AUDIT_USER_ACCT, -- buf, NULL, NULL, ttyname(STDIN_FILENO), 1); -+ snprintf(buf, sizeof(buf), "pam_tally2 reset=%hu", cline_reset); -+ audit_log_acct_message(audit_fd, AUDIT_USER_MGMT, NULL, -+ buf, NULL, uid, NULL, NULL, ttyname(STDIN_FILENO), 1); - if (audit_fd >=0) - close(audit_fd); - #endif -@@ -1040,11 +1040,10 @@ main( int argc UNUSED, char **argv ) - } - else if ( !cline_reset ) { - #ifdef HAVE_LIBAUDIT -- char buf[64]; - int audit_fd = audit_open(); -- snprintf(buf, sizeof(buf), "pam_tally2 uid=all reset=0"); -- audit_log_user_message(audit_fd, AUDIT_USER_ACCT, -- buf, NULL, NULL, ttyname(STDIN_FILENO), 1); -+ audit_log_acct_message(audit_fd, AUDIT_USER_MGMT, NULL, -+ "pam_tally2-reset-all-accts reset=0", "*", -1, -+ NULL, NULL, ttyname(STDIN_FILENO), 1); - if (audit_fd >=0) - close(audit_fd); - #endif diff --git a/SOURCES/pam-1.1.8-full-relro.patch b/SOURCES/pam-1.1.8-full-relro.patch deleted file mode 100644 index 07c69e3..0000000 --- a/SOURCES/pam-1.1.8-full-relro.patch +++ /dev/null @@ -1,88 +0,0 @@ -diff -up Linux-PAM-1.1.8/modules/pam_console/Makefile.am.relro Linux-PAM-1.1.8/modules/pam_console/Makefile.am ---- Linux-PAM-1.1.8/modules/pam_console/Makefile.am.relro 2014-08-13 16:02:49.000000000 +0200 -+++ Linux-PAM-1.1.8/modules/pam_console/Makefile.am 2014-09-10 17:14:33.245554314 +0200 -@@ -33,6 +33,8 @@ pam_console_la_LIBADD = -L$(top_builddir - - pam_console_apply_LDADD = -L$(top_builddir)/libpam -lpam - -+pam_console_apply_LDFLAGS = -Wl,-z,now @PIE_LDFLAGS@ -+ - securelib_LTLIBRARIES = pam_console.la - sbin_PROGRAMS = pam_console_apply - -@@ -47,7 +49,7 @@ pam_console_apply_SOURCES = pam_console_ - configfile.c configfile.h hashtable.c hashtable.h hashtable_private.h - - pam_console_la_CFLAGS = $(AM_CFLAGS) --pam_console_apply_CFLAGS = $(AM_CFLAGS) -+pam_console_apply_CFLAGS = $(AM_CFLAGS) @PIE_CFLAGS@ - - configfile.tab.c: configfile.y - $(YACC) $(BISON_OPTS) -o $@ -p _pc_yy $< -diff -up Linux-PAM-1.1.8/modules/pam_filter/upperLOWER/Makefile.am.relro Linux-PAM-1.1.8/modules/pam_filter/upperLOWER/Makefile.am ---- Linux-PAM-1.1.8/modules/pam_filter/upperLOWER/Makefile.am.relro 2014-09-10 17:17:20.273401344 +0200 -+++ Linux-PAM-1.1.8/modules/pam_filter/upperLOWER/Makefile.am 2014-09-10 17:17:07.857115369 +0200 -@@ -9,7 +9,7 @@ securelibfilterdir = $(SECUREDIR)/pam_fi - - AM_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include \ - -I$(srcdir)/.. @PIE_CFLAGS@ --AM_LDFLAGS = @PIE_LDFLAGS@ -+AM_LDFLAGS = -Wl,-z,now @PIE_LDFLAGS@ - LDADD = $(top_builddir)/libpam/libpam.la - - securelibfilter_PROGRAMS = upperLOWER -diff -up Linux-PAM-1.1.8/modules/pam_mkhomedir/Makefile.am.relro Linux-PAM-1.1.8/modules/pam_mkhomedir/Makefile.am ---- Linux-PAM-1.1.8/modules/pam_mkhomedir/Makefile.am.relro 2013-06-18 16:11:21.000000000 +0200 -+++ Linux-PAM-1.1.8/modules/pam_mkhomedir/Makefile.am 2014-09-10 17:18:42.922304935 +0200 -@@ -30,6 +30,8 @@ endif - - sbin_PROGRAMS = mkhomedir_helper - mkhomedir_helper_SOURCES = mkhomedir_helper.c -+mkhomedir_helper_CFLAGS = $(AM_CFLAGS) @PIE_CFLAGS@ -+mkhomedir_helper_LDFLAGS = -Wl,-z,now @PIE_LDFLAGS@ - mkhomedir_helper_LDADD = $(top_builddir)/libpam/libpam.la - - if ENABLE_REGENERATE_MAN -diff -up Linux-PAM-1.1.8/modules/pam_tally2/Makefile.am.relro Linux-PAM-1.1.8/modules/pam_tally2/Makefile.am ---- Linux-PAM-1.1.8/modules/pam_tally2/Makefile.am.relro 2013-06-18 16:11:21.000000000 +0200 -+++ Linux-PAM-1.1.8/modules/pam_tally2/Makefile.am 2014-09-10 17:22:04.339944040 +0200 -@@ -26,6 +26,8 @@ if HAVE_VERSIONING - pam_tally2_la_LDFLAGS += -Wl,--version-script=$(srcdir)/../modules.map - endif - -+pam_tally2_CFLAGS = $(AM_CFLAGS) @PIE_CFLAGS@ -+pam_tally2_LDFLAGS = -Wl,-z,now @PIE_LDFLAGS@ - pam_tally2_LDADD = $(top_builddir)/libpam/libpam.la $(LIBAUDIT) - - securelib_LTLIBRARIES = pam_tally2.la -diff -up Linux-PAM-1.1.8/modules/pam_timestamp/Makefile.am.relro Linux-PAM-1.1.8/modules/pam_timestamp/Makefile.am ---- Linux-PAM-1.1.8/modules/pam_timestamp/Makefile.am.relro 2013-06-18 16:11:21.000000000 +0200 -+++ Linux-PAM-1.1.8/modules/pam_timestamp/Makefile.am 2014-08-13 16:02:49.906688139 +0200 -@@ -36,7 +36,7 @@ pam_timestamp_la_CFLAGS = $(AM_CFLAGS) - pam_timestamp_check_SOURCES = pam_timestamp_check.c - pam_timestamp_check_CFLAGS = $(AM_CFLAGS) @PIE_CFLAGS@ - pam_timestamp_check_LDADD = $(top_builddir)/libpam/libpam.la --pam_timestamp_check_LDFLAGS = @PIE_LDFLAGS@ -+pam_timestamp_check_LDFLAGS = -Wl,-z,now @PIE_LDFLAGS@ - - hmacfile_SOURCES = hmacfile.c hmacsha1.c sha1.c - hmacfile_LDADD = $(top_builddir)/libpam/libpam.la -diff -up Linux-PAM-1.1.8/modules/pam_unix/Makefile.am.relro Linux-PAM-1.1.8/modules/pam_unix/Makefile.am ---- Linux-PAM-1.1.8/modules/pam_unix/Makefile.am.relro 2013-06-18 16:11:21.000000000 +0200 -+++ Linux-PAM-1.1.8/modules/pam_unix/Makefile.am 2014-08-13 16:02:49.906688139 +0200 -@@ -55,13 +55,13 @@ bigcrypt_LDADD = @LIBCRYPT@ - unix_chkpwd_SOURCES = unix_chkpwd.c md5_good.c md5_broken.c bigcrypt.c \ - passverify.c - unix_chkpwd_CFLAGS = $(AM_CFLAGS) @PIE_CFLAGS@ -DHELPER_COMPILE=\"unix_chkpwd\" --unix_chkpwd_LDFLAGS = @PIE_LDFLAGS@ -+unix_chkpwd_LDFLAGS = -Wl,-z,now @PIE_LDFLAGS@ - unix_chkpwd_LDADD = @LIBCRYPT@ @LIBSELINUX@ @LIBAUDIT@ - - unix_update_SOURCES = unix_update.c md5_good.c md5_broken.c bigcrypt.c \ - passverify.c - unix_update_CFLAGS = $(AM_CFLAGS) @PIE_CFLAGS@ -DHELPER_COMPILE=\"unix_update\" --unix_update_LDFLAGS = @PIE_LDFLAGS@ -+unix_update_LDFLAGS = -Wl,-z,now @PIE_LDFLAGS@ - unix_update_LDADD = @LIBCRYPT@ @LIBSELINUX@ - - if ENABLE_REGENERATE_MAN diff --git a/SOURCES/pam-1.2.0-redhat-modules.patch b/SOURCES/pam-1.2.0-redhat-modules.patch deleted file mode 100644 index 8a66134..0000000 --- a/SOURCES/pam-1.2.0-redhat-modules.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff -up Linux-PAM-1.2.0/configure.ac.redhat-modules Linux-PAM-1.2.0/configure.ac ---- Linux-PAM-1.2.0/configure.ac.redhat-modules 2015-03-25 16:50:10.000000000 +0100 -+++ Linux-PAM-1.2.0/configure.ac 2015-05-15 15:46:50.996074677 +0200 -@@ -616,6 +616,8 @@ AC_CONFIG_FILES([Makefile libpam/Makefil - libpam_misc/Makefile conf/Makefile conf/pam_conv1/Makefile \ - po/Makefile.in \ - modules/Makefile \ -+ modules/pam_chroot/Makefile modules/pam_console/Makefile \ -+ modules/pam_postgresok/Makefile \ - modules/pam_access/Makefile modules/pam_cracklib/Makefile \ - modules/pam_debug/Makefile modules/pam_deny/Makefile \ - modules/pam_echo/Makefile modules/pam_env/Makefile \ -diff -up Linux-PAM-1.2.0/modules/Makefile.am.redhat-modules Linux-PAM-1.2.0/modules/Makefile.am ---- Linux-PAM-1.2.0/modules/Makefile.am.redhat-modules 2015-03-24 13:02:32.000000000 +0100 -+++ Linux-PAM-1.2.0/modules/Makefile.am 2015-05-15 15:46:50.995074654 +0200 -@@ -3,6 +3,7 @@ - # - - SUBDIRS = pam_access pam_cracklib pam_debug pam_deny pam_echo \ -+ pam_chroot pam_console pam_postgresok \ - pam_env pam_exec pam_faildelay pam_filter pam_ftp \ - pam_group pam_issue pam_keyinit pam_lastlog pam_limits \ - pam_listfile pam_localuser pam_loginuid pam_mail \ diff --git a/SOURCES/pam-1.2.0-unix-no-fallback.patch b/SOURCES/pam-1.2.0-unix-no-fallback.patch deleted file mode 100644 index 6295da7..0000000 --- a/SOURCES/pam-1.2.0-unix-no-fallback.patch +++ /dev/null @@ -1,73 +0,0 @@ -diff -up Linux-PAM-1.2.0/modules/pam_unix/pam_unix.8.xml.no-fallback Linux-PAM-1.2.0/modules/pam_unix/pam_unix.8.xml ---- Linux-PAM-1.2.0/modules/pam_unix/pam_unix.8.xml.no-fallback 2015-04-27 16:38:03.000000000 +0200 -+++ Linux-PAM-1.2.0/modules/pam_unix/pam_unix.8.xml 2015-05-15 15:54:21.524440864 +0200 -@@ -284,11 +284,10 @@ - - - When a user changes their password next, -- encrypt it with the SHA256 algorithm. If the -- SHA256 algorithm is not known to the -+ encrypt it with the SHA256 algorithm. The -+ SHA256 algorithm must be supported by the - crypt3 -- function, -- fall back to MD5. -+ function. - - - -@@ -299,11 +298,10 @@ - - - When a user changes their password next, -- encrypt it with the SHA512 algorithm. If the -- SHA512 algorithm is not known to the -+ encrypt it with the SHA512 algorithm. The -+ SHA512 algorithm must be supported by the - crypt3 -- function, -- fall back to MD5. -+ function. - - - -@@ -314,11 +312,10 @@ - - - When a user changes their password next, -- encrypt it with the blowfish algorithm. If the -- blowfish algorithm is not known to the -+ encrypt it with the blowfish algorithm. The -+ blowfish algorithm must be supported by the - crypt3 -- function, -- fall back to MD5. -+ function. - - - -diff -up Linux-PAM-1.2.0/modules/pam_unix/passverify.c.no-fallback Linux-PAM-1.2.0/modules/pam_unix/passverify.c ---- Linux-PAM-1.2.0/modules/pam_unix/passverify.c.no-fallback 2015-05-15 15:54:21.525440887 +0200 -+++ Linux-PAM-1.2.0/modules/pam_unix/passverify.c 2015-05-15 15:57:23.138613273 +0200 -@@ -437,10 +437,9 @@ PAMH_ARG_DECL(char * create_password_has - sp = crypt(password, salt); - #endif - if (!sp || strncmp(algoid, sp, strlen(algoid)) != 0) { -- /* libxcrypt/libc doesn't know the algorithm, use MD5 */ -+ /* libxcrypt/libc doesn't know the algorithm, error out */ - pam_syslog(pamh, LOG_ERR, -- "Algo %s not supported by the crypto backend, " -- "falling back to MD5\n", -+ "Algo %s not supported by the crypto backend.\n", - on(UNIX_BLOWFISH_PASS, ctrl) ? "blowfish" : - on(UNIX_SHA256_PASS, ctrl) ? "sha256" : - on(UNIX_SHA512_PASS, ctrl) ? "sha512" : algoid); -@@ -450,7 +449,7 @@ PAMH_ARG_DECL(char * create_password_has - #ifdef HAVE_CRYPT_R - free(cdata); - #endif -- return crypt_md5_wrapper(password); -+ return NULL; - } - sp = x_strdup(sp); - #ifdef HAVE_CRYPT_R diff --git a/SOURCES/pam-1.2.1-console-devname.patch b/SOURCES/pam-1.2.1-console-devname.patch deleted file mode 100644 index 5e03b40..0000000 --- a/SOURCES/pam-1.2.1-console-devname.patch +++ /dev/null @@ -1,9 +0,0 @@ -diff -up Linux-PAM-1.2.1/modules/pam_console/console.handlers.devname Linux-PAM-1.2.1/modules/pam_console/console.handlers ---- Linux-PAM-1.2.1/modules/pam_console/console.handlers.devname 2015-10-16 14:15:48.000000000 +0200 -+++ Linux-PAM-1.2.1/modules/pam_console/console.handlers 2016-02-05 17:47:26.056787517 +0100 -@@ -14,4 +14,4 @@ - # echo lock wait Locking console for user on tty - # touch unlock wait /var/run/console-unlocked - --console consoledevs tty[0-9][0-9]* vc/[0-9][0-9]* :[0-9]+\.[0-9]+ :[0-9]+ -+console consoledevs /dev/tty[0-9][0-9]* tty[0-9][0-9]* vc/[0-9][0-9]* :[0-9]+\.[0-9]+ :[0-9]+ diff --git a/SOURCES/pam-1.2.1-faillock-admin-group.patch b/SOURCES/pam-1.2.1-faillock-admin-group.patch deleted file mode 100644 index 8bd1384..0000000 --- a/SOURCES/pam-1.2.1-faillock-admin-group.patch +++ /dev/null @@ -1,133 +0,0 @@ -diff -up Linux-PAM-1.3.0/modules/pam_faillock/pam_faillock.c.admin-group Linux-PAM-1.3.0/modules/pam_faillock/pam_faillock.c ---- Linux-PAM-1.3.0/modules/pam_faillock/pam_faillock.c.admin-group 2016-04-04 16:37:38.696260359 +0200 -+++ Linux-PAM-1.3.0/modules/pam_faillock/pam_faillock.c 2017-08-21 16:40:01.624706864 +0200 -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2010 Tomas Mraz -+ * Copyright (c) 2010, 2017 Tomas Mraz - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions -@@ -78,9 +78,11 @@ struct options { - unsigned int root_unlock_time; - const char *dir; - const char *user; -+ const char *admin_group; - int failures; - uint64_t latest_time; - uid_t uid; -+ int is_admin; - uint64_t now; - }; - -@@ -152,6 +154,9 @@ args_parse(pam_handle_t *pamh, int argc, - opts->root_unlock_time = temp; - } - } -+ else if (strncmp(argv[i], "admin_group=", 12) == 0) { -+ opts->admin_group = argv[i] + 12; -+ } - else if (strcmp(argv[i], "preauth") == 0) { - opts->action = FAILLOCK_ACTION_PREAUTH; - } -@@ -209,6 +214,17 @@ static int get_pam_user(pam_handle_t *pa - } - opts->user = user; - opts->uid = pwd->pw_uid; -+ -+ if (pwd->pw_uid == 0) { -+ opts->is_admin = 1; -+ return PAM_SUCCESS; -+ } -+ -+ if (opts->admin_group && *opts->admin_group) { -+ opts->is_admin = pam_modutil_user_in_group_uid_nam(pamh, -+ pwd->pw_uid, opts->admin_group); -+ } -+ - return PAM_SUCCESS; - } - -@@ -239,7 +255,7 @@ check_tally(pam_handle_t *pamh, struct o - return PAM_SYSTEM_ERR; - } - -- if (opts->uid == 0 && !(opts->flags & FAILLOCK_FLAG_DENY_ROOT)) { -+ if (opts->is_admin && !(opts->flags & FAILLOCK_FLAG_DENY_ROOT)) { - return PAM_SUCCESS; - } - -@@ -262,13 +278,9 @@ check_tally(pam_handle_t *pamh, struct o - - opts->failures = failures; - -- if (opts->uid == 0 && !(opts->flags & FAILLOCK_FLAG_DENY_ROOT)) { -- return PAM_SUCCESS; -- } -- - if (opts->deny && failures >= opts->deny) { -- if ((opts->uid && opts->unlock_time && latest_time + opts->unlock_time < opts->now) || -- (!opts->uid && opts->root_unlock_time && latest_time + opts->root_unlock_time < opts->now)) { -+ if ((!opts->is_admin && opts->unlock_time && latest_time + opts->unlock_time < opts->now) || -+ (opts->is_admin && opts->root_unlock_time && latest_time + opts->root_unlock_time < opts->now)) { - #ifdef HAVE_LIBAUDIT - if (opts->action != FAILLOCK_ACTION_PREAUTH) { /* do not audit in preauth */ - char buf[64]; -@@ -401,7 +413,7 @@ write_tally(pam_handle_t *pamh, struct o - audit_log_user_message(audit_fd, AUDIT_ANOM_LOGIN_FAILURES, buf, - NULL, NULL, NULL, 1); - -- if (opts->uid != 0 || (opts->flags & FAILLOCK_FLAG_DENY_ROOT)) { -+ if (!opts->is_admin || (opts->flags & FAILLOCK_FLAG_DENY_ROOT)) { - audit_log_user_message(audit_fd, AUDIT_RESP_ACCT_LOCK, buf, - NULL, NULL, NULL, 1); - } -@@ -425,11 +437,11 @@ faillock_message(pam_handle_t *pamh, str - int64_t left; - - if (!(opts->flags & FAILLOCK_FLAG_SILENT)) { -- if (opts->uid) { -- left = opts->latest_time + opts->unlock_time - opts->now; -+ if (opts->is_admin) { -+ left = opts->latest_time + opts->root_unlock_time - opts->now; - } - else { -- left = opts->latest_time + opts->root_unlock_time - opts->now; -+ left = opts->latest_time + opts->unlock_time - opts->now; - } - - if (left > 0) { -diff -up Linux-PAM-1.3.0/modules/pam_faillock/pam_faillock.8.xml.admin-group Linux-PAM-1.3.0/modules/pam_faillock/pam_faillock.8.xml ---- Linux-PAM-1.3.0/modules/pam_faillock/pam_faillock.8.xml.admin-group 2016-05-06 15:24:10.328281818 +0200 -+++ Linux-PAM-1.3.0/modules/pam_faillock/pam_faillock.8.xml 2017-08-21 16:16:09.448033843 +0200 -@@ -40,6 +40,9 @@ - root_unlock_time=n - - -+ admin_group=name -+ -+ - audit - - -@@ -243,6 +246,20 @@ - - - -+ -+ -+ -+ -+ -+ -+ If a group name is specified with this option, members -+ of the group will be handled by this module the same as -+ the root account (the options -+ and will apply to them. -+ By default the option is not set. -+ -+ -+ - - - diff --git a/SOURCES/pam-1.2.1-faillock.patch b/SOURCES/pam-1.2.1-faillock.patch deleted file mode 100644 index 7a4209c..0000000 --- a/SOURCES/pam-1.2.1-faillock.patch +++ /dev/null @@ -1,1759 +0,0 @@ -diff -up Linux-PAM-1.2.1/configure.ac.faillock Linux-PAM-1.2.1/configure.ac ---- Linux-PAM-1.2.1/configure.ac.faillock 2015-06-25 10:42:21.477374752 +0200 -+++ Linux-PAM-1.2.1/configure.ac 2015-06-25 10:42:21.501375246 +0200 -@@ -621,7 +621,7 @@ AC_CONFIG_FILES([Makefile libpam/Makefil - modules/pam_access/Makefile modules/pam_cracklib/Makefile \ - modules/pam_debug/Makefile modules/pam_deny/Makefile \ - modules/pam_echo/Makefile modules/pam_env/Makefile \ -- modules/pam_faildelay/Makefile \ -+ modules/pam_faildelay/Makefile modules/pam_faillock/Makefile \ - modules/pam_filter/Makefile modules/pam_filter/upperLOWER/Makefile \ - modules/pam_ftp/Makefile modules/pam_group/Makefile \ - modules/pam_issue/Makefile modules/pam_keyinit/Makefile \ -diff -up Linux-PAM-1.2.1/doc/sag/pam_faillock.xml.faillock Linux-PAM-1.2.1/doc/sag/pam_faillock.xml ---- Linux-PAM-1.2.1/doc/sag/pam_faillock.xml.faillock 2015-06-25 10:42:21.482374855 +0200 -+++ Linux-PAM-1.2.1/doc/sag/pam_faillock.xml 2015-06-25 10:42:21.482374855 +0200 -@@ -0,0 +1,38 @@ -+ -+ -+
-+ pam_faillock - temporarily locking access based on failed authentication attempts during an interval -+ -+ -+ -+ -+ -+ -+
-+ -+
-+
-+ -+
-+
-+ -+
-+
-+ -+
-+
-+ -+
-+
-+ -+
-+
-diff -up Linux-PAM-1.2.1/modules/Makefile.am.faillock Linux-PAM-1.2.1/modules/Makefile.am ---- Linux-PAM-1.2.1/modules/Makefile.am.faillock 2015-06-25 10:42:21.480374814 +0200 -+++ Linux-PAM-1.2.1/modules/Makefile.am 2015-06-25 10:42:21.482374855 +0200 -@@ -3,7 +3,7 @@ - # - - SUBDIRS = pam_access pam_cracklib pam_debug pam_deny pam_echo \ -- pam_chroot pam_console pam_postgresok \ -+ pam_chroot pam_console pam_postgresok pam_faillock \ - pam_env pam_exec pam_faildelay pam_filter pam_ftp \ - pam_group pam_issue pam_keyinit pam_lastlog pam_limits \ - pam_listfile pam_localuser pam_loginuid pam_mail \ -diff -up Linux-PAM-1.2.1/modules/pam_faillock/faillock.c.faillock Linux-PAM-1.2.1/modules/pam_faillock/faillock.c ---- Linux-PAM-1.2.1/modules/pam_faillock/faillock.c.faillock 2015-06-25 10:42:21.482374855 +0200 -+++ Linux-PAM-1.2.1/modules/pam_faillock/faillock.c 2015-06-25 10:42:21.482374855 +0200 -@@ -0,0 +1,158 @@ -+/* -+ * Copyright (c) 2010 Tomas Mraz -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, and the entire permission notice in its entirety, -+ * including the disclaimer of warranties. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * ALTERNATIVELY, this product may be distributed under the terms of -+ * the GNU Public License, in which case the provisions of the GPL are -+ * required INSTEAD OF the above restrictions. (This clause is -+ * necessary due to a potential bad interaction between the GPL and -+ * the restrictions contained in a BSD-style copyright.) -+ * -+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -+ * OF THE POSSIBILITY OF SUCH DAMAGE. -+ */ -+ -+#include "config.h" -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "faillock.h" -+ -+int -+open_tally (const char *dir, const char *user, uid_t uid, int create) -+{ -+ char *path; -+ int flags = O_RDWR; -+ int fd; -+ -+ if (strstr(user, "../") != NULL) -+ /* just a defensive programming as the user must be a -+ * valid user on the system anyway -+ */ -+ return -1; -+ path = malloc(strlen(dir) + strlen(user) + 2); -+ if (path == NULL) -+ return -1; -+ -+ strcpy(path, dir); -+ if (*dir && dir[strlen(dir) - 1] != '/') { -+ strcat(path, "/"); -+ } -+ strcat(path, user); -+ -+ if (create) { -+ flags |= O_CREAT; -+ } -+ -+ fd = open(path, flags, 0600); -+ -+ free(path); -+ -+ if (fd != -1) { -+ struct stat st; -+ -+ while (flock(fd, LOCK_EX) == -1 && errno == EINTR); -+ if (fstat(fd, &st) == 0) { -+ if (st.st_uid != uid) { -+ fchown(fd, uid, -1); -+ } -+ } -+ } -+ -+ return fd; -+} -+ -+#define CHUNK_SIZE (64 * sizeof(struct tally)) -+#define MAX_RECORDS 1024 -+ -+int -+read_tally(int fd, struct tally_data *tallies) -+{ -+ void *data = NULL, *newdata; -+ unsigned int count = 0; -+ ssize_t chunk = 0; -+ -+ do { -+ newdata = realloc(data, count * sizeof(struct tally) + CHUNK_SIZE); -+ if (newdata == NULL) { -+ free(data); -+ return -1; -+ } -+ -+ data = newdata; -+ -+ chunk = pam_modutil_read(fd, (char *)data + count * sizeof(struct tally), CHUNK_SIZE); -+ if (chunk < 0) { -+ free(data); -+ return -1; -+ } -+ -+ count += chunk/sizeof(struct tally); -+ -+ if (count >= MAX_RECORDS) -+ break; -+ } -+ while (chunk == CHUNK_SIZE); -+ -+ tallies->records = data; -+ tallies->count = count; -+ -+ return 0; -+} -+ -+int -+update_tally(int fd, struct tally_data *tallies) -+{ -+ void *data = tallies->records; -+ unsigned int count = tallies->count; -+ ssize_t chunk; -+ -+ if (tallies->count > MAX_RECORDS) { -+ data = tallies->records + (count - MAX_RECORDS); -+ count = MAX_RECORDS; -+ } -+ -+ if (lseek(fd, 0, SEEK_SET) == (off_t)-1) { -+ return -1; -+ } -+ -+ chunk = pam_modutil_write(fd, data, count * sizeof(struct tally)); -+ -+ if (chunk != (ssize_t)(count * sizeof(struct tally))) { -+ return -1; -+ } -+ -+ if (ftruncate(fd, count * sizeof(struct tally)) == -1) -+ return -1; -+ -+ return 0; -+} -diff -up Linux-PAM-1.2.1/modules/pam_faillock/faillock.h.faillock Linux-PAM-1.2.1/modules/pam_faillock/faillock.h ---- Linux-PAM-1.2.1/modules/pam_faillock/faillock.h.faillock 2015-06-25 10:42:21.482374855 +0200 -+++ Linux-PAM-1.2.1/modules/pam_faillock/faillock.h 2015-06-25 10:42:21.482374855 +0200 -@@ -0,0 +1,73 @@ -+/* -+ * Copyright (c) 2010 Tomas Mraz -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, and the entire permission notice in its entirety, -+ * including the disclaimer of warranties. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * ALTERNATIVELY, this product may be distributed under the terms of -+ * the GNU Public License, in which case the provisions of the GPL are -+ * required INSTEAD OF the above restrictions. (This clause is -+ * necessary due to a potential bad interaction between the GPL and -+ * the restrictions contained in a BSD-style copyright.) -+ * -+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -+ * OF THE POSSIBILITY OF SUCH DAMAGE. -+ */ -+ -+/* -+ * faillock.h - authentication failure data file record structure -+ * -+ * Each record in the file represents an instance of login failure of -+ * the user at the recorded time -+ */ -+ -+ -+#ifndef _FAILLOCK_H -+#define _FAILLOCK_H -+ -+#include -+#include -+ -+#define TALLY_STATUS_VALID 0x1 /* the tally file entry is valid */ -+#define TALLY_STATUS_RHOST 0x2 /* the source is rhost */ -+#define TALLY_STATUS_TTY 0x4 /* the source is tty - if both TALLY_FLAG_RHOST and TALLY_FLAG_TTY are not set the source is service */ -+ -+struct tally { -+ char source[52]; /* rhost or tty of the login failure (not necessarily NULL terminated) */ -+ uint16_t reserved; /* reserved for future use */ -+ uint16_t status; /* record status */ -+ uint64_t time; /* time of the login failure */ -+}; -+/* 64 bytes per entry */ -+ -+struct tally_data { -+ struct tally *records; /* array of tallies */ -+ unsigned int count; /* number of records */ -+}; -+ -+#define FAILLOCK_DEFAULT_TALLYDIR "/var/run/faillock" -+ -+int open_tally(const char *dir, const char *user, uid_t uid, int create); -+int read_tally(int fd, struct tally_data *tallies); -+int update_tally(int fd, struct tally_data *tallies); -+#endif -+ -diff -up Linux-PAM-1.2.1/modules/pam_faillock/faillock.8.xml.faillock Linux-PAM-1.2.1/modules/pam_faillock/faillock.8.xml ---- Linux-PAM-1.2.1/modules/pam_faillock/faillock.8.xml.faillock 2015-06-25 10:42:21.482374855 +0200 -+++ Linux-PAM-1.2.1/modules/pam_faillock/faillock.8.xml 2015-06-25 10:42:21.482374855 +0200 -@@ -0,0 +1,123 @@ -+ -+ -+ -+ -+ -+ -+ faillock -+ 8 -+ Linux-PAM Manual -+ -+ -+ -+ faillock -+ Tool for displaying and modifying the authentication failure record files -+ -+ -+ -+ -+ faillock -+ -+ --dir /path/to/tally-directory -+ -+ -+ --user username -+ -+ -+ --reset -+ -+ -+ -+ -+ -+ -+ DESCRIPTION -+ -+ -+ The pam_faillock.so module maintains a list of -+ failed authentication attempts per user during a specified interval -+ and locks the account in case there were more than -+ deny consecutive failed authentications. -+ It stores the failure records into per-user files in the tally -+ directory. -+ -+ -+ The faillock command is an application which -+ can be used to examine and modify the contents of the -+ the tally files. It can display the recent failed authentication -+ attempts of the username or clear the tally -+ files of all or individual usernames. -+ -+ -+ -+ -+ -+ OPTIONS -+ -+ -+ -+ -+ -+ -+ -+ The directory where the user files with the failure records are kept. The -+ default is /var/run/faillock. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ The user whose failure records should be displayed or cleared. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Instead of displaying the user's failure records, clear them. -+ -+ -+ -+ -+ -+ -+ -+ FILES -+ -+ -+ /var/run/faillock/* -+ -+ the files logging the authentication failures for users -+ -+ -+ -+ -+ -+ -+ SEE ALSO -+ -+ -+ pam_faillock8 -+ , -+ -+ pam8 -+ -+ -+ -+ -+ -+ AUTHOR -+ -+ faillock was written by Tomas Mraz. -+ -+ -+ -+ -diff -up Linux-PAM-1.2.1/modules/pam_faillock/main.c.faillock Linux-PAM-1.2.1/modules/pam_faillock/main.c ---- Linux-PAM-1.2.1/modules/pam_faillock/main.c.faillock 2015-06-25 10:42:21.482374855 +0200 -+++ Linux-PAM-1.2.1/modules/pam_faillock/main.c 2015-06-25 10:42:21.503375287 +0200 -@@ -0,0 +1,232 @@ -+/* -+ * Copyright (c) 2010 Tomas Mraz -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, and the entire permission notice in its entirety, -+ * including the disclaimer of warranties. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * ALTERNATIVELY, this product may be distributed under the terms of -+ * the GNU Public License, in which case the provisions of the GPL are -+ * required INSTEAD OF the above restrictions. (This clause is -+ * necessary due to a potential bad interaction between the GPL and -+ * the restrictions contained in a BSD-style copyright.) -+ * -+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -+ * OF THE POSSIBILITY OF SUCH DAMAGE. -+ */ -+ -+#include "config.h" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#ifdef HAVE_LIBAUDIT -+#include -+#endif -+ -+#include "faillock.h" -+ -+struct options { -+ unsigned int reset; -+ const char *dir; -+ const char *user; -+ const char *progname; -+}; -+ -+static int -+args_parse(int argc, char **argv, struct options *opts) -+{ -+ int i; -+ memset(opts, 0, sizeof(*opts)); -+ -+ opts->dir = FAILLOCK_DEFAULT_TALLYDIR; -+ opts->progname = argv[0]; -+ -+ for (i = 1; i < argc; ++i) { -+ -+ if (strcmp(argv[i], "--dir") == 0) { -+ ++i; -+ if (i >= argc || strlen(argv[i]) == 0) { -+ fprintf(stderr, "%s: No directory supplied.\n", argv[0]); -+ return -1; -+ } -+ opts->dir = argv[i]; -+ } -+ else if (strcmp(argv[i], "--user") == 0) { -+ ++i; -+ if (i >= argc || strlen(argv[i]) == 0) { -+ fprintf(stderr, "%s: No user name supplied.\n", argv[0]); -+ return -1; -+ } -+ opts->user = argv[i]; -+ } -+ else if (strcmp(argv[i], "--reset") == 0) { -+ opts->reset = 1; -+ } -+ else { -+ fprintf(stderr, "%s: Unknown option: %s\n", argv[0], argv[i]); -+ return -1; -+ } -+ } -+ return 0; -+} -+ -+static void -+usage(const char *progname) -+{ -+ fprintf(stderr, _("Usage: %s [--dir /path/to/tally-directory] [--user username] [--reset]\n"), -+ progname); -+} -+ -+static int -+do_user(struct options *opts, const char *user) -+{ -+ int fd; -+ int rv; -+ struct tally_data tallies; -+ struct passwd *pwd; -+ -+ pwd = getpwnam(user); -+ -+ fd = open_tally(opts->dir, user, pwd != NULL ? pwd->pw_uid : 0, 0); -+ -+ if (fd == -1) { -+ if (errno == ENOENT) { -+ return 0; -+ } -+ else { -+ fprintf(stderr, "%s: Error opening the tally file for %s:", -+ opts->progname, user); -+ perror(NULL); -+ return 3; -+ } -+ } -+ if (opts->reset) { -+#ifdef HAVE_LIBAUDIT -+ int audit_fd; -+#endif -+ -+ while ((rv=ftruncate(fd, 0)) == -1 && errno == EINTR); -+ if (rv == -1) { -+ fprintf(stderr, "%s: Error clearing the tally file for %s:", -+ opts->progname, user); -+ perror(NULL); -+#ifdef HAVE_LIBAUDIT -+ } -+ if ((audit_fd=audit_open()) >= 0) { -+ -+ if (pwd != NULL) { -+ audit_log_acct_message(audit_fd, AUDIT_USER_MGMT, NULL, -+ "faillock-reset", NULL, pwd->pw_uid, NULL, NULL, NULL, rv == 0); -+ } -+ close(audit_fd); -+ } -+ if (rv == -1) { -+#endif -+ close(fd); -+ return 4; -+ } -+ } -+ else { -+ unsigned int i; -+ -+ memset(&tallies, 0, sizeof(tallies)); -+ if ((rv=read_tally(fd, &tallies)) == -1) { -+ fprintf(stderr, "%s: Error reading the tally file for %s:", -+ opts->progname, user); -+ perror(NULL); -+ close(fd); -+ return 5; -+ } -+ -+ printf("%s:\n", user); -+ printf("%-19s %-5s %-48s %-5s\n", "When", "Type", "Source", "Valid"); -+ -+ for (i = 0; i < tallies.count; i++) { -+ struct tm *tm; -+ char timebuf[80]; -+ uint16_t status = tallies.records[i].status; -+ time_t when = tallies.records[i].time; -+ -+ tm = localtime(&when); -+ strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S", tm); -+ printf("%-19s %-5s %-52.52s %s\n", timebuf, -+ status & TALLY_STATUS_RHOST ? "RHOST" : (status & TALLY_STATUS_TTY ? "TTY" : "SVC"), -+ tallies.records[i].source, status & TALLY_STATUS_VALID ? "V":"I"); -+ } -+ free(tallies.records); -+ } -+ close(fd); -+ return 0; -+} -+ -+static int -+do_allusers(struct options *opts) -+{ -+ struct dirent **userlist; -+ int rv, i; -+ -+ rv = scandir(opts->dir, &userlist, NULL, alphasort); -+ if (rv < 0) { -+ fprintf(stderr, "%s: Error reading tally directory: ", opts->progname); -+ perror(NULL); -+ return 2; -+ } -+ -+ for (i = 0; i < rv; i++) { -+ if (userlist[i]->d_name[0] == '.') { -+ if ((userlist[i]->d_name[1] == '.' && userlist[i]->d_name[2] == '\0') || -+ userlist[i]->d_name[1] == '\0') -+ continue; -+ } -+ do_user(opts, userlist[i]->d_name); -+ free(userlist[i]); -+ } -+ free(userlist); -+ -+ return 0; -+} -+ -+ -+/*-----------------------------------------------------------------------*/ -+int -+main (int argc, char *argv[]) -+{ -+ struct options opts; -+ -+ if (args_parse(argc, argv, &opts)) { -+ usage(argv[0]); -+ return 1; -+ } -+ -+ if (opts.user == NULL) { -+ return do_allusers(&opts); -+ } -+ -+ return do_user(&opts, opts.user); -+} -+ -diff -up Linux-PAM-1.2.1/modules/pam_faillock/Makefile.am.faillock Linux-PAM-1.2.1/modules/pam_faillock/Makefile.am ---- Linux-PAM-1.2.1/modules/pam_faillock/Makefile.am.faillock 2015-06-25 10:42:21.482374855 +0200 -+++ Linux-PAM-1.2.1/modules/pam_faillock/Makefile.am 2015-06-25 10:42:21.494375102 +0200 -@@ -0,0 +1,44 @@ -+# -+# Copyright (c) 2005, 2006, 2007, 2009 Thorsten Kukuk -+# Copyright (c) 2008 Red Hat, Inc. -+# Copyright (c) 2010 Tomas Mraz -+# -+ -+CLEANFILES = *~ -+MAINTAINERCLEANFILES = $(MANS) README -+ -+EXTRA_DIST = README $(MANS) $(XMLS) tst-pam_faillock -+ -+man_MANS = pam_faillock.8 faillock.8 -+XMLS = README.xml pam_faillock.8.xml faillock.8.xml -+ -+TESTS = tst-pam_faillock -+ -+securelibdir = $(SECUREDIR) -+secureconfdir = $(SCONFIGDIR) -+ -+noinst_HEADERS = faillock.h -+ -+faillock_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include @PIE_CFLAGS@ -+pam_faillock_la_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include -+ -+pam_faillock_la_LDFLAGS = -no-undefined -avoid-version -module -+pam_faillock_la_LIBADD = -L$(top_builddir)/libpam -lpam $(LIBAUDIT) -+if HAVE_VERSIONING -+ pam_faillock_la_LDFLAGS += -Wl,--version-script=$(srcdir)/../modules.map -+endif -+ -+faillock_LDFLAGS = -Wl,-z,now @PIE_LDFLAGS@ -+faillock_LDADD = -L$(top_builddir)/libpam -lpam $(LIBAUDIT) -+ -+securelib_LTLIBRARIES = pam_faillock.la -+sbin_PROGRAMS = faillock -+ -+pam_faillock_la_SOURCES = pam_faillock.c faillock.c -+faillock_SOURCES = main.c faillock.c -+ -+if ENABLE_REGENERATE_MAN -+noinst_DATA = README -+README: pam_faillock.8.xml -+-include $(top_srcdir)/Make.xml.rules -+endif -diff -up Linux-PAM-1.2.1/modules/pam_faillock/pam_faillock.c.faillock Linux-PAM-1.2.1/modules/pam_faillock/pam_faillock.c ---- Linux-PAM-1.2.1/modules/pam_faillock/pam_faillock.c.faillock 2015-06-25 10:42:21.483374875 +0200 -+++ Linux-PAM-1.2.1/modules/pam_faillock/pam_faillock.c 2015-10-16 14:07:38.451616869 +0200 -@@ -0,0 +1,571 @@ -+/* -+ * Copyright (c) 2010 Tomas Mraz -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, and the entire permission notice in its entirety, -+ * including the disclaimer of warranties. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * ALTERNATIVELY, this product may be distributed under the terms of -+ * the GNU Public License, in which case the provisions of the GPL are -+ * required INSTEAD OF the above restrictions. (This clause is -+ * necessary due to a potential bad interaction between the GPL and -+ * the restrictions contained in a BSD-style copyright.) -+ * -+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -+ * OF THE POSSIBILITY OF SUCH DAMAGE. -+ */ -+ -+#include "config.h" -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#ifdef HAVE_LIBAUDIT -+#include -+#endif -+ -+#include -+#include -+#include -+ -+#include "faillock.h" -+ -+#define PAM_SM_AUTH -+#define PAM_SM_ACCOUNT -+ -+#define FAILLOCK_ACTION_PREAUTH 0 -+#define FAILLOCK_ACTION_AUTHSUCC 1 -+#define FAILLOCK_ACTION_AUTHFAIL 2 -+ -+#define FAILLOCK_FLAG_DENY_ROOT 0x1 -+#define FAILLOCK_FLAG_AUDIT 0x2 -+#define FAILLOCK_FLAG_SILENT 0x4 -+#define FAILLOCK_FLAG_NO_LOG_INFO 0x8 -+#define FAILLOCK_FLAG_UNLOCKED 0x10 -+ -+#define MAX_TIME_INTERVAL 604800 /* 7 days */ -+ -+struct options { -+ unsigned int action; -+ unsigned int flags; -+ unsigned short deny; -+ unsigned int fail_interval; -+ unsigned int unlock_time; -+ unsigned int root_unlock_time; -+ const char *dir; -+ const char *user; -+ int failures; -+ uint64_t latest_time; -+ uid_t uid; -+ uint64_t now; -+}; -+ -+static void -+args_parse(pam_handle_t *pamh, int argc, const char **argv, -+ int flags, struct options *opts) -+{ -+ int i; -+ memset(opts, 0, sizeof(*opts)); -+ -+ opts->dir = FAILLOCK_DEFAULT_TALLYDIR; -+ opts->deny = 3; -+ opts->fail_interval = 900; -+ opts->unlock_time = 600; -+ opts->root_unlock_time = MAX_TIME_INTERVAL+1; -+ -+ for (i = 0; i < argc; ++i) { -+ -+ if (strncmp(argv[i], "dir=", 4) == 0) { -+ if (argv[i][4] != '/') { -+ pam_syslog(pamh, LOG_ERR, -+ "Tally directory is not absolute path (%s); keeping default", argv[i]); -+ } else { -+ opts->dir = argv[i]+4; -+ } -+ } -+ else if (strncmp(argv[i], "deny=", 5) == 0) { -+ if (sscanf(argv[i]+5, "%hu", &opts->deny) != 1) { -+ pam_syslog(pamh, LOG_ERR, -+ "Bad number supplied for deny argument"); -+ } -+ } -+ else if (strncmp(argv[i], "fail_interval=", 14) == 0) { -+ unsigned int temp; -+ if (sscanf(argv[i]+14, "%u", &temp) != 1 || -+ temp > MAX_TIME_INTERVAL) { -+ pam_syslog(pamh, LOG_ERR, -+ "Bad number supplied for fail_interval argument"); -+ } else { -+ opts->fail_interval = temp; -+ } -+ } -+ else if (strncmp(argv[i], "unlock_time=", 12) == 0) { -+ unsigned int temp; -+ -+ if (strcmp(argv[i]+12, "never") == 0) { -+ opts->unlock_time = 0; -+ } -+ else if (sscanf(argv[i]+12, "%u", &temp) != 1 || -+ temp > MAX_TIME_INTERVAL) { -+ pam_syslog(pamh, LOG_ERR, -+ "Bad number supplied for unlock_time argument"); -+ } -+ else { -+ opts->unlock_time = temp; -+ } -+ } -+ else if (strncmp(argv[i], "root_unlock_time=", 17) == 0) { -+ unsigned int temp; -+ -+ if (strcmp(argv[i]+17, "never") == 0) { -+ opts->root_unlock_time = 0; -+ } -+ else if (sscanf(argv[i]+17, "%u", &temp) != 1 || -+ temp > MAX_TIME_INTERVAL) { -+ pam_syslog(pamh, LOG_ERR, -+ "Bad number supplied for root_unlock_time argument"); -+ } else { -+ opts->root_unlock_time = temp; -+ } -+ } -+ else if (strcmp(argv[i], "preauth") == 0) { -+ opts->action = FAILLOCK_ACTION_PREAUTH; -+ } -+ else if (strcmp(argv[i], "authfail") == 0) { -+ opts->action = FAILLOCK_ACTION_AUTHFAIL; -+ } -+ else if (strcmp(argv[i], "authsucc") == 0) { -+ opts->action = FAILLOCK_ACTION_AUTHSUCC; -+ } -+ else if (strcmp(argv[i], "even_deny_root") == 0) { -+ opts->flags |= FAILLOCK_FLAG_DENY_ROOT; -+ } -+ else if (strcmp(argv[i], "audit") == 0) { -+ opts->flags |= FAILLOCK_FLAG_AUDIT; -+ } -+ else if (strcmp(argv[i], "silent") == 0) { -+ opts->flags |= FAILLOCK_FLAG_SILENT; -+ } -+ else if (strcmp(argv[i], "no_log_info") == 0) { -+ opts->flags |= FAILLOCK_FLAG_NO_LOG_INFO; -+ } -+ else { -+ pam_syslog(pamh, LOG_ERR, "Unknown option: %s", argv[i]); -+ } -+ } -+ -+ if (opts->root_unlock_time == MAX_TIME_INTERVAL+1) -+ opts->root_unlock_time = opts->unlock_time; -+ if (flags & PAM_SILENT) -+ opts->flags |= FAILLOCK_FLAG_SILENT; -+} -+ -+static int get_pam_user(pam_handle_t *pamh, struct options *opts) -+{ -+ const char *user; -+ int rv; -+ struct passwd *pwd; -+ -+ if ((rv=pam_get_user(pamh, &user, NULL)) != PAM_SUCCESS) { -+ return rv; -+ } -+ -+ if (*user == '\0') { -+ return PAM_IGNORE; -+ } -+ -+ if ((pwd=pam_modutil_getpwnam(pamh, user)) == NULL) { -+ if (opts->flags & FAILLOCK_FLAG_AUDIT) { -+ pam_syslog(pamh, LOG_ERR, "User unknown: %s", user); -+ } -+ else { -+ pam_syslog(pamh, LOG_ERR, "User unknown"); -+ } -+ return PAM_IGNORE; -+ } -+ opts->user = user; -+ opts->uid = pwd->pw_uid; -+ return PAM_SUCCESS; -+} -+ -+static int -+check_tally(pam_handle_t *pamh, struct options *opts, struct tally_data *tallies, int *fd) -+{ -+ int tfd; -+ unsigned int i; -+ uint64_t latest_time; -+ int failures; -+ -+ opts->now = time(NULL); -+ -+ tfd = open_tally(opts->dir, opts->user, opts->uid, 0); -+ -+ *fd = tfd; -+ -+ if (tfd == -1) { -+ if (errno == EACCES || errno == ENOENT) { -+ return PAM_SUCCESS; -+ } -+ pam_syslog(pamh, LOG_ERR, "Error opening the tally file for %s: %m", opts->user); -+ return PAM_SYSTEM_ERR; -+ } -+ -+ if (read_tally(tfd, tallies) != 0) { -+ pam_syslog(pamh, LOG_ERR, "Error reading the tally file for %s: %m", opts->user); -+ return PAM_SYSTEM_ERR; -+ } -+ -+ if (opts->uid == 0 && !(opts->flags & FAILLOCK_FLAG_DENY_ROOT)) { -+ return PAM_SUCCESS; -+ } -+ -+ latest_time = 0; -+ for(i = 0; i < tallies->count; i++) { -+ if ((tallies->records[i].status & TALLY_STATUS_VALID) && -+ tallies->records[i].time > latest_time) -+ latest_time = tallies->records[i].time; -+ } -+ -+ opts->latest_time = latest_time; -+ -+ failures = 0; -+ for(i = 0; i < tallies->count; i++) { -+ if ((tallies->records[i].status & TALLY_STATUS_VALID) && -+ latest_time - tallies->records[i].time < opts->fail_interval) { -+ ++failures; -+ } -+ } -+ -+ opts->failures = failures; -+ -+ if (opts->uid == 0 && !(opts->flags & FAILLOCK_FLAG_DENY_ROOT)) { -+ return PAM_SUCCESS; -+ } -+ -+ if (opts->deny && failures >= opts->deny) { -+ if ((opts->uid && opts->unlock_time && latest_time + opts->unlock_time < opts->now) || -+ (!opts->uid && opts->root_unlock_time && latest_time + opts->root_unlock_time < opts->now)) { -+#ifdef HAVE_LIBAUDIT -+ if (opts->action != FAILLOCK_ACTION_PREAUTH) { /* do not audit in preauth */ -+ char buf[64]; -+ int audit_fd; -+ const void *rhost = NULL, *tty = NULL; -+ -+ audit_fd = audit_open(); -+ /* If there is an error & audit support is in the kernel report error */ -+ if ((audit_fd < 0) && !(errno == EINVAL || errno == EPROTONOSUPPORT || -+ errno == EAFNOSUPPORT)) -+ return PAM_SYSTEM_ERR; -+ -+ (void)pam_get_item(pamh, PAM_TTY, &tty); -+ (void)pam_get_item(pamh, PAM_RHOST, &rhost); -+ snprintf(buf, sizeof(buf), "pam_faillock uid=%u ", opts->uid); -+ audit_log_user_message(audit_fd, AUDIT_RESP_ACCT_UNLOCK_TIMED, buf, -+ rhost, NULL, tty, 1); -+ } -+#endif -+ opts->flags |= FAILLOCK_FLAG_UNLOCKED; -+ return PAM_SUCCESS; -+ } -+ return PAM_AUTH_ERR; -+ } -+ return PAM_SUCCESS; -+} -+ -+static void -+reset_tally(pam_handle_t *pamh, struct options *opts, int *fd) -+{ -+ int rv; -+ -+ if (*fd == -1) { -+ *fd = open_tally(opts->dir, opts->user, opts->uid, 1); -+ } -+ else { -+ while ((rv=ftruncate(*fd, 0)) == -1 && errno == EINTR); -+ if (rv == -1) { -+ pam_syslog(pamh, LOG_ERR, "Error clearing the tally file for %s: %m", opts->user); -+ } -+ } -+} -+ -+static int -+write_tally(pam_handle_t *pamh, struct options *opts, struct tally_data *tallies, int *fd) -+{ -+ struct tally *records; -+ unsigned int i; -+ int failures; -+ unsigned int oldest; -+ uint64_t oldtime; -+ const void *source = NULL; -+ -+ if (*fd == -1) { -+ *fd = open_tally(opts->dir, opts->user, opts->uid, 1); -+ } -+ if (*fd == -1) { -+ if (errno == EACCES) { -+ return PAM_SUCCESS; -+ } -+ pam_syslog(pamh, LOG_ERR, "Error opening the tally file for %s: %m", opts->user); -+ return PAM_SYSTEM_ERR; -+ } -+ -+ oldtime = 0; -+ oldest = 0; -+ failures = 0; -+ -+ for (i = 0; i < tallies->count; ++i) { -+ if (tallies->records[i].time < oldtime) { -+ oldtime = tallies->records[i].time; -+ oldest = i; -+ } -+ if (opts->flags & FAILLOCK_FLAG_UNLOCKED || -+ opts->now - tallies->records[i].time >= opts->fail_interval ) { -+ tallies->records[i].status &= ~TALLY_STATUS_VALID; -+ } else { -+ ++failures; -+ } -+ } -+ -+ if (oldest >= tallies->count || (tallies->records[oldest].status & TALLY_STATUS_VALID)) { -+ oldest = tallies->count; -+ -+ if ((records=realloc(tallies->records, (oldest+1) * sizeof (*tallies->records))) == NULL) { -+ pam_syslog(pamh, LOG_CRIT, "Error allocating memory for tally records: %m"); -+ return PAM_BUF_ERR; -+ } -+ -+ ++tallies->count; -+ tallies->records = records; -+ } -+ -+ memset(&tallies->records[oldest], 0, sizeof (*tallies->records)); -+ -+ tallies->records[oldest].status = TALLY_STATUS_VALID; -+ if (pam_get_item(pamh, PAM_RHOST, &source) != PAM_SUCCESS || source == NULL) { -+ if (pam_get_item(pamh, PAM_TTY, &source) != PAM_SUCCESS || source == NULL) { -+ if (pam_get_item(pamh, PAM_SERVICE, &source) != PAM_SUCCESS || source == NULL) { -+ source = ""; -+ } -+ } -+ else { -+ tallies->records[oldest].status |= TALLY_STATUS_TTY; -+ } -+ } -+ else { -+ tallies->records[oldest].status |= TALLY_STATUS_RHOST; -+ } -+ -+ strncpy(tallies->records[oldest].source, source, sizeof(tallies->records[oldest].source)); -+ /* source does not have to be null terminated */ -+ -+ tallies->records[oldest].time = opts->now; -+ -+ ++failures; -+ -+ if (opts->deny && failures == opts->deny) { -+#ifdef HAVE_LIBAUDIT -+ char buf[64]; -+ int audit_fd; -+ -+ audit_fd = audit_open(); -+ /* If there is an error & audit support is in the kernel report error */ -+ if ((audit_fd < 0) && !(errno == EINVAL || errno == EPROTONOSUPPORT || -+ errno == EAFNOSUPPORT)) -+ return PAM_SYSTEM_ERR; -+ -+ snprintf(buf, sizeof(buf), "pam_faillock uid=%u ", opts->uid); -+ audit_log_user_message(audit_fd, AUDIT_ANOM_LOGIN_FAILURES, buf, -+ NULL, NULL, NULL, 1); -+ -+ if (opts->uid != 0 || (opts->flags & FAILLOCK_FLAG_DENY_ROOT)) { -+ audit_log_user_message(audit_fd, AUDIT_RESP_ACCT_LOCK, buf, -+ NULL, NULL, NULL, 1); -+ } -+ close(audit_fd); -+#endif -+ if (!(opts->flags & FAILLOCK_FLAG_NO_LOG_INFO)) { -+ pam_syslog(pamh, LOG_INFO, "Consecutive login failures for user %s account temporarily locked", -+ opts->user); -+ } -+ } -+ -+ if (update_tally(*fd, tallies) == 0) -+ return PAM_SUCCESS; -+ -+ return PAM_SYSTEM_ERR; -+} -+ -+static void -+faillock_message(pam_handle_t *pamh, struct options *opts) -+{ -+ int64_t left; -+ -+ if (!(opts->flags & FAILLOCK_FLAG_SILENT)) { -+ if (opts->uid) { -+ left = opts->latest_time + opts->unlock_time - opts->now; -+ } -+ else { -+ left = opts->latest_time + opts->root_unlock_time - opts->now; -+ } -+ -+ if (left > 0) { -+ left = (left + 59)/60; /* minutes */ -+ -+ pam_info(pamh, _("Account temporarily locked due to %d failed logins"), -+ opts->failures); -+ pam_info(pamh, _("(%d minutes left to unlock)"), (int)left); -+ } -+ else { -+ pam_info(pamh, _("Account locked due to %d failed logins"), -+ opts->failures); -+ } -+ } -+} -+ -+static void -+tally_cleanup(struct tally_data *tallies, int fd) -+{ -+ if (fd != -1) { -+ close(fd); -+ } -+ -+ free(tallies->records); -+} -+ -+/*---------------------------------------------------------------------*/ -+ -+PAM_EXTERN int -+pam_sm_authenticate(pam_handle_t *pamh, int flags, -+ int argc, const char **argv) -+{ -+ struct options opts; -+ int rv, fd = -1; -+ struct tally_data tallies; -+ -+ memset(&tallies, 0, sizeof(tallies)); -+ -+ args_parse(pamh, argc, argv, flags, &opts); -+ -+ pam_fail_delay(pamh, 2000000); /* 2 sec delay for on failure */ -+ -+ if ((rv=get_pam_user(pamh, &opts)) != PAM_SUCCESS) { -+ return rv; -+ } -+ -+ switch (opts.action) { -+ case FAILLOCK_ACTION_PREAUTH: -+ rv = check_tally(pamh, &opts, &tallies, &fd); -+ if (rv == PAM_AUTH_ERR && !(opts.flags & FAILLOCK_FLAG_SILENT)) { -+ faillock_message(pamh, &opts); -+ } -+ break; -+ -+ case FAILLOCK_ACTION_AUTHSUCC: -+ rv = check_tally(pamh, &opts, &tallies, &fd); -+ if (rv == PAM_SUCCESS) { -+ reset_tally(pamh, &opts, &fd); -+ } -+ break; -+ -+ case FAILLOCK_ACTION_AUTHFAIL: -+ rv = check_tally(pamh, &opts, &tallies, &fd); -+ if (rv == PAM_SUCCESS) { -+ rv = PAM_IGNORE; /* this return value should be ignored */ -+ write_tally(pamh, &opts, &tallies, &fd); -+ } -+ break; -+ } -+ -+ tally_cleanup(&tallies, fd); -+ -+ return rv; -+} -+ -+/*---------------------------------------------------------------------*/ -+ -+PAM_EXTERN int -+pam_sm_setcred(pam_handle_t *pamh UNUSED, int flags UNUSED, -+ int argc UNUSED, const char **argv UNUSED) -+{ -+ return PAM_SUCCESS; -+} -+ -+/*---------------------------------------------------------------------*/ -+ -+PAM_EXTERN int -+pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, -+ int argc, const char **argv) -+{ -+ struct options opts; -+ int rv, fd = -1; -+ struct tally_data tallies; -+ -+ memset(&tallies, 0, sizeof(tallies)); -+ -+ args_parse(pamh, argc, argv, flags, &opts); -+ -+ opts.action = FAILLOCK_ACTION_AUTHSUCC; -+ -+ if ((rv=get_pam_user(pamh, &opts)) != PAM_SUCCESS) { -+ return rv; -+ } -+ -+ check_tally(pamh, &opts, &tallies, &fd); /* for auditing */ -+ reset_tally(pamh, &opts, &fd); -+ -+ tally_cleanup(&tallies, fd); -+ -+ return PAM_SUCCESS; -+} -+ -+/*-----------------------------------------------------------------------*/ -+ -+#ifdef PAM_STATIC -+ -+/* static module data */ -+ -+struct pam_module _pam_faillock_modstruct = { -+ MODULE_NAME, -+#ifdef PAM_SM_AUTH -+ pam_sm_authenticate, -+ pam_sm_setcred, -+#else -+ NULL, -+ NULL, -+#endif -+#ifdef PAM_SM_ACCOUNT -+ pam_sm_acct_mgmt, -+#else -+ NULL, -+#endif -+ NULL, -+ NULL, -+ NULL, -+}; -+ -+#endif /* #ifdef PAM_STATIC */ -+ -diff -up Linux-PAM-1.2.1/modules/pam_faillock/pam_faillock.8.xml.faillock Linux-PAM-1.2.1/modules/pam_faillock/pam_faillock.8.xml ---- Linux-PAM-1.2.1/modules/pam_faillock/pam_faillock.8.xml.faillock 2016-04-04 16:37:38.696260359 +0200 -+++ Linux-PAM-1.2.1/modules/pam_faillock/pam_faillock.8.xml 2016-04-28 17:09:04.679596165 +0200 -@@ -0,0 +1,408 @@ -+ -+ -+ -+ -+ -+ -+ pam_faillock -+ 8 -+ Linux-PAM Manual -+ -+ -+ -+ pam_faillock -+ Module counting authentication failures during a specified interval -+ -+ -+ -+ -+ auth ... pam_faillock.so -+ -+ preauth|authfail|authsucc -+ -+ -+ dir=/path/to/tally-directory -+ -+ -+ even_deny_root -+ -+ -+ deny=n -+ -+ -+ fail_interval=n -+ -+ -+ unlock_time=n -+ -+ -+ root_unlock_time=n -+ -+ -+ audit -+ -+ -+ silent -+ -+ -+ no_log_info -+ -+ -+ -+ account ... pam_faillock.so -+ -+ dir=/path/to/tally-directory -+ -+ -+ no_log_info -+ -+ -+ -+ -+ -+ -+ DESCRIPTION -+ -+ -+ This module maintains a list of failed authentication attempts per -+ user during a specified interval and locks the account in case -+ there were more than deny consecutive -+ failed authentications. -+ -+ -+ Normally, failed attempts to authenticate root will -+ not cause the root account to become -+ blocked, to prevent denial-of-service: if your users aren't given -+ shell accounts and root may only login via su or -+ at the machine console (not telnet/rsh, etc), this is safe. -+ -+ -+ -+ -+ -+ OPTIONS -+ -+ -+ -+ -+ -+ -+ -+ This argument must be set accordingly to the position of this module -+ instance in the PAM stack. -+ -+ -+ The preauth argument must be used when the module -+ is called before the modules which ask for the user credentials such -+ as the password. The module just examines whether the user should -+ be blocked from accessing the service in case there were anomalous -+ number of failed consecutive authentication attempts recently. This -+ call is optional if authsucc is used. -+ -+ -+ The authfail argument must be used when the module -+ is called after the modules which determine the authentication outcome, -+ failed. Unless the user is already blocked due to previous authentication -+ failures, the module will record the failure into the appropriate user -+ tally file. -+ -+ -+ The authsucc argument must be used when the module -+ is called after the modules which determine the authentication outcome, -+ succeded. Unless the user is already blocked due to previous authentication -+ failures, the module will then clear the record of the failures in the -+ respective user tally file. Otherwise it will return authentication error. -+ If this call is not done, the pam_faillock will not distinguish between -+ consecutive and non-consecutive failed authentication attempts. The -+ preauth call must be used in such case. Due to -+ complications in the way the PAM stack can be configured it is also -+ possible to call pam_faillock as an account module. -+ In such configuration the module must be also called in the -+ preauth stage. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ The directory where the user files with the failure records are kept. The -+ default is /var/run/faillock. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Will log the user name into the system log if the user is not found. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Don't print informative messages. This option is implicite -+ in the authfail and authsucc -+ functions. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Don't log informative messages via syslog3. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Deny access if the number of consecutive authentication failures -+ for this user during the recent interval exceeds -+ n. The default is 3. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ The length of the interval during which the consecutive -+ authentication failures must happen for the user account -+ lock out is n seconds. -+ The default is 900 (15 minutes). -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ The access will be reenabled after -+ n seconds after the lock out. -+ The value 0 has the same meaning as value -+ never - the access -+ will not be reenabled without resetting the faillock -+ entries by the faillock8 command. -+ The default is 600 (10 minutes). -+ -+ -+ Note that the default directory that pam_faillock -+ uses is usually cleared on system boot so the access will be also reenabled -+ after system reboot. If that is undesirable a different tally directory -+ must be set with the option. -+ -+ -+ Also note that it is usually undesirable to permanently lock -+ out the users as they can become easily a target of denial of service -+ attack unless the usernames are random and kept secret to potential -+ attackers. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Root account can become locked as well as regular accounts. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ This option implies option. -+ Allow access after n seconds -+ to root account after the account is locked. In case the -+ option is not specified the value is the same as of the -+ option. -+ -+ -+ -+ -+ -+ -+ -+ MODULE TYPES PROVIDED -+ -+ The and module types are -+ provided. -+ -+ -+ -+ -+ RETURN VALUES -+ -+ -+ PAM_AUTH_ERR -+ -+ -+ A invalid option was given, the module was not able -+ to retrieve the user name, no valid counter file -+ was found, or too many failed logins. -+ -+ -+ -+ -+ PAM_SUCCESS -+ -+ -+ Everything was successful. -+ -+ -+ -+ -+ PAM_IGNORE -+ -+ -+ User not present in passwd database. -+ -+ -+ -+ -+ -+ -+ -+ NOTES -+ -+ pam_faillock setup in the PAM stack is different -+ from the pam_tally2 module setup. -+ -+ -+ The individual files with the failure records are created as owned by -+ the user. This allows pam_faillock.so module -+ to work correctly when it is called from a screensaver. -+ -+ -+ Note that using the module in without the -+ option or with requisite -+ control field leaks an information about existence or -+ non-existence of an user account in the system because -+ the failures are not recorded for the unknown users. The message -+ about the user account being locked is never displayed for nonexisting -+ user accounts allowing the adversary to infer that a particular account -+ is not existing on a system. -+ -+ -+ -+ -+ EXAMPLES -+ -+ Here are two possible configuration examples for /etc/pam.d/login. -+ They make pam_faillock to lock the account after 4 consecutive -+ failed logins during the default interval of 15 minutes. Root account will be locked -+ as well. The accounts will be automatically unlocked after 20 minutes. -+ -+ -+ In the first example the module is called only in the auth -+ phase and the module does not print any information about the account blocking -+ by pam_faillock. The preauth call can -+ be added to tell the user that his login is blocked by the module and also to abort -+ the authentication without even asking for password in such case. -+ -+ -+auth required pam_securetty.so -+auth required pam_env.so -+auth required pam_nologin.so -+# optionally call: auth requisite pam_faillock.so preauth deny=4 even_deny_root unlock_time=1200 -+# to display the message about account being locked -+auth [success=1 default=bad] pam_unix.so -+auth [default=die] pam_faillock.so authfail deny=4 even_deny_root unlock_time=1200 -+auth sufficient pam_faillock.so authsucc deny=4 even_deny_root unlock_time=1200 -+auth required pam_deny.so -+account required pam_unix.so -+password required pam_unix.so shadow -+session required pam_selinux.so close -+session required pam_loginuid.so -+session required pam_unix.so -+session required pam_selinux.so open -+ -+ -+ In the second example the module is called both in the auth -+ and account phases and the module gives the authenticating -+ user message when the account is locked -+ -+ -+auth required pam_securetty.so -+auth required pam_env.so -+auth required pam_nologin.so -+auth required pam_faillock.so preauth silent deny=4 even_deny_root unlock_time=1200 -+# optionally use requisite above if you do not want to prompt for the password -+# on locked accounts, possibly with removing the silent option as well -+auth sufficient pam_unix.so -+auth [default=die] pam_faillock.so authfail deny=4 even_deny_root unlock_time=1200 -+auth required pam_deny.so -+account required pam_faillock.so -+# if you drop the above call to pam_faillock.so the lock will be done also -+# on non-consecutive authentication failures -+account required pam_unix.so -+password required pam_unix.so shadow -+session required pam_selinux.so close -+session required pam_loginuid.so -+session required pam_unix.so -+session required pam_selinux.so open -+ -+ -+ -+ -+ FILES -+ -+ -+ /var/run/faillock/* -+ -+ the files logging the authentication failures for users -+ -+ -+ -+ -+ -+ -+ SEE ALSO -+ -+ -+ faillock8 -+ , -+ -+ pam.conf5 -+ , -+ -+ pam.d5 -+ , -+ -+ pam8 -+ -+ -+ -+ -+ -+ AUTHOR -+ -+ pam_faillock was written by Tomas Mraz. -+ -+ -+ -+ -diff -up Linux-PAM-1.2.1/modules/pam_faillock/README.xml.faillock Linux-PAM-1.2.1/modules/pam_faillock/README.xml ---- Linux-PAM-1.2.1/modules/pam_faillock/README.xml.faillock 2015-06-25 10:42:21.483374875 +0200 -+++ Linux-PAM-1.2.1/modules/pam_faillock/README.xml 2015-06-25 10:42:21.483374875 +0200 -@@ -0,0 +1,46 @@ -+ -+ -+--> -+]> -+ -+
-+ -+ -+ -+ -+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" -+ href="pam_faillock.8.xml" xpointer='xpointer(//refnamediv[@id = "pam_faillock-name"]/*)'/> -+ -+ -+ -+ -+
-+ -+
-+ -+
-+ -+
-+ -+
-+ -+
-+ -+
-+ -+
-+ -+
-+ -+
-+ -+
-diff -up Linux-PAM-1.2.1/modules/pam_faillock/tst-pam_faillock.faillock Linux-PAM-1.2.1/modules/pam_faillock/tst-pam_faillock ---- Linux-PAM-1.2.1/modules/pam_faillock/tst-pam_faillock.faillock 2015-06-25 10:42:21.483374875 +0200 -+++ Linux-PAM-1.2.1/modules/pam_faillock/tst-pam_faillock 2015-06-25 10:42:21.483374875 +0200 -@@ -0,0 +1,2 @@ -+#!/bin/sh -+../../tests/tst-dlopen .libs/pam_faillock.so diff --git a/SOURCES/pam-1.3.0-pwhistory-helper.patch b/SOURCES/pam-1.3.0-pwhistory-helper.patch deleted file mode 100644 index 554e5c8..0000000 --- a/SOURCES/pam-1.3.0-pwhistory-helper.patch +++ /dev/null @@ -1,806 +0,0 @@ -diff -up Linux-PAM-1.3.0/modules/pam_pwhistory/Makefile.am.pwhhelper Linux-PAM-1.3.0/modules/pam_pwhistory/Makefile.am ---- Linux-PAM-1.3.0/modules/pam_pwhistory/Makefile.am.pwhhelper 2016-03-24 12:45:42.000000000 +0100 -+++ Linux-PAM-1.3.0/modules/pam_pwhistory/Makefile.am 2016-05-06 15:18:42.307637933 +0200 -@@ -1,5 +1,6 @@ - # - # Copyright (c) 2008, 2009 Thorsten Kukuk -+# Copyright (c) 2013 Red Hat, Inc. - # - - CLEANFILES = *~ -@@ -9,25 +10,34 @@ EXTRA_DIST = README $(MANS) $(XMLS) tst- - - TESTS = tst-pam_pwhistory - --man_MANS = pam_pwhistory.8 -+man_MANS = pam_pwhistory.8 pwhistory_helper.8 - --XMLS = README.xml pam_pwhistory.8.xml -+XMLS = README.xml pam_pwhistory.8.xml pwhistory_helper.8.xml - - securelibdir = $(SECUREDIR) - secureconfdir = $(SCONFIGDIR) - --AM_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include --AM_LDFLAGS = -no-undefined -avoid-version -module -+AM_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include \ -+ -DPWHISTORY_HELPER=\"$(sbindir)/pwhistory_helper\" -+ -+pam_pwhistory_la_LDFLAGS = -no-undefined -avoid-version -module - if HAVE_VERSIONING -- AM_LDFLAGS += -Wl,--version-script=$(srcdir)/../modules.map -+ pam_pwhistory_la_LDFLAGS += -Wl,--version-script=$(srcdir)/../modules.map - endif - - noinst_HEADERS = opasswd.h - - securelib_LTLIBRARIES = pam_pwhistory.la --pam_pwhistory_la_LIBADD = $(top_builddir)/libpam/libpam.la @LIBCRYPT@ -+pam_pwhistory_la_CFLAGS = $(AM_CFLAGS) -+pam_pwhistory_la_LIBADD = $(top_builddir)/libpam/libpam.la @LIBCRYPT@ @LIBSELINUX@ - pam_pwhistory_la_SOURCES = pam_pwhistory.c opasswd.c - -+sbin_PROGRAMS = pwhistory_helper -+pwhistory_helper_CFLAGS = $(AM_CFLAGS) -DHELPER_COMPILE=\"pwhistory_helper\" @PIE_CFLAGS@ -+pwhistory_helper_SOURCES = pwhistory_helper.c opasswd.c -+pwhistory_helper_LDFLAGS = -Wl,-z,now @PIE_LDFLAGS@ -+pwhistory_helper_LDADD = $(top_builddir)/libpam/libpam.la @LIBCRYPT@ -+ - if ENABLE_REGENERATE_MAN - noinst_DATA = README - README: pam_pwhistory.8.xml -diff -up Linux-PAM-1.3.0/modules/pam_pwhistory/opasswd.c.pwhhelper Linux-PAM-1.3.0/modules/pam_pwhistory/opasswd.c ---- Linux-PAM-1.3.0/modules/pam_pwhistory/opasswd.c.pwhhelper 2016-03-24 12:45:42.000000000 +0100 -+++ Linux-PAM-1.3.0/modules/pam_pwhistory/opasswd.c 2016-05-06 15:18:42.307637933 +0200 -@@ -1,5 +1,6 @@ - /* - * Copyright (c) 2008 Thorsten Kukuk -+ * Copyright (c) 2013 Red Hat, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions -@@ -38,6 +39,7 @@ - #endif - - #include -+#include - #include - #include - #include -@@ -47,6 +49,7 @@ - #include - #include - #include -+#include - #include - - #if defined (HAVE_XCRYPT_H) -@@ -55,7 +58,14 @@ - #include - #endif - -+#ifdef HELPER_COMPILE -+#define pam_modutil_getpwnam(h,n) getpwnam(n) -+#define pam_modutil_getspnam(h,n) getspnam(n) -+#define pam_syslog(h,a,...) helper_log_err(a,__VA_ARGS__) -+#else -+#include - #include -+#endif - #include - - #include "opasswd.h" -@@ -76,6 +86,19 @@ typedef struct { - char *old_passwords; - } opwd; - -+#ifdef HELPER_COMPILE -+void -+helper_log_err(int err, const char *format, ...) -+{ -+ va_list args; -+ -+ va_start(args, format); -+ openlog(HELPER_COMPILE, LOG_CONS | LOG_PID, LOG_AUTHPRIV); -+ vsyslog(err, format, args); -+ va_end(args); -+ closelog(); -+} -+#endif - - static int - parse_entry (char *line, opwd *data) -@@ -117,8 +140,8 @@ compare_password(const char *newpass, co - } - - /* Check, if the new password is already in the opasswd file. */ --int --check_old_pass (pam_handle_t *pamh, const char *user, -+PAMH_ARG_DECL(int -+check_old_pass, const char *user, - const char *newpass, int debug) - { - int retval = PAM_SUCCESS; -@@ -128,6 +151,11 @@ check_old_pass (pam_handle_t *pamh, cons - opwd entry; - int found = 0; - -+#ifndef HELPER_COMPILE -+ if (SELINUX_ENABLED) -+ return PAM_PWHISTORY_RUN_HELPER; -+#endif -+ - if ((oldpf = fopen (OLD_PASSWORDS_FILE, "r")) == NULL) - { - if (errno != ENOENT) -@@ -213,9 +241,9 @@ check_old_pass (pam_handle_t *pamh, cons - return retval; - } - --int --save_old_pass (pam_handle_t *pamh, const char *user, uid_t uid, -- const char *oldpass, int howmany, int debug UNUSED) -+PAMH_ARG_DECL(int -+save_old_pass, const char *user, -+ int howmany, int debug UNUSED) - { - char opasswd_tmp[] = TMP_PASSWORDS_FILE; - struct stat opasswd_stat; -@@ -226,10 +254,35 @@ save_old_pass (pam_handle_t *pamh, const - char *buf = NULL; - size_t buflen = 0; - int found = 0; -+ struct passwd *pwd; -+ const char *oldpass; -+ -+ pwd = pam_modutil_getpwnam (pamh, user); -+ if (pwd == NULL) -+ return PAM_USER_UNKNOWN; - - if (howmany <= 0) - return PAM_SUCCESS; - -+#ifndef HELPER_COMPILE -+ if (SELINUX_ENABLED) -+ return PAM_PWHISTORY_RUN_HELPER; -+#endif -+ -+ if ((strcmp(pwd->pw_passwd, "x") == 0) || -+ ((pwd->pw_passwd[0] == '#') && -+ (pwd->pw_passwd[1] == '#') && -+ (strcmp(pwd->pw_name, pwd->pw_passwd + 2) == 0))) -+ { -+ struct spwd *spw = pam_modutil_getspnam (pamh, user); -+ -+ if (spw == NULL) -+ return PAM_USER_UNKNOWN; -+ oldpass = spw->sp_pwdp; -+ } -+ else -+ oldpass = pwd->pw_passwd; -+ - if (oldpass == NULL || *oldpass == '\0') - return PAM_SUCCESS; - -@@ -452,7 +505,7 @@ save_old_pass (pam_handle_t *pamh, const - { - char *out; - -- if (asprintf (&out, "%s:%d:1:%s\n", user, uid, oldpass) < 0) -+ if (asprintf (&out, "%s:%d:1:%s\n", user, pwd->pw_uid, oldpass) < 0) - { - retval = PAM_AUTHTOK_ERR; - if (oldpf) -diff -up Linux-PAM-1.3.0/modules/pam_pwhistory/opasswd.h.pwhhelper Linux-PAM-1.3.0/modules/pam_pwhistory/opasswd.h ---- Linux-PAM-1.3.0/modules/pam_pwhistory/opasswd.h.pwhhelper 2016-03-24 12:45:42.000000000 +0100 -+++ Linux-PAM-1.3.0/modules/pam_pwhistory/opasswd.h 2016-05-06 15:18:42.307637933 +0200 -@@ -1,5 +1,6 @@ - /* - * Copyright (c) 2008 Thorsten Kukuk -+ * Copyright (c) 2013 Red Hat, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions -@@ -36,10 +37,32 @@ - #ifndef __OPASSWD_H__ - #define __OPASSWD_H__ - --extern int check_old_pass (pam_handle_t *pamh, const char *user, -- const char *newpass, int debug); --extern int save_old_pass (pam_handle_t *pamh, const char *user, -- uid_t uid, const char *oldpass, -- int howmany, int debug); -+#define PAM_PWHISTORY_RUN_HELPER PAM_CRED_INSUFFICIENT -+ -+#ifdef WITH_SELINUX -+#include -+#define SELINUX_ENABLED is_selinux_enabled()>0 -+#else -+#define SELINUX_ENABLED 0 -+#endif -+ -+#ifdef HELPER_COMPILE -+#define PAMH_ARG_DECL(fname, ...) fname(__VA_ARGS__) -+#define PAMH_ARG(...) __VA_ARGS__ -+#else -+#define PAMH_ARG_DECL(fname, ...) fname(pam_handle_t *pamh, __VA_ARGS__) -+#define PAMH_ARG(...) pamh, __VA_ARGS__ -+#endif -+ -+#ifdef HELPER_COMPILE -+void -+helper_log_err(int err, const char *format, ...); -+#endif -+ -+PAMH_ARG_DECL(int -+check_old_pass, const char *user, const char *newpass, int debug); -+ -+PAMH_ARG_DECL(int -+save_old_pass, const char *user, int howmany, int debug); - - #endif /* __OPASSWD_H__ */ -diff -up Linux-PAM-1.3.0/modules/pam_pwhistory/pam_pwhistory.c.pwhhelper Linux-PAM-1.3.0/modules/pam_pwhistory/pam_pwhistory.c ---- Linux-PAM-1.3.0/modules/pam_pwhistory/pam_pwhistory.c.pwhhelper 2016-04-04 11:22:28.000000000 +0200 -+++ Linux-PAM-1.3.0/modules/pam_pwhistory/pam_pwhistory.c 2016-05-06 15:19:31.610785512 +0200 -@@ -1,6 +1,7 @@ - /* - * Copyright (c) 2008, 2012 Thorsten Kukuk - * Author: Thorsten Kukuk -+ * Copyright (c) 2013 Red Hat, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions -@@ -46,10 +47,14 @@ - #include - #include - #include --#include - #include - #include - #include -+#include -+#include -+#include -+#include -+#include - - #include - #include -@@ -59,6 +64,7 @@ - #include "opasswd.h" - - #define DEFAULT_BUFLEN 2048 -+#define MAX_FD_NO 20000 - - struct options_t { - int debug; -@@ -102,6 +108,184 @@ parse_option (pam_handle_t *pamh, const - pam_syslog (pamh, LOG_ERR, "pam_pwhistory: unknown option: %s", argv); - } - -+static int -+run_save_helper(pam_handle_t *pamh, const char *user, -+ int howmany, int debug) -+{ -+ int retval, child; -+ struct sigaction newsa, oldsa; -+ -+ memset(&newsa, '\0', sizeof(newsa)); -+ newsa.sa_handler = SIG_DFL; -+ sigaction(SIGCHLD, &newsa, &oldsa); -+ -+ child = fork(); -+ if (child == 0) -+ { -+ int i = 0; -+ struct rlimit rlim; -+ int dummyfds[2]; -+ static char *envp[] = { NULL }; -+ char *args[] = { NULL, NULL, NULL, NULL, NULL, NULL }; -+ -+ /* replace std file descriptors with a dummy pipe */ -+ if (pipe2(dummyfds, O_NONBLOCK) == 0) -+ { -+ dup2(dummyfds[0], STDIN_FILENO); -+ dup2(dummyfds[1], STDOUT_FILENO); -+ dup2(dummyfds[1], STDERR_FILENO); -+ } -+ -+ if (getrlimit(RLIMIT_NOFILE,&rlim) == 0) -+ { -+ if (rlim.rlim_max >= MAX_FD_NO) -+ rlim.rlim_max = MAX_FD_NO; -+ for (i = STDERR_FILENO + 1; i < (int)rlim.rlim_max; i++) -+ { -+ if (i != dummyfds[0]) -+ close(i); -+ } -+ } -+ -+ /* exec binary helper */ -+ args[0] = strdup(PWHISTORY_HELPER); -+ args[1] = strdup("save"); -+ args[2] = x_strdup(user); -+ asprintf(&args[3], "%d", howmany); -+ asprintf(&args[4], "%d", debug); -+ -+ execve(args[0], args, envp); -+ -+ _exit(PAM_SYSTEM_ERR); -+ } -+ else if (child > 0) -+ { -+ /* wait for child */ -+ int rc = 0; -+ rc = waitpid(child, &retval, 0); /* wait for helper to complete */ -+ if (rc < 0) -+ { -+ pam_syslog(pamh, LOG_ERR, "pwhistory_helper save waitpid returned %d: %m", rc); -+ retval = PAM_SYSTEM_ERR; -+ } -+ else if (!WIFEXITED(retval)) -+ { -+ pam_syslog(pamh, LOG_ERR, "pwhistory_helper save abnormal exit: %d", retval); -+ retval = PAM_SYSTEM_ERR; -+ } -+ else -+ { -+ retval = WEXITSTATUS(retval); -+ } -+ } -+ else -+ { -+ retval = PAM_SYSTEM_ERR; -+ } -+ -+ sigaction(SIGCHLD, &oldsa, NULL); /* restore old signal handler */ -+ -+ return retval; -+} -+ -+static int -+run_check_helper(pam_handle_t *pamh, const char *user, -+ const char *newpass, int debug) -+{ -+ int retval, child, fds[2]; -+ struct sigaction newsa, oldsa; -+ -+ /* create a pipe for the password */ -+ if (pipe(fds) != 0) -+ return PAM_SYSTEM_ERR; -+ -+ memset(&newsa, '\0', sizeof(newsa)); -+ newsa.sa_handler = SIG_DFL; -+ sigaction(SIGCHLD, &newsa, &oldsa); -+ -+ child = fork(); -+ if (child == 0) -+ { -+ int i = 0; -+ struct rlimit rlim; -+ int dummyfds[2]; -+ static char *envp[] = { NULL }; -+ char *args[] = { NULL, NULL, NULL, NULL, NULL }; -+ -+ /* reopen stdin as pipe */ -+ dup2(fds[0], STDIN_FILENO); -+ -+ /* replace std file descriptors with a dummy pipe */ -+ if (pipe2(dummyfds, O_NONBLOCK) == 0) -+ { -+ dup2(dummyfds[1], STDOUT_FILENO); -+ dup2(dummyfds[1], STDERR_FILENO); -+ } -+ -+ if (getrlimit(RLIMIT_NOFILE,&rlim) == 0) -+ { -+ if (rlim.rlim_max >= MAX_FD_NO) -+ rlim.rlim_max = MAX_FD_NO; -+ for (i = STDERR_FILENO + 1; i < (int)rlim.rlim_max; i++) -+ { -+ if (i != dummyfds[0]) -+ close(i); -+ } -+ } -+ -+ /* exec binary helper */ -+ args[0] = strdup(PWHISTORY_HELPER); -+ args[1] = strdup("check"); -+ args[2] = x_strdup(user); -+ asprintf(&args[3], "%d", debug); -+ -+ execve(args[0], args, envp); -+ -+ _exit(PAM_SYSTEM_ERR); -+ } -+ else if (child > 0) -+ { -+ /* wait for child */ -+ int rc = 0; -+ if (newpass == NULL) -+ newpass = ""; -+ -+ /* send the password to the child */ -+ if (write(fds[1], newpass, strlen(newpass)+1) == -1) -+ { -+ pam_syslog(pamh, LOG_ERR, "Cannot send password to helper: %m"); -+ retval = PAM_SYSTEM_ERR; -+ } -+ newpass = NULL; -+ close(fds[0]); /* close here to avoid possible SIGPIPE above */ -+ close(fds[1]); -+ rc = waitpid(child, &retval, 0); /* wait for helper to complete */ -+ if (rc < 0) -+ { -+ pam_syslog(pamh, LOG_ERR, "pwhistory_helper check waitpid returned %d: %m", rc); -+ retval = PAM_SYSTEM_ERR; -+ } -+ else if (!WIFEXITED(retval)) -+ { -+ pam_syslog(pamh, LOG_ERR, "pwhistory_helper check abnormal exit: %d", retval); -+ retval = PAM_SYSTEM_ERR; -+ } -+ else -+ { -+ retval = WEXITSTATUS(retval); -+ } -+ } -+ else -+ { -+ close(fds[0]); -+ close(fds[1]); -+ retval = PAM_SYSTEM_ERR; -+ } -+ -+ sigaction(SIGCHLD, &oldsa, NULL); /* restore old signal handler */ -+ -+ return retval; -+} - - /* This module saves the current crypted password in /etc/security/opasswd - and then compares the new password with all entries in this file. */ -@@ -109,7 +293,6 @@ parse_option (pam_handle_t *pamh, const - int - pam_sm_chauthtok (pam_handle_t *pamh, int flags, int argc, const char **argv) - { -- struct passwd *pwd; - const char *newpass; - const char *user; - int retval, tries; -@@ -154,31 +337,13 @@ pam_sm_chauthtok (pam_handle_t *pamh, in - return PAM_SUCCESS; - } - -- pwd = pam_modutil_getpwnam (pamh, user); -- if (pwd == NULL) -- return PAM_USER_UNKNOWN; -- -- if ((strcmp(pwd->pw_passwd, "x") == 0) || -- ((pwd->pw_passwd[0] == '#') && -- (pwd->pw_passwd[1] == '#') && -- (strcmp(pwd->pw_name, pwd->pw_passwd + 2) == 0))) -- { -- struct spwd *spw = pam_modutil_getspnam (pamh, user); -- if (spw == NULL) -- return PAM_USER_UNKNOWN; -+ retval = save_old_pass (pamh, user, options.remember, options.debug); - -- retval = save_old_pass (pamh, user, pwd->pw_uid, spw->sp_pwdp, -- options.remember, options.debug); -- if (retval != PAM_SUCCESS) -- return retval; -- } -- else -- { -- retval = save_old_pass (pamh, user, pwd->pw_uid, pwd->pw_passwd, -- options.remember, options.debug); -- if (retval != PAM_SUCCESS) -- return retval; -- } -+ if (retval == PAM_PWHISTORY_RUN_HELPER) -+ retval = run_save_helper(pamh, user, options.remember, options.debug); -+ -+ if (retval != PAM_SUCCESS) -+ return retval; - - newpass = NULL; - tries = 0; -@@ -207,8 +372,11 @@ pam_sm_chauthtok (pam_handle_t *pamh, in - if (options.debug) - pam_syslog (pamh, LOG_DEBUG, "check against old password file"); - -- if (check_old_pass (pamh, user, newpass, -- options.debug) != PAM_SUCCESS) -+ retval = check_old_pass (pamh, user, newpass, options.debug); -+ if (retval == PAM_PWHISTORY_RUN_HELPER) -+ retval = run_check_helper(pamh, user, newpass, options.debug); -+ -+ if (retval != PAM_SUCCESS) - { - if (getuid() || options.enforce_for_root || - (flags & PAM_CHANGE_EXPIRED_AUTHTOK)) -diff -up Linux-PAM-1.3.0/modules/pam_pwhistory/pwhistory_helper.c.pwhhelper Linux-PAM-1.3.0/modules/pam_pwhistory/pwhistory_helper.c ---- Linux-PAM-1.3.0/modules/pam_pwhistory/pwhistory_helper.c.pwhhelper 2016-05-06 15:18:42.308637957 +0200 -+++ Linux-PAM-1.3.0/modules/pam_pwhistory/pwhistory_helper.c 2016-05-06 15:18:42.308637957 +0200 -@@ -0,0 +1,209 @@ -+/* -+ * Copyright (c) 2013 Red Hat, Inc. -+ * Author: Tomas Mraz -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, and the entire permission notice in its entirety, -+ * including the disclaimer of warranties. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * ALTERNATIVELY, this product may be distributed under the terms of -+ * the GNU Public License, in which case the provisions of the GPL are -+ * required INSTEAD OF the above restrictions. (This clause is -+ * necessary due to a potential bad interaction between the GPL and -+ * the restrictions contained in a BSD-style copyright.) -+ * -+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -+ * OF THE POSSIBILITY OF SUCH DAMAGE. -+ */ -+ -+#include "config.h" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "opasswd.h" -+ -+#define MAXPASS 200 -+ -+static void -+su_sighandler(int sig) -+{ -+#ifndef SA_RESETHAND -+ /* emulate the behaviour of the SA_RESETHAND flag */ -+ if ( sig == SIGILL || sig == SIGTRAP || sig == SIGBUS || sig = SIGSERV ) { -+ struct sigaction sa; -+ memset(&sa, '\0', sizeof(sa)); -+ sa.sa_handler = SIG_DFL; -+ sigaction(sig, &sa, NULL); -+ } -+#endif -+ if (sig > 0) { -+ _exit(sig); -+ } -+} -+ -+static void -+setup_signals(void) -+{ -+ struct sigaction action; /* posix signal structure */ -+ -+ /* -+ * Setup signal handlers -+ */ -+ (void) memset((void *) &action, 0, sizeof(action)); -+ action.sa_handler = su_sighandler; -+#ifdef SA_RESETHAND -+ action.sa_flags = SA_RESETHAND; -+#endif -+ (void) sigaction(SIGILL, &action, NULL); -+ (void) sigaction(SIGTRAP, &action, NULL); -+ (void) sigaction(SIGBUS, &action, NULL); -+ (void) sigaction(SIGSEGV, &action, NULL); -+ action.sa_handler = SIG_IGN; -+ action.sa_flags = 0; -+ (void) sigaction(SIGTERM, &action, NULL); -+ (void) sigaction(SIGHUP, &action, NULL); -+ (void) sigaction(SIGINT, &action, NULL); -+ (void) sigaction(SIGQUIT, &action, NULL); -+} -+ -+static int -+read_passwords(int fd, int npass, char **passwords) -+{ -+ int rbytes = 0; -+ int offset = 0; -+ int i = 0; -+ char *pptr; -+ while (npass > 0) -+ { -+ rbytes = read(fd, passwords[i]+offset, MAXPASS-offset); -+ -+ if (rbytes < 0) -+ { -+ if (errno == EINTR) continue; -+ break; -+ } -+ if (rbytes == 0) -+ break; -+ -+ while (npass > 0 && (pptr=memchr(passwords[i]+offset, '\0', rbytes)) -+ != NULL) -+ { -+ rbytes -= pptr - (passwords[i]+offset) + 1; -+ i++; -+ offset = 0; -+ npass--; -+ if (rbytes > 0) -+ { -+ if (npass > 0) -+ memcpy(passwords[i], pptr+1, rbytes); -+ memset(pptr+1, '\0', rbytes); -+ } -+ } -+ offset += rbytes; -+ } -+ -+ /* clear up */ -+ if (offset > 0 && npass > 0) -+ memset(passwords[i], '\0', offset); -+ -+ return i; -+} -+ -+ -+static int -+check_history(const char *user, const char *debug) -+{ -+ char pass[MAXPASS + 1]; -+ char *passwords[] = { pass }; -+ int npass; -+ int dbg = atoi(debug); /* no need to be too fancy here */ -+ int retval; -+ -+ /* read the password from stdin (a pipe from the pam_pwhistory module) */ -+ npass = read_passwords(STDIN_FILENO, 1, passwords); -+ -+ if (npass != 1) -+ { /* is it a valid password? */ -+ helper_log_err(LOG_DEBUG, "no password supplied"); -+ return PAM_AUTHTOK_ERR; -+ } -+ -+ retval = check_old_pass(user, pass, dbg); -+ -+ memset(pass, '\0', MAXPASS); /* clear memory of the password */ -+ -+ return retval; -+} -+ -+static int -+save_history(const char *user, const char *howmany, const char *debug) -+{ -+ int num = atoi(howmany); -+ int dbg = atoi(debug); /* no need to be too fancy here */ -+ int retval; -+ -+ retval = save_old_pass(user, num, dbg); -+ -+ return retval; -+} -+ -+int -+main(int argc, char *argv[]) -+{ -+ const char *option; -+ const char *user; -+ -+ /* -+ * Catch or ignore as many signal as possible. -+ */ -+ setup_signals(); -+ -+ /* -+ * we establish that this program is running with non-tty stdin. -+ * this is to discourage casual use. -+ */ -+ -+ if (isatty(STDIN_FILENO) || argc < 4) -+ { -+ fprintf(stderr, -+ "This binary is not designed for running in this way.\n"); -+ sleep(10); /* this should discourage/annoy the user */ -+ return PAM_SYSTEM_ERR; -+ } -+ -+ option = argv[1]; -+ user = argv[2]; -+ -+ if (strcmp(option, "check") == 0 && argc == 4) -+ return check_history(user, argv[3]); -+ else if (strcmp(option, "save") == 0 && argc == 5) -+ return save_history(user, argv[3], argv[4]); -+ -+ return PAM_SYSTEM_ERR; -+} -+ -diff -up Linux-PAM-1.3.0/modules/pam_pwhistory/pwhistory_helper.8.xml.pwhhelper Linux-PAM-1.3.0/modules/pam_pwhistory/pwhistory_helper.8.xml ---- Linux-PAM-1.3.0/modules/pam_pwhistory/pwhistory_helper.8.xml.pwhhelper 2016-05-06 15:18:42.308637957 +0200 -+++ Linux-PAM-1.3.0/modules/pam_pwhistory/pwhistory_helper.8.xml 2016-05-06 15:18:42.308637957 +0200 -@@ -0,0 +1,68 @@ -+ -+ -+ -+ -+ -+ -+ pwhistory_helper -+ 8 -+ Linux-PAM Manual -+ -+ -+ -+ pwhistory_helper -+ Helper binary that transfers password hashes from passwd or shadow to opasswd -+ -+ -+ -+ -+ pwhistory_helper -+ -+ ... -+ -+ -+ -+ -+ -+ -+ DESCRIPTION -+ -+ -+ pwhistory_helper is a helper program for the -+ pam_pwhistory module that transfers password hashes -+ from passwd or shadow file to the opasswd file and checks a password -+ supplied by user against the existing hashes in the opasswd file. -+ -+ -+ -+ The purpose of the helper is to enable tighter confinement of -+ login and password changing services. The helper is thus called only -+ when SELinux is enabled on the system. -+ -+ -+ -+ The interface of the helper - command line options, and input/output -+ data format are internal to the pam_pwhistory -+ module and it should not be called directly from applications. -+ -+ -+ -+ -+ SEE ALSO -+ -+ -+ pam_pwhistory8 -+ -+ -+ -+ -+ -+ AUTHOR -+ -+ Written by Tomas Mraz based on the code originally in -+ pam_pwhistory and pam_unix modules. -+ -+ -+ -+ diff --git a/SOURCES/pam-1.3.1-access-handle-hostnames.patch b/SOURCES/pam-1.3.1-access-handle-hostnames.patch deleted file mode 100644 index b73ba8a..0000000 --- a/SOURCES/pam-1.3.1-access-handle-hostnames.patch +++ /dev/null @@ -1,158 +0,0 @@ -diff -up Linux-PAM-1.3.1/modules/pam_access/pam_access.c.access-handle-hostnames Linux-PAM-1.3.1/modules/pam_access/pam_access.c ---- Linux-PAM-1.3.1/modules/pam_access/pam_access.c.access-handle-hostnames 2024-01-19 16:45:18.319862531 +0100 -+++ Linux-PAM-1.3.1/modules/pam_access/pam_access.c 2024-01-19 16:50:34.239545948 +0100 -@@ -683,7 +683,7 @@ string_match (pam_handle_t *pamh, const - /* - * If the token has the magic value "ALL" the match always succeeds. - * Otherwise, return YES if the token fully matches the string. -- * "NONE" token matches NULL string. -+ * "NONE" token matches NULL string. - */ - - if (strcasecmp(tok, "ALL") == 0) { /* all: always matches */ -@@ -701,7 +701,8 @@ string_match (pam_handle_t *pamh, const - - /* network_netmask_match - match a string against one token - * where string is a hostname or ip (v4,v6) address and tok -- * represents either a single ip (v4,v6) address or a network/netmask -+ * represents either a hostname, a single ip (v4,v6) address -+ * or a network/netmask - */ - static int - network_netmask_match (pam_handle_t *pamh, -@@ -710,10 +711,12 @@ network_netmask_match (pam_handle_t *pam - char *netmask_ptr; - char netmask_string[MAXHOSTNAMELEN + 1]; - int addr_type; -+ struct addrinfo *ai = NULL; - - if (item->debug) -- pam_syslog (pamh, LOG_DEBUG, -+ pam_syslog (pamh, LOG_DEBUG, - "network_netmask_match: tok=%s, item=%s", tok, string); -+ - /* OK, check if tok is of type addr/mask */ - if ((netmask_ptr = strchr(tok, '/')) != NULL) - { -@@ -745,52 +748,109 @@ network_netmask_match (pam_handle_t *pam - netmask_ptr = number_to_netmask(netmask, addr_type, - netmask_string, MAXHOSTNAMELEN); - } -- } -+ -+ /* -+ * Construct an addrinfo list from the IP address. -+ * This should not fail as the input is a correct IP address... -+ */ -+ if (getaddrinfo (tok, NULL, NULL, &ai) != 0) -+ { -+ return NO; -+ } -+ } - else -- /* NO, then check if it is only an addr */ -- if (isipaddr(tok, NULL, NULL) != YES) -+ { -+ /* -+ * It is either an IP address or a hostname. -+ * Let getaddrinfo sort everything out -+ */ -+ if (getaddrinfo (tok, NULL, NULL, &ai) != 0) - { -+ if (item->debug) -+ pam_syslog(pamh, LOG_DEBUG, "cannot resolve hostname \"%s\"", tok); -+ - return NO; - } -+ netmask_ptr = NULL; -+ } - - if (isipaddr(string, NULL, NULL) != YES) - { -- /* Assume network/netmask with a name of a host. */ - struct addrinfo hint; - -+ /* Assume network/netmask with a name of a host. */ - memset (&hint, '\0', sizeof (hint)); - hint.ai_flags = AI_CANONNAME; - hint.ai_family = AF_UNSPEC; - - if (item->gai_rv != 0) -+ { -+ freeaddrinfo(ai); - return NO; -+ } - else if (!item->res && - (item->gai_rv = getaddrinfo (string, NULL, &hint, &item->res)) != 0) -+ { -+ freeaddrinfo(ai); - return NO; -+ } - else - { - struct addrinfo *runp = item->res; -+ struct addrinfo *runp1; - - while (runp != NULL) - { - char buf[INET6_ADDRSTRLEN]; - -- inet_ntop (runp->ai_family, -- runp->ai_family == AF_INET -- ? (void *) &((struct sockaddr_in *) runp->ai_addr)->sin_addr -- : (void *) &((struct sockaddr_in6 *) runp->ai_addr)->sin6_addr, -- buf, sizeof (buf)); -+ if (getnameinfo (runp->ai_addr, runp->ai_addrlen, buf, sizeof (buf), NULL, 0, NI_NUMERICHOST) != 0) -+ { -+ freeaddrinfo(ai); -+ return NO; -+ } - -- if (are_addresses_equal(buf, tok, netmask_ptr)) -+ for (runp1 = ai; runp1 != NULL; runp1 = runp1->ai_next) - { -- return YES; -+ char buf1[INET6_ADDRSTRLEN]; -+ -+ if (runp->ai_family != runp1->ai_family) -+ continue; -+ -+ if (getnameinfo (runp1->ai_addr, runp1->ai_addrlen, buf1, sizeof (buf1), NULL, 0, NI_NUMERICHOST) != 0) -+ { -+ freeaddrinfo(ai); -+ return NO; -+ } -+ -+ if (are_addresses_equal (buf, buf1, netmask_ptr)) -+ { -+ freeaddrinfo(ai); -+ return YES; -+ } - } - runp = runp->ai_next; - } - } - } - else -- return (are_addresses_equal(string, tok, netmask_ptr)); -+ { -+ struct addrinfo *runp1; -+ -+ for (runp1 = ai; runp1 != NULL; runp1 = runp1->ai_next) -+ { -+ char buf1[INET6_ADDRSTRLEN]; -+ -+ (void) getnameinfo (runp1->ai_addr, runp1->ai_addrlen, buf1, sizeof (buf1), NULL, 0, NI_NUMERICHOST); -+ -+ if (are_addresses_equal(string, buf1, netmask_ptr)) -+ { -+ freeaddrinfo(ai); -+ return YES; -+ } -+ } -+ } -+ -+ freeaddrinfo(ai); - - return NO; - } diff --git a/SOURCES/pam-1.3.1-audit-error.patch b/SOURCES/pam-1.3.1-audit-error.patch deleted file mode 100644 index f01172b..0000000 --- a/SOURCES/pam-1.3.1-audit-error.patch +++ /dev/null @@ -1,35 +0,0 @@ -From b429ea18b1c9c8953df5169c6a453b4255a6f23d Mon Sep 17 00:00:00 2001 -From: Iker Pedrosa -Date: Thu, 27 Feb 2020 11:48:47 +0100 -Subject: [PATCH] pam_tty_audit: if kernel audit is disabled return PAM_IGNORE - -If kernel audit is disabled the socket open will return -EPROTONOSUPPORT. -Return PAM_IGNORE from pam_tty_audit and log a warning -in this situation so login is not blocked by the module. ---- - modules/pam_tty_audit/pam_tty_audit.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/modules/pam_tty_audit/pam_tty_audit.c b/modules/pam_tty_audit/pam_tty_audit.c -index 7dbcada2..589c60a2 100644 ---- a/modules/pam_tty_audit/pam_tty_audit.c -+++ b/modules/pam_tty_audit/pam_tty_audit.c -@@ -351,6 +351,14 @@ pam_sm_open_session (pam_handle_t *pamh, int flags, int argc, const char **argv) - - fd = nl_open (); - if (fd == -1 -+ && errno == EPROTONOSUPPORT) -+ { -+ pam_syslog (pamh, LOG_WARNING, "unable to open audit socket, audit not " -+ "supported; tty_audit skipped"); -+ free (old_status); -+ return PAM_IGNORE; -+ } -+ else if (fd == -1 - || nl_send (fd, AUDIT_TTY_GET, 0, NULL, 0) != 0 - || nl_recv (fd, AUDIT_TTY_GET, old_status, sizeof (*old_status)) != 0) - { --- -2.25.2 - diff --git a/SOURCES/pam-1.3.1-audit-messages-formatting.patch b/SOURCES/pam-1.3.1-audit-messages-formatting.patch deleted file mode 100644 index e152aa5..0000000 --- a/SOURCES/pam-1.3.1-audit-messages-formatting.patch +++ /dev/null @@ -1,33 +0,0 @@ -diff -up Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.c.audit-messages-formatting Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.c ---- Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.c.audit-messages-formatting 2024-03-11 16:21:51.928946604 +0100 -+++ Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.c 2024-03-11 16:21:51.934946609 +0100 -@@ -334,7 +334,7 @@ check_tally(pam_handle_t *pamh, struct o - - (void)pam_get_item(pamh, PAM_TTY, &tty); - (void)pam_get_item(pamh, PAM_RHOST, &rhost); -- snprintf(buf, sizeof(buf), "pam_faillock uid=%u ", opts->uid); -+ snprintf(buf, sizeof(buf), "op=pam_faillock suid=%u ", opts->uid); - audit_log_user_message(audit_fd, AUDIT_RESP_ACCT_UNLOCK_TIMED, buf, - rhost, NULL, tty, 1); - } -@@ -450,7 +450,7 @@ write_tally(pam_handle_t *pamh, struct o - errno == EAFNOSUPPORT)) - return PAM_SYSTEM_ERR; - -- snprintf(buf, sizeof(buf), "pam_faillock uid=%u ", opts->uid); -+ snprintf(buf, sizeof(buf), "op=pam_faillock suid=%u ", opts->uid); - audit_log_user_message(audit_fd, AUDIT_ANOM_LOGIN_FAILURES, buf, - NULL, NULL, NULL, 1); - -diff -up Linux-PAM-1.3.1/modules/pam_selinux/pam_selinux.c.audit-messages-formatting Linux-PAM-1.3.1/modules/pam_selinux/pam_selinux.c ---- Linux-PAM-1.3.1/modules/pam_selinux/pam_selinux.c.audit-messages-formatting 2024-03-11 16:21:51.934946609 +0100 -+++ Linux-PAM-1.3.1/modules/pam_selinux/pam_selinux.c 2024-03-11 16:23:24.521025061 +0100 -@@ -106,7 +106,7 @@ int send_audit_message(pam_handle_t *pam - pam_syslog(pamh, LOG_ERR, "Error translating selected context."); - selected_raw = NULL; - } -- if (asprintf(&msg, "pam: default-context=%s selected-context=%s", -+ if (asprintf(&msg, "op=pam_selinux default-context=%s selected-context=%s", - default_raw ? default_raw : (default_context ? default_context : "?"), - selected_raw ? selected_raw : (selected_context ? selected_context : "?")) < 0) { - pam_syslog(pamh, LOG_ERR, "Error allocating memory."); diff --git a/SOURCES/pam-1.3.1-authtok-verify-fix.patch b/SOURCES/pam-1.3.1-authtok-verify-fix.patch deleted file mode 100644 index 6c40cdc..0000000 --- a/SOURCES/pam-1.3.1-authtok-verify-fix.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 27d04a849fd9f9cfd4b35eb80d687817830183df Mon Sep 17 00:00:00 2001 -From: Tomas Mraz -Date: Wed, 7 Aug 2019 12:22:55 +0200 -Subject: [PATCH] pam_get_authtok_verify: Avoid duplicate password verification - -If password was already verified by previous modules in the stack -it does not need to be verified by pam_get_authtok_verify either. - -* libpam/pam_get_authtok.c (pam_get_authtok_internal): Set the authtok_verified - appropriately. - (pam_get_authtok_verify): Do not prompt if authtok_verified is set and - set it when the password is verified. -* libpam/pam_private.h: Add authtok_verified to the pam handle struct. -* libpam/pam_start.c (pam_start): Initialize authtok_verified. ---- - libpam/pam_get_authtok.c | 10 ++++++++++ - libpam/pam_private.h | 1 + - libpam/pam_start.c | 1 + - 3 files changed, 12 insertions(+) - -diff --git a/libpam/pam_get_authtok.c b/libpam/pam_get_authtok.c -index 800c6e5..99eb25f 100644 ---- a/libpam/pam_get_authtok.c -+++ b/libpam/pam_get_authtok.c -@@ -140,6 +140,8 @@ pam_get_authtok_internal (pam_handle_t *pamh, int item, - } - else if (chpass) - { -+ pamh->authtok_verified = 0; -+ - retval = pam_prompt (pamh, PAM_PROMPT_ECHO_OFF, &resp[0], - PROMPT1, authtok_type, - strlen (authtok_type) > 0?" ":""); -@@ -184,6 +186,9 @@ pam_get_authtok_internal (pam_handle_t *pamh, int item, - if (retval != PAM_SUCCESS) - return retval; - -+ if (chpass > 1) -+ pamh->authtok_verified = 1; -+ - return pam_get_item(pamh, item, (const void **)authtok); - } - -@@ -214,6 +219,9 @@ pam_get_authtok_verify (pam_handle_t *pamh, const char **authtok, - if (authtok == NULL || pamh->choice != PAM_CHAUTHTOK) - return PAM_SYSTEM_ERR; - -+ if (pamh->authtok_verified) -+ return pam_get_item (pamh, PAM_AUTHTOK, (const void **)authtok); -+ - if (prompt != NULL) - { - retval = pam_prompt (pamh, PAM_PROMPT_ECHO_OFF, &resp, -@@ -252,5 +260,7 @@ pam_get_authtok_verify (pam_handle_t *pamh, const char **authtok, - if (retval != PAM_SUCCESS) - return retval; - -+ pamh->authtok_verified = 1; -+ - return pam_get_item(pamh, PAM_AUTHTOK, (const void **)authtok); - } -diff --git a/libpam/pam_private.h b/libpam/pam_private.h -index 7ff9f75..58a26f5 100644 ---- a/libpam/pam_private.h -+++ b/libpam/pam_private.h -@@ -172,6 +172,7 @@ struct pam_handle { - #ifdef HAVE_LIBAUDIT - int audit_state; /* keep track of reported audit messages */ - #endif -+ int authtok_verified; - }; - - /* Values for select arg to _pam_dispatch() */ -diff --git a/libpam/pam_start.c b/libpam/pam_start.c -index 328416d..e27c64b 100644 ---- a/libpam/pam_start.c -+++ b/libpam/pam_start.c -@@ -94,6 +94,7 @@ int pam_start ( - #endif - (*pamh)->xdisplay = NULL; - (*pamh)->authtok_type = NULL; -+ (*pamh)->authtok_verified = 0; - memset (&((*pamh)->xauth), 0, sizeof ((*pamh)->xauth)); - - if (((*pamh)->pam_conversation = (struct pam_conv *) --- -2.20.1 - diff --git a/SOURCES/pam-1.3.1-console-build.patch b/SOURCES/pam-1.3.1-console-build.patch deleted file mode 100644 index b9338cd..0000000 --- a/SOURCES/pam-1.3.1-console-build.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -up Linux-PAM-1.3.1/modules/pam_console/sed-static.console-build Linux-PAM-1.3.1/modules/pam_console/sed-static ---- Linux-PAM-1.3.1/modules/pam_console/sed-static.console-build 2014-01-31 14:17:53.000000000 +0100 -+++ Linux-PAM-1.3.1/modules/pam_console/sed-static 2018-09-10 15:06:04.115302315 +0200 -@@ -13,6 +13,7 @@ sed ' - /^YY_BUFFER_STATE yy_scan_buffer/s/^/STATIC / - /^YY_BUFFER_STATE yy_scan_string/s/^/STATIC / - /^void yy_switch_to_buffer/s/^/STATIC / -+/^extern int yylex/s/^extern /STATIC / - /define YY_DECL int yylex/s/YY_DECL /YY_DECL STATIC / - /^int yyparse/s/^/STATIC / - /^void yyrestart/s/^/STATIC / diff --git a/SOURCES/pam-1.3.1-coverity.patch b/SOURCES/pam-1.3.1-coverity.patch deleted file mode 100644 index cecf768..0000000 --- a/SOURCES/pam-1.3.1-coverity.patch +++ /dev/null @@ -1,185 +0,0 @@ -diff --git a/libpam/pam_handlers.c b/libpam/pam_handlers.c -index 106ef7c..b2e94c7 100644 ---- a/libpam/pam_handlers.c -+++ b/libpam/pam_handlers.c -@@ -282,7 +282,6 @@ _pam_open_config_file(pam_handle_t *pamh - { - char *p; - FILE *f; -- int err = 0; - - /* Absolute path */ - if (service[0] == '/') { -diff --git a/libpam_misc/misc_conv.c b/libpam_misc/misc_conv.c -index be53f34..07dce36 100644 ---- a/libpam_misc/misc_conv.c -+++ b/libpam_misc/misc_conv.c -@@ -211,7 +211,7 @@ static int read_string(int echo, const char *prompt, char **retstr) - line[nc] = '\0'; - } - *retstr = strdup(line); -- _pam_overwrite(line); -+ _pam_overwrite_n(line, sizeof(line)); - if (!*retstr) { - D(("no memory for response string")); - nc = -1; -@@ -244,7 +244,7 @@ static int read_string(int echo, const char *prompt, char **retstr) - D(("the timer appears to have expired")); - - *retstr = NULL; -- _pam_overwrite(line); -+ _pam_overwrite_n(line, sizeof(line)); - - cleanexit: - -diff --git a/modules/pam_access/pam_access.c b/modules/pam_access/pam_access.c -index 80d885d..3801862 100644 ---- a/modules/pam_access/pam_access.c -+++ b/modules/pam_access/pam_access.c -@@ -806,7 +806,7 @@ pam_sm_authenticate (pam_handle_t *pamh, int flags UNUSED, - const char *user=NULL; - const void *void_from=NULL; - const char *from; -- const char const *default_config = PAM_ACCESS_CONFIG; -+ const char * const default_config = PAM_ACCESS_CONFIG; - struct passwd *user_pw; - char hostname[MAXHOSTNAMELEN + 1]; - int rv; -diff --git a/modules/pam_limits/pam_limits.c b/modules/pam_limits/pam_limits.c -index 4bc4ae7..f8476b4 100644 ---- a/modules/pam_limits/pam_limits.c -+++ b/modules/pam_limits/pam_limits.c -@@ -342,7 +342,7 @@ static const char *lnames[RLIM_NLIMITS] = { - #endif - }; - --static int str2rlimit(char *name) { -+static int str2rlimit(const char *name) { - int i; - if (!name || *name == '\0') - return -1; -@@ -352,7 +352,7 @@ static int str2rlimit(char *name) { - return -1; - } - --static rlim_t str2rlim_t(char *value) { -+static rlim_t str2rlim_t(const char *value) { - unsigned long long rlimit = 0; - - if (!value) return (rlim_t)rlimit; -@@ -384,7 +384,7 @@ static void parse_kernel_limits(pam_handle_t *pamh, struct pam_limit_s *pl, int - FILE *limitsfile; - const char *proclimits = "/proc/1/limits"; - char line[256]; -- char *units, *hard, *soft, *name; -+ const char *units, *hard, *soft, *name; - - if (!(limitsfile = fopen(proclimits, "r"))) { - pam_syslog(pamh, LOG_WARNING, "Could not read %s (%s), using PAM defaults", proclimits, strerror(errno)); -diff --git a/modules/pam_loginuid/pam_loginuid.c b/modules/pam_loginuid/pam_loginuid.c -index 96bfd98..66d202c 100644 ---- a/modules/pam_loginuid/pam_loginuid.c -+++ b/modules/pam_loginuid/pam_loginuid.c -@@ -64,7 +64,7 @@ static int set_loginuid(pam_handle_t *pamh, uid_t uid) - fd = open("/proc/self/uid_map", O_RDONLY); - if (fd >= 0) { - count = pam_modutil_read(fd, uid_map, sizeof(uid_map)); -- if (strncmp(uid_map, host_uid_map, count) != 0) -+ if (count <= 0 || strncmp(uid_map, host_uid_map, count) != 0) - rc = PAM_IGNORE; - close(fd); - } -diff --git a/modules/pam_mkhomedir/mkhomedir_helper.c b/modules/pam_mkhomedir/mkhomedir_helper.c -index 9e204c1..4b8d6b7 100644 ---- a/modules/pam_mkhomedir/mkhomedir_helper.c -+++ b/modules/pam_mkhomedir/mkhomedir_helper.c -@@ -232,6 +232,8 @@ create_homedir(const struct passwd *pwd, - { - pam_syslog(NULL, LOG_DEBUG, - "unable to open or stat src file %s: %m", newsource); -+ if (srcfd >= 0) -+ close(srcfd); - closedir(d); - - #ifndef PATH_MAX -diff --git a/modules/pam_namespace/pam_namespace.c b/modules/pam_namespace/pam_namespace.c -index f541f89..85f5efa 100644 ---- a/modules/pam_namespace/pam_namespace.c -+++ b/modules/pam_namespace/pam_namespace.c -@@ -1418,6 +1418,7 @@ static int create_instance(struct polydir_s *polyptr, char *ipath, struct stat * - if (fstat(fd, &newstatbuf) < 0) { - pam_syslog(idata->pamh, LOG_ERR, "Error stating %s, %m", - ipath); -+ close(fd); - rmdir(ipath); - return PAM_SESSION_ERR; - } -diff --git a/modules/pam_pwhistory/opasswd.c b/modules/pam_pwhistory/opasswd.c -index e6cf346..813f579 100644 ---- a/modules/pam_pwhistory/opasswd.c -+++ b/modules/pam_pwhistory/opasswd.c -@@ -326,6 +326,9 @@ save_old_pass (pam_handle_t *pamh, const char *user, uid_t uid, - n = strlen (buf); - #endif /* HAVE_GETLINE / HAVE_GETDELIM */ - -+ if (n < 1) -+ break; -+ - cp = buf; - save = strdup (buf); /* Copy to write the original data back. */ - if (save == NULL) -@@ -336,9 +339,6 @@ save_old_pass (pam_handle_t *pamh, const char *user, uid_t uid, - goto error_opasswd; - } - -- if (n < 1) -- break; -- - tmp = strchr (cp, '#'); /* remove comments */ - if (tmp) - *tmp = '\0'; -diff --git a/modules/pam_rootok/pam_rootok.c b/modules/pam_rootok/pam_rootok.c -index 17baabe..a9d9140 100644 ---- a/modules/pam_rootok/pam_rootok.c -+++ b/modules/pam_rootok/pam_rootok.c -@@ -66,14 +66,17 @@ log_callback (int type, const char *fmt, ...) - int audit_fd; - va_list ap; - -- va_start(ap, fmt); - #ifdef HAVE_LIBAUDIT - audit_fd = audit_open(); - - if (audit_fd >= 0) { - char *buf; -+ int ret; - -- if (vasprintf (&buf, fmt, ap) < 0) -+ va_start(ap, fmt); -+ ret = vasprintf (&buf, fmt, ap); -+ va_end(ap); -+ if (ret < 0) - return 0; - audit_log_user_avc_message(audit_fd, AUDIT_USER_AVC, buf, NULL, NULL, - NULL, 0); -@@ -83,6 +86,7 @@ log_callback (int type, const char *fmt, ...) - } - - #endif -+ va_start(ap, fmt); - vsyslog (LOG_USER | LOG_INFO, fmt, ap); - va_end(ap); - return 0; -diff --git a/modules/pam_sepermit/pam_sepermit.c b/modules/pam_sepermit/pam_sepermit.c -index c653290..f37af0f 100644 ---- a/modules/pam_sepermit/pam_sepermit.c -+++ b/modules/pam_sepermit/pam_sepermit.c -@@ -353,7 +353,7 @@ sepermit_match(pam_handle_t *pamh, const char *cfgfile, const char *user, - if (*sense == PAM_SUCCESS) { - if (ignore) - *sense = PAM_IGNORE; -- if (geteuid() == 0 && exclusive && get_loginuid(pamh) == -1) -+ if (geteuid() == 0 && exclusive && get_loginuid(pamh) == (uid_t)-1) - if (sepermit_lock(pamh, user, debug) < 0) - *sense = PAM_AUTH_ERR; - } diff --git a/SOURCES/pam-1.3.1-faillock-create-tallydir.patch b/SOURCES/pam-1.3.1-faillock-create-tallydir.patch deleted file mode 100644 index e2d2caf..0000000 --- a/SOURCES/pam-1.3.1-faillock-create-tallydir.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -up Linux-PAM-1.3.1/modules/pam_faillock/faillock.c.faillock-create-tallydir Linux-PAM-1.3.1/modules/pam_faillock/faillock.c ---- Linux-PAM-1.3.1/modules/pam_faillock/faillock.c.faillock-create-tallydir 2024-01-08 11:32:02.122392119 +0100 -+++ Linux-PAM-1.3.1/modules/pam_faillock/faillock.c 2024-01-08 11:33:10.916515943 +0100 -@@ -74,6 +74,9 @@ open_tally (const char *dir, const char - - if (create) { - flags |= O_CREAT; -+ if (access(dir, F_OK) != 0) { -+ mkdir(dir, 0755); -+ } - } - - fd = open(path, flags, 0600); diff --git a/SOURCES/pam-1.3.1-faillock-load-conf-from-file.patch b/SOURCES/pam-1.3.1-faillock-load-conf-from-file.patch deleted file mode 100644 index 81ea7cc..0000000 --- a/SOURCES/pam-1.3.1-faillock-load-conf-from-file.patch +++ /dev/null @@ -1,1212 +0,0 @@ -diff -up Linux-PAM-1.3.1/modules/pam_faillock/faillock.8.xml.faillock-load-conf-from-file Linux-PAM-1.3.1/modules/pam_faillock/faillock.8.xml ---- Linux-PAM-1.3.1/modules/pam_faillock/faillock.8.xml.faillock-load-conf-from-file 2022-05-26 10:57:11.713067506 +0200 -+++ Linux-PAM-1.3.1/modules/pam_faillock/faillock.8.xml 2022-05-26 10:57:11.747067749 +0200 -@@ -57,12 +57,29 @@ - - - -+ -+ -+ -+ -+ The file where the configuration is located. The default is -+ /etc/security/faillock.conf. -+ -+ -+ -+ -+ - - - - -- The directory where the user files with the failure records are kept. The -- default is /var/run/faillock. -+ The directory where the user files with the failure records are kept. -+ -+ -+ The priority to set this option is to use the value provided -+ from the command line. If this isn't provided, then the value -+ from the configuration file is used. Finally, if neither of -+ them has been provided, then -+ /var/run/faillock is used. - - - -diff -up Linux-PAM-1.3.1/modules/pam_faillock/faillock_config.c.faillock-load-conf-from-file Linux-PAM-1.3.1/modules/pam_faillock/faillock_config.c ---- Linux-PAM-1.3.1/modules/pam_faillock/faillock_config.c.faillock-load-conf-from-file 2022-05-26 10:57:11.747067749 +0200 -+++ Linux-PAM-1.3.1/modules/pam_faillock/faillock_config.c 2022-05-26 10:57:11.747067749 +0200 -@@ -0,0 +1,266 @@ -+/* -+ * Copyright (c) 2022 Tomas Mraz -+ * Copyright (c) 2022 Iker Pedrosa -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, and the entire permission notice in its entirety, -+ * including the disclaimer of warranties. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * ALTERNATIVELY, this product may be distributed under the terms of -+ * the GNU Public License, in which case the provisions of the GPL are -+ * required INSTEAD OF the above restrictions. (This clause is -+ * necessary due to a potential bad interaction between the GPL and -+ * the restrictions contained in a BSD-style copyright.) -+ * -+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -+ * OF THE POSSIBILITY OF SUCH DAMAGE. -+ */ -+ -+#include "config.h" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include "faillock_config.h" -+#include "faillock.h" -+ -+#define FAILLOCK_DEFAULT_CONF "/etc/security/faillock.conf" -+#ifdef VENDOR_SCONFIGDIR -+#define VENDOR_FAILLOCK_DEFAULT_CONF VENDOR_SCONFIGDIR "/faillock.conf" -+#endif -+ -+static void PAM_FORMAT((printf, 3, 4)) PAM_NONNULL((3)) -+config_log(const pam_handle_t *pamh, int priority, const char *fmt, ...) -+{ -+ va_list args; -+ -+ va_start(args, fmt); -+ if (pamh) { -+ pam_vsyslog(pamh, priority, fmt, args); -+ } else { -+ char *buf = NULL; -+ -+ if (vasprintf(&buf, fmt, args) < 0) { -+ fprintf(stderr, "vasprintf: %m"); -+ va_end(args); -+ return; -+ } -+ fprintf(stderr, "%s\n", buf); -+ free(buf); -+ } -+ va_end(args); -+} -+ -+/* parse a single configuration file */ -+int -+read_config_file(pam_handle_t *pamh, struct options *opts, const char *cfgfile) -+{ -+ char linebuf[FAILLOCK_CONF_MAX_LINELEN+1]; -+ const char *fname = (cfgfile != NULL) ? cfgfile : FAILLOCK_DEFAULT_CONF; -+ FILE *f = fopen(fname, "r"); -+ -+#ifdef VENDOR_FAILLOCK_DEFAULT_CONF -+ if (f == NULL && errno == ENOENT && cfgfile == NULL) { -+ /* -+ * If the default configuration file in /etc does not exist, -+ * try the vendor configuration file as fallback. -+ */ -+ f = fopen(VENDOR_FAILLOCK_DEFAULT_CONF, "r"); -+ } -+#endif /* VENDOR_FAILLOCK_DEFAULT_CONF */ -+ -+ if (f == NULL) { -+ /* ignore non-existent default config file */ -+ if (errno == ENOENT && cfgfile == NULL) -+ return PAM_SUCCESS; -+ return PAM_SERVICE_ERR; -+ } -+ -+ while (fgets(linebuf, sizeof(linebuf), f) != NULL) { -+ size_t len; -+ char *ptr; -+ char *name; -+ int eq; -+ -+ len = strlen(linebuf); -+ /* len cannot be 0 unless there is a bug in fgets */ -+ if (len && linebuf[len - 1] != '\n' && !feof(f)) { -+ (void) fclose(f); -+ return PAM_SERVICE_ERR; -+ } -+ -+ if ((ptr=strchr(linebuf, '#')) != NULL) { -+ *ptr = '\0'; -+ } else { -+ ptr = linebuf + len; -+ } -+ -+ /* drop terminating whitespace including the \n */ -+ while (ptr > linebuf) { -+ if (!isspace(*(ptr-1))) { -+ *ptr = '\0'; -+ break; -+ } -+ --ptr; -+ } -+ -+ /* skip initial whitespace */ -+ for (ptr = linebuf; isspace(*ptr); ptr++); -+ if (*ptr == '\0') -+ continue; -+ -+ /* grab the key name */ -+ eq = 0; -+ name = ptr; -+ while (*ptr != '\0') { -+ if (isspace(*ptr) || *ptr == '=') { -+ eq = *ptr == '='; -+ *ptr = '\0'; -+ ++ptr; -+ break; -+ } -+ ++ptr; -+ } -+ -+ /* grab the key value */ -+ while (*ptr != '\0') { -+ if (*ptr != '=' || eq) { -+ if (!isspace(*ptr)) { -+ break; -+ } -+ } else { -+ eq = 1; -+ } -+ ++ptr; -+ } -+ -+ /* set the key:value pair on opts */ -+ set_conf_opt(pamh, opts, name, ptr); -+ } -+ -+ (void)fclose(f); -+ return PAM_SUCCESS; -+} -+ -+void -+set_conf_opt(pam_handle_t *pamh, struct options *opts, const char *name, -+ const char *value) -+{ -+ if (strcmp(name, "dir") == 0) { -+ if (value[0] != '/') { -+ config_log(pamh, LOG_ERR, -+ "Tally directory is not absolute path (%s); keeping value", -+ value); -+ } else { -+ free(opts->dir); -+ opts->dir = strdup(value); -+ if (opts->dir == NULL) { -+ opts->fatal_error = 1; -+ config_log(pamh, LOG_CRIT, "Error allocating memory: %m"); -+ } -+ } -+ } -+ else if (strcmp(name, "deny") == 0) { -+ if (sscanf(value, "%hu", &opts->deny) != 1) { -+ config_log(pamh, LOG_ERR, -+ "Bad number supplied for deny argument"); -+ } -+ } -+ else if (strcmp(name, "fail_interval") == 0) { -+ unsigned int temp; -+ if (sscanf(value, "%u", &temp) != 1 || -+ temp > MAX_TIME_INTERVAL) { -+ config_log(pamh, LOG_ERR, -+ "Bad number supplied for fail_interval argument"); -+ } else { -+ opts->fail_interval = temp; -+ } -+ } -+ else if (strcmp(name, "unlock_time") == 0) { -+ unsigned int temp; -+ -+ if (strcmp(value, "never") == 0) { -+ opts->unlock_time = 0; -+ } -+ else if (sscanf(value, "%u", &temp) != 1 || -+ temp > MAX_TIME_INTERVAL) { -+ config_log(pamh, LOG_ERR, -+ "Bad number supplied for unlock_time argument"); -+ } -+ else { -+ opts->unlock_time = temp; -+ } -+ } -+ else if (strcmp(name, "root_unlock_time") == 0) { -+ unsigned int temp; -+ -+ if (strcmp(value, "never") == 0) { -+ opts->root_unlock_time = 0; -+ } -+ else if (sscanf(value, "%u", &temp) != 1 || -+ temp > MAX_TIME_INTERVAL) { -+ config_log(pamh, LOG_ERR, -+ "Bad number supplied for root_unlock_time argument"); -+ } else { -+ opts->root_unlock_time = temp; -+ } -+ } -+ else if (strcmp(name, "admin_group") == 0) { -+ free(opts->admin_group); -+ opts->admin_group = strdup(value); -+ if (opts->admin_group == NULL) { -+ opts->fatal_error = 1; -+ config_log(pamh, LOG_CRIT, "Error allocating memory: %m"); -+ } -+ } -+ else if (strcmp(name, "even_deny_root") == 0) { -+ opts->flags |= FAILLOCK_FLAG_DENY_ROOT; -+ } -+ else if (strcmp(name, "audit") == 0) { -+ opts->flags |= FAILLOCK_FLAG_AUDIT; -+ } -+ else if (strcmp(name, "silent") == 0) { -+ opts->flags |= FAILLOCK_FLAG_SILENT; -+ } -+ else if (strcmp(name, "no_log_info") == 0) { -+ opts->flags |= FAILLOCK_FLAG_NO_LOG_INFO; -+ } -+ else if (strcmp(name, "local_users_only") == 0) { -+ opts->flags |= FAILLOCK_FLAG_LOCAL_ONLY; -+ } -+ else if (strcmp(name, "nodelay") == 0) { -+ opts->flags |= FAILLOCK_FLAG_NO_DELAY; -+ } -+ else { -+ config_log(pamh, LOG_ERR, "Unknown option: %s", name); -+ } -+} -+ -+const char *get_tally_dir(const struct options *opts) -+{ -+ return (opts->dir != NULL) ? opts->dir : FAILLOCK_DEFAULT_TALLYDIR; -+} -diff -up Linux-PAM-1.3.1/modules/pam_faillock/faillock_config.h.faillock-load-conf-from-file Linux-PAM-1.3.1/modules/pam_faillock/faillock_config.h ---- Linux-PAM-1.3.1/modules/pam_faillock/faillock_config.h.faillock-load-conf-from-file 2022-05-26 10:57:11.747067749 +0200 -+++ Linux-PAM-1.3.1/modules/pam_faillock/faillock_config.h 2022-05-26 10:57:11.747067749 +0200 -@@ -0,0 +1,89 @@ -+/* -+ * Copyright (c) 2022 Tomas Mraz -+ * Copyright (c) 2022 Iker Pedrosa -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, and the entire permission notice in its entirety, -+ * including the disclaimer of warranties. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * ALTERNATIVELY, this product may be distributed under the terms of -+ * the GNU Public License, in which case the provisions of the GPL are -+ * required INSTEAD OF the above restrictions. (This clause is -+ * necessary due to a potential bad interaction between the GPL and -+ * the restrictions contained in a BSD-style copyright.) -+ * -+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -+ * OF THE POSSIBILITY OF SUCH DAMAGE. -+ */ -+ -+/* -+ * faillock_config.h - load configuration options from file -+ * -+ */ -+ -+#ifndef _FAILLOCK_CONFIG_H -+#define _FAILLOCK_CONFIG_H -+ -+#include -+#include -+#include -+ -+#include -+ -+#define FAILLOCK_FLAG_DENY_ROOT 0x1 -+#define FAILLOCK_FLAG_AUDIT 0x2 -+#define FAILLOCK_FLAG_SILENT 0x4 -+#define FAILLOCK_FLAG_NO_LOG_INFO 0x8 -+#define FAILLOCK_FLAG_UNLOCKED 0x10 -+#define FAILLOCK_FLAG_LOCAL_ONLY 0x20 -+#define FAILLOCK_FLAG_NO_DELAY 0x40 -+ -+#define FAILLOCK_CONF_MAX_LINELEN 1023 -+#define MAX_TIME_INTERVAL 604800 /* 7 days */ -+ -+struct options { -+ unsigned int action; -+ unsigned int flags; -+ unsigned short deny; -+ unsigned int fail_interval; -+ unsigned int unlock_time; -+ unsigned int root_unlock_time; -+ char *dir; -+ const char *user; -+ char *admin_group; -+ int failures; -+ uint64_t latest_time; -+ uid_t uid; -+ int is_admin; -+ uint64_t now; -+ int fatal_error; -+ -+ unsigned int reset; -+ const char *progname; -+}; -+ -+int read_config_file(pam_handle_t *pamh, struct options *opts, -+ const char *cfgfile); -+void set_conf_opt(pam_handle_t *pamh, struct options *opts, const char *name, -+ const char *value); -+const char *get_tally_dir(const struct options *opts); -+ -+#endif /* _FAILLOCK_CONFIG_H */ -diff -up Linux-PAM-1.3.1/modules/pam_faillock/main.c.faillock-load-conf-from-file Linux-PAM-1.3.1/modules/pam_faillock/main.c ---- Linux-PAM-1.3.1/modules/pam_faillock/main.c.faillock-load-conf-from-file 2022-05-26 10:57:11.713067506 +0200 -+++ Linux-PAM-1.3.1/modules/pam_faillock/main.c 2022-05-26 10:57:11.747067749 +0200 -@@ -48,43 +48,50 @@ - #include - #endif - -+#include "pam_inline.h" - #include "faillock.h" -- --struct options { -- unsigned int reset; -- const char *dir; -- const char *user; -- const char *progname; --}; -+#include "faillock_config.h" - - static int - args_parse(int argc, char **argv, struct options *opts) - { - int i; -+ int rv; -+ const char *dir = NULL; -+ const char *conf = NULL; -+ - memset(opts, 0, sizeof(*opts)); - -- opts->dir = FAILLOCK_DEFAULT_TALLYDIR; - opts->progname = argv[0]; - - for (i = 1; i < argc; ++i) { -- -- if (strcmp(argv[i], "--dir") == 0) { -+ if (strcmp(argv[i], "--conf") == 0) { -+ ++i; -+ if (i >= argc || strlen(argv[i]) == 0) { -+ fprintf(stderr, "%s: No configuration file supplied.\n", -+ argv[0]); -+ return -1; -+ } -+ conf = argv[i]; -+ } -+ else if (strcmp(argv[i], "--dir") == 0) { - ++i; - if (i >= argc || strlen(argv[i]) == 0) { -- fprintf(stderr, "%s: No directory supplied.\n", argv[0]); -+ fprintf(stderr, "%s: No records directory supplied.\n", -+ argv[0]); - return -1; - } -- opts->dir = argv[i]; -- } -+ dir = argv[i]; -+ } - else if (strcmp(argv[i], "--user") == 0) { - ++i; - if (i >= argc || strlen(argv[i]) == 0) { -- fprintf(stderr, "%s: No user name supplied.\n", argv[0]); -+ fprintf(stderr, "%s: No user name supplied.\n", argv[0]); - return -1; - } -- opts->user = argv[i]; -+ opts->user = argv[i]; - } -- else if (strcmp(argv[i], "--reset") == 0) { -+ else if (strcmp(argv[i], "--reset") == 0) { - opts->reset = 1; - } - else { -@@ -92,6 +99,21 @@ args_parse(int argc, char **argv, struct - return -1; - } - } -+ -+ if ((rv = read_config_file(NULL, opts, conf)) != PAM_SUCCESS) { -+ fprintf(stderr, "Configuration file missing or broken"); -+ return rv; -+ } -+ -+ if (dir != NULL) { -+ free(opts->dir); -+ opts->dir = strdup(dir); -+ if (opts->dir == NULL) { -+ fprintf(stderr, "Error allocating memory: %m"); -+ return -1; -+ } -+ } -+ - return 0; - } - -@@ -109,10 +131,11 @@ do_user(struct options *opts, const char - int rv; - struct tally_data tallies; - struct passwd *pwd; -+ const char *dir = get_tally_dir(opts); - - pwd = getpwnam(user); - -- fd = open_tally(opts->dir, user, pwd != NULL ? pwd->pw_uid : 0, 0); -+ fd = open_tally(dir, user, pwd != NULL ? pwd->pw_uid : 0, 0); - - if (fd == -1) { - if (errno == ENOENT) { -@@ -189,11 +212,11 @@ do_allusers(struct options *opts) - { - struct dirent **userlist; - int rv, i; -+ const char *dir = get_tally_dir(opts); - -- rv = scandir(opts->dir, &userlist, NULL, alphasort); -+ rv = scandir(dir, &userlist, NULL, alphasort); - if (rv < 0) { -- fprintf(stderr, "%s: Error reading tally directory: ", opts->progname); -- perror(NULL); -+ fprintf(stderr, "%s: Error reading tally directory: %m\n", opts->progname); - return 2; - } - -diff -up Linux-PAM-1.3.1/modules/pam_faillock/Makefile.am.faillock-load-conf-from-file Linux-PAM-1.3.1/modules/pam_faillock/Makefile.am ---- Linux-PAM-1.3.1/modules/pam_faillock/Makefile.am.faillock-load-conf-from-file 2022-05-26 10:57:11.727067606 +0200 -+++ Linux-PAM-1.3.1/modules/pam_faillock/Makefile.am 2022-05-26 10:57:59.032406450 +0200 -@@ -17,7 +17,7 @@ TESTS = tst-pam_faillock - securelibdir = $(SECUREDIR) - secureconfdir = $(SCONFIGDIR) - --noinst_HEADERS = faillock.h -+noinst_HEADERS = faillock.h faillock_config.h - - faillock_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include @PIE_CFLAGS@ - pam_faillock_la_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include -@@ -36,8 +36,8 @@ secureconf_DATA = faillock.conf - securelib_LTLIBRARIES = pam_faillock.la - sbin_PROGRAMS = faillock - --pam_faillock_la_SOURCES = pam_faillock.c faillock.c --faillock_SOURCES = main.c faillock.c -+pam_faillock_la_SOURCES = pam_faillock.c faillock.c faillock_config.c -+faillock_SOURCES = main.c faillock.c faillock_config.c - - if ENABLE_REGENERATE_MAN - noinst_DATA = README -diff -up Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.c.faillock-load-conf-from-file Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.c ---- Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.c.faillock-load-conf-from-file 2022-05-26 10:57:11.727067606 +0200 -+++ Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.c 2022-05-26 10:57:11.748067756 +0200 -@@ -38,7 +38,6 @@ - #include - #include - #include --#include - #include - #include - #include -@@ -54,83 +53,50 @@ - #include - #include - -+#include "pam_inline.h" - #include "faillock.h" -- --#define PAM_SM_AUTH --#define PAM_SM_ACCOUNT -+#include "faillock_config.h" - - #define FAILLOCK_ACTION_PREAUTH 0 - #define FAILLOCK_ACTION_AUTHSUCC 1 - #define FAILLOCK_ACTION_AUTHFAIL 2 - --#define FAILLOCK_FLAG_DENY_ROOT 0x1 --#define FAILLOCK_FLAG_AUDIT 0x2 --#define FAILLOCK_FLAG_SILENT 0x4 --#define FAILLOCK_FLAG_NO_LOG_INFO 0x8 --#define FAILLOCK_FLAG_UNLOCKED 0x10 --#define FAILLOCK_FLAG_LOCAL_ONLY 0x20 -- --#define MAX_TIME_INTERVAL 604800 /* 7 days */ --#define FAILLOCK_CONF_MAX_LINELEN 1023 --#define FAILLOCK_ERROR_CONF_OPEN -3 --#define FAILLOCK_ERROR_CONF_MALFORMED -4 -- --#define PATH_PASSWD "/etc/passwd" -- --struct options { -- unsigned int action; -- unsigned int flags; -- unsigned short deny; -- unsigned int fail_interval; -- unsigned int unlock_time; -- unsigned int root_unlock_time; -- char *dir; -- const char *conf; -- const char *user; -- char *admin_group; -- int failures; -- uint64_t latest_time; -- uid_t uid; -- int is_admin; -- uint64_t now; -- int fatal_error; --}; -- --int read_config_file( -- pam_handle_t *pamh, -- struct options *opts, -- const char *cfgfile --); -- --void set_conf_opt( -- pam_handle_t *pamh, -- struct options *opts, -- const char *name, -- const char *value --); -- --static void -+static int - args_parse(pam_handle_t *pamh, int argc, const char **argv, - int flags, struct options *opts) - { - int i; -+ int config_arg_index = -1; - int rv; -+ const char *conf = NULL; -+ - memset(opts, 0, sizeof(*opts)); - -- opts->dir = strdup(FAILLOCK_DEFAULT_TALLYDIR); -- opts->conf = FAILLOCK_DEFAULT_CONF; - opts->deny = 3; - opts->fail_interval = 900; - opts->unlock_time = 600; - opts->root_unlock_time = MAX_TIME_INTERVAL+1; - -- if ((rv=read_config_file(pamh, opts, opts->conf)) != PAM_SUCCESS) { -- pam_syslog(pamh, LOG_DEBUG, -- "Configuration file missing"); -+ for (i = 0; i < argc; ++i) { -+ const char *str = pam_str_skip_prefix(argv[i], "conf="); -+ -+ if (str != NULL) { -+ conf = str; -+ config_arg_index = i; -+ } -+ } -+ -+ if ((rv = read_config_file(pamh, opts, conf)) != PAM_SUCCESS) { -+ pam_syslog(pamh, LOG_ERR, -+ "Configuration file missing or broken"); -+ return rv; - } - - for (i = 0; i < argc; ++i) { -- if (strcmp(argv[i], "preauth") == 0) { -+ if (i == config_arg_index) { -+ continue; -+ } -+ else if (strcmp(argv[i], "preauth") == 0) { - opts->action = FAILLOCK_ACTION_PREAUTH; - } - else if (strcmp(argv[i], "authfail") == 0) { -@@ -163,226 +129,26 @@ args_parse(pam_handle_t *pamh, int argc, - if (flags & PAM_SILENT) - opts->flags |= FAILLOCK_FLAG_SILENT; - -- if (opts->dir == NULL) { -- pam_syslog(pamh, LOG_CRIT, "Error allocating memory: %m"); -- opts->fatal_error = 1; -- } --} -- --/* parse a single configuration file */ --int --read_config_file(pam_handle_t *pamh, struct options *opts, const char *cfgfile) --{ -- FILE *f; -- char linebuf[FAILLOCK_CONF_MAX_LINELEN+1]; -- -- f = fopen(cfgfile, "r"); -- if (f == NULL) { -- /* ignore non-existent default config file */ -- if (errno == ENOENT && strcmp(cfgfile, FAILLOCK_DEFAULT_CONF) == 0) -- return 0; -- return FAILLOCK_ERROR_CONF_OPEN; -- } -- -- while (fgets(linebuf, sizeof(linebuf), f) != NULL) { -- size_t len; -- char *ptr; -- char *name; -- int eq; -- -- len = strlen(linebuf); -- /* len cannot be 0 unless there is a bug in fgets */ -- if (len && linebuf[len - 1] != '\n' && !feof(f)) { -- (void) fclose(f); -- return FAILLOCK_ERROR_CONF_MALFORMED; -- } -- -- if ((ptr=strchr(linebuf, '#')) != NULL) { -- *ptr = '\0'; -- } else { -- ptr = linebuf + len; -- } -- -- /* drop terminating whitespace including the \n */ -- while (ptr > linebuf) { -- if (!isspace(*(ptr-1))) { -- *ptr = '\0'; -- break; -- } -- --ptr; -- } -- -- /* skip initial whitespace */ -- for (ptr = linebuf; isspace(*ptr); ptr++); -- if (*ptr == '\0') -- continue; -- -- /* grab the key name */ -- eq = 0; -- name = ptr; -- while (*ptr != '\0') { -- if (isspace(*ptr) || *ptr == '=') { -- eq = *ptr == '='; -- *ptr = '\0'; -- ++ptr; -- break; -- } -- ++ptr; -- } -- -- /* grab the key value */ -- while (*ptr != '\0') { -- if (*ptr != '=' || eq) { -- if (!isspace(*ptr)) { -- break; -- } -- } else { -- eq = 1; -- } -- ++ptr; -- } -- -- /* set the key:value pair on opts */ -- set_conf_opt(pamh, opts, name, ptr); -- } -- -- (void)fclose(f); -+ if (opts->fatal_error) -+ return PAM_BUF_ERR; - return PAM_SUCCESS; - } - --void set_conf_opt(pam_handle_t *pamh, struct options *opts, const char *name, const char *value) --{ -- if (strcmp(name, "dir") == 0) { -- if (value[0] != '/') { -- pam_syslog(pamh, LOG_ERR, -- "Tally directory is not absolute path (%s); keeping default", value); -- } else { -- free(opts->dir); -- opts->dir = strdup(value); -- } -- } -- else if (strcmp(name, "deny") == 0) { -- if (sscanf(value, "%hu", &opts->deny) != 1) { -- pam_syslog(pamh, LOG_ERR, -- "Bad number supplied for deny argument"); -- } -- } -- else if (strcmp(name, "fail_interval") == 0) { -- unsigned int temp; -- if (sscanf(value, "%u", &temp) != 1 || -- temp > MAX_TIME_INTERVAL) { -- pam_syslog(pamh, LOG_ERR, -- "Bad number supplied for fail_interval argument"); -- } else { -- opts->fail_interval = temp; -- } -- } -- else if (strcmp(name, "unlock_time") == 0) { -- unsigned int temp; -- -- if (strcmp(value, "never") == 0) { -- opts->unlock_time = 0; -- } -- else if (sscanf(value, "%u", &temp) != 1 || -- temp > MAX_TIME_INTERVAL) { -- pam_syslog(pamh, LOG_ERR, -- "Bad number supplied for unlock_time argument"); -- } -- else { -- opts->unlock_time = temp; -- } -- } -- else if (strcmp(name, "root_unlock_time") == 0) { -- unsigned int temp; -- -- if (strcmp(value, "never") == 0) { -- opts->root_unlock_time = 0; -- } -- else if (sscanf(value, "%u", &temp) != 1 || -- temp > MAX_TIME_INTERVAL) { -- pam_syslog(pamh, LOG_ERR, -- "Bad number supplied for root_unlock_time argument"); -- } else { -- opts->root_unlock_time = temp; -- } -- } -- else if (strcmp(name, "admin_group") == 0) { -- free(opts->admin_group); -- opts->admin_group = strdup(value); -- if (opts->admin_group == NULL) { -- opts->fatal_error = 1; -- pam_syslog(pamh, LOG_CRIT, "Error allocating memory: %m"); -- } -- } -- else if (strcmp(name, "even_deny_root") == 0) { -- opts->flags |= FAILLOCK_FLAG_DENY_ROOT; -- } -- else if (strcmp(name, "audit") == 0) { -- opts->flags |= FAILLOCK_FLAG_AUDIT; -- } -- else if (strcmp(name, "silent") == 0) { -- opts->flags |= FAILLOCK_FLAG_SILENT; -- } -- else if (strcmp(name, "no_log_info") == 0) { -- opts->flags |= FAILLOCK_FLAG_NO_LOG_INFO; -- } -- else if (strcmp(name, "local_users_only") == 0) { -- opts->flags |= FAILLOCK_FLAG_LOCAL_ONLY; -- } -- else { -- pam_syslog(pamh, LOG_ERR, "Unknown option: %s", name); -- } --} -- --static int check_local_user (pam_handle_t *pamh, const char *user) -+static int -+check_local_user (pam_handle_t *pamh, const char *user) - { -- struct passwd pw, *pwp; -- char buf[4096]; -- int found = 0; -- FILE *fp; -- int errn; -- -- fp = fopen(PATH_PASSWD, "r"); -- if (fp == NULL) { -- pam_syslog(pamh, LOG_ERR, "unable to open %s: %m", -- PATH_PASSWD); -- return -1; -- } -- -- for (;;) { -- errn = fgetpwent_r(fp, &pw, buf, sizeof (buf), &pwp); -- if (errn == ERANGE) { -- pam_syslog(pamh, LOG_WARNING, "%s contains very long lines; corrupted?", -- PATH_PASSWD); -- /* we can continue here as next call will read further */ -- continue; -- } -- if (errn != 0) -- break; -- if (strcmp(pwp->pw_name, user) == 0) { -- found = 1; -- break; -- } -- } -- -- fclose (fp); -- -- if (errn != 0 && errn != ENOENT) { -- pam_syslog(pamh, LOG_ERR, "unable to enumerate local accounts: %m"); -- return -1; -- } else { -- return found; -- } -+ return pam_modutil_check_user_in_passwd(pamh, user, NULL) == PAM_SUCCESS; - } - --static int get_pam_user(pam_handle_t *pamh, struct options *opts) -+static int -+get_pam_user(pam_handle_t *pamh, struct options *opts) - { - const char *user; - int rv; - struct passwd *pwd; - - if ((rv=pam_get_user(pamh, &user, NULL)) != PAM_SUCCESS) { -- return rv; -+ return rv == PAM_CONV_AGAIN ? PAM_INCOMPLETE : rv; - } - - if (*user == '\0') { -@@ -391,10 +157,10 @@ static int get_pam_user(pam_handle_t *pa - - if ((pwd=pam_modutil_getpwnam(pamh, user)) == NULL) { - if (opts->flags & FAILLOCK_FLAG_AUDIT) { -- pam_syslog(pamh, LOG_ERR, "User unknown: %s", user); -+ pam_syslog(pamh, LOG_NOTICE, "User unknown: %s", user); - } - else { -- pam_syslog(pamh, LOG_ERR, "User unknown"); -+ pam_syslog(pamh, LOG_NOTICE, "User unknown"); - } - return PAM_IGNORE; - } -@@ -421,10 +187,11 @@ check_tally(pam_handle_t *pamh, struct o - unsigned int i; - uint64_t latest_time; - int failures; -+ const char *dir = get_tally_dir(opts); - - opts->now = time(NULL); - -- tfd = open_tally(opts->dir, opts->user, opts->uid, 0); -+ tfd = open_tally(dir, opts->user, opts->uid, 0); - - *fd = tfd; - -@@ -446,7 +213,7 @@ check_tally(pam_handle_t *pamh, struct o - } - - latest_time = 0; -- for(i = 0; i < tallies->count; i++) { -+ for (i = 0; i < tallies->count; i++) { - if ((tallies->records[i].status & TALLY_STATUS_VALID) && - tallies->records[i].time > latest_time) - latest_time = tallies->records[i].time; -@@ -455,7 +222,7 @@ check_tally(pam_handle_t *pamh, struct o - opts->latest_time = latest_time; - - failures = 0; -- for(i = 0; i < tallies->count; i++) { -+ for (i = 0; i < tallies->count; i++) { - if ((tallies->records[i].status & TALLY_STATUS_VALID) && - latest_time - tallies->records[i].time < opts->fail_interval) { - ++failures; -@@ -498,9 +265,10 @@ static void - reset_tally(pam_handle_t *pamh, struct options *opts, int *fd) - { - int rv; -+ const char *dir = get_tally_dir(opts); - - if (*fd == -1) { -- *fd = open_tally(opts->dir, opts->user, opts->uid, 1); -+ *fd = open_tally(dir, opts->user, opts->uid, 1); - } - else { - while ((rv=ftruncate(*fd, 0)) == -1 && errno == EINTR); -@@ -519,9 +287,10 @@ write_tally(pam_handle_t *pamh, struct o - unsigned int oldest; - uint64_t oldtime; - const void *source = NULL; -+ const char *dir = get_tally_dir(opts); - - if (*fd == -1) { -- *fd = open_tally(opts->dir, opts->user, opts->uid, 1); -+ *fd = open_tally(dir, opts->user, opts->uid, 1); - } - if (*fd == -1) { - if (errno == EACCES) { -@@ -536,7 +305,7 @@ write_tally(pam_handle_t *pamh, struct o - failures = 0; - - for (i = 0; i < tallies->count; ++i) { -- if (tallies->records[i].time < oldtime) { -+ if (oldtime == 0 || tallies->records[i].time < oldtime) { - oldtime = tallies->records[i].time; - oldest = i; - } -@@ -630,16 +399,26 @@ faillock_message(pam_handle_t *pamh, str - left = opts->latest_time + opts->unlock_time - opts->now; - } - -+ pam_info(pamh, _("The account is locked due to %u failed logins."), -+ (unsigned int)opts->failures); - if (left > 0) { - left = (left + 59)/60; /* minutes */ - -- pam_info(pamh, _("Account temporarily locked due to %d failed logins"), -- opts->failures); -- pam_info(pamh, _("(%d minutes left to unlock)"), (int)left); -- } -- else { -- pam_info(pamh, _("Account locked due to %d failed logins"), -- opts->failures); -+#if defined HAVE_DNGETTEXT && defined ENABLE_NLS -+ pam_info( -+ pamh, -+ dngettext(PACKAGE, -+ "(%d minute left to unlock)", -+ "(%d minutes left to unlock)", -+ (int)left), -+ (int)left); -+#else -+ if (left == 1) -+ pam_info(pamh, _("(%d minute left to unlock)"), (int)left); -+ else -+ /* TRANSLATORS: only used if dngettext is not supported. */ -+ pam_info(pamh, _("(%d minutes left to unlock)"), (int)left); -+#endif - } - } - } -@@ -663,7 +442,7 @@ opts_cleanup(struct options *opts) - - /*---------------------------------------------------------------------*/ - --PAM_EXTERN int -+int - pam_sm_authenticate(pam_handle_t *pamh, int flags, - int argc, const char **argv) - { -@@ -673,13 +452,13 @@ pam_sm_authenticate(pam_handle_t *pamh, - - memset(&tallies, 0, sizeof(tallies)); - -- args_parse(pamh, argc, argv, flags, &opts); -- if (opts.fatal_error) { -- rv = PAM_BUF_ERR; -+ rv = args_parse(pamh, argc, argv, flags, &opts); -+ if (rv != PAM_SUCCESS) - goto err; -- } - -- pam_fail_delay(pamh, 2000000); /* 2 sec delay for on failure */ -+ if (!(opts.flags & FAILLOCK_FLAG_NO_DELAY)) { -+ pam_fail_delay(pamh, 2000000); /* 2 sec delay on failure */ -+ } - - if ((rv=get_pam_user(pamh, &opts)) != PAM_SUCCESS) { - goto err; -@@ -722,7 +501,7 @@ err: - - /*---------------------------------------------------------------------*/ - --PAM_EXTERN int -+int - pam_sm_setcred(pam_handle_t *pamh UNUSED, int flags UNUSED, - int argc UNUSED, const char **argv UNUSED) - { -@@ -731,7 +510,7 @@ pam_sm_setcred(pam_handle_t *pamh UNUSED - - /*---------------------------------------------------------------------*/ - --PAM_EXTERN int -+int - pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, - int argc, const char **argv) - { -@@ -741,12 +520,10 @@ pam_sm_acct_mgmt(pam_handle_t *pamh, int - - memset(&tallies, 0, sizeof(tallies)); - -- args_parse(pamh, argc, argv, flags, &opts); -+ rv = args_parse(pamh, argc, argv, flags, &opts); - -- if (opts.fatal_error) { -- rv = PAM_BUF_ERR; -+ if (rv != PAM_SUCCESS) - goto err; -- } - - opts.action = FAILLOCK_ACTION_AUTHSUCC; - -@@ -770,28 +547,3 @@ err: - - /*-----------------------------------------------------------------------*/ - --#ifdef PAM_STATIC -- --/* static module data */ -- --struct pam_module _pam_faillock_modstruct = { -- MODULE_NAME, --#ifdef PAM_SM_AUTH -- pam_sm_authenticate, -- pam_sm_setcred, --#else -- NULL, -- NULL, --#endif --#ifdef PAM_SM_ACCOUNT -- pam_sm_acct_mgmt, --#else -- NULL, --#endif -- NULL, -- NULL, -- NULL, --}; -- --#endif /* #ifdef PAM_STATIC */ -- -diff --git a/modules/pam_faillock/faillock.h b/modules/pam_faillock/faillock.h -index b22a9dfb..0ea0ffba 100644 ---- a/modules/pam_faillock/faillock.h -+++ b/modules/pam_faillock/faillock.h -diff -up Linux-PAM-1.5.1/modules/pam_faillock/faillock.h.faillock-load-conf-from-file Linux-PAM-1.5.1/modules/pam_faillock/faillock.h ---- Linux-PAM-1.5.1/modules/pam_faillock/faillock.h.faillock-load-conf-from-file 2020-11-25 17:57:02.000000000 +0100 -+++ Linux-PAM-1.5.1/modules/pam_faillock/faillock.h 2022-05-25 15:33:03.885551825 +0200 -@@ -67,7 +67,6 @@ struct tally_data { - }; - - #define FAILLOCK_DEFAULT_TALLYDIR "/var/run/faillock" --#define FAILLOCK_DEFAULT_CONF "/etc/security/faillock.conf" - - int open_tally(const char *dir, const char *user, uid_t uid, int create); - int read_tally(int fd, struct tally_data *tallies); -diff --git a/modules/pam_faillock/pam_faillock.c b/modules/pam_faillock/pam_faillock.c -index ddbb90e7..f46fca99 100644 ---- a/modules/pam_faillock/pam_faillock.c -+++ b/modules/pam_faillock/pam_faillock.c -@@ -134,10 +134,96 @@ args_parse(pam_handle_t *pamh, int argc, const char **argv, - return PAM_SUCCESS; - } - -+static int -+check_user_in_passwd(pam_handle_t *pamh, -+ const char *user_name, -+ const char *file_name) -+{ -+ int rc; -+ size_t user_len; -+ FILE *fp; -+ char line[BUFSIZ]; -+ -+ /* Validate the user name. */ -+ if ((user_len = strlen(user_name)) == 0) { -+ pam_syslog(pamh, LOG_NOTICE, "user name is not valid"); -+ return PAM_SERVICE_ERR; -+ } -+ -+ if (user_len > sizeof(line) - sizeof(":")) { -+ pam_syslog(pamh, LOG_NOTICE, "user name is too long"); -+ return PAM_SERVICE_ERR; -+ } -+ -+ if (strchr(user_name, ':') != NULL) { -+ /* -+ * "root:x" is not a local user name even if the passwd file -+ * contains a line starting with "root:x:". -+ */ -+ return PAM_PERM_DENIED; -+ } -+ -+ /* Open the passwd file. */ -+ if (file_name == NULL) { -+ file_name = "/etc/passwd"; -+ } -+ if ((fp = fopen(file_name, "r")) == NULL) { -+ pam_syslog(pamh, LOG_ERR, "error opening %s: %m", file_name); -+ return PAM_SERVICE_ERR; -+ } -+ -+ /* -+ * Scan the file using fgets() instead of fgetpwent_r() because -+ * the latter is not flexible enough in handling long lines -+ * in passwd files. -+ */ -+ rc = PAM_PERM_DENIED; -+ while (fgets(line, sizeof(line), fp) != NULL) { -+ size_t line_len; -+ const char *str; -+ -+ /* -+ * Does this line start with the user name -+ * followed by a colon? -+ */ -+ if (strncmp(user_name, line, user_len) == 0 && -+ line[user_len] == ':') { -+ rc = PAM_SUCCESS; -+ /* -+ * Continue reading the file to avoid timing attacks. -+ */ -+ } -+ /* Has a newline been read? */ -+ line_len = strlen(line); -+ if (line_len < sizeof(line) - 1 || -+ line[line_len - 1] == '\n') { -+ /* Yes, continue with the next line. */ -+ continue; -+ } -+ -+ /* No, read till the end of this line first. */ -+ while ((str = fgets(line, sizeof(line), fp)) != NULL) { -+ line_len = strlen(line); -+ if (line_len == 0 || -+ line[line_len - 1] == '\n') { -+ break; -+ } -+ } -+ if (str == NULL) { -+ /* fgets returned NULL, we are done. */ -+ break; -+ } -+ /* Continue with the next line. */ -+ } -+ -+ fclose(fp); -+ return rc; -+} -+ - static int - check_local_user (pam_handle_t *pamh, const char *user) - { -- return pam_modutil_check_user_in_passwd(pamh, user, NULL) == PAM_SUCCESS; -+ return check_user_in_passwd(pamh, user, NULL) == PAM_SUCCESS; - } - - static int diff --git a/SOURCES/pam-1.3.1-faillock-update.patch b/SOURCES/pam-1.3.1-faillock-update.patch deleted file mode 100644 index c001f48..0000000 --- a/SOURCES/pam-1.3.1-faillock-update.patch +++ /dev/null @@ -1,1186 +0,0 @@ -diff -up Linux-PAM-1.3.1/modules/pam_faillock/faillock.c.faillock-update Linux-PAM-1.3.1/modules/pam_faillock/faillock.c ---- Linux-PAM-1.3.1/modules/pam_faillock/faillock.c.faillock-update 2019-10-16 16:49:27.026893768 +0200 -+++ Linux-PAM-1.3.1/modules/pam_faillock/faillock.c 2019-12-16 17:55:27.042001068 +0100 -@@ -1,5 +1,6 @@ - /* - * Copyright (c) 2010 Tomas Mraz -+ * Copyright (c) 2010, 2016, 2017 Red Hat, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions -@@ -47,6 +48,8 @@ - - #include "faillock.h" - -+#define ignore_return(x) if (1==((int)x)) {;} -+ - int - open_tally (const char *dir, const char *user, uid_t uid, int create) - { -@@ -54,7 +57,7 @@ open_tally (const char *dir, const char - int flags = O_RDWR; - int fd; - -- if (strstr(user, "../") != NULL) -+ if (dir == NULL || strstr(user, "../") != NULL) - /* just a defensive programming as the user must be a - * valid user on the system anyway - */ -@@ -83,7 +86,7 @@ open_tally (const char *dir, const char - while (flock(fd, LOCK_EX) == -1 && errno == EINTR); - if (fstat(fd, &st) == 0) { - if (st.st_uid != uid) { -- fchown(fd, uid, -1); -+ ignore_return(fchown(fd, uid, -1)); - } - } - } -@@ -121,7 +124,7 @@ read_tally(int fd, struct tally_data *ta - if (count >= MAX_RECORDS) - break; - } -- while (chunk == CHUNK_SIZE); -+ while (chunk == CHUNK_SIZE); - - tallies->records = data; - tallies->count = count; -diff -up Linux-PAM-1.3.1/modules/pam_faillock/faillock.conf.5.xml.faillock-update Linux-PAM-1.3.1/modules/pam_faillock/faillock.conf.5.xml ---- Linux-PAM-1.3.1/modules/pam_faillock/faillock.conf.5.xml.faillock-update 2019-10-16 17:34:58.073276020 +0200 -+++ Linux-PAM-1.3.1/modules/pam_faillock/faillock.conf.5.xml 2019-10-16 16:26:05.000000000 +0200 -@@ -0,0 +1,243 @@ -+ -+ -+ -+ -+ -+ -+ faillock.conf -+ 5 -+ Linux-PAM Manual -+ -+ -+ -+ faillock.conf -+ pam_faillock configuration file -+ -+ -+ -+ -+ DESCRIPTION -+ -+ faillock.conf provides a way to configure the -+ default settings for locking the user after multiple failed authentication attempts. -+ This file is read by the pam_faillock module and is the -+ preferred method over configuring pam_faillock directly. -+ -+ -+ The file has a very simple name = value format with possible comments -+ starting with # character. The whitespace at the beginning of line, end -+ of line, and around the = sign is ignored. -+ -+ -+ -+ -+ -+ OPTIONS -+ -+ -+ -+ -+ -+ -+ -+ The directory where the user files with the failure records are kept. The -+ default is /var/run/faillock. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Will log the user name into the system log if the user is not found. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Don't print informative messages to the user. Please note that when -+ this option is not used there will be difference in the authentication -+ behavior for users which exist on the system and non-existing users. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Don't log informative messages via syslog3. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Only track failed user authentications attempts for local users -+ in /etc/passwd and ignore centralized (AD, IdM, LDAP, etc.) users. -+ The faillock8 -+ command will also no longer track user failed -+ authentication attempts. Enabling this option will prevent a -+ double-lockout scenario where a user is locked out locally and -+ in the centralized mechanism. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Deny access if the number of consecutive authentication failures -+ for this user during the recent interval exceeds -+ n. The default is 3. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ The length of the interval during which the consecutive -+ authentication failures must happen for the user account -+ lock out is n seconds. -+ The default is 900 (15 minutes). -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ The access will be reenabled after -+ n seconds after the lock out. -+ The value 0 has the same meaning as value -+ never - the access -+ will not be reenabled without resetting the faillock -+ entries by the faillock8 command. -+ The default is 600 (10 minutes). -+ -+ -+ Note that the default directory that pam_faillock -+ uses is usually cleared on system boot so the access will be also reenabled -+ after system reboot. If that is undesirable a different tally directory -+ must be set with the option. -+ -+ -+ Also note that it is usually undesirable to permanently lock -+ out the users as they can become easily a target of denial of service -+ attack unless the usernames are random and kept secret to potential -+ attackers. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Root account can become locked as well as regular accounts. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ This option implies option. -+ Allow access after n seconds -+ to root account after the account is locked. In case the -+ option is not specified the value is the same as of the -+ option. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ If a group name is specified with this option, members -+ of the group will be handled by this module the same as -+ the root account (the options -+ and will apply to them. -+ By default the option is not set. -+ -+ -+ -+ -+ -+ -+ -+ EXAMPLES -+ -+ /etc/security/faillock.conf file example: -+ -+ -+deny=4 -+unlock_time=1200 -+silent -+ -+ -+ -+ -+ FILES -+ -+ -+ /etc/security/faillock.conf -+ -+ the config file for custom options -+ -+ -+ -+ -+ -+ -+ SEE ALSO -+ -+ -+ faillock8 -+ , -+ -+ pam_faillock8 -+ , -+ -+ pam.conf5 -+ , -+ -+ pam.d5 -+ , -+ -+ pam8 -+ -+ -+ -+ -+ -+ AUTHOR -+ -+ pam_faillock was written by Tomas Mraz. The support for faillock.conf was written by Brian Ward. -+ -+ -+ -+ -diff -up Linux-PAM-1.3.1/modules/pam_faillock/faillock.conf.faillock-update Linux-PAM-1.3.1/modules/pam_faillock/faillock.conf ---- Linux-PAM-1.3.1/modules/pam_faillock/faillock.conf.faillock-update 2019-10-16 17:34:50.607405060 +0200 -+++ Linux-PAM-1.3.1/modules/pam_faillock/faillock.conf 2019-10-16 16:26:05.000000000 +0200 -@@ -0,0 +1,62 @@ -+# Configuration for locking the user after multiple failed -+# authentication attempts. -+# -+# The directory where the user files with the failure records are kept. -+# The default is /var/run/faillock. -+# dir = /var/run/faillock -+# -+# Will log the user name into the system log if the user is not found. -+# Enabled if option is present. -+# audit -+# -+# Don't print informative messages. -+# Enabled if option is present. -+# silent -+# -+# Don't log informative messages via syslog. -+# Enabled if option is present. -+# no_log_info -+# -+# Only track failed user authentications attempts for local users -+# in /etc/passwd and ignore centralized (AD, IdM, LDAP, etc.) users. -+# The `faillock` command will also no longer track user failed -+# authentication attempts. Enabling this option will prevent a -+# double-lockout scenario where a user is locked out locally and -+# in the centralized mechanism. -+# Enabled if option is present. -+# local_users_only -+# -+# Deny access if the number of consecutive authentication failures -+# for this user during the recent interval exceeds n tries. -+# The default is 3. -+# deny = 3 -+# -+# The length of the interval during which the consecutive -+# authentication failures must happen for the user account -+# lock out is n seconds. -+# The default is 900 (15 minutes). -+# fail_interval = 900 -+# -+# The access will be reenabled after n seconds after the lock out. -+# The value 0 has the same meaning as value `never` - the access -+# will not be reenabled without resetting the faillock -+# entries by the `faillock` command. -+# The default is 600 (10 minutes). -+# unlock_time = 600 -+# -+# Root account can become locked as well as regular accounts. -+# Enabled if option is present. -+# even_deny_root -+# -+# This option implies the `even_deny_root` option. -+# Allow access after n seconds to root account after the -+# account is locked. In case the option is not specified -+# the value is the same as of the `unlock_time` option. -+# root_unlock_time = 900 -+# -+# If a group name is specified with this option, members -+# of the group will be handled by this module the same as -+# the root account (the options `even_deny_root>` and -+# `root_unlock_time` will apply to them. -+# By default, the option is not set. -+# admin_group = -diff -up Linux-PAM-1.3.1/modules/pam_faillock/faillock.h.faillock-update Linux-PAM-1.3.1/modules/pam_faillock/faillock.h ---- Linux-PAM-1.3.1/modules/pam_faillock/faillock.h.faillock-update 2019-10-16 16:49:27.026893768 +0200 -+++ Linux-PAM-1.3.1/modules/pam_faillock/faillock.h 2019-10-16 16:51:40.431628566 +0200 -@@ -65,6 +65,7 @@ struct tally_data { - }; - - #define FAILLOCK_DEFAULT_TALLYDIR "/var/run/faillock" -+#define FAILLOCK_DEFAULT_CONF "/etc/security/faillock.conf" - - int open_tally(const char *dir, const char *user, uid_t uid, int create); - int read_tally(int fd, struct tally_data *tallies); -diff -up Linux-PAM-1.3.1/modules/pam_faillock/Makefile.am.faillock-update Linux-PAM-1.3.1/modules/pam_faillock/Makefile.am ---- Linux-PAM-1.3.1/modules/pam_faillock/Makefile.am.faillock-update 2019-10-16 16:49:27.026893768 +0200 -+++ Linux-PAM-1.3.1/modules/pam_faillock/Makefile.am 2019-10-16 16:50:15.065078080 +0200 -@@ -1,6 +1,6 @@ - # - # Copyright (c) 2005, 2006, 2007, 2009 Thorsten Kukuk --# Copyright (c) 2008 Red Hat, Inc. -+# Copyright (c) 2008, 2018 Red Hat, Inc. - # Copyright (c) 2010 Tomas Mraz - # - -@@ -9,8 +9,8 @@ MAINTAINERCLEANFILES = $(MANS) README - - EXTRA_DIST = README $(MANS) $(XMLS) tst-pam_faillock - --man_MANS = pam_faillock.8 faillock.8 --XMLS = README.xml pam_faillock.8.xml faillock.8.xml -+man_MANS = pam_faillock.8 faillock.8 faillock.conf.5 -+XMLS = README.xml pam_faillock.8.xml faillock.8.xml faillock.conf.5.xml - - TESTS = tst-pam_faillock - -@@ -31,6 +31,8 @@ endif - faillock_LDFLAGS = -Wl,-z,now @PIE_LDFLAGS@ - faillock_LDADD = -L$(top_builddir)/libpam -lpam $(LIBAUDIT) - -+secureconf_DATA = faillock.conf -+ - securelib_LTLIBRARIES = pam_faillock.la - sbin_PROGRAMS = faillock - -diff -up Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.8.xml.faillock-update Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.8.xml ---- Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.8.xml.faillock-update 2019-10-16 16:49:27.030893701 +0200 -+++ Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.8.xml 2019-10-16 16:53:39.544606052 +0200 -@@ -126,141 +126,13 @@ - - - -- -- -- -- -- -- -- The directory where the user files with the failure records are kept. The -- default is /var/run/faillock. -- -- -- -- -- -- -- -- -- -- Will log the user name into the system log if the user is not found. -- -- -- -- -- -- -- -- -- -- Don't print informative messages. This option is implicite -- in the authfail and authsucc -- functions. -- -- -- -- -- -- -- -- -- -- Don't log informative messages via syslog3. -- -- -- -- -- -- -- -- -- -- Deny access if the number of consecutive authentication failures -- for this user during the recent interval exceeds -- n. The default is 3. -- -- -- -- -- -- -- -- -- -- The length of the interval during which the consecutive -- authentication failures must happen for the user account -- lock out is n seconds. -- The default is 900 (15 minutes). -- -- -- -- -- -- -- -- -- -- The access will be reenabled after -- n seconds after the lock out. -- The value 0 has the same meaning as value -- never - the access -- will not be reenabled without resetting the faillock -- entries by the faillock8 command. -- The default is 600 (10 minutes). -- -- -- Note that the default directory that pam_faillock -- uses is usually cleared on system boot so the access will be also reenabled -- after system reboot. If that is undesirable a different tally directory -- must be set with the option. -- -- -- Also note that it is usually undesirable to permanently lock -- out the users as they can become easily a target of denial of service -- attack unless the usernames are random and kept secret to potential -- attackers. -- -- -- -- -- -- -- -- -- -- Root account can become locked as well as regular accounts. -- -- -- -- -- -- -- -- -- -- This option implies option. -- Allow access after n seconds -- to root account after the account is locked. In case the -- option is not specified the value is the same as of the -- option. -- -- -- -- -- -- -- -- -- -- If a group name is specified with this option, members -- of the group will be handled by this module the same as -- the root account (the options -- and will apply to them. -- By default the option is not set. -- -- -- - -+ -+ The options for configuring the module behavior are described in the -+ faillock.conf5 -+ manual page. The options specified on the module command -+ line override the values from the configuration file. -+ - - - -@@ -306,19 +178,23 @@ - - NOTES - -- pam_faillock setup in the PAM stack is different -+ Configuring options on the module command line is not recommend. The -+ /etc/security/faillock.conf should be used instead. -+ -+ -+ The setup of pam_faillock in the PAM stack is different - from the pam_tally2 module setup. - - -- The individual files with the failure records are created as owned by -+ Individual files with the failure records are created as owned by - the user. This allows pam_faillock.so module - to work correctly when it is called from a screensaver. - - - Note that using the module in without the -- option or with requisite -- control field leaks an information about existence or -- non-existence of an user account in the system because -+ option specified in /etc/security/faillock.conf -+ or with requisite control field leaks an information about -+ existence or non-existence of an user account in the system because - the failures are not recorded for the unknown users. The message - about the user account being locked is never displayed for nonexisting - user accounts allowing the adversary to infer that a particular account -@@ -341,15 +217,26 @@ - be added to tell the user that his login is blocked by the module and also to abort - the authentication without even asking for password in such case. - -+ -+ /etc/security/faillock.conf file example: -+ -+ -+deny=4 -+unlock_time=1200 -+silent -+ -+ -+ /etc/pam.d/config file example: -+ - - auth required pam_securetty.so - auth required pam_env.so - auth required pam_nologin.so --# optionally call: auth requisite pam_faillock.so preauth deny=4 even_deny_root unlock_time=1200 -+# optionally call: auth requisite pam_faillock.so preauth - # to display the message about account being locked - auth [success=1 default=bad] pam_unix.so --auth [default=die] pam_faillock.so authfail deny=4 even_deny_root unlock_time=1200 --auth sufficient pam_faillock.so authsucc deny=4 even_deny_root unlock_time=1200 -+auth [default=die] pam_faillock.so authfail -+auth sufficient pam_faillock.so authsucc - auth required pam_deny.so - account required pam_unix.so - password required pam_unix.so shadow -@@ -361,17 +248,18 @@ session required pam_selinux.so o - - In the second example the module is called both in the auth - and account phases and the module gives the authenticating -- user message when the account is locked -+ user message when the account is locked if option is not -+ specified in the faillock.conf. - - - auth required pam_securetty.so - auth required pam_env.so - auth required pam_nologin.so --auth required pam_faillock.so preauth silent deny=4 even_deny_root unlock_time=1200 -+auth required pam_faillock.so preauth - # optionally use requisite above if you do not want to prompt for the password --# on locked accounts, possibly with removing the silent option as well -+# on locked accounts - auth sufficient pam_unix.so --auth [default=die] pam_faillock.so authfail deny=4 even_deny_root unlock_time=1200 -+auth [default=die] pam_faillock.so authfail - auth required pam_deny.so - account required pam_faillock.so - # if you drop the above call to pam_faillock.so the lock will be done also -@@ -394,6 +282,12 @@ session required pam_selinux.so o - the files logging the authentication failures for users - - -+ -+ /etc/security/faillock.conf -+ -+ the config file for pam_faillock options -+ -+ - - - -@@ -404,6 +298,9 @@ session required pam_selinux.so o - faillock8 - , - -+ faillock.conf5 -+ , -+ - pam.conf5 - , - -diff -up Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.c.faillock-update Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.c ---- Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.c.faillock-update 2019-10-16 16:49:27.030893701 +0200 -+++ Linux-PAM-1.3.1/modules/pam_faillock/pam_faillock.c 2019-12-16 17:55:11.403270018 +0100 -@@ -1,5 +1,6 @@ - /* -- * Copyright (c) 2010, 2017 Tomas Mraz -+ * Copyright (c) 2010, 2017, 2019 Tomas Mraz -+ * Copyright (c) 2010, 2017, 2019 Red Hat, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions -@@ -43,6 +44,7 @@ - #include - #include - #include -+#include - - #ifdef HAVE_LIBAUDIT - #include -@@ -66,8 +68,14 @@ - #define FAILLOCK_FLAG_SILENT 0x4 - #define FAILLOCK_FLAG_NO_LOG_INFO 0x8 - #define FAILLOCK_FLAG_UNLOCKED 0x10 -+#define FAILLOCK_FLAG_LOCAL_ONLY 0x20 - - #define MAX_TIME_INTERVAL 604800 /* 7 days */ -+#define FAILLOCK_CONF_MAX_LINELEN 1023 -+#define FAILLOCK_ERROR_CONF_OPEN -3 -+#define FAILLOCK_ERROR_CONF_MALFORMED -4 -+ -+#define PATH_PASSWD "/etc/passwd" - - struct options { - unsigned int action; -@@ -76,117 +84,295 @@ struct options { - unsigned int fail_interval; - unsigned int unlock_time; - unsigned int root_unlock_time; -- const char *dir; -+ char *dir; -+ const char *conf; - const char *user; -- const char *admin_group; -+ char *admin_group; - int failures; - uint64_t latest_time; - uid_t uid; - int is_admin; - uint64_t now; -+ int fatal_error; - }; - -+int read_config_file( -+ pam_handle_t *pamh, -+ struct options *opts, -+ const char *cfgfile -+); -+ -+void set_conf_opt( -+ pam_handle_t *pamh, -+ struct options *opts, -+ const char *name, -+ const char *value -+); -+ - static void - args_parse(pam_handle_t *pamh, int argc, const char **argv, - int flags, struct options *opts) - { - int i; -+ int rv; - memset(opts, 0, sizeof(*opts)); - -- opts->dir = FAILLOCK_DEFAULT_TALLYDIR; -+ opts->dir = strdup(FAILLOCK_DEFAULT_TALLYDIR); -+ opts->conf = FAILLOCK_DEFAULT_CONF; - opts->deny = 3; - opts->fail_interval = 900; - opts->unlock_time = 600; - opts->root_unlock_time = MAX_TIME_INTERVAL+1; - -- for (i = 0; i < argc; ++i) { -+ if ((rv=read_config_file(pamh, opts, opts->conf)) != PAM_SUCCESS) { -+ pam_syslog(pamh, LOG_DEBUG, -+ "Configuration file missing"); -+ } - -- if (strncmp(argv[i], "dir=", 4) == 0) { -- if (argv[i][4] != '/') { -- pam_syslog(pamh, LOG_ERR, -- "Tally directory is not absolute path (%s); keeping default", argv[i]); -- } else { -- opts->dir = argv[i]+4; -- } -- } -- else if (strncmp(argv[i], "deny=", 5) == 0) { -- if (sscanf(argv[i]+5, "%hu", &opts->deny) != 1) { -- pam_syslog(pamh, LOG_ERR, -- "Bad number supplied for deny argument"); -- } -- } -- else if (strncmp(argv[i], "fail_interval=", 14) == 0) { -- unsigned int temp; -- if (sscanf(argv[i]+14, "%u", &temp) != 1 || -- temp > MAX_TIME_INTERVAL) { -- pam_syslog(pamh, LOG_ERR, -- "Bad number supplied for fail_interval argument"); -- } else { -- opts->fail_interval = temp; -- } -+ for (i = 0; i < argc; ++i) { -+ if (strcmp(argv[i], "preauth") == 0) { -+ opts->action = FAILLOCK_ACTION_PREAUTH; -+ } -+ else if (strcmp(argv[i], "authfail") == 0) { -+ opts->action = FAILLOCK_ACTION_AUTHFAIL; -+ } -+ else if (strcmp(argv[i], "authsucc") == 0) { -+ opts->action = FAILLOCK_ACTION_AUTHSUCC; - } -- else if (strncmp(argv[i], "unlock_time=", 12) == 0) { -- unsigned int temp; -+ else { -+ char buf[FAILLOCK_CONF_MAX_LINELEN + 1]; -+ char *val; - -- if (strcmp(argv[i]+12, "never") == 0) { -- opts->unlock_time = 0; -- } -- else if (sscanf(argv[i]+12, "%u", &temp) != 1 || -- temp > MAX_TIME_INTERVAL) { -- pam_syslog(pamh, LOG_ERR, -- "Bad number supplied for unlock_time argument"); -+ strncpy(buf, argv[i], sizeof(buf) - 1); -+ buf[sizeof(buf) - 1] = '\0'; -+ -+ val = strchr(buf, '='); -+ if (val != NULL) { -+ *val = '\0'; -+ ++val; - } - else { -- opts->unlock_time = temp; -+ val = buf + sizeof(buf) - 1; - } -+ set_conf_opt(pamh, opts, buf, val); - } -- else if (strncmp(argv[i], "root_unlock_time=", 17) == 0) { -- unsigned int temp; -+ } - -- if (strcmp(argv[i]+17, "never") == 0) { -- opts->root_unlock_time = 0; -- } -- else if (sscanf(argv[i]+17, "%u", &temp) != 1 || -- temp > MAX_TIME_INTERVAL) { -- pam_syslog(pamh, LOG_ERR, -- "Bad number supplied for root_unlock_time argument"); -+ if (opts->root_unlock_time == MAX_TIME_INTERVAL+1) -+ opts->root_unlock_time = opts->unlock_time; -+ if (flags & PAM_SILENT) -+ opts->flags |= FAILLOCK_FLAG_SILENT; -+ -+ if (opts->dir == NULL) { -+ pam_syslog(pamh, LOG_CRIT, "Error allocating memory: %m"); -+ opts->fatal_error = 1; -+ } -+} -+ -+/* parse a single configuration file */ -+int -+read_config_file(pam_handle_t *pamh, struct options *opts, const char *cfgfile) -+{ -+ FILE *f; -+ char linebuf[FAILLOCK_CONF_MAX_LINELEN+1]; -+ -+ f = fopen(cfgfile, "r"); -+ if (f == NULL) { -+ /* ignore non-existent default config file */ -+ if (errno == ENOENT && strcmp(cfgfile, FAILLOCK_DEFAULT_CONF) == 0) -+ return 0; -+ return FAILLOCK_ERROR_CONF_OPEN; -+ } -+ -+ while (fgets(linebuf, sizeof(linebuf), f) != NULL) { -+ size_t len; -+ char *ptr; -+ char *name; -+ int eq; -+ -+ len = strlen(linebuf); -+ /* len cannot be 0 unless there is a bug in fgets */ -+ if (len && linebuf[len - 1] != '\n' && !feof(f)) { -+ (void) fclose(f); -+ return FAILLOCK_ERROR_CONF_MALFORMED; -+ } -+ -+ if ((ptr=strchr(linebuf, '#')) != NULL) { -+ *ptr = '\0'; -+ } else { -+ ptr = linebuf + len; -+ } -+ -+ /* drop terminating whitespace including the \n */ -+ while (ptr > linebuf) { -+ if (!isspace(*(ptr-1))) { -+ *ptr = '\0'; -+ break; -+ } -+ --ptr; -+ } -+ -+ /* skip initial whitespace */ -+ for (ptr = linebuf; isspace(*ptr); ptr++); -+ if (*ptr == '\0') -+ continue; -+ -+ /* grab the key name */ -+ eq = 0; -+ name = ptr; -+ while (*ptr != '\0') { -+ if (isspace(*ptr) || *ptr == '=') { -+ eq = *ptr == '='; -+ *ptr = '\0'; -+ ++ptr; -+ break; -+ } -+ ++ptr; -+ } -+ -+ /* grab the key value */ -+ while (*ptr != '\0') { -+ if (*ptr != '=' || eq) { -+ if (!isspace(*ptr)) { -+ break; -+ } - } else { -- opts->root_unlock_time = temp; -+ eq = 1; - } -+ ++ptr; - } -- else if (strncmp(argv[i], "admin_group=", 12) == 0) { -- opts->admin_group = argv[i] + 12; -+ -+ /* set the key:value pair on opts */ -+ set_conf_opt(pamh, opts, name, ptr); -+ } -+ -+ (void)fclose(f); -+ return PAM_SUCCESS; -+} -+ -+void set_conf_opt(pam_handle_t *pamh, struct options *opts, const char *name, const char *value) -+{ -+ if (strcmp(name, "dir") == 0) { -+ if (value[0] != '/') { -+ pam_syslog(pamh, LOG_ERR, -+ "Tally directory is not absolute path (%s); keeping default", value); -+ } else { -+ free(opts->dir); -+ opts->dir = strdup(value); - } -- else if (strcmp(argv[i], "preauth") == 0) { -- opts->action = FAILLOCK_ACTION_PREAUTH; -+ } -+ else if (strcmp(name, "deny") == 0) { -+ if (sscanf(value, "%hu", &opts->deny) != 1) { -+ pam_syslog(pamh, LOG_ERR, -+ "Bad number supplied for deny argument"); -+ } -+ } -+ else if (strcmp(name, "fail_interval") == 0) { -+ unsigned int temp; -+ if (sscanf(value, "%u", &temp) != 1 || -+ temp > MAX_TIME_INTERVAL) { -+ pam_syslog(pamh, LOG_ERR, -+ "Bad number supplied for fail_interval argument"); -+ } else { -+ opts->fail_interval = temp; - } -- else if (strcmp(argv[i], "authfail") == 0) { -- opts->action = FAILLOCK_ACTION_AUTHFAIL; -+ } -+ else if (strcmp(name, "unlock_time") == 0) { -+ unsigned int temp; -+ -+ if (strcmp(value, "never") == 0) { -+ opts->unlock_time = 0; - } -- else if (strcmp(argv[i], "authsucc") == 0) { -- opts->action = FAILLOCK_ACTION_AUTHSUCC; -+ else if (sscanf(value, "%u", &temp) != 1 || -+ temp > MAX_TIME_INTERVAL) { -+ pam_syslog(pamh, LOG_ERR, -+ "Bad number supplied for unlock_time argument"); - } -- else if (strcmp(argv[i], "even_deny_root") == 0) { -- opts->flags |= FAILLOCK_FLAG_DENY_ROOT; -+ else { -+ opts->unlock_time = temp; - } -- else if (strcmp(argv[i], "audit") == 0) { -- opts->flags |= FAILLOCK_FLAG_AUDIT; -+ } -+ else if (strcmp(name, "root_unlock_time") == 0) { -+ unsigned int temp; -+ -+ if (strcmp(value, "never") == 0) { -+ opts->root_unlock_time = 0; - } -- else if (strcmp(argv[i], "silent") == 0) { -- opts->flags |= FAILLOCK_FLAG_SILENT; -+ else if (sscanf(value, "%u", &temp) != 1 || -+ temp > MAX_TIME_INTERVAL) { -+ pam_syslog(pamh, LOG_ERR, -+ "Bad number supplied for root_unlock_time argument"); -+ } else { -+ opts->root_unlock_time = temp; - } -- else if (strcmp(argv[i], "no_log_info") == 0) { -- opts->flags |= FAILLOCK_FLAG_NO_LOG_INFO; -+ } -+ else if (strcmp(name, "admin_group") == 0) { -+ free(opts->admin_group); -+ opts->admin_group = strdup(value); -+ if (opts->admin_group == NULL) { -+ opts->fatal_error = 1; -+ pam_syslog(pamh, LOG_CRIT, "Error allocating memory: %m"); - } -- else { -- pam_syslog(pamh, LOG_ERR, "Unknown option: %s", argv[i]); -+ } -+ else if (strcmp(name, "even_deny_root") == 0) { -+ opts->flags |= FAILLOCK_FLAG_DENY_ROOT; -+ } -+ else if (strcmp(name, "audit") == 0) { -+ opts->flags |= FAILLOCK_FLAG_AUDIT; -+ } -+ else if (strcmp(name, "silent") == 0) { -+ opts->flags |= FAILLOCK_FLAG_SILENT; -+ } -+ else if (strcmp(name, "no_log_info") == 0) { -+ opts->flags |= FAILLOCK_FLAG_NO_LOG_INFO; -+ } -+ else if (strcmp(name, "local_users_only") == 0) { -+ opts->flags |= FAILLOCK_FLAG_LOCAL_ONLY; -+ } -+ else { -+ pam_syslog(pamh, LOG_ERR, "Unknown option: %s", name); -+ } -+} -+ -+static int check_local_user (pam_handle_t *pamh, const char *user) -+{ -+ struct passwd pw, *pwp; -+ char buf[4096]; -+ int found = 0; -+ FILE *fp; -+ int errn; -+ -+ fp = fopen(PATH_PASSWD, "r"); -+ if (fp == NULL) { -+ pam_syslog(pamh, LOG_ERR, "unable to open %s: %m", -+ PATH_PASSWD); -+ return -1; -+ } -+ -+ for (;;) { -+ errn = fgetpwent_r(fp, &pw, buf, sizeof (buf), &pwp); -+ if (errn == ERANGE) { -+ pam_syslog(pamh, LOG_WARNING, "%s contains very long lines; corrupted?", -+ PATH_PASSWD); -+ /* we can continue here as next call will read further */ -+ continue; -+ } -+ if (errn != 0) -+ break; -+ if (strcmp(pwp->pw_name, user) == 0) { -+ found = 1; -+ break; - } - } - -- if (opts->root_unlock_time == MAX_TIME_INTERVAL+1) -- opts->root_unlock_time = opts->unlock_time; -- if (flags & PAM_SILENT) -- opts->flags |= FAILLOCK_FLAG_SILENT; -+ fclose (fp); -+ -+ if (errn != 0 && errn != ENOENT) { -+ pam_syslog(pamh, LOG_ERR, "unable to enumerate local accounts: %m"); -+ return -1; -+ } else { -+ return found; -+ } - } - - static int get_pam_user(pam_handle_t *pamh, struct options *opts) -@@ -393,7 +579,7 @@ write_tally(pam_handle_t *pamh, struct o - - strncpy(tallies->records[oldest].source, source, sizeof(tallies->records[oldest].source)); - /* source does not have to be null terminated */ -- -+ - tallies->records[oldest].time = opts->now; - - ++failures; -@@ -468,6 +654,13 @@ tally_cleanup(struct tally_data *tallies - free(tallies->records); - } - -+static void -+opts_cleanup(struct options *opts) -+{ -+ free(opts->dir); -+ free(opts->admin_group); -+} -+ - /*---------------------------------------------------------------------*/ - - PAM_EXTERN int -@@ -481,39 +674,49 @@ pam_sm_authenticate(pam_handle_t *pamh, - memset(&tallies, 0, sizeof(tallies)); - - args_parse(pamh, argc, argv, flags, &opts); -+ if (opts.fatal_error) { -+ rv = PAM_BUF_ERR; -+ goto err; -+ } - - pam_fail_delay(pamh, 2000000); /* 2 sec delay for on failure */ - - if ((rv=get_pam_user(pamh, &opts)) != PAM_SUCCESS) { -- return rv; -+ goto err; - } - -- switch (opts.action) { -- case FAILLOCK_ACTION_PREAUTH: -- rv = check_tally(pamh, &opts, &tallies, &fd); -- if (rv == PAM_AUTH_ERR && !(opts.flags & FAILLOCK_FLAG_SILENT)) { -- faillock_message(pamh, &opts); -- } -- break; -- -- case FAILLOCK_ACTION_AUTHSUCC: -- rv = check_tally(pamh, &opts, &tallies, &fd); -- if (rv == PAM_SUCCESS) { -- reset_tally(pamh, &opts, &fd); -- } -- break; -- -- case FAILLOCK_ACTION_AUTHFAIL: -- rv = check_tally(pamh, &opts, &tallies, &fd); -- if (rv == PAM_SUCCESS) { -- rv = PAM_IGNORE; /* this return value should be ignored */ -- write_tally(pamh, &opts, &tallies, &fd); -- } -- break; -+ if (!(opts.flags & FAILLOCK_FLAG_LOCAL_ONLY) || -+ check_local_user (pamh, opts.user) != 0) { -+ switch (opts.action) { -+ case FAILLOCK_ACTION_PREAUTH: -+ rv = check_tally(pamh, &opts, &tallies, &fd); -+ if (rv == PAM_AUTH_ERR && !(opts.flags & FAILLOCK_FLAG_SILENT)) { -+ faillock_message(pamh, &opts); -+ } -+ break; -+ -+ case FAILLOCK_ACTION_AUTHSUCC: -+ rv = check_tally(pamh, &opts, &tallies, &fd); -+ if (rv == PAM_SUCCESS) { -+ reset_tally(pamh, &opts, &fd); -+ } -+ break; -+ -+ case FAILLOCK_ACTION_AUTHFAIL: -+ rv = check_tally(pamh, &opts, &tallies, &fd); -+ if (rv == PAM_SUCCESS) { -+ rv = PAM_IGNORE; /* this return value should be ignored */ -+ write_tally(pamh, &opts, &tallies, &fd); -+ } -+ break; -+ } - } - - tally_cleanup(&tallies, fd); - -+err: -+ opts_cleanup(&opts); -+ - return rv; - } - -@@ -540,18 +743,29 @@ pam_sm_acct_mgmt(pam_handle_t *pamh, int - - args_parse(pamh, argc, argv, flags, &opts); - -+ if (opts.fatal_error) { -+ rv = PAM_BUF_ERR; -+ goto err; -+ } -+ - opts.action = FAILLOCK_ACTION_AUTHSUCC; - - if ((rv=get_pam_user(pamh, &opts)) != PAM_SUCCESS) { -- return rv; -+ goto err; - } - -- check_tally(pamh, &opts, &tallies, &fd); /* for auditing */ -- reset_tally(pamh, &opts, &fd); -+ if (!(opts.flags & FAILLOCK_FLAG_LOCAL_ONLY) || -+ check_local_user (pamh, opts.user) != 0) { -+ check_tally(pamh, &opts, &tallies, &fd); /* for auditing */ -+ reset_tally(pamh, &opts, &fd); -+ } - - tally_cleanup(&tallies, fd); - -- return PAM_SUCCESS; -+err: -+ opts_cleanup(&opts); -+ -+ return rv; - } - - /*-----------------------------------------------------------------------*/ diff --git a/SOURCES/pam-1.3.1-fds-closing.patch b/SOURCES/pam-1.3.1-fds-closing.patch deleted file mode 100644 index 7f5f772..0000000 --- a/SOURCES/pam-1.3.1-fds-closing.patch +++ /dev/null @@ -1,70 +0,0 @@ -diff -up Linux-PAM-1.3.1/libpam/pam_modutil_sanitize.c.fds-closing Linux-PAM-1.3.1/libpam/pam_modutil_sanitize.c ---- Linux-PAM-1.3.1/libpam/pam_modutil_sanitize.c.fds-closing 2017-02-10 11:10:15.000000000 +0100 -+++ Linux-PAM-1.3.1/libpam/pam_modutil_sanitize.c 2019-10-16 16:07:31.259021159 +0200 -@@ -10,6 +10,7 @@ - #include - #include - #include -+#include - - /* - * Creates a pipe, closes its write end, redirects fd to its read end. -@@ -116,27 +117,45 @@ redirect_out(pam_handle_t *pamh, enum pa - static void - close_fds(void) - { -+ DIR *dir = NULL; -+ struct dirent *dent; -+ int dfd = -1; -+ int fd; -+ struct rlimit rlim; -+ - /* - * An arbitrary upper limit for the maximum file descriptor number - * returned by RLIMIT_NOFILE. - */ -- const int MAX_FD_NO = 65535; -+ const unsigned int MAX_FD_NO = 65535; - - /* The lower limit is the same as for _POSIX_OPEN_MAX. */ -- const int MIN_FD_NO = 20; -+ const unsigned int MIN_FD_NO = 20; - -- int fd; -- struct rlimit rlim; -- -- if (getrlimit(RLIMIT_NOFILE, &rlim) || rlim.rlim_max > MAX_FD_NO) -- fd = MAX_FD_NO; -- else if (rlim.rlim_max < MIN_FD_NO) -- fd = MIN_FD_NO; -- else -- fd = rlim.rlim_max - 1; -+ /* If /proc is mounted, we can optimize which fd can be closed. */ -+ if ((dir = opendir("/proc/self/fd")) != NULL) { -+ if ((dfd = dirfd(dir)) >= 0) { -+ while ((dent = readdir(dir)) != NULL) { -+ fd = atoi(dent->d_name); -+ if (fd > STDERR_FILENO && fd != dfd) -+ close(fd); -+ } -+ } -+ closedir(dir); -+ } -+ -+ /* If /proc isn't available, fallback to the previous behavior. */ -+ if (dfd < 0) { -+ if (getrlimit(RLIMIT_NOFILE, &rlim) || rlim.rlim_max > MAX_FD_NO) -+ fd = MAX_FD_NO; -+ else if (rlim.rlim_max < MIN_FD_NO) -+ fd = MIN_FD_NO; -+ else -+ fd = rlim.rlim_max - 1; - -- for (; fd > STDERR_FILENO; --fd) -- close(fd); -+ for (; fd > STDERR_FILENO; --fd) -+ close(fd); -+ } - } - - int diff --git a/SOURCES/pam-1.3.1-inline.patch b/SOURCES/pam-1.3.1-inline.patch deleted file mode 100644 index 65dfa26..0000000 --- a/SOURCES/pam-1.3.1-inline.patch +++ /dev/null @@ -1,105 +0,0 @@ -diff -up Linux-PAM-1.3.1/libpam/include/pam_cc_compat.h.inline Linux-PAM-1.3.1/libpam/include/pam_cc_compat.h ---- Linux-PAM-1.3.1/libpam/include/pam_cc_compat.h.inline 2022-05-26 10:44:31.702623614 +0200 -+++ Linux-PAM-1.3.1/libpam/include/pam_cc_compat.h 2022-05-26 10:44:31.703623621 +0200 -@@ -44,4 +44,17 @@ - # define DIAG_POP_IGNORE_CAST_ALIGN /* empty */ - #endif - -+/* -+ * Evaluates to -+ * 1, if the given two types are known to be the same -+ * 0, otherwise. -+ */ -+#if PAM_GNUC_PREREQ(3, 0) -+# define PAM_IS_SAME_TYPE(x_, y_) \ -+ __builtin_types_compatible_p(__typeof__(x_), __typeof__(y_)) -+#else -+/* Cannot tell whether these types are the same. */ -+# define PAM_IS_SAME_TYPE(x_, y_) 0 -+#endif -+ - #endif /* PAM_CC_COMPAT_H */ -diff -up Linux-PAM-1.3.1/libpam/include/pam_inline.h.inline Linux-PAM-1.3.1/libpam/include/pam_inline.h ---- Linux-PAM-1.3.1/libpam/include/pam_inline.h.inline 2022-05-26 10:44:31.703623621 +0200 -+++ Linux-PAM-1.3.1/libpam/include/pam_inline.h 2022-05-26 10:44:31.703623621 +0200 -@@ -0,0 +1,67 @@ -+/* -+ * Copyright (c) 2020 Dmitry V. Levin -+ * -+ * Handy inline functions and macros providing some convenient functionality -+ * to libpam and its modules. -+ */ -+ -+#ifndef PAM_INLINE_H -+#define PAM_INLINE_H -+ -+#include "pam_cc_compat.h" -+#include -+ -+/* -+ * Evaluates to -+ * - a syntax error if the argument is 0, -+ * 0, otherwise. -+ */ -+#define PAM_FAIL_BUILD_ON_ZERO(e_) (sizeof(int[-1 + 2 * !!(e_)]) * 0) -+ -+/* -+ * Evaluates to -+ * 1, if the given type is known to be a non-array type -+ * 0, otherwise. -+ */ -+#define PAM_IS_NOT_ARRAY(a_) PAM_IS_SAME_TYPE((a_), &(a_)[0]) -+ -+/* -+ * Evaluates to -+ * - a syntax error if the argument is not an array, -+ * 0, otherwise. -+ */ -+#define PAM_MUST_BE_ARRAY(a_) PAM_FAIL_BUILD_ON_ZERO(!PAM_IS_NOT_ARRAY(a_)) -+ -+/* Evaluates to the number of elements in the specified array. */ -+#define PAM_ARRAY_SIZE(a_) (sizeof(a_) / sizeof((a_)[0]) + PAM_MUST_BE_ARRAY(a_)) -+ -+/* -+ * Returns NULL if STR does not start with PREFIX, -+ * or a pointer to the first char in STR after PREFIX. -+ * The length of PREFIX is specified by PREFIX_LEN. -+ */ -+static inline const char * -+pam_str_skip_prefix_len(const char *str, const char *prefix, size_t prefix_len) -+{ -+ return strncmp(str, prefix, prefix_len) ? NULL : str + prefix_len; -+} -+ -+#define pam_str_skip_prefix(str_, prefix_) \ -+ pam_str_skip_prefix_len((str_), (prefix_), sizeof(prefix_) - 1 + PAM_MUST_BE_ARRAY(prefix_)) -+ -+/* -+ * Returns NULL if STR does not start with PREFIX -+ * (ignoring the case of the characters), -+ * or a pointer to the first char in STR after PREFIX. -+ * The length of PREFIX is specified by PREFIX_LEN. -+ */ -+static inline const char * -+pam_str_skip_icase_prefix_len(const char *str, const char *prefix, size_t prefix_len) -+{ -+ return strncasecmp(str, prefix, prefix_len) ? NULL : str + prefix_len; -+} -+ -+#define pam_str_skip_icase_prefix(str_, prefix_) \ -+ pam_str_skip_icase_prefix_len((str_), (prefix_), sizeof(prefix_) - 1 + PAM_MUST_BE_ARRAY(prefix_)) -+ -+#endif /* PAM_INLINE_H */ -diff -up Linux-PAM-1.3.1/libpam/Makefile.am.inline Linux-PAM-1.3.1/libpam/Makefile.am ---- Linux-PAM-1.3.1/libpam/Makefile.am.inline 2022-05-26 10:44:31.702623614 +0200 -+++ Linux-PAM-1.3.1/libpam/Makefile.am 2022-05-26 10:45:21.146977780 +0200 -@@ -18,7 +18,8 @@ include_HEADERS = include/security/_pam_ - include/security/pam_ext.h include/security/pam_modutil.h - - noinst_HEADERS = pam_prelude.h pam_private.h pam_tokens.h \ -- pam_modutil_private.h include/pam_cc_compat.h -+ pam_modutil_private.h include/pam_cc_compat.h \ -+ include/pam_inline.h - - libpam_la_LDFLAGS = -no-undefined -version-info 84:2:84 - libpam_la_LIBADD = @LIBAUDIT@ $(LIBPRELUDE_LIBS) @LIBDL@ diff --git a/SOURCES/pam-1.3.1-lastlog-no-showfailed.patch b/SOURCES/pam-1.3.1-lastlog-no-showfailed.patch deleted file mode 100644 index 6b68d9d..0000000 --- a/SOURCES/pam-1.3.1-lastlog-no-showfailed.patch +++ /dev/null @@ -1,82 +0,0 @@ -From c426914fa166ffb0482b6f6ad659ddf17d5dfaa1 Mon Sep 17 00:00:00 2001 -From: Nir Soffer -Date: Wed, 9 Jan 2019 23:41:16 +0200 -Subject: [PATCH] pam_lastlog: Improve silent option documentation - -The silent option explicitly silents only the last login message and not -bad logins. Add a note to the manual to make this clear. - -* modules/pam_lastlog/pam_lastlog.8.xml: Clearify "silent showfailed" ---- - modules/pam_lastlog/pam_lastlog.8.xml | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/modules/pam_lastlog/pam_lastlog.8.xml b/modules/pam_lastlog/pam_lastlog.8.xml -index c8f247e..bc2e1be 100644 ---- a/modules/pam_lastlog/pam_lastlog.8.xml -+++ b/modules/pam_lastlog/pam_lastlog.8.xml -@@ -102,6 +102,7 @@ - - Don't inform the user about any previous login, - just update the /var/log/lastlog file. -+ This option does not affect display of bad login attempts. - - - --- -2.20.1 - -From 7d036249a9772c546ede1f38ad68b3f1575216d6 Mon Sep 17 00:00:00 2001 -From: Nir Soffer -Date: Sun, 6 Jan 2019 00:36:27 +0200 -Subject: [PATCH] pam_lastlog: Respect PAM_SILENT flag - -pam_lastlog module will not log info about failed login if the session -was opened with PAM_SILENT flag. - -Example use case enabled by this change: - - sudo --non-interactive program - -If this command is run by another program expecting specific output from -the command run by sudo, the unexpected info about failed logins will -break this program. - -* modules/pam_lastlog/pam_lastlog.c: Respect silent option. - (_pam_session_parse): Unset LASTLOG_BTMP if PAM_SILENT is set. ---- - modules/pam_lastlog/pam_lastlog.c | 11 ++++++----- - 1 file changed, 6 insertions(+), 5 deletions(-) - -diff --git a/modules/pam_lastlog/pam_lastlog.c b/modules/pam_lastlog/pam_lastlog.c -index 18bf7be..e980c04 100644 ---- a/modules/pam_lastlog/pam_lastlog.c -+++ b/modules/pam_lastlog/pam_lastlog.c -@@ -135,11 +135,6 @@ _pam_session_parse(pam_handle_t *pamh, int flags, int argc, const char **argv) - { - int ctrl=(LASTLOG_DATE|LASTLOG_HOST|LASTLOG_LINE|LASTLOG_WTMP|LASTLOG_UPDATE); - -- /* does the appliction require quiet? */ -- if (flags & PAM_SILENT) { -- ctrl |= LASTLOG_QUIET; -- } -- - /* step through arguments */ - for (; argc-- > 0; ++argv) { - -@@ -168,6 +163,12 @@ _pam_session_parse(pam_handle_t *pamh, int flags, int argc, const char **argv) - } - } - -+ /* does the appliction require quiet? */ -+ if (flags & PAM_SILENT) { -+ ctrl |= LASTLOG_QUIET; -+ ctrl &= ~LASTLOG_BTMP; -+ } -+ - D(("ctrl = %o", ctrl)); - return ctrl; - } --- -2.20.1 - diff --git a/SOURCES/pam-1.3.1-lastlog-unlimited-fsize.patch b/SOURCES/pam-1.3.1-lastlog-unlimited-fsize.patch deleted file mode 100644 index 1067d6f..0000000 --- a/SOURCES/pam-1.3.1-lastlog-unlimited-fsize.patch +++ /dev/null @@ -1,227 +0,0 @@ -From 3a3e70739834cd5cbd17469907ef718c81ae40c0 Mon Sep 17 00:00:00 2001 -From: Carlos Santos -Date: Wed, 11 Sep 2019 11:50:28 -0300 -Subject: [PATCH] pam_lastlog: document the 'unlimited' option - -Signed-off-by: Carlos Santos ---- - modules/pam_lastlog/pam_lastlog.8.xml | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - -diff --git a/modules/pam_lastlog/pam_lastlog.8.xml b/modules/pam_lastlog/pam_lastlog.8.xml -index bc2e1be..f10e94a 100644 ---- a/modules/pam_lastlog/pam_lastlog.8.xml -+++ b/modules/pam_lastlog/pam_lastlog.8.xml -@@ -48,6 +48,9 @@ - - inactive=<days> - -+ -+ unlimited -+ - - - -@@ -196,6 +199,18 @@ - - - -+ -+ -+ -+ -+ -+ -+ If the fsize limit is set, this option can be -+ used to override it, preventing failures on systems with large UID -+ values that lead lastlog to become a huge sparse file. -+ -+ -+ - - - -@@ -300,6 +315,9 @@ - - SEE ALSO - -+ -+ limits.conf5 -+ , - - pam.conf5 - , --- -2.20.1 - -From 9349333a9ae958205294cd25e97fd6b4805bd82b Mon Sep 17 00:00:00 2001 -From: Carlos Santos -Date: Tue, 10 Sep 2019 23:08:30 -0300 -Subject: [PATCH] pam_lastlog: prevent crash due to reduced 'fsize' limit - -It a reduced fsize limit is set in /etc/security/limits.conf and -pam_limits is in use pam_lastlog may cause a crash, e.g. - - ----- begin /etc/pam.d/su ---- - auth sufficient pam_rootok.so - auth required pam_wheel.so use_uid - auth required pam_env.so - auth required pam_unix.so nullok - account required pam_unix.so - password required pam_unix.so nullok - session required pam_limits.so - session required pam_env.so - session required pam_unix.so - session optional pam_lastlog.so - ----- end /etc/pam.d/su ----- - - ----- begin /etc/security/limits.d/fsize.conf ----- - * soft fsize 1710 - * hard fsize 1710 - ----- end /etc/security/limits.d/fsize.conf ----- - - # id user1 - uid=1000(user1) gid=1000(user1) groups=1000(user1) - # su - user1 - Last login: Wed Sep 11 01:52:44 UTC 2019 on console - $ exit - # id user2 - uid=60000(user2) gid=60000(user2) groups=60000(user2) - # su - user2 - File size limit exceeded - -This happens because pam_limits sets RLIMIT_FSIZE before pam_lastlog -attempts to write /var/log/lastlog, leading to a SIGXFSZ signal. - -In order to fix this, and an 'unlimited' option, which leads to saving -the 'fsize' limit and set it to unlimited before writing lastlog. After -that, restore the saved value. If 'fsize' is already unlimited nothing -is done. - -Failing to set the 'fsize' limit is not a fatal error. With luck the -configured limit will suffice, so we try to write lastlog anyway, even -under the risk of dying due to a SIGXFSZ. - -Failing to restore the 'fsize' limit is a fatal error, since we don't -want to keep it unlimited. - -Signed-off-by: Carlos Santos ---- - modules/pam_lastlog/pam_lastlog.c | 66 ++++++++++++++++++++++++++----- - 1 file changed, 57 insertions(+), 9 deletions(-) - -diff --git a/modules/pam_lastlog/pam_lastlog.c b/modules/pam_lastlog/pam_lastlog.c -index e980c04..a135c9f 100644 ---- a/modules/pam_lastlog/pam_lastlog.c -+++ b/modules/pam_lastlog/pam_lastlog.c -@@ -25,6 +25,8 @@ - #include - #include - #include -+#include -+#include - #include - #include - -@@ -82,15 +84,16 @@ struct lastlog { - - /* argument parsing */ - --#define LASTLOG_DATE 01 /* display the date of the last login */ --#define LASTLOG_HOST 02 /* display the last host used (if set) */ --#define LASTLOG_LINE 04 /* display the last terminal used */ --#define LASTLOG_NEVER 010 /* display a welcome message for first login */ --#define LASTLOG_DEBUG 020 /* send info to syslog(3) */ --#define LASTLOG_QUIET 040 /* keep quiet about things */ --#define LASTLOG_WTMP 0100 /* log to wtmp as well as lastlog */ --#define LASTLOG_BTMP 0200 /* display failed login info from btmp */ --#define LASTLOG_UPDATE 0400 /* update the lastlog and wtmp files (default) */ -+#define LASTLOG_DATE 01 /* display the date of the last login */ -+#define LASTLOG_HOST 02 /* display the last host used (if set) */ -+#define LASTLOG_LINE 04 /* display the last terminal used */ -+#define LASTLOG_NEVER 010 /* display a welcome message for first login */ -+#define LASTLOG_DEBUG 020 /* send info to syslog(3) */ -+#define LASTLOG_QUIET 040 /* keep quiet about things */ -+#define LASTLOG_WTMP 0100 /* log to wtmp as well as lastlog */ -+#define LASTLOG_BTMP 0200 /* display failed login info from btmp */ -+#define LASTLOG_UPDATE 0400 /* update the lastlog and wtmp files (default) */ -+#define LASTLOG_UNLIMITED 01000 /* unlimited file size (ignore 'fsize' limit) */ - - static int - _pam_auth_parse(pam_handle_t *pamh, int flags, int argc, const char **argv, -@@ -158,6 +161,8 @@ _pam_session_parse(pam_handle_t *pamh, int flags, int argc, const char **argv) - ctrl &= ~(LASTLOG_WTMP|LASTLOG_UPDATE); - } else if (!strcmp(*argv,"showfailed")) { - ctrl |= LASTLOG_BTMP; -+ } else if (!strcmp(*argv,"unlimited")) { -+ ctrl |= LASTLOG_UNLIMITED; - } else { - pam_syslog(pamh, LOG_ERR, "unknown option: %s", *argv); - } -@@ -373,6 +378,12 @@ static int - last_login_write(pam_handle_t *pamh, int announce, int last_fd, - uid_t uid, const char *user) - { -+ static struct rlimit no_limit = { -+ RLIM_INFINITY, -+ RLIM_INFINITY -+ }; -+ struct rlimit old_limit; -+ int setrlimit_res; - struct flock last_lock; - struct lastlog last_login; - time_t ll_time; -@@ -427,6 +438,31 @@ last_login_write(pam_handle_t *pamh, int announce, int last_fd, - sleep(LASTLOG_IGNORE_LOCK_TIME); - } - -+ /* -+ * Failing to set the 'fsize' limit is not a fatal error. We try to write -+ * lastlog anyway, under the risk of dying due to a SIGXFSZ. -+ */ -+ D(("setting limit for 'fsize'")); -+ -+ if ((announce & LASTLOG_UNLIMITED) == 0) { /* don't set to unlimted */ -+ setrlimit_res = -1; -+ } else if (getrlimit(RLIMIT_FSIZE, &old_limit) == 0) { -+ if (old_limit.rlim_cur == RLIM_INFINITY) { /* already unlimited */ -+ setrlimit_res = -1; -+ } else { -+ setrlimit_res = setrlimit(RLIMIT_FSIZE, &no_limit); -+ if (setrlimit_res != 0) -+ pam_syslog(pamh, LOG_WARNING, "Could not set limit for 'fsize': %m"); -+ } -+ } else { -+ setrlimit_res = -1; -+ if (errno == EINVAL) { -+ pam_syslog(pamh, LOG_INFO, "Limit for 'fsize' not supported: %m"); -+ } else { -+ pam_syslog(pamh, LOG_WARNING, "Could not get limit for 'fsize': %m"); -+ } -+ } -+ - D(("writing to the lastlog file")); - if (pam_modutil_write (last_fd, (char *) &last_login, - sizeof (last_login)) != sizeof(last_login)) { -@@ -434,6 +470,18 @@ last_login_write(pam_handle_t *pamh, int announce, int last_fd, - retval = PAM_SERVICE_ERR; - } - -+ /* -+ * Failing to restore the 'fsize' limit is a fatal error. -+ */ -+ D(("restoring limit for 'fsize'")); -+ if (setrlimit_res == 0) { -+ setrlimit_res = setrlimit(RLIMIT_FSIZE, &old_limit); -+ if (setrlimit_res != 0) { -+ pam_syslog(pamh, LOG_ERR, "Could not restore limit for 'fsize': %m"); -+ retval = PAM_SERVICE_ERR; -+ } -+ } -+ - last_lock.l_type = F_UNLCK; - (void) fcntl(last_fd, F_SETLK, &last_lock); /* unlock */ - D(("unlocked")); --- -2.20.1 - diff --git a/SOURCES/pam-1.3.1-libpam-support-long-lines.patch b/SOURCES/pam-1.3.1-libpam-support-long-lines.patch deleted file mode 100644 index 6483b62..0000000 --- a/SOURCES/pam-1.3.1-libpam-support-long-lines.patch +++ /dev/null @@ -1,595 +0,0 @@ -diff -up Linux-PAM-1.3.1/libpam/pam_handlers.c.libpam-support-long-lines Linux-PAM-1.3.1/libpam/pam_handlers.c ---- Linux-PAM-1.3.1/libpam/pam_handlers.c.libpam-support-long-lines 2024-11-04 13:17:27.395991844 +0100 -+++ Linux-PAM-1.3.1/libpam/pam_handlers.c 2024-11-04 14:45:22.583441849 +0100 -@@ -16,21 +16,30 @@ - #include - #include - --#define BUF_SIZE 1024 - #define MODULE_CHUNK 4 - #define UNKNOWN_MODULE "<*unknown module*>" - #ifndef _PAM_ISA - #define _PAM_ISA "." - #endif - --static int _pam_assemble_line(FILE *f, char *buf, int buf_len); -+struct line_buffer { -+ char *assembled; -+ char *chunk; -+ size_t chunk_size; -+ size_t len; -+ size_t size; -+}; -+ -+static void _pam_buffer_init(struct line_buffer *buffer); -+ -+static int _pam_assemble_line(FILE *f, struct line_buffer *buf); - - static void _pam_free_handlers_aux(struct handler **hp); - - static int _pam_add_handler(pam_handle_t *pamh - , int must_fail, int other, int stack_level, int type - , int *actions, const char *mod_path -- , int argc, char **argv, int argvlen); -+ , int argc, char **argv, size_t argvlen); - - /* Values for module type */ - -@@ -58,12 +67,15 @@ static int _pam_parse_conf_file(pam_hand - #endif /* PAM_READ_BOTH_CONFS */ - ) - { -- char buf[BUF_SIZE]; -+ struct line_buffer buffer; - int x; /* read a line from the FILE *f ? */ -+ -+ _pam_buffer_init(&buffer); - /* - * read a line from the configuration (FILE *) f - */ -- while ((x = _pam_assemble_line(f, buf, BUF_SIZE)) > 0) { -+ while ((x = _pam_assemble_line(f, &buffer)) > 0) { -+ char *buf = buffer.assembled; - char *tok, *nexttok=NULL; - const char *this_service; - const char *mod_path; -@@ -73,7 +85,7 @@ static int _pam_parse_conf_file(pam_hand - int handler_type = PAM_HT_MODULE; /* regular handler from a module */ - int argc; - char **argv; -- int argvlen; -+ size_t argvlen; - - D(("_pam_init_handler: LINE: %s", buf)); - if (known_service != NULL) { -@@ -232,10 +244,11 @@ static int _pam_parse_conf_file(pam_hand - if (nexttok != NULL) { - D(("list: %s",nexttok)); - argvlen = _pam_mkargv(nexttok, &argv, &argc); -- D(("argvlen = %d",argvlen)); -+ D(("argvlen = %zu",argvlen)); - } else { /* there are no arguments so fix by hand */ - D(("_pam_init_handlers: empty argument list")); -- argvlen = argc = 0; -+ argvlen = 0; -+ argc = 0; - argv = NULL; - } - -@@ -548,88 +561,243 @@ int _pam_init_handlers(pam_handle_t *pam - return PAM_SUCCESS; - } - -+static int _pam_buffer_add(struct line_buffer *buffer, char *start, char *end) -+{ -+ size_t len = end - start; -+ -+ D(("assembled: [%zu/%zu] '%s', adding [%zu] '%s'", -+ buffer->len, buffer->size, -+ buffer->assembled == NULL ? "" : buffer->assembled, len, start)); -+ -+ if (start == end) -+ return 0; -+ -+ if (buffer->assembled == NULL && buffer->chunk == start) { -+ /* no extra allocation needed, just move chunk to assembled */ -+ buffer->assembled = buffer->chunk; -+ buffer->len = len; -+ buffer->size = buffer->chunk_size; -+ -+ buffer->chunk = NULL; -+ buffer->chunk_size = 0; -+ -+ D(("exiting with quick exchange")); -+ return 0; -+ } -+ -+ if (buffer->len + len + 1 > buffer->size) { -+ size_t size; -+ char *p; -+ -+ size = buffer->len + len + 1; -+ if ((p = realloc(buffer->assembled, size)) == NULL) -+ return -1; -+ -+ buffer->assembled = p; -+ buffer->size = size; -+ } -+ -+ memcpy(buffer->assembled + buffer->len, start, len); -+ buffer->len += len; -+ buffer->assembled[buffer->len] = '\0'; -+ -+ D(("exiting")); -+ return 0; -+} -+ -+static inline int _pam_buffer_add_eol(struct line_buffer *buffer, -+ char *start, char *end) -+{ -+ if (buffer->assembled != NULL || (*start != '\0' && *start != '\n')) -+ return _pam_buffer_add(buffer, start, end); -+ return 0; -+} -+ -+static void _pam_buffer_clear(struct line_buffer *buffer) -+{ -+ _pam_drop(buffer->assembled); -+ _pam_drop(buffer->chunk); -+ buffer->chunk_size = 0; -+ buffer->len = 0; -+ buffer->size = 0; -+} -+ -+static void _pam_buffer_init(struct line_buffer *buffer) -+{ -+ buffer->assembled = NULL; -+ buffer->chunk = NULL; -+ _pam_buffer_clear(buffer); -+} -+ -+static void _pam_buffer_purge(struct line_buffer *buffer) -+{ -+ _pam_drop(buffer->chunk); -+ buffer->chunk_size = 0; -+} -+ -+static void _pam_buffer_shift(struct line_buffer *buffer) -+{ -+ if (buffer->assembled == NULL) -+ return; -+ -+ _pam_buffer_purge(buffer); -+ buffer->chunk = buffer->assembled; -+ buffer->chunk_size = buffer->size; -+ -+ buffer->assembled = NULL; -+ buffer->size = 0; -+ buffer->len = 0; -+} -+ -+static inline int _pam_buffer_valid(struct line_buffer *buffer) -+{ -+ return buffer->assembled != NULL && *buffer->assembled != '\0'; -+} -+ - /* -- * This is where we read a line of the PAM config file. The line may be -- * preceeded by lines of comments and also extended with "\\\n" -+ * Trim string to relevant parts of a configuration line. -+ * -+ * Preceding whitespaces are skipped and comment (#) marks the end of -+ * configuration line. -+ * -+ * Returns start of configuration line. - */ -+static inline char *_pam_str_trim(char *str) -+{ -+ /* skip leading spaces */ -+ str += strspn(str, " \t"); -+ /* -+ * we are only interested in characters before the first '#' -+ * character -+ */ -+ str[strcspn(str, "#")] = '\0'; - --static int _pam_assemble_line(FILE *f, char *buffer, int buf_len) -+ return str; -+} -+ -+/* -+ * Remove escaped newline from end of string. -+ * -+ * Configuration lines may span across multiple lines in a file -+ * by ending a line with a backslash (\). -+ * -+ * If an escaped newline is encountered, the backslash will be -+ * replaced with a blank ' ' and the newline itself removed. -+ * Then the variable "end" will point to the new end of line. -+ * -+ * Returns 0 if escaped newline was found and replaced, 1 otherwise. -+ */ -+static inline int _pam_str_unescnl(char *start, char **end) - { -- char *p = buffer; -- char *endp = buffer + buf_len; -- char *s, *os; -- int used = 0; -+ int ret = 1; -+ char *p = *end; - -- /* loop broken with a 'break' when a non-'\\n' ended line is read */ -+ /* -+ * Check for backslash by scanning back from the end of -+ * the entered line, the '\n' should be included since -+ * normally a line is terminated with this character. -+ */ -+ while (p > start && ((*--p == ' ') || (*p == '\t') || (*p == '\n'))) -+ ; -+ if (*p == '\\') { -+ *p++ = ' '; /* replace backslash with ' ' */ -+ *p = '\0'; /* truncate the line here */ -+ *end = p; -+ ret = 0; -+ } - -- D(("called.")); -- for (;;) { -- if (p >= endp) { -- /* Overflow */ -- D(("_pam_assemble_line: overflow")); -- return -1; -- } -- if (fgets(p, endp - p, f) == NULL) { -- if (used) { -- /* Incomplete read */ -- return -1; -- } else { -- /* EOF */ -- return 0; -- } -- } -+ return ret; -+} - -- /* skip leading spaces --- line may be blank */ -+/* -+ * Prepare line from file for configuration line parsing. -+ * -+ * A configuration line may span across multiple lines in a file. -+ * Remove comments and skip preceding whitespaces. -+ * -+ * Returns 0 if line spans across multiple lines, 1 if -+ * end of line is encountered. -+ */ -+static inline int _pam_str_prepare(char *line, ssize_t len, -+ char **start, char **end) -+{ -+ int ret; - -- s = p + strspn(p, " \n\t"); -- if (*s && (*s != '#')) { -- os = s; -+ *start = line; -+ *end = line + len; - -- /* -- * we are only interested in characters before the first '#' -- * character -- */ -+ ret = _pam_str_unescnl(*start, end) || strchr(*start, '#') != NULL; - -- while (*s && *s != '#') -- ++s; -- if (*s == '#') { -- *s = '\0'; -- used += strlen(os); -- break; /* the line has been read */ -- } -+ *start = _pam_str_trim(*start); -+ -+ return ret; -+} -+ -+/* -+ * This is where we read a line of the PAM config file. The line may be -+ * preceded by lines of comments and also extended with "\\\n" -+ * -+ * Returns 0 on EOF, 1 on successful line parsing, or -1 on error. -+ */ -+ -+static int _pam_assemble_line(FILE *f, struct line_buffer *buffer) -+{ -+ int ret = 0; -+ -+ /* loop broken with a 'break' when a non-'\\n' ended line is read */ - -- s = os; -+ D(("called.")); - -- /* -- * Check for backslash by scanning back from the end of -- * the entered line, the '\n' has been included since -- * normally a line is terminated with this -- * character. fgets() should only return one though! -- */ -+ _pam_buffer_shift(buffer); - -- s += strlen(s); -- while (s > os && ((*--s == ' ') || (*s == '\t') -- || (*s == '\n'))); -+ for (;;) { -+ char *start, *end; -+ ssize_t n; -+ int eol; - -- /* check if it ends with a backslash */ -- if (*s == '\\') { -- *s++ = ' '; /* replace backslash with ' ' */ -- *s = '\0'; /* truncate the line here */ -- used += strlen(os); -- p = s; /* there is more ... */ -+ if ((n = getline(&buffer->chunk, &buffer->chunk_size, f)) == -1) { -+ if (ret) { -+ /* Incomplete read */ -+ ret = -1; - } else { -- /* End of the line! */ -- used += strlen(os); -- break; /* this is the complete line */ -+ /* EOF */ -+ ret = 0; - } -+ break; -+ } -+ -+ eol = _pam_str_prepare(buffer->chunk, n, &start, &end); - -+ if (eol) { -+ if (_pam_buffer_add_eol(buffer, start, end)) { -+ ret = -1; -+ break; -+ } -+ if (_pam_buffer_valid(buffer)) { -+ /* Successfully parsed a line */ -+ ret = 1; -+ break; -+ } -+ /* Start parsing next line */ -+ _pam_buffer_shift(buffer); -+ ret = 0; - } else { -- /* Nothing in this line */ -- /* Don't move p */ -+ /* Configuration line spans across multiple lines in file */ -+ if (_pam_buffer_add(buffer, start, end)) { -+ ret = -1; -+ break; -+ } -+ /* Keep parsing line */ -+ ret = 1; - } - } - -- return used; -+ if (ret == 1) -+ _pam_buffer_purge(buffer); -+ else -+ _pam_buffer_clear(buffer); -+ -+ return ret; - } - - static char * -@@ -761,7 +929,7 @@ _pam_load_module(pam_handle_t *pamh, con - int _pam_add_handler(pam_handle_t *pamh - , int handler_type, int other, int stack_level, int type - , int *actions, const char *mod_path -- , int argc, char **argv, int argvlen) -+ , int argc, char **argv, size_t argvlen) - { - struct loaded_module *mod = NULL; - struct handler **handler_p; -diff -up Linux-PAM-1.3.1/libpam/pam_misc.c.libpam-support-long-lines Linux-PAM-1.3.1/libpam/pam_misc.c ---- Linux-PAM-1.3.1/libpam/pam_misc.c.libpam-support-long-lines 2017-02-10 11:10:15.000000000 +0100 -+++ Linux-PAM-1.3.1/libpam/pam_misc.c 2024-11-04 14:47:31.147672755 +0100 -@@ -39,6 +39,8 @@ - - #include - #include -+#include -+#include - #include - #include - #include -@@ -163,60 +165,55 @@ char *_pam_memdup(const char *x, int len - /* Generate argv, argc from s */ - /* caller must free(argv) */ - --int _pam_mkargv(char *s, char ***argv, int *argc) -+size_t _pam_mkargv(const char *s, char ***argv, int *argc) - { -- int l; -- int argvlen = 0; -- char *sbuf, *sbuf_start; -+ size_t l; -+ size_t argvlen = 0; - char **our_argv = NULL; -- char **argvbuf; -- char *argvbufp; --#ifdef PAM_DEBUG -- int count=0; --#endif - -- D(("_pam_mkargv called: %s",s)); -+ D(("called: %s",s)); - - *argc = 0; - - l = strlen(s); -- if (l) { -- if ((sbuf = sbuf_start = _pam_strdup(s)) == NULL) { -- pam_syslog(NULL, LOG_CRIT, -- "pam_mkargv: null returned by _pam_strdup"); -- D(("arg NULL")); -+ if (l && l < SIZE_MAX / (sizeof(char) + sizeof(char *))) { -+ char **argvbuf; -+ /* Overkill on the malloc, but not large */ -+ argvlen = (l + 1) * (sizeof(char) + sizeof(char *)); -+ if ((our_argv = argvbuf = malloc(argvlen)) == NULL) { -+ pam_syslog(NULL, LOG_CRIT, "pam_mkargv: null returned by malloc"); -+ argvlen = 0; - } else { -- /* Overkill on the malloc, but not large */ -- argvlen = (l + 1) * ((sizeof(char)) + sizeof(char *)); -- if ((our_argv = argvbuf = malloc(argvlen)) == NULL) { -- pam_syslog(NULL, LOG_CRIT, -- "pam_mkargv: null returned by malloc"); -- } else { -- char *tmp=NULL; -- -- argvbufp = (char *) argvbuf + (l * sizeof(char *)); -- D(("[%s]",sbuf)); -- while ((sbuf = _pam_StrTok(sbuf, " \n\t", &tmp))) { -- D(("arg #%d",++count)); -- D(("->[%s]",sbuf)); -- strcpy(argvbufp, sbuf); -- D(("copied token")); -- *argvbuf = argvbufp; -- argvbufp += strlen(argvbufp) + 1; -- D(("stepped in argvbufp")); -- (*argc)++; -- argvbuf++; -- sbuf = NULL; -- D(("loop again?")); -+ char *argvbufp; -+ char *tmp=NULL; -+ char *tok; -+#ifdef PAM_DEBUG -+ unsigned count=0; -+#endif -+ argvbufp = (char *) argvbuf + (l * sizeof(char *)); -+ strcpy(argvbufp, s); -+ D(("[%s]",argvbufp)); -+ while ((tok = _pam_StrTok(argvbufp, " \n\t", &tmp))) { -+ D(("arg #%u",++count)); -+ D(("->[%s]",tok)); -+ *argvbuf++ = tok; -+ if (*argc == INT_MAX) { -+ pam_syslog(NULL, LOG_CRIT, -+ "pam_mkargv: too many arguments"); -+ argvlen = 0; -+ _pam_drop(our_argv); -+ break; - } -+ (*argc)++; -+ argvbufp = NULL; -+ D(("loop again?")); - } -- _pam_drop(sbuf_start); - } - } - - *argv = our_argv; - -- D(("_pam_mkargv returned")); -+ D(("exiting")); - - return(argvlen); - } -diff -up Linux-PAM-1.3.1/libpam/pam_private.h.libpam-support-long-lines Linux-PAM-1.3.1/libpam/pam_private.h ---- Linux-PAM-1.3.1/libpam/pam_private.h.libpam-support-long-lines 2024-11-04 13:17:27.404991868 +0100 -+++ Linux-PAM-1.3.1/libpam/pam_private.h 2024-11-04 14:51:31.654635328 +0100 -@@ -16,6 +16,7 @@ - - #include "config.h" - -+#include - #include - - #include -@@ -266,7 +267,7 @@ char *_pam_strdup(const char *s); - - char *_pam_memdup(const char *s, int len); - --int _pam_mkargv(char *s, char ***argv, int *argc); -+size_t _pam_mkargv(const char *s, char ***argv, int *argc); - - void _pam_sanitize(pam_handle_t *pamh); - -diff -up Linux-PAM-1.3.1/modules/pam_exec/pam_exec.c.libpam-support-long-lines Linux-PAM-1.3.1/modules/pam_exec/pam_exec.c ---- Linux-PAM-1.3.1/modules/pam_exec/pam_exec.c.libpam-support-long-lines 2017-02-10 11:10:15.000000000 +0100 -+++ Linux-PAM-1.3.1/modules/pam_exec/pam_exec.c 2024-11-04 13:17:27.434991946 +0100 -@@ -408,7 +408,7 @@ call_exec (const char *pam_type, pam_han - _exit (err); - } - -- arggv = calloc (argc + 4, sizeof (char *)); -+ arggv = calloc ((size_t) argc + 1, sizeof (char *)); - if (arggv == NULL) - _exit (ENOMEM); - -diff -up Linux-PAM-1.3.1/modules/pam_filter/pam_filter.c.libpam-support-long-lines Linux-PAM-1.3.1/modules/pam_filter/pam_filter.c ---- Linux-PAM-1.3.1/modules/pam_filter/pam_filter.c.libpam-support-long-lines 2017-02-10 11:10:15.000000000 +0100 -+++ Linux-PAM-1.3.1/modules/pam_filter/pam_filter.c 2024-11-04 13:17:27.434991946 +0100 -@@ -101,7 +101,8 @@ static int process_args(pam_handle_t *pa - char **levp; - const char *user = NULL; - const void *tmp; -- int i,size, retval; -+ int i, retval; -+ size_t size; - - *filtername = *++argv; - if (ctrl & FILTER_DEBUG) { -diff -up Linux-PAM-1.3.1/modules/pam_motd/pam_motd.c.libpam-support-long-lines Linux-PAM-1.3.1/modules/pam_motd/pam_motd.c ---- Linux-PAM-1.3.1/modules/pam_motd/pam_motd.c.libpam-support-long-lines 2024-11-04 13:17:27.423991918 +0100 -+++ Linux-PAM-1.3.1/modules/pam_motd/pam_motd.c 2024-11-04 13:17:27.434991946 +0100 -@@ -83,14 +83,14 @@ static void try_to_display_fd(pam_handle - * Returns 0 in case of error, 1 in case of success. - */ - static int pam_split_string(const pam_handle_t *pamh, char *arg, char delim, -- char ***out_arg_split, unsigned int *out_num_strs) -+ char ***out_arg_split, size_t *out_num_strs) - { - char *arg_extracted = NULL; - const char *arg_ptr = arg; - char **arg_split = NULL; - char delim_str[2]; -- unsigned int i = 0; -- unsigned int num_strs = 0; -+ size_t i = 0; -+ size_t num_strs = 0; - int retval = 0; - - delim_str[0] = delim; -@@ -184,13 +184,13 @@ static int filter_dirents(const struct d - } - - static void try_to_display_directories_with_overrides(pam_handle_t *pamh, -- char **motd_dir_path_split, unsigned int num_motd_dirs, int report_missing) -+ char **motd_dir_path_split, size_t num_motd_dirs, int report_missing) - { - struct dirent ***dirscans = NULL; - unsigned int *dirscans_sizes = NULL; - unsigned int dirscans_size_total = 0; - char **dirnames_all = NULL; -- unsigned int i; -+ size_t i; - int i_dirnames = 0; - - if (pamh == NULL || motd_dir_path_split == NULL) { -@@ -302,11 +302,11 @@ int pam_sm_open_session(pam_handle_t *pa - int retval = PAM_IGNORE; - const char *motd_path = NULL; - char *motd_path_copy = NULL; -- unsigned int num_motd_paths = 0; -+ size_t num_motd_paths = 0; - char **motd_path_split = NULL; - const char *motd_dir_path = NULL; - char *motd_dir_path_copy = NULL; -- unsigned int num_motd_dir_paths = 0; -+ size_t num_motd_dir_paths = 0; - char **motd_dir_path_split = NULL; - int report_missing; - diff --git a/SOURCES/pam-1.3.1-motd-manpage.patch b/SOURCES/pam-1.3.1-motd-manpage.patch deleted file mode 100644 index b8e2a1e..0000000 --- a/SOURCES/pam-1.3.1-motd-manpage.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff -up Linux-PAM-1.3.1/modules/pam_motd/pam_motd.8.xml.motd-manpage Linux-PAM-1.3.1/modules/pam_motd/pam_motd.8.xml ---- Linux-PAM-1.3.1/modules/pam_motd/pam_motd.8.xml.motd-manpage 2018-05-18 11:50:46.000000000 +0200 -+++ Linux-PAM-1.3.1/modules/pam_motd/pam_motd.8.xml 2019-12-19 10:29:36.243558251 +0100 -@@ -31,10 +31,19 @@ - - pam_motd is a PAM module that can be used to display - arbitrary motd (message of the day) files after a successful -- login. By default the /etc/motd file is -+ login. By default the /etc/motd file and -+ all files from /etc/motd.d are - shown. The message size is limited to 64KB. - -- -+ -+ To silence a message, -+ a symbolic link with target /dev/null -+ may be placed in /etc/motd.d with -+ the same filename as the message to be silenced. Example: -+ -+ -+ ln -sfn /dev/null /etc/motd.d/my_motd -+ - - - diff --git a/SOURCES/pam-1.3.1-namespace-gdm-doc.patch b/SOURCES/pam-1.3.1-namespace-gdm-doc.patch deleted file mode 100644 index 48c4961..0000000 --- a/SOURCES/pam-1.3.1-namespace-gdm-doc.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 491e5500b6b3913f531574208274358a2df88659 Mon Sep 17 00:00:00 2001 -From: ikerexxe -Date: Mon, 5 Oct 2020 10:41:29 +0200 -Subject: [PATCH] pam_namespace: polyinstantiation refer to gdm doc - -modules/pam_namespace/pam_namespace.8.xml: delete obsolete information -about polyinstantiation and refer to gdm's documentation. - -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1861841 ---- - modules/pam_namespace/pam_namespace.8.xml | 41 ++--------------------- - 1 file changed, 2 insertions(+), 39 deletions(-) - -diff --git a/modules/pam_namespace/pam_namespace.8.xml b/modules/pam_namespace/pam_namespace.8.xml -index f0f80d33..57c44c4b 100644 ---- a/modules/pam_namespace/pam_namespace.8.xml -+++ b/modules/pam_namespace/pam_namespace.8.xml -@@ -343,45 +343,8 @@ - - - -- To use polyinstantiation with graphical display manager gdm, insert the -- following line, before exit 0, in /etc/gdm/PostSession/Default: -- -- -- -- /usr/sbin/gdm-safe-restart -- -- -- -- This allows gdm to restart after each session and appropriately adjust -- namespaces of display manager and the X server. If polyinstantiation -- of /tmp is desired along with the graphical environment, then additional -- configuration changes are needed to address the interaction of X server -- and font server namespaces with their use of /tmp to create -- communication sockets. Please use the initialization script -- /etc/security/namespace.init to ensure that -- the X server and its clients can appropriately access the -- communication socket X0. Please refer to the sample instructions -- provided in the comment section of the instance initialization script -- /etc/security/namespace.init. In addition, -- perform the following changes to use graphical environment with -- polyinstantiation of /tmp: -- -- -- -- -- 1. Disable the use of font server by commenting out "FontPath" -- line in /etc/X11/xorg.conf. If you do want to use the font server -- then you will have to augment the instance initialization -- script to appropriately provide /tmp/.font-unix from the -- polyinstantiated /tmp. -- 2. Ensure that the gdm service is setup to use pam_namespace, -- as described above, by modifying /etc/pam.d/gdm. -- 3. Ensure that the display manager is configured to restart X server -- with each new session. This default setup can be verified by -- making sure that /usr/share/gdm/defaults.conf contains -- "AlwaysRestartServer=true", and it is not overridden by -- /etc/gdm/custom.conf. -- -+ To use polyinstantiation with graphical display manager gdm, please refer -+ to gdm's documentation. - - - --- -2.26.2 - diff --git a/SOURCES/pam-1.3.1-namespace-mntopts.patch b/SOURCES/pam-1.3.1-namespace-mntopts.patch deleted file mode 100644 index 3249157..0000000 --- a/SOURCES/pam-1.3.1-namespace-mntopts.patch +++ /dev/null @@ -1,131 +0,0 @@ -diff --git a/modules/pam_namespace/namespace.conf.5.xml b/modules/pam_namespace/namespace.conf.5.xml -index c7698cb..a94b49e 100644 ---- a/modules/pam_namespace/namespace.conf.5.xml -+++ b/modules/pam_namespace/namespace.conf.5.xml -@@ -122,9 +122,14 @@ - mntopts=value - - value of this flag is passed to the mount call when the tmpfs mount is - done. It allows for example the specification of the maximum size of the -- tmpfs instance that is created by the mount call. See -- mount8 -- for details. -+ tmpfs instance that is created by the mount call. In addition to -+ options specified in the -+ tmpfs5 -+ manual the nosuid, -+ noexec, and nodev flags -+ can be used to respectively disable setuid bit effect, disable running -+ executables, and disable devices to be interpreted on the mounted -+ tmpfs filesystem. - - - -diff --git a/modules/pam_namespace/pam_namespace.c b/modules/pam_namespace/pam_namespace.c -index f541f89..660c7a1 100644 ---- a/modules/pam_namespace/pam_namespace.c -+++ b/modules/pam_namespace/pam_namespace.c -@@ -230,6 +230,73 @@ static int parse_iscript_params(char *params, struct polydir_s *poly) - return 0; - } - -+struct mntflag { -+ const char *name; -+ size_t len; -+ unsigned long flag; -+}; -+ -+#define LITERAL_AND_LEN(x) x, sizeof(x) - 1 -+ -+static const struct mntflag mntflags[] = { -+ { LITERAL_AND_LEN("noexec"), MS_NOEXEC }, -+ { LITERAL_AND_LEN("nosuid"), MS_NOSUID }, -+ { LITERAL_AND_LEN("nodev"), MS_NODEV } -+ }; -+ -+static int filter_mntopts(const char *opts, char **filtered, -+ unsigned long *mountflags) -+{ -+ size_t origlen = strlen(opts); -+ const char *end; -+ char *dest; -+ -+ dest = *filtered = NULL; -+ *mountflags = 0; -+ -+ if (origlen == 0) -+ return 0; -+ -+ do { -+ size_t len; -+ int i; -+ -+ end = strchr(opts, ','); -+ if (end == NULL) { -+ len = strlen(opts); -+ } else { -+ len = end - opts; -+ } -+ -+ for (i = 0; i < (int)(sizeof(mntflags)/sizeof(mntflags[0])); i++) { -+ if (mntflags[i].len != len) -+ continue; -+ if (memcmp(mntflags[i].name, opts, len) == 0) { -+ *mountflags |= mntflags[i].flag; -+ opts = end; -+ break; -+ } -+ } -+ -+ if (opts != end) { -+ if (dest != NULL) { -+ *dest = ','; -+ ++dest; -+ } else { -+ dest = *filtered = calloc(1, origlen + 1); -+ if (dest == NULL) -+ return -1; -+ } -+ memcpy(dest, opts, len); -+ dest += len; -+ } -+ -+ opts = end + 1; -+ } while (end != NULL); -+ -+ return 0; -+} -+ - static int parse_method(char *method, struct polydir_s *poly, - struct instance_data *idata) - { -@@ -289,7 +356,8 @@ static int parse_method(char *method, struct polydir_s *poly, - break; - } - free(poly->mount_opts); /* if duplicate mntopts specified */ -- if ((poly->mount_opts = strdup(flag+namelen+1)) == NULL) { -+ poly->mount_opts = NULL; -+ if (filter_mntopts(flag+namelen+1, &poly->mount_opts, &poly->mount_flags) != 0) { - pam_syslog(idata->pamh, LOG_CRIT, "Memory allocation error"); - return -1; - } -@@ -1484,7 +1552,7 @@ static int ns_setup(struct polydir_s *polyptr, - } - - if (polyptr->method == TMPFS) { -- if (mount("tmpfs", polyptr->dir, "tmpfs", 0, polyptr->mount_opts) < 0) { -+ if (mount("tmpfs", polyptr->dir, "tmpfs", polyptr->mount_flags, polyptr->mount_opts) < 0) { - pam_syslog(idata->pamh, LOG_ERR, "Error mounting tmpfs on %s, %m", - polyptr->dir); - return PAM_SESSION_ERR; -diff --git a/modules/pam_namespace/pam_namespace.h b/modules/pam_namespace/pam_namespace.h -index 47ebcc3..1522386 100644 ---- a/modules/pam_namespace/pam_namespace.h -+++ b/modules/pam_namespace/pam_namespace.h -@@ -166,6 +166,7 @@ struct polydir_s { - unsigned int flags; /* polydir flags */ - char *init_script; /* path to init script */ - char *mount_opts; /* mount options for tmpfs mount */ -+ unsigned long mount_flags; /* mount flags for tmpfs mount */ - uid_t owner; /* user which should own the polydir */ - gid_t group; /* group which should own the polydir */ - mode_t mode; /* mode of the polydir */ diff --git a/SOURCES/pam-1.3.1-namespace-protect-dir.patch b/SOURCES/pam-1.3.1-namespace-protect-dir.patch deleted file mode 100644 index 39e2b5e..0000000 --- a/SOURCES/pam-1.3.1-namespace-protect-dir.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 031bb5a5d0d950253b68138b498dc93be69a64cb Mon Sep 17 00:00:00 2001 -From: Matthias Gerstner -Date: Wed, 27 Dec 2023 14:01:59 +0100 -Subject: [PATCH] pam_namespace: protect_dir(): use O_DIRECTORY to prevent - local DoS situations - -Without O_DIRECTORY the path crawling logic is subject to e.g. FIFOs -being placed in user controlled directories, causing the PAM module to -block indefinitely during `openat()`. - -Pass O_DIRECTORY to cause the `openat()` to fail if the path does not -refer to a directory. - -With this the check whether the final path element is a directory -becomes unnecessary, drop it. ---- - modules/pam_namespace/pam_namespace.c | 18 +----------------- - 1 file changed, 1 insertion(+), 17 deletions(-) - -diff --git a/modules/pam_namespace/pam_namespace.c b/modules/pam_namespace/pam_namespace.c -index 2528cff8..f72d6718 100644 ---- a/modules/pam_namespace/pam_namespace.c -+++ b/modules/pam_namespace/pam_namespace.c -@@ -1201,7 +1201,7 @@ static int protect_dir(const char *path, mode_t mode, int do_mkdir, - int dfd = AT_FDCWD; - int dfd_next; - int save_errno; -- int flags = O_RDONLY; -+ int flags = O_RDONLY | O_DIRECTORY; - int rv = -1; - struct stat st; - -@@ -1255,22 +1255,6 @@ static int protect_dir(const char *path, mode_t mode, int do_mkdir, - rv = openat(dfd, dir, flags); - } - -- if (rv != -1) { -- if (fstat(rv, &st) != 0) { -- save_errno = errno; -- close(rv); -- rv = -1; -- errno = save_errno; -- goto error; -- } -- if (!S_ISDIR(st.st_mode)) { -- close(rv); -- errno = ENOTDIR; -- rv = -1; -- goto error; -- } -- } -- - if (flags & O_NOFOLLOW) { - /* we are inside user-owned dir - protect */ - if (protect_mount(rv, p, idata) == -1) { --- -2.43.0 - diff --git a/SOURCES/pam-1.3.1-noflex.patch b/SOURCES/pam-1.3.1-noflex.patch deleted file mode 100644 index c65d225..0000000 --- a/SOURCES/pam-1.3.1-noflex.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff -up Linux-PAM-1.3.1/doc/Makefile.am.noflex Linux-PAM-1.3.1/doc/Makefile.am ---- Linux-PAM-1.3.1/doc/Makefile.am.noflex 2017-02-10 11:10:15.000000000 +0100 -+++ Linux-PAM-1.3.1/doc/Makefile.am 2018-05-18 14:53:50.300997606 +0200 -@@ -2,7 +2,7 @@ - # Copyright (c) 2005, 2006 Thorsten Kukuk - # - --SUBDIRS = man specs sag adg mwg -+SUBDIRS = man sag adg mwg - - CLEANFILES = *~ - -diff -up Linux-PAM-1.3.1/Makefile.am.noflex Linux-PAM-1.3.1/Makefile.am ---- Linux-PAM-1.3.1/Makefile.am.noflex 2018-05-18 14:53:50.301997629 +0200 -+++ Linux-PAM-1.3.1/Makefile.am 2018-05-18 14:55:31.576353800 +0200 -@@ -4,7 +4,7 @@ - - AUTOMAKE_OPTIONS = 1.9 gnu dist-bzip2 dist-xz check-news - --SUBDIRS = libpam tests libpamc libpam_misc modules po conf doc examples xtests -+SUBDIRS = libpam tests libpamc libpam_misc modules po doc examples xtests - - CLEANFILES = *~ - diff --git a/SOURCES/pam-1.3.1-pam-cc-compat.patch b/SOURCES/pam-1.3.1-pam-cc-compat.patch deleted file mode 100644 index fe9a95a..0000000 --- a/SOURCES/pam-1.3.1-pam-cc-compat.patch +++ /dev/null @@ -1,63 +0,0 @@ -diff -up Linux-PAM-1.3.1/libpam/include/pam_cc_compat.h.pam-cc-compat Linux-PAM-1.3.1/libpam/include/pam_cc_compat.h ---- Linux-PAM-1.3.1/libpam/include/pam_cc_compat.h.pam-cc-compat 2022-05-26 10:43:50.436328027 +0200 -+++ Linux-PAM-1.3.1/libpam/include/pam_cc_compat.h 2022-05-26 10:43:50.436328027 +0200 -@@ -0,0 +1,47 @@ -+/* -+ * Copyright (c) 2020 Dmitry V. Levin -+ */ -+ -+#ifndef PAM_CC_COMPAT_H -+#define PAM_CC_COMPAT_H -+ -+#include "config.h" -+#include -+ -+#if defined __clang__ && defined __clang_major__ && defined __clang_minor__ -+# define PAM_CLANG_PREREQ(maj, min) \ -+ ((__clang_major__ << 16) + __clang_minor__ >= ((maj) << 16) + (min)) -+#else -+# define PAM_CLANG_PREREQ(maj, min) 0 -+#endif -+ -+#if PAM_GNUC_PREREQ(4, 6) -+# define DIAG_PUSH_IGNORE_CAST_QUAL \ -+ _Pragma("GCC diagnostic push"); \ -+ _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") -+# define DIAG_POP_IGNORE_CAST_QUAL \ -+ _Pragma("GCC diagnostic pop") -+# define DIAG_PUSH_IGNORE_CAST_ALIGN \ -+ _Pragma("GCC diagnostic push"); \ -+ _Pragma("GCC diagnostic ignored \"-Wcast-align\"") -+# define DIAG_POP_IGNORE_CAST_ALIGN \ -+ _Pragma("GCC diagnostic pop") -+#elif PAM_CLANG_PREREQ(2, 6) -+# define DIAG_PUSH_IGNORE_CAST_QUAL \ -+ _Pragma("clang diagnostic push"); \ -+ _Pragma("clang diagnostic ignored \"-Wcast-qual\"") -+# define DIAG_POP_IGNORE_CAST_QUAL \ -+ _Pragma("clang diagnostic pop") -+# define DIAG_PUSH_IGNORE_CAST_ALIGN \ -+ _Pragma("clang diagnostic push"); \ -+ _Pragma("clang diagnostic ignored \"-Wcast-align\"") -+# define DIAG_POP_IGNORE_CAST_ALIGN \ -+ _Pragma("clang diagnostic pop") -+#else -+# define DIAG_PUSH_IGNORE_CAST_QUAL /* empty */ -+# define DIAG_POP_IGNORE_CAST_QUAL /* empty */ -+# define DIAG_PUSH_IGNORE_CAST_ALIGN /* empty */ -+# define DIAG_POP_IGNORE_CAST_ALIGN /* empty */ -+#endif -+ -+#endif /* PAM_CC_COMPAT_H */ -diff -up Linux-PAM-1.3.1/libpam/Makefile.am.pam-cc-compat Linux-PAM-1.3.1/libpam/Makefile.am ---- Linux-PAM-1.3.1/libpam/Makefile.am.pam-cc-compat 2022-05-26 10:43:50.436328027 +0200 -+++ Linux-PAM-1.3.1/libpam/Makefile.am 2022-05-26 10:44:00.865402730 +0200 -@@ -18,7 +18,7 @@ include_HEADERS = include/security/_pam_ - include/security/pam_ext.h include/security/pam_modutil.h - - noinst_HEADERS = pam_prelude.h pam_private.h pam_tokens.h \ -- pam_modutil_private.h -+ pam_modutil_private.h include/pam_cc_compat.h - - libpam_la_LDFLAGS = -no-undefined -version-info 84:2:84 - libpam_la_LIBADD = @LIBAUDIT@ $(LIBPRELUDE_LIBS) @LIBDL@ diff --git a/SOURCES/pam-1.3.1-pam-keyinit-thread-safe.patch b/SOURCES/pam-1.3.1-pam-keyinit-thread-safe.patch deleted file mode 100644 index 1f322a1..0000000 --- a/SOURCES/pam-1.3.1-pam-keyinit-thread-safe.patch +++ /dev/null @@ -1,125 +0,0 @@ -diff -up Linux-PAM-1.3.1/modules/pam_keyinit/pam_keyinit.c.pam_keyinit-thread-safe Linux-PAM-1.3.1/modules/pam_keyinit/pam_keyinit.c ---- Linux-PAM-1.3.1/modules/pam_keyinit/pam_keyinit.c.pam_keyinit-thread-safe 2017-02-10 11:10:15.000000000 +0100 -+++ Linux-PAM-1.3.1/modules/pam_keyinit/pam_keyinit.c 2022-04-25 12:10:28.071240439 +0200 -@@ -20,6 +20,7 @@ - #include - #include - #include -+#include - - #define KEY_SPEC_SESSION_KEYRING -3 /* ID for session keyring */ - #define KEY_SPEC_USER_KEYRING -4 /* ID for UID-specific keyring */ -@@ -30,12 +31,12 @@ - #define KEYCTL_REVOKE 3 /* revoke a key */ - #define KEYCTL_LINK 8 /* link a key into a keyring */ - --static int my_session_keyring; --static int session_counter; --static int do_revoke; --static int revoke_as_uid; --static int revoke_as_gid; --static int xdebug = 0; -+static _Thread_local int my_session_keyring = 0; -+static _Atomic int session_counter = 0; -+static _Thread_local int do_revoke = 0; -+static _Thread_local uid_t revoke_as_uid; -+static _Thread_local gid_t revoke_as_gid; -+static _Thread_local int xdebug = 0; - - static void debug(pam_handle_t *pamh, const char *fmt, ...) - __attribute__((format(printf, 2, 3))); -@@ -65,6 +66,33 @@ static int error(pam_handle_t *pamh, con - return PAM_SESSION_ERR; - } - -+static int pam_setreuid(uid_t ruid, uid_t euid) -+{ -+#if defined(SYS_setreuid32) -+ return syscall(SYS_setreuid32, ruid, euid); -+#else -+ return syscall(SYS_setreuid, ruid, euid); -+#endif -+} -+ -+static int pam_setregid(gid_t rgid, gid_t egid) -+{ -+#if defined(SYS_setregid32) -+ return syscall(SYS_setregid32, rgid, egid); -+#else -+ return syscall(SYS_setregid, rgid, egid); -+#endif -+} -+ -+static int pam_setresuid(uid_t ruid, uid_t euid, uid_t suid) -+{ -+#if defined(SYS_setresuid32) -+ return syscall(SYS_setresuid32, ruid, euid, suid); -+#else -+ return syscall(SYS_setresuid, ruid, euid, suid); -+#endif -+} -+ - /* - * initialise the session keyring for this process - */ -@@ -139,23 +167,25 @@ static void kill_keyrings(pam_handle_t * - - /* switch to the real UID and GID so that we have permission to - * revoke the key */ -- if (revoke_as_gid != old_gid && setregid(-1, revoke_as_gid) < 0) -+ if (revoke_as_gid != old_gid && pam_setregid(-1, revoke_as_gid) < 0) - error(pamh, "Unable to change GID to %d temporarily\n", - revoke_as_gid); - -- if (revoke_as_uid != old_uid && setresuid(-1, revoke_as_uid, old_uid) < 0) -+ if (revoke_as_uid != old_uid && pam_setresuid(-1, revoke_as_uid, old_uid) < 0) - error(pamh, "Unable to change UID to %d temporarily\n", - revoke_as_uid); -+ if (getegid() != old_gid && pam_setregid(-1, old_gid) < 0) -+ error(pamh, "Unable to change GID back to %d\n", old_gid); - - syscall(__NR_keyctl, - KEYCTL_REVOKE, - my_session_keyring); - - /* return to the orignal UID and GID (probably root) */ -- if (revoke_as_uid != old_uid && setreuid(-1, old_uid) < 0) -+ if (revoke_as_uid != old_uid && pam_setreuid(-1, old_uid) < 0) - error(pamh, "Unable to change UID back to %d\n", old_uid); - -- if (revoke_as_gid != old_gid && setregid(-1, old_gid) < 0) -+ if (revoke_as_gid != old_gid && pam_setregid(-1, old_gid) < 0) - error(pamh, "Unable to change GID back to %d\n", old_gid); - - my_session_keyring = 0; -@@ -210,14 +240,14 @@ int pam_sm_open_session(pam_handle_t *pa - - /* switch to the real UID and GID so that the keyring ends up owned by - * the right user */ -- if (gid != old_gid && setregid(gid, -1) < 0) { -+ if (gid != old_gid && pam_setregid(gid, -1) < 0) { - error(pamh, "Unable to change GID to %d temporarily\n", gid); - return PAM_SESSION_ERR; - } - -- if (uid != old_uid && setreuid(uid, -1) < 0) { -+ if (uid != old_uid && pam_setreuid(uid, -1) < 0) { - error(pamh, "Unable to change UID to %d temporarily\n", uid); -- if (setregid(old_gid, -1) < 0) -+ if (pam_setregid(old_gid, -1) < 0) - error(pamh, "Unable to change GID back to %d\n", old_gid); - return PAM_SESSION_ERR; - } -@@ -225,10 +255,10 @@ int pam_sm_open_session(pam_handle_t *pa - ret = init_keyrings(pamh, force); - - /* return to the orignal UID and GID (probably root) */ -- if (uid != old_uid && setreuid(old_uid, -1) < 0) -+ if (uid != old_uid && pam_setreuid(old_uid, -1) < 0) - ret = error(pamh, "Unable to change UID back to %d\n", old_uid); - -- if (gid != old_gid && setregid(old_gid, -1) < 0) -+ if (gid != old_gid && pam_setregid(old_gid, -1) < 0) - ret = error(pamh, "Unable to change GID back to %d\n", old_gid); - - return ret; diff --git a/SOURCES/pam-1.3.1-pam-limits-unlimited-value.patch b/SOURCES/pam-1.3.1-pam-limits-unlimited-value.patch deleted file mode 100644 index 1cf063c..0000000 --- a/SOURCES/pam-1.3.1-pam-limits-unlimited-value.patch +++ /dev/null @@ -1,78 +0,0 @@ -diff -up Linux-PAM-1.3.1/modules/pam_limits/limits.conf.5.xml.pam-limits-unlimited-value Linux-PAM-1.3.1/modules/pam_limits/limits.conf.5.xml ---- Linux-PAM-1.3.1/modules/pam_limits/limits.conf.5.xml.pam-limits-unlimited-value 2022-01-28 09:45:41.431606850 +0100 -+++ Linux-PAM-1.3.1/modules/pam_limits/limits.conf.5.xml 2022-01-28 09:47:31.732430391 +0100 -@@ -275,6 +275,8 @@ - All items support the values -1, - unlimited or infinity indicating no limit, - except for priority and nice. -+ If nofile is to be set to one of these values, -+ it will be set to the contents of /proc/sys/fs/nr_open instead (see setrlimit(3)). - - - If a hard limit or soft limit of a resource is set to a valid value, -diff -up Linux-PAM-1.3.1/modules/pam_limits/pam_limits.c.pam-limits-unlimited-value Linux-PAM-1.3.1/modules/pam_limits/pam_limits.c ---- Linux-PAM-1.3.1/modules/pam_limits/pam_limits.c.pam-limits-unlimited-value 2022-01-28 09:45:41.415606731 +0100 -+++ Linux-PAM-1.3.1/modules/pam_limits/pam_limits.c 2022-01-28 09:45:41.431606850 +0100 -@@ -487,6 +487,41 @@ static int init_limits(pam_handle_t *pam - return retval; - } - -+/* -+ * Read the contents of and return it in *valuep -+ * return 1 if conversion succeeds, result is in *valuep -+ * return 0 if conversion fails, *valuep is untouched. -+ */ -+static int -+value_from_file(const char *pathname, rlim_t *valuep) -+{ -+ char buf[128]; -+ FILE *fp; -+ int retval; -+ -+ retval = 0; -+ -+ if ((fp = fopen(pathname, "r")) != NULL) { -+ if (fgets(buf, sizeof(buf), fp) != NULL) { -+ char *endptr; -+ unsigned long long value; -+ -+ errno = 0; -+ value = strtoull(buf, &endptr, 10); -+ if (endptr != buf && -+ (value != ULLONG_MAX || errno == 0) && -+ (unsigned long long) (rlim_t) value == value) { -+ *valuep = (rlim_t) value; -+ retval = 1; -+ } -+ } -+ -+ fclose(fp); -+ } -+ -+ return retval; -+} -+ - static void - process_limit (const pam_handle_t *pamh, int source, const char *lim_type, - const char *lim_item, const char *lim_value, -@@ -652,6 +687,20 @@ process_limit (const pam_handle_t *pamh, - rlimit_value = 20 - int_value; - break; - #endif -+ case RLIMIT_NOFILE: -+ /* -+ * If nofile is to be set to "unlimited", try to set it to -+ * the value in /proc/sys/fs/nr_open instead. -+ */ -+ if (rlimit_value == RLIM_INFINITY) { -+ if (!value_from_file("/proc/sys/fs/nr_open", &rlimit_value)) -+ pam_syslog(pamh, LOG_WARNING, -+ "Cannot set \"nofile\" to a sensible value"); -+ else if (ctrl & PAM_DEBUG_ARG) -+ pam_syslog(pamh, LOG_DEBUG, "Setting \"nofile\" limit to %llu", -+ (unsigned long long) rlimit_value); -+ } -+ break; - } - - if ( (limit_item != LIMIT_LOGIN) diff --git a/SOURCES/pam-1.3.1-pam-misc-configurable.patch b/SOURCES/pam-1.3.1-pam-misc-configurable.patch deleted file mode 100644 index 045e70e..0000000 --- a/SOURCES/pam-1.3.1-pam-misc-configurable.patch +++ /dev/null @@ -1,29 +0,0 @@ -diff -up Linux-PAM-1.3.1/configure.ac.pam-misc-configurable Linux-PAM-1.3.1/configure.ac ---- Linux-PAM-1.3.1/configure.ac.pam-misc-configurable 2023-06-26 09:57:00.243146563 +0200 -+++ Linux-PAM-1.3.1/configure.ac 2023-06-26 09:59:45.353636685 +0200 -@@ -621,6 +621,13 @@ if test x"$opt_kerneloverflowuid" == x; - fi - AC_DEFINE_UNQUOTED(PAM_USERTYPE_OVERFLOW_UID, $opt_kerneloverflowuid, [Kernel overflow uid.]) - -+AC_ARG_WITH([misc-conv-bufsize], -+AS_HELP_STRING([--with-misc-conv-bufsize=], -+ [Size of input buffer for libpam_misc's misc_conv() conversation function, default=4096]), -+ [], -+ [with_misc_conv_bufsize=4096]) -+AC_DEFINE_UNQUOTED(PAM_MISC_CONV_BUFSIZE, $with_misc_conv_bufsize, [libpam_misc misc_conv() buffer size.]) -+ - dnl Files to be created from when we run configure - AC_CONFIG_FILES([Makefile libpam/Makefile libpamc/Makefile libpamc/test/Makefile \ - libpam_misc/Makefile conf/Makefile conf/pam_conv1/Makefile \ -diff -up Linux-PAM-1.3.1/libpam_misc/misc_conv.c.pam-misc-configurable Linux-PAM-1.3.1/libpam_misc/misc_conv.c ---- Linux-PAM-1.3.1/libpam_misc/misc_conv.c.pam-misc-configurable 2023-06-26 09:57:00.242146560 +0200 -+++ Linux-PAM-1.3.1/libpam_misc/misc_conv.c 2023-06-26 10:00:38.023787972 +0200 -@@ -18,7 +18,7 @@ - #include - #include - --#define INPUTSIZE PAM_MAX_MSG_SIZE /* maximum length of input+1 */ -+#define INPUTSIZE PAM_MISC_CONV_BUFSIZE /* maximum length of input+1 */ - #define CONV_ECHO_ON 1 /* types of echo state */ - #define CONV_ECHO_OFF 0 - diff --git a/SOURCES/pam-1.3.1-pam-modutil-close-write.patch b/SOURCES/pam-1.3.1-pam-modutil-close-write.patch deleted file mode 100644 index 611e855..0000000 --- a/SOURCES/pam-1.3.1-pam-modutil-close-write.patch +++ /dev/null @@ -1,74 +0,0 @@ -From b6f73810a2e7afd02a231e2dfa14b05752c83db7 Mon Sep 17 00:00:00 2001 -From: "Dmitry V. Levin" -Date: Wed, 26 Feb 2020 19:20:58 +0000 -Subject: [PATCH] pam_modutil_sanitize_helper_fds: fix SIGPIPE effect of - PAM_MODUTIL_PIPE_FD - -When pam_modutil_sanitize_helper_fds() is invoked with -PAM_MODUTIL_PIPE_FD to provide a dummy pipe descriptor for stdout -or stderr, it closes the read end of the newly created dummy pipe. -The negative side effect of this approach is that any write to such -descriptor triggers a SIGPIPE. Avoid this by closing the write end of -the dummy pipe and using its read end as a dummy pipe descriptor for -output. Any read from such descriptor returns 0, and any write just -fails with EBADF, which should work better with unprepared writers. - -* libpam/pam_modutil_sanitize.c (redirect_out_pipe): Remove. -(redirect_out): Call redirect_in_pipe instead of redirect_out_pipe. - -Fixes: b0ec5d1e ("Introduce pam_modutil_sanitize_helper_fds") ---- - libpam/pam_modutil_sanitize.c | 30 +----------------------------- - 1 file changed, 1 insertion(+), 29 deletions(-) - -diff --git a/libpam/pam_modutil_sanitize.c b/libpam/pam_modutil_sanitize.c -index 605c859d..58b9537c 100644 ---- a/libpam/pam_modutil_sanitize.c -+++ b/libpam/pam_modutil_sanitize.c -@@ -46,34 +46,6 @@ redirect_in_pipe(pam_handle_t *pamh, int fd, const char *name) - return fd; - } - --/* -- * Creates a pipe, closes its read end, redirects fd to its write end. -- * Returns fd on success, -1 otherwise. -- */ --static int --redirect_out_pipe(pam_handle_t *pamh, int fd, const char *name) --{ -- int out[2]; -- -- if (pipe(out) < 0) { -- pam_syslog(pamh, LOG_ERR, "Could not create pipe: %m"); -- return -1; -- } -- -- close(out[0]); -- -- if (out[1] == fd) -- return fd; -- -- if (dup2(out[1], fd) != fd) { -- pam_syslog(pamh, LOG_ERR, "dup2 of %s failed: %m", name); -- fd = -1; -- } -- -- close(out[1]); -- return fd; --} -- - /* - * Opens /dev/null for writing, redirects fd there. - * Returns fd on success, -1 otherwise. -@@ -106,7 +78,7 @@ redirect_out(pam_handle_t *pamh, enum pam_modutil_redirect_fd mode, - { - switch (mode) { - case PAM_MODUTIL_PIPE_FD: -- if (redirect_out_pipe(pamh, fd, name) < 0) -+ if (redirect_in_pipe(pamh, fd, name) < 0) - return -1; - break; - case PAM_MODUTIL_NULL_FD: --- -2.25.3 - diff --git a/SOURCES/pam-1.3.1-pam-motd-avoid-unnecessary-logging.patch b/SOURCES/pam-1.3.1-pam-motd-avoid-unnecessary-logging.patch deleted file mode 100644 index 52f7292..0000000 --- a/SOURCES/pam-1.3.1-pam-motd-avoid-unnecessary-logging.patch +++ /dev/null @@ -1,283 +0,0 @@ -From d57ab22133654033ee1da89f128a81572d320985 Mon Sep 17 00:00:00 2001 -From: Tomas Mraz -Date: Thu, 20 Dec 2018 13:59:25 +0100 -Subject: [PATCH] pam_motd: Cleanup the code and avoid unnecessary logging - -The pam_motd module will not log if the default motd.d directories -are missing. - -Also cleanup some code cleanliness issues and fix compilation -warnings. - -* modules/pam_motd/pam_motd.c: Constification of constant strings. - (try_to_display_directory): Removed unused function. - (pam_split_string): Replace uint with unsigned int. Fix warnings. - (compare_strings): Fix warnings by proper constification. - (try_to_display_directories_with_overrides): Cleanups. Switch - off the logging if the motd.d directories are missing and they - are default ones. - (pam_sm_open_session): Cleanup warnings. Pass the information - to try_to_display_directories_with_overrides() that non-default - motd options are used. ---- - modules/pam_motd/pam_motd.c | 88 ++++++++++++++++--------------------- - 1 file changed, 37 insertions(+), 51 deletions(-) - -diff --git a/modules/pam_motd/pam_motd.c b/modules/pam_motd/pam_motd.c -index ec3ebd58..dbd718b6 100644 ---- a/modules/pam_motd/pam_motd.c -+++ b/modules/pam_motd/pam_motd.c -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -48,8 +49,8 @@ pam_sm_close_session (pam_handle_t *pamh UNUSED, int flags UNUSED, - return PAM_IGNORE; - } - --static char default_motd[] = DEFAULT_MOTD; --static char default_motd_dir[] = DEFAULT_MOTD_D; -+static const char default_motd[] = DEFAULT_MOTD; -+static const char default_motd_dir[] = DEFAULT_MOTD_D; - - static void try_to_display_fd(pam_handle_t *pamh, int fd) - { -@@ -75,28 +76,6 @@ static void try_to_display_fd(pam_handle_t *pamh, int fd) - _pam_drop(mtmp); - } - --static void try_to_display_directory(pam_handle_t *pamh, const char *dirname) --{ -- DIR *dirp; -- -- dirp = opendir(dirname); -- -- if (dirp != NULL) { -- struct dirent *entry; -- -- while ((entry = readdir(dirp))) { -- int fd = openat(dirfd(dirp), entry->d_name, O_RDONLY); -- -- if (fd >= 0) { -- try_to_display_fd(pamh, fd); -- close(fd); -- } -- } -- -- closedir(dirp); -- } --} -- - /* - * Split a DELIM-separated string ARG into an array. - * Outputs a newly allocated array of strings OUT_ARG_SPLIT -@@ -104,14 +83,14 @@ static void try_to_display_directory(pam_handle_t *pamh, const char *dirname) - * Returns 0 in case of error, 1 in case of success. - */ - static int pam_split_string(const pam_handle_t *pamh, char *arg, char delim, -- char ***out_arg_split, uint *out_num_strs) -+ char ***out_arg_split, unsigned int *out_num_strs) - { - char *arg_extracted = NULL; - const char *arg_ptr = arg; - char **arg_split = NULL; - char delim_str[2]; -- int i = 0; -- uint num_strs = 0; -+ unsigned int i = 0; -+ unsigned int num_strs = 0; - int retval = 0; - - delim_str[0] = delim; -@@ -126,7 +105,7 @@ static int pam_split_string(const pam_handle_t *pamh, char *arg, char delim, - arg_ptr = strchr(arg_ptr + sizeof(const char), delim); - } - -- arg_split = (char **)calloc(num_strs, sizeof(char *)); -+ arg_split = calloc(num_strs, sizeof(char *)); - if (arg_split == NULL) { - pam_syslog(pamh, LOG_CRIT, "pam_motd: failed to allocate string array"); - goto out; -@@ -180,10 +159,10 @@ static int join_dir_strings(char **strp_out, const char *a_str, const char *b_st - return retval; - } - --static int compare_strings(const void * a, const void * b) -+static int compare_strings(const void *a, const void *b) - { -- const char *a_str = *(char **)a; -- const char *b_str = *(char **)b; -+ const char *a_str = *(const char * const *)a; -+ const char *b_str = *(const char * const *)b; - - if (a_str == NULL && b_str == NULL) { - return 0; -@@ -205,13 +184,13 @@ static int filter_dirents(const struct dirent *d) - } - - static void try_to_display_directories_with_overrides(pam_handle_t *pamh, -- char **motd_dir_path_split, int num_motd_dirs) -+ char **motd_dir_path_split, unsigned int num_motd_dirs, int report_missing) - { - struct dirent ***dirscans = NULL; -- int *dirscans_sizes = NULL; -- int dirscans_size_total = 0; -+ unsigned int *dirscans_sizes = NULL; -+ unsigned int dirscans_size_total = 0; - char **dirnames_all = NULL; -- int i; -+ unsigned int i; - int i_dirnames = 0; - - if (pamh == NULL || motd_dir_path_split == NULL) { -@@ -221,29 +200,31 @@ static void try_to_display_directories_with_overrides(pam_handle_t *pamh, - goto out; - } - -- if ((dirscans = (struct dirent ***)calloc(num_motd_dirs, -- sizeof(struct dirent **))) == NULL) { -+ if ((dirscans = calloc(num_motd_dirs, sizeof(struct dirent **))) == NULL) { - pam_syslog(pamh, LOG_CRIT, "pam_motd: failed to allocate dirent arrays"); - goto out; - } -- if ((dirscans_sizes = (int *)calloc(num_motd_dirs, sizeof(int))) == NULL) { -+ if ((dirscans_sizes = calloc(num_motd_dirs, sizeof(int))) == NULL) { - pam_syslog(pamh, LOG_CRIT, "pam_motd: failed to allocate dirent array sizes"); - goto out; - } - - for (i = 0; i < num_motd_dirs; i++) { -- dirscans_sizes[i] = scandir(motd_dir_path_split[i], &(dirscans[i]), -+ int rv; -+ rv = scandir(motd_dir_path_split[i], &(dirscans[i]), - filter_dirents, alphasort); -- if (dirscans_sizes[i] < 0) { -- pam_syslog(pamh, LOG_ERR, "pam_motd: error scanning directory %s", motd_dir_path_split[i]); -- dirscans_sizes[i] = 0; -+ if (rv < 0) { -+ if (errno != ENOENT || report_missing) { -+ pam_syslog(pamh, LOG_ERR, "pam_motd: error scanning directory %s: %m", -+ motd_dir_path_split[i]); -+ } -+ dirscans_sizes[i] = rv; - } - dirscans_size_total += dirscans_sizes[i]; - } - - /* Allocate space for all file names found in the directories, including duplicates. */ -- if ((dirnames_all = (char **)calloc(dirscans_size_total, -- sizeof(char *))) == NULL) { -+ if ((dirnames_all = calloc(dirscans_size_total, sizeof(char *))) == NULL) { - pam_syslog(pamh, LOG_CRIT, "pam_motd: failed to allocate dirname array"); - goto out; - } -@@ -253,7 +234,7 @@ static void try_to_display_directories_with_overrides(pam_handle_t *pamh, - } - - for (i = 0; i < num_motd_dirs; i++) { -- int j; -+ unsigned int j; - - for (j = 0; j < dirscans_sizes[i]; j++) { - dirnames_all[i_dirnames] = dirscans[i][j]->d_name; -@@ -265,7 +246,7 @@ static void try_to_display_directories_with_overrides(pam_handle_t *pamh, - sizeof(const char *), compare_strings); - - for (i = 0; i < dirscans_size_total; i++) { -- int j; -+ unsigned int j; - - if (dirnames_all[i] == NULL) { - continue; -@@ -301,7 +282,8 @@ static void try_to_display_directories_with_overrides(pam_handle_t *pamh, - out: - _pam_drop(dirnames_all); - for (i = 0; i < num_motd_dirs; i++) { -- int j; -+ unsigned int j; -+ - for (j = 0; j < dirscans_sizes[i]; j++) { - _pam_drop(dirscans[i][j]); - } -@@ -319,12 +301,13 @@ int pam_sm_open_session(pam_handle_t *pamh, int flags, - int retval = PAM_IGNORE; - const char *motd_path = NULL; - char *motd_path_copy = NULL; -- int num_motd_paths = 0; -+ unsigned int num_motd_paths = 0; - char **motd_path_split = NULL; - const char *motd_dir_path = NULL; - char *motd_dir_path_copy = NULL; -- int num_motd_dir_paths = 0; -+ unsigned int num_motd_dir_paths = 0; - char **motd_dir_path_split = NULL; -+ int report_missing; - - if (flags & PAM_SILENT) { - return retval; -@@ -360,6 +343,9 @@ int pam_sm_open_session(pam_handle_t *pamh, int flags, - if (motd_path == NULL && motd_dir_path == NULL) { - motd_path = default_motd; - motd_dir_path = default_motd_dir; -+ report_missing = 0; -+ } else { -+ report_missing = 1; - } - - if (motd_path != NULL) { -@@ -385,7 +371,7 @@ int pam_sm_open_session(pam_handle_t *pamh, int flags, - } - - if (motd_path_split != NULL) { -- int i; -+ unsigned int i; - - for (i = 0; i < num_motd_paths; i++) { - int fd = open(motd_path_split[i], O_RDONLY, 0); -@@ -402,7 +388,7 @@ int pam_sm_open_session(pam_handle_t *pamh, int flags, - - if (motd_dir_path_split != NULL) - try_to_display_directories_with_overrides(pamh, motd_dir_path_split, -- num_motd_dir_paths); -+ num_motd_dir_paths, report_missing); - - out: - _pam_drop(motd_path_copy); --- -2.37.3 - -From c2c0434bd634a817f2b16ce7f58fc96c04e88b03 Mon Sep 17 00:00:00 2001 -From: "Dmitry V. Levin" -Date: Sun, 26 Apr 2020 11:12:59 +0000 -Subject: [PATCH] pam_motd: fix NULL dereference when at least one of motd - directories is not available - -* modules/pam_motd/pam_motd.c -(try_to_display_directories_with_overrides): Do not assign -1U to -dirscans_sizes[i] when scandir(motd_dir_path_split[i]) returns an error. - -Resolves: https://bugzilla.altlinux.org/38389 -Fixes: d57ab221 ("pam_motd: Cleanup the code and avoid unnecessary logging") ---- - modules/pam_motd/pam_motd.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/modules/pam_motd/pam_motd.c b/modules/pam_motd/pam_motd.c -index df09b7d0..8147c6fd 100644 ---- a/modules/pam_motd/pam_motd.c -+++ b/modules/pam_motd/pam_motd.c -@@ -219,6 +219,7 @@ static void try_to_display_directories_with_overrides(pam_handle_t *pamh, - pam_syslog(pamh, LOG_ERR, "pam_motd: error scanning directory %s: %m", - motd_dir_path_split[i]); - } -+ } else { - dirscans_sizes[i] = rv; - } - dirscans_size_total += dirscans_sizes[i]; --- -2.37.3 - diff --git a/SOURCES/pam-1.3.1-pam-motd-fix-memory-leak.patch b/SOURCES/pam-1.3.1-pam-motd-fix-memory-leak.patch deleted file mode 100644 index 932633b..0000000 --- a/SOURCES/pam-1.3.1-pam-motd-fix-memory-leak.patch +++ /dev/null @@ -1,57 +0,0 @@ -From 62cd745d730e5ba13d5d7092ac566fc0b2148e61 Mon Sep 17 00:00:00 2001 -From: "Dmitry V. Levin" -Date: Sun, 26 Apr 2020 11:12:59 +0000 -Subject: [PATCH] pam_motd: fix memory leak - -pam_motd used to leak memory allocated for each motd file -successfully opened in try_to_display_directories_with_overrides. - -* modules/pam_motd/pam_motd.c -(try_to_display_directories_with_overrides): Free abs_path. - -Fixes: f9c9c721 ("pam_motd: Support multiple motd paths specified, with filename overrides (#69)") ---- - modules/pam_motd/pam_motd.c | 20 ++++++++++---------- - 1 file changed, 10 insertions(+), 10 deletions(-) - -diff --git a/modules/pam_motd/pam_motd.c b/modules/pam_motd/pam_motd.c -index f0cd317d..3be129a5 100644 ---- a/modules/pam_motd/pam_motd.c -+++ b/modules/pam_motd/pam_motd.c -@@ -259,23 +259,23 @@ static void try_to_display_directories_with_overrides(pam_handle_t *pamh, - - for (j = 0; j < num_motd_dirs; j++) { - char *abs_path = NULL; -+ int fd; - - if (join_dir_strings(&abs_path, motd_dir_path_split[j], -- dirnames_all[i]) < 0) { -+ dirnames_all[i]) < 0 || abs_path == NULL) { - continue; - } - -- if (abs_path != NULL) { -- int fd = open(abs_path, O_RDONLY, 0); -- if (fd >= 0) { -- try_to_display_fd(pamh, fd); -- close(fd); -+ fd = open(abs_path, O_RDONLY, 0); -+ _pam_drop(abs_path); - -- /* We displayed a file, skip to the next file name. */ -- break; -- } -+ if (fd >= 0) { -+ try_to_display_fd(pamh, fd); -+ close(fd); -+ -+ /* We displayed a file, skip to the next file name. */ -+ break; - } -- _pam_drop(abs_path); - } - } - --- -2.35.3 - diff --git a/SOURCES/pam-1.3.1-pam-motd-fix-segmentation-fault.patch b/SOURCES/pam-1.3.1-pam-motd-fix-segmentation-fault.patch deleted file mode 100644 index af72866..0000000 --- a/SOURCES/pam-1.3.1-pam-motd-fix-segmentation-fault.patch +++ /dev/null @@ -1,133 +0,0 @@ -From 8eaf5570cf011148a0b55c53570df5edaafebdb0 Mon Sep 17 00:00:00 2001 -From: Robert Fairley -Date: Wed, 21 Nov 2018 02:46:02 -0500 -Subject: [PATCH] pam_motd: Fix segmentation fault when no motd_dir specified - (#76) - -This fixes a regression introduced by #69, where motd_path was set -to NULL and passed into strdup() if the motd_dir argument was -not specified in the configuration file. This caused a segmentation -fault. - -* modules/pam_motd/pam_motd.c: fix checks for NULL in arguments -* xtests/Makefile.am: add test scripts and config file -* xtests/tst-pam_motd.sh: add running tst-pam_motd4.sh -* xtests/tst-pam_motd4.pamd: create -* xtests/tst-pam_motd4.sh: create ---- - modules/pam_motd/pam_motd.c | 15 ++++++++++----- - xtests/Makefile.am | 4 ++-- - xtests/tst-pam_motd.sh | 1 + - xtests/tst-pam_motd4.pamd | 3 +++ - xtests/tst-pam_motd4.sh | 27 +++++++++++++++++++++++++++ - 5 files changed, 43 insertions(+), 7 deletions(-) - create mode 100644 xtests/tst-pam_motd4.pamd - create mode 100755 xtests/tst-pam_motd4.sh - -diff --git a/modules/pam_motd/pam_motd.c b/modules/pam_motd/pam_motd.c -index 1c1cfcfa..ec3ebd58 100644 ---- a/modules/pam_motd/pam_motd.c -+++ b/modules/pam_motd/pam_motd.c -@@ -132,7 +132,6 @@ static int pam_split_string(const pam_handle_t *pamh, char *arg, char delim, - goto out; - } - -- - arg_extracted = strtok_r(arg, delim_str, &arg); - while (arg_extracted != NULL && i < num_strs) { - arg_split[i++] = arg_extracted; -@@ -363,15 +362,21 @@ int pam_sm_open_session(pam_handle_t *pamh, int flags, - motd_dir_path = default_motd_dir; - } - -- motd_path_copy = strdup(motd_path); -+ if (motd_path != NULL) { -+ motd_path_copy = strdup(motd_path); -+ } -+ - if (motd_path_copy != NULL) { -- if (pam_split_string(pamh, motd_path_copy, ':', &motd_path_split, -- &num_motd_paths) == 0) { -+ if (pam_split_string(pamh, motd_path_copy, ':', -+ &motd_path_split, &num_motd_paths) == 0) { - goto out; - } - } - -- motd_dir_path_copy = strdup(motd_dir_path); -+ if (motd_dir_path != NULL) { -+ motd_dir_path_copy = strdup(motd_dir_path); -+ } -+ - if (motd_dir_path_copy != NULL) { - if (pam_split_string(pamh, motd_dir_path_copy, ':', - &motd_dir_path_split, &num_motd_dir_paths) == 0) { -diff --git a/xtests/Makefile.am b/xtests/Makefile.am -index 555d5e33..4d5aba3d 100644 ---- a/xtests/Makefile.am -+++ b/xtests/Makefile.am -@@ -34,8 +34,8 @@ EXTRA_DIST = run-xtests.sh tst-pam_dispatch1.pamd tst-pam_dispatch2.pamd \ - tst-pam_pwhistory1.pamd tst-pam_pwhistory1.sh \ - tst-pam_time1.pamd time.conf \ - tst-pam_motd.sh tst-pam_motd1.sh tst-pam_motd2.sh \ -- tst-pam_motd3.sh tst-pam_motd1.pamd \ -- tst-pam_motd2.pamd tst-pam_motd3.pamd -+ tst-pam_motd3.sh tst-pam_motd4.sh tst-pam_motd1.pamd \ -+ tst-pam_motd2.pamd tst-pam_motd3.pamd tst-pam_motd4.pamd - - XTESTS = tst-pam_dispatch1 tst-pam_dispatch2 tst-pam_dispatch3 \ - tst-pam_dispatch4 tst-pam_dispatch5 \ -diff --git a/xtests/tst-pam_motd.sh b/xtests/tst-pam_motd.sh -index 9b0c38f6..90801280 100755 ---- a/xtests/tst-pam_motd.sh -+++ b/xtests/tst-pam_motd.sh -@@ -5,3 +5,4 @@ set -e - ./tst-pam_motd1.sh - ./tst-pam_motd2.sh - ./tst-pam_motd3.sh -+./tst-pam_motd4.sh -diff --git a/xtests/tst-pam_motd4.pamd b/xtests/tst-pam_motd4.pamd -new file mode 100644 -index 00000000..9dc311ad ---- /dev/null -+++ b/xtests/tst-pam_motd4.pamd -@@ -0,0 +1,3 @@ -+#%PAM-1.0 -+session required pam_permit.so -+session optional pam_motd.so motd=tst-pam_motd4.d/etc/motd -diff --git a/xtests/tst-pam_motd4.sh b/xtests/tst-pam_motd4.sh -new file mode 100755 -index 00000000..6022177f ---- /dev/null -+++ b/xtests/tst-pam_motd4.sh -@@ -0,0 +1,27 @@ -+#!/bin/bash -+ -+TST_DIR="tst-pam_motd4.d" -+ -+function tst_cleanup() { -+ rm -rf "${TST_DIR}" -+ rm -f tst-pam_motd4.out -+} -+ -+mkdir -p ${TST_DIR}/etc -+ -+# Verify the case of single motd with no motd_dir given in tst-pam_motd4.pamd -+echo "motd: /etc/motd" > ${TST_DIR}/etc/motd -+ -+./tst-pam_motd tst-pam_motd4 > tst-pam_motd4.out -+ -+RET=$? -+ -+motd_to_show_output=$(cat tst-pam_motd4.out | grep "motd: /etc/motd") -+if [ -z "${motd_to_show_output}" ]; -+then -+ tst_cleanup -+ exit 1 -+fi -+ -+tst_cleanup -+exit $RET --- -2.35.1 - diff --git a/SOURCES/pam-1.3.1-pam-motd-support-multiple-motd-paths.patch b/SOURCES/pam-1.3.1-pam-motd-support-multiple-motd-paths.patch deleted file mode 100644 index f81ecbe..0000000 --- a/SOURCES/pam-1.3.1-pam-motd-support-multiple-motd-paths.patch +++ /dev/null @@ -1,691 +0,0 @@ -diff -up Linux-PAM-1.3.1/modules/pam_motd/pam_motd.8.xml.pam_motd-support-multiple-motd-paths1 Linux-PAM-1.3.1/modules/pam_motd/pam_motd.8.xml ---- Linux-PAM-1.3.1/modules/pam_motd/pam_motd.8.xml.pam_motd-support-multiple-motd-paths1 2022-04-25 12:32:36.939663167 +0200 -+++ Linux-PAM-1.3.1/modules/pam_motd/pam_motd.8.xml 2022-04-25 12:34:43.506582206 +0200 -@@ -21,6 +21,9 @@ - - motd=/path/filename - -+ -+ motd_dir=/path/dirname.d -+ - - - -@@ -31,18 +34,49 @@ - - pam_motd is a PAM module that can be used to display - arbitrary motd (message of the day) files after a successful -- login. By default the /etc/motd file and -- all files from /etc/motd.d are -- shown. The message size is limited to 64KB. -+ login. By default, pam_motd shows files in the -+ following locations: -+ -+ -+ -+ /etc/motd -+ /run/motd -+ /usr/lib/motd -+ /etc/motd.d/ -+ /run/motd.d/ -+ /usr/lib/motd.d/ -+ -+ -+ -+ Each message size is limited to 64KB. -+ -+ -+ If /etc/motd does not exist, -+ then /run/motd is shown. If -+ /run/motd does not exist, then -+ /usr/lib/motd is shown. -+ -+ -+ Similar overriding behavior applies to the directories. -+ Files in /etc/motd.d/ override files -+ with the same name in /run/motd.d/ and -+ /usr/lib/motd.d/. Files in /run/motd.d/ -+ override files with the same name in /usr/lib/motd.d/. -+ -+ -+ Files in the directories listed above are displayed in lexicographic -+ order by name. Moreover, the files are filtered by reading them with the -+ credentials of the target user authenticating on the system. - - - To silence a message, - a symbolic link with target /dev/null - may be placed in /etc/motd.d with - the same filename as the message to be silenced. Example: -+ Creating a symbolic link as follows silences /usr/lib/motd.d/my_motd. - - -- ln -sfn /dev/null /etc/motd.d/my_motd -+ ln -s /dev/null /etc/motd.d/my_motd - - - -@@ -56,8 +90,10 @@ - - - -- The /path/filename file is displayed -- as message of the day. -+ The /path/filename file is displayed -+ as message of the day. Multiple paths to try can be -+ specified as a colon-separated list. By default this option -+ is set to /etc/motd:/run/motd:/usr/lib/motd. - - - -@@ -68,16 +104,17 @@ - - - The /path/dirname.d directory is scanned -- and each file contained inside of it is displayed. -+ and each file contained inside of it is displayed. Multiple -+ directories to scan can be specified as a colon-separated list. -+ By default this option is set to /etc/motd.d:/run/motd.d:/usr/lib/motd.d. - - - - - -- When no options are given, the default is to display both -- /etc/motd and the contents of -- /etc/motd.d. Specifying either option (or both) -- will disable this default behavior. -+ When no options are given, the default behavior applies for both -+ options. Specifying either option (or both) will disable the -+ default behavior for both options. - - - -diff -up Linux-PAM-1.3.1/modules/pam_motd/pam_motd.c.pam_motd-support-multiple-motd-paths1 Linux-PAM-1.3.1/modules/pam_motd/pam_motd.c ---- Linux-PAM-1.3.1/modules/pam_motd/pam_motd.c.pam_motd-support-multiple-motd-paths1 2018-05-18 11:50:46.000000000 +0200 -+++ Linux-PAM-1.3.1/modules/pam_motd/pam_motd.c 2022-04-25 12:32:36.947663225 +0200 -@@ -33,8 +33,8 @@ - */ - - #define PAM_SM_SESSION --#define DEFAULT_MOTD "/etc/motd" --#define DEFAULT_MOTD_D "/etc/motd.d" -+#define DEFAULT_MOTD "/etc/motd:/run/motd:/usr/lib/motd" -+#define DEFAULT_MOTD_D "/etc/motd.d:/run/motd.d:/usr/lib/motd.d" - - #include - #include -@@ -97,12 +97,235 @@ static void try_to_display_directory(pam - } - } - -+/* -+ * Split a DELIM-separated string ARG into an array. -+ * Outputs a newly allocated array of strings OUT_ARG_SPLIT -+ * and the number of strings OUT_NUM_STRS. -+ * Returns 0 in case of error, 1 in case of success. -+ */ -+static int pam_split_string(const pam_handle_t *pamh, char *arg, char delim, -+ char ***out_arg_split, uint *out_num_strs) -+{ -+ char *arg_extracted = NULL; -+ const char *arg_ptr = arg; -+ char **arg_split = NULL; -+ char delim_str[2]; -+ int i = 0; -+ uint num_strs = 0; -+ int retval = 0; -+ -+ delim_str[0] = delim; -+ delim_str[1] = '\0'; -+ -+ if (arg == NULL) { -+ goto out; -+ } -+ -+ while (arg_ptr != NULL) { -+ num_strs++; -+ arg_ptr = strchr(arg_ptr + sizeof(const char), delim); -+ } -+ -+ arg_split = (char **)calloc(num_strs, sizeof(char *)); -+ if (arg_split == NULL) { -+ pam_syslog(pamh, LOG_CRIT, "pam_motd: failed to allocate string array"); -+ goto out; -+ } -+ -+ -+ arg_extracted = strtok_r(arg, delim_str, &arg); -+ while (arg_extracted != NULL && i < num_strs) { -+ arg_split[i++] = arg_extracted; -+ arg_extracted = strtok_r(NULL, delim_str, &arg); -+ } -+ -+ retval = 1; -+ -+ out: -+ *out_num_strs = num_strs; -+ *out_arg_split = arg_split; -+ -+ return retval; -+} -+ -+/* Join A_STR and B_STR, inserting a "/" between them if one is not already trailing -+ * in A_STR or beginning B_STR. A pointer to a newly allocated string holding the -+ * joined string is returned in STRP_OUT. -+ * Returns -1 in case of error, or the number of bytes in the joined string in -+ * case of success. */ -+static int join_dir_strings(char **strp_out, const char *a_str, const char *b_str) -+{ -+ int has_sep = 0; -+ int retval = -1; -+ char *join_strp = NULL; -+ -+ if (strp_out == NULL || a_str == NULL || b_str == NULL) { -+ goto out; -+ } -+ if (strlen(a_str) == 0) { -+ goto out; -+ } -+ -+ has_sep = (a_str[strlen(a_str) - 1] == '/') || (b_str[0] == '/'); -+ -+ retval = asprintf(&join_strp, "%s%s%s", a_str, -+ (has_sep == 1) ? "" : "/", b_str); -+ -+ if (retval < 0) { -+ goto out; -+ } -+ -+ *strp_out = join_strp; -+ -+ out: -+ return retval; -+} -+ -+static int compare_strings(const void * a, const void * b) -+{ -+ const char *a_str = *(char **)a; -+ const char *b_str = *(char **)b; -+ -+ if (a_str == NULL && b_str == NULL) { -+ return 0; -+ } -+ else if (a_str == NULL) { -+ return -1; -+ } -+ else if (b_str == NULL) { -+ return 1; -+ } -+ else { -+ return strcmp(a_str, b_str); -+ } -+} -+ -+static int filter_dirents(const struct dirent *d) -+{ -+ return (d->d_type == DT_REG || d->d_type == DT_LNK); -+} -+ -+static void try_to_display_directories_with_overrides(pam_handle_t *pamh, -+ char **motd_dir_path_split, int num_motd_dirs) -+{ -+ struct dirent ***dirscans = NULL; -+ int *dirscans_sizes = NULL; -+ int dirscans_size_total = 0; -+ char **dirnames_all = NULL; -+ int i; -+ int i_dirnames = 0; -+ -+ if (pamh == NULL || motd_dir_path_split == NULL) { -+ goto out; -+ } -+ if (num_motd_dirs < 1) { -+ goto out; -+ } -+ -+ if ((dirscans = (struct dirent ***)calloc(num_motd_dirs, -+ sizeof(struct dirent **))) == NULL) { -+ pam_syslog(pamh, LOG_CRIT, "pam_motd: failed to allocate dirent arrays"); -+ goto out; -+ } -+ if ((dirscans_sizes = (int *)calloc(num_motd_dirs, sizeof(int))) == NULL) { -+ pam_syslog(pamh, LOG_CRIT, "pam_motd: failed to allocate dirent array sizes"); -+ goto out; -+ } -+ -+ for (i = 0; i < num_motd_dirs; i++) { -+ dirscans_sizes[i] = scandir(motd_dir_path_split[i], &(dirscans[i]), -+ filter_dirents, alphasort); -+ if (dirscans_sizes[i] < 0) { -+ pam_syslog(pamh, LOG_ERR, "pam_motd: error scanning directory %s", motd_dir_path_split[i]); -+ dirscans_sizes[i] = 0; -+ } -+ dirscans_size_total += dirscans_sizes[i]; -+ } -+ -+ /* Allocate space for all file names found in the directories, including duplicates. */ -+ if ((dirnames_all = (char **)calloc(dirscans_size_total, -+ sizeof(char *))) == NULL) { -+ pam_syslog(pamh, LOG_CRIT, "pam_motd: failed to allocate dirname array"); -+ goto out; -+ } -+ -+ for (i = 0; i < dirscans_size_total; i++) { -+ dirnames_all[i] = NULL; -+ } -+ -+ for (i = 0; i < num_motd_dirs; i++) { -+ int j; -+ -+ for (j = 0; j < dirscans_sizes[i]; j++) { -+ dirnames_all[i_dirnames] = dirscans[i][j]->d_name; -+ i_dirnames++; -+ } -+ } -+ -+ qsort(dirnames_all, dirscans_size_total, -+ sizeof(const char *), compare_strings); -+ -+ for (i = 0; i < dirscans_size_total; i++) { -+ int j; -+ -+ if (dirnames_all[i] == NULL) { -+ continue; -+ } -+ -+ /* Skip duplicate file names. */ -+ if (i > 0 && strcmp(dirnames_all[i], dirnames_all[i - 1]) == 0) { -+ continue; -+ } -+ -+ for (j = 0; j < num_motd_dirs; j++) { -+ char *abs_path = NULL; -+ -+ if (join_dir_strings(&abs_path, motd_dir_path_split[j], -+ dirnames_all[i]) < 0) { -+ continue; -+ } -+ -+ if (abs_path != NULL) { -+ int fd = open(abs_path, O_RDONLY, 0); -+ if (fd >= 0) { -+ try_to_display_fd(pamh, fd); -+ close(fd); -+ -+ /* We displayed a file, skip to the next file name. */ -+ break; -+ } -+ } -+ _pam_drop(abs_path); -+ } -+ } -+ -+ out: -+ _pam_drop(dirnames_all); -+ for (i = 0; i < num_motd_dirs; i++) { -+ int j; -+ for (j = 0; j < dirscans_sizes[i]; j++) { -+ _pam_drop(dirscans[i][j]); -+ } -+ _pam_drop(dirscans[i]); -+ } -+ _pam_drop(dirscans_sizes); -+ _pam_drop(dirscans); -+ -+ return; -+} -+ - int pam_sm_open_session(pam_handle_t *pamh, int flags, - int argc, const char **argv) - { - int retval = PAM_IGNORE; - const char *motd_path = NULL; -+ char *motd_path_copy = NULL; -+ int num_motd_paths = 0; -+ char **motd_path_split = NULL; - const char *motd_dir_path = NULL; -+ char *motd_dir_path_copy = NULL; -+ int num_motd_dir_paths = 0; -+ char **motd_dir_path_split = NULL; - - if (flags & PAM_SILENT) { - return retval; -@@ -140,17 +363,47 @@ int pam_sm_open_session(pam_handle_t *pa - motd_dir_path = default_motd_dir; - } - -- if (motd_path != NULL) { -- int fd = open(motd_path, O_RDONLY, 0); -+ motd_path_copy = strdup(motd_path); -+ if (motd_path_copy != NULL) { -+ if (pam_split_string(pamh, motd_path_copy, ':', &motd_path_split, -+ &num_motd_paths) == 0) { -+ goto out; -+ } -+ } -+ -+ motd_dir_path_copy = strdup(motd_dir_path); -+ if (motd_dir_path_copy != NULL) { -+ if (pam_split_string(pamh, motd_dir_path_copy, ':', -+ &motd_dir_path_split, &num_motd_dir_paths) == 0) { -+ goto out; -+ } -+ } -+ -+ if (motd_path_split != NULL) { -+ int i; -+ -+ for (i = 0; i < num_motd_paths; i++) { -+ int fd = open(motd_path_split[i], O_RDONLY, 0); - -- if (fd >= 0) { -- try_to_display_fd(pamh, fd); -- close(fd); -+ if (fd >= 0) { -+ try_to_display_fd(pamh, fd); -+ close(fd); -+ -+ /* We found and displayed a file, move onto next filename. */ -+ break; -+ } - } - } - -- if (motd_dir_path != NULL) -- try_to_display_directory(pamh, motd_dir_path); -+ if (motd_dir_path_split != NULL) -+ try_to_display_directories_with_overrides(pamh, motd_dir_path_split, -+ num_motd_dir_paths); -+ -+ out: -+ _pam_drop(motd_path_copy); -+ _pam_drop(motd_path_split); -+ _pam_drop(motd_dir_path_copy); -+ _pam_drop(motd_dir_path_split); - - return retval; - } -diff -up Linux-PAM-1.3.1/xtests/Makefile.am.pam_motd-support-multiple-motd-paths1 Linux-PAM-1.3.1/xtests/Makefile.am ---- Linux-PAM-1.3.1/xtests/Makefile.am.pam_motd-support-multiple-motd-paths1 2017-02-10 11:10:15.000000000 +0100 -+++ Linux-PAM-1.3.1/xtests/Makefile.am 2022-04-25 12:32:36.947663225 +0200 -@@ -32,7 +32,10 @@ EXTRA_DIST = run-xtests.sh tst-pam_dispa - tst-pam_substack5.pamd tst-pam_substack5a.pamd tst-pam_substack5.sh \ - tst-pam_assemble_line1.pamd tst-pam_assemble_line1.sh \ - tst-pam_pwhistory1.pamd tst-pam_pwhistory1.sh \ -- tst-pam_time1.pamd time.conf -+ tst-pam_time1.pamd time.conf \ -+ tst-pam_motd.sh tst-pam_motd1.sh tst-pam_motd2.sh \ -+ tst-pam_motd3.sh tst-pam_motd1.pamd \ -+ tst-pam_motd2.pamd tst-pam_motd3.pamd - - XTESTS = tst-pam_dispatch1 tst-pam_dispatch2 tst-pam_dispatch3 \ - tst-pam_dispatch4 tst-pam_dispatch5 \ -@@ -41,7 +44,7 @@ XTESTS = tst-pam_dispatch1 tst-pam_dispa - tst-pam_access1 tst-pam_access2 tst-pam_access3 \ - tst-pam_access4 tst-pam_limits1 tst-pam_succeed_if1 \ - tst-pam_group1 tst-pam_authfail tst-pam_authsucceed \ -- tst-pam_pwhistory1 tst-pam_time1 -+ tst-pam_pwhistory1 tst-pam_time1 tst-pam_motd - - NOSRCTESTS = tst-pam_substack1 tst-pam_substack2 tst-pam_substack3 \ - tst-pam_substack4 tst-pam_substack5 tst-pam_assemble_line1 -diff -up Linux-PAM-1.3.1/xtests/tst-pam_motd1.pamd.pam_motd-support-multiple-motd-paths1 Linux-PAM-1.3.1/xtests/tst-pam_motd1.pamd ---- Linux-PAM-1.3.1/xtests/tst-pam_motd1.pamd.pam_motd-support-multiple-motd-paths1 2022-04-25 12:32:36.947663225 +0200 -+++ Linux-PAM-1.3.1/xtests/tst-pam_motd1.pamd 2022-04-25 12:32:36.947663225 +0200 -@@ -0,0 +1,3 @@ -+#%PAM-1.0 -+session required pam_permit.so -+session optional pam_motd.so motd=tst-pam_motd1.d/etc/motd motd_dir=tst-pam_motd1.d/etc/motd.d -diff -up Linux-PAM-1.3.1/xtests/tst-pam_motd1.sh.pam_motd-support-multiple-motd-paths1 Linux-PAM-1.3.1/xtests/tst-pam_motd1.sh ---- Linux-PAM-1.3.1/xtests/tst-pam_motd1.sh.pam_motd-support-multiple-motd-paths1 2022-04-25 12:32:36.947663225 +0200 -+++ Linux-PAM-1.3.1/xtests/tst-pam_motd1.sh 2022-04-25 12:32:36.947663225 +0200 -@@ -0,0 +1,36 @@ -+#!/bin/bash -+ -+TST_DIR="tst-pam_motd1.d" -+ -+function tst_cleanup() { -+ rm -rf "${TST_DIR}" -+ rm -f tst-pam_motd1.out -+} -+ -+mkdir -p ${TST_DIR} -+mkdir -p ${TST_DIR}/etc/motd.d -+ -+# Verify the case of single motd and motd.d directory works -+echo "motd: /etc/motd" > ${TST_DIR}/etc/motd -+echo "motd: /etc/motd.d/test" > ${TST_DIR}/etc/motd.d/test -+ -+./tst-pam_motd tst-pam_motd1 > tst-pam_motd1.out -+ -+RET=$? -+ -+motd_to_show_output=$(cat tst-pam_motd1.out | grep "motd: /etc/motd") -+if [ -z "${motd_to_show_output}" ]; -+then -+ tst_cleanup -+ exit 1 -+fi -+ -+motd_dir_to_show_output=$(cat tst-pam_motd1.out | grep "motd: /etc/motd.d/test") -+if [ -z "${motd_dir_to_show_output}" ]; -+then -+ tst_cleanup -+ exit 1 -+fi -+ -+tst_cleanup -+exit $RET -diff -up Linux-PAM-1.3.1/xtests/tst-pam_motd2.pamd.pam_motd-support-multiple-motd-paths1 Linux-PAM-1.3.1/xtests/tst-pam_motd2.pamd ---- Linux-PAM-1.3.1/xtests/tst-pam_motd2.pamd.pam_motd-support-multiple-motd-paths1 2022-04-25 12:32:36.947663225 +0200 -+++ Linux-PAM-1.3.1/xtests/tst-pam_motd2.pamd 2022-04-25 12:32:36.947663225 +0200 -@@ -0,0 +1,3 @@ -+#%PAM-1.0 -+session required pam_permit.so -+session optional pam_motd.so motd=tst-pam_motd2.d/etc/motd:tst-pam_motd2.d/run/motd:tst-pam_motd2.d/usr/lib/motd motd_dir=tst-pam_motd2.d/etc/motd.d:tst-pam_motd2.d/run/motd.d:tst-pam_motd2.d/usr/lib/motd.d -diff -up Linux-PAM-1.3.1/xtests/tst-pam_motd2.sh.pam_motd-support-multiple-motd-paths1 Linux-PAM-1.3.1/xtests/tst-pam_motd2.sh ---- Linux-PAM-1.3.1/xtests/tst-pam_motd2.sh.pam_motd-support-multiple-motd-paths1 2022-04-25 12:32:36.947663225 +0200 -+++ Linux-PAM-1.3.1/xtests/tst-pam_motd2.sh 2022-04-25 12:32:36.947663225 +0200 -@@ -0,0 +1,53 @@ -+#!/bin/bash -+ -+TST_DIR="tst-pam_motd2.d" -+ -+function tst_cleanup() { -+ rm -rf "${TST_DIR}" -+ rm -f tst-pam_motd2.out -+} -+ -+mkdir -p ${TST_DIR} -+mkdir -p ${TST_DIR}/etc/motd.d -+mkdir -p ${TST_DIR}/run/motd.d -+mkdir -p ${TST_DIR}/usr/lib/motd.d -+ -+echo "motd: /etc/motd" > ${TST_DIR}/etc/motd -+echo "motd: /run/motd" > ${TST_DIR}/run/motd -+echo "motd: /usr/lib/motd" > ${TST_DIR}/usr/lib/motd -+ -+# Drop a motd file in test directories such that every overriding -+# condition (for 3 directories in this case) will be seen. -+echo "motd: e0r0u1 in usr/lib - will show" > ${TST_DIR}/usr/lib/motd.d/e0r0u1.motd -+echo "motd: e0r1u0 in run - will show" > ${TST_DIR}/run/motd.d/e0r1u0.motd -+echo "motd: e0r1u1 in usr/lib - not show" > ${TST_DIR}/usr/lib/motd.d/e0r1u1.motd -+echo "motd: e0r1u1 in run - will show" > ${TST_DIR}/run/motd.d/e0r1u1.motd -+echo "motd: e1r0u0 in etc - will show" > ${TST_DIR}/etc/motd.d/e1r0u0.motd -+echo "motd: e1r0u1 in usr/lib - not show" > ${TST_DIR}/usr/lib/motd.d/e1r0u1.motd -+echo "motd: e1r0u1 in etc - will show" > ${TST_DIR}/etc/motd.d/e1r0u1.motd -+echo "motd: e1r1u0 in run - not show" > ${TST_DIR}/run/motd.d/e1r1u0.motd -+echo "motd: e1r1u0 in etc - will show" > ${TST_DIR}/etc/motd.d/e1r1u0.motd -+echo "motd: e1r1u1 in usr/lib - not show" > ${TST_DIR}/usr/lib/motd.d/e1r1u1.motd -+echo "motd: e1r1u1 in run - not show" > ${TST_DIR}/run/motd.d/e1r1u1.motd -+echo "motd: e1r1u1 in etc - will show" > ${TST_DIR}/etc/motd.d/e1r1u1.motd -+ -+./tst-pam_motd tst-pam_motd2 > tst-pam_motd2.out -+ -+RET=$? -+ -+motd_to_show_output=$(cat tst-pam_motd2.out | grep "motd: /etc/motd") -+if [ -z "${motd_to_show_output}" ]; -+then -+ tst_cleanup -+ exit 1 -+fi -+ -+motd_dir_not_show_output=$(cat tst-pam_motd2.out | grep "not show") -+if [ -n "${motd_dir_not_show_output}" ]; -+then -+ tst_cleanup -+ exit 1 -+fi -+ -+tst_cleanup -+exit $RET -diff -up Linux-PAM-1.3.1/xtests/tst-pam_motd3.pamd.pam_motd-support-multiple-motd-paths1 Linux-PAM-1.3.1/xtests/tst-pam_motd3.pamd ---- Linux-PAM-1.3.1/xtests/tst-pam_motd3.pamd.pam_motd-support-multiple-motd-paths1 2022-04-25 12:32:36.947663225 +0200 -+++ Linux-PAM-1.3.1/xtests/tst-pam_motd3.pamd 2022-04-25 12:32:36.947663225 +0200 -@@ -0,0 +1,3 @@ -+#%PAM-1.0 -+session required pam_permit.so -+session optional pam_motd.so motd=tst-pam_motd3.d/etc/motd:tst-pam_motd3.d/run/motd:tst-pam_motd3.d/usr/lib/motd motd_dir=tst-pam_motd3.d/etc/motd.d:tst-pam_motd3.d/run/motd.d:tst-pam_motd3.d/usr/lib/motd.d -diff -up Linux-PAM-1.3.1/xtests/tst-pam_motd3.sh.pam_motd-support-multiple-motd-paths1 Linux-PAM-1.3.1/xtests/tst-pam_motd3.sh ---- Linux-PAM-1.3.1/xtests/tst-pam_motd3.sh.pam_motd-support-multiple-motd-paths1 2022-04-25 12:32:36.947663225 +0200 -+++ Linux-PAM-1.3.1/xtests/tst-pam_motd3.sh 2022-04-25 12:32:36.947663225 +0200 -@@ -0,0 +1,53 @@ -+#!/bin/bash -+ -+TST_DIR="tst-pam_motd3.d" -+ -+function tst_cleanup() { -+ rm -rf "${TST_DIR}" -+ rm -f tst-pam_motd3.out -+} -+ -+mkdir -p ${TST_DIR} -+mkdir -p ${TST_DIR}/etc/motd.d -+mkdir -p ${TST_DIR}/run/motd.d -+mkdir -p ${TST_DIR}/usr/lib/motd.d -+ -+# Verify motd is still displayed when not overridden -+echo "motd: test-show in run - show" > ${TST_DIR}/run/motd.d/test-show.motd -+ -+# Test overridden by a symlink to a file that isn't /dev/null; symlink target should show -+echo "motd: hidden-by-symlink in usr/lib - not show" > ${TST_DIR}/usr/lib/motd.d/hidden-by-symlink.motd -+echo "motd: test-from-symlink - show" > ${TST_DIR}/test-from-symlink.motd -+ln -sr ${TST_DIR}/test-from-symlink.motd ${TST_DIR}/run/motd.d/hidden-by-symlink.motd -+ -+# Test hidden by a null symlink -+echo "motd: hidden-by-null-symlink in run - not show" > ${TST_DIR}/run/motd.d/hidden-by-null-symlink.motd -+ln -s /dev/null ${TST_DIR}/etc/motd.d/hidden-by-null-symlink.motd -+ -+./tst-pam_motd tst-pam_motd3 > tst-pam_motd3.out -+ -+RET=$? -+ -+motd_dir_not_show_output=$(cat tst-pam_motd3.out | grep "not show") -+if [ -n "${motd_dir_not_show_output}" ]; -+then -+ tst_cleanup -+ exit 1 -+fi -+ -+motd_test_show_output=$(cat tst-pam_motd3.out | grep "test-show.*- show") -+if [ -z "${motd_test_show_output}" ]; -+then -+ tst_cleanup -+ exit 1 -+fi -+ -+motd_general_symlink_show_output=$(cat tst-pam_motd3.out | grep "test-from-symlink.*- show") -+if [ -z "${motd_general_symlink_show_output}" ]; -+then -+ tst_cleanup -+ exit 1 -+fi -+ -+tst_cleanup -+exit $RET -diff -up Linux-PAM-1.3.1/xtests/tst-pam_motd.c.pam_motd-support-multiple-motd-paths1 Linux-PAM-1.3.1/xtests/tst-pam_motd.c ---- Linux-PAM-1.3.1/xtests/tst-pam_motd.c.pam_motd-support-multiple-motd-paths1 2022-04-25 12:32:36.947663225 +0200 -+++ Linux-PAM-1.3.1/xtests/tst-pam_motd.c 2022-04-25 12:32:36.947663225 +0200 -@@ -0,0 +1,69 @@ -+/* -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, and the entire permission notice in its entirety, -+ * including the disclaimer of warranties. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * ALTERNATIVELY, this product may be distributed under the terms of -+ * the GNU Public License, in which case the provisions of the GPL are -+ * required INSTEAD OF the above restrictions. (This clause is -+ * necessary due to a potential bad interaction between the GPL and -+ * the restrictions contained in a BSD-style copyright.) -+ * -+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -+ * OF THE POSSIBILITY OF SUCH DAMAGE. -+ */ -+ -+#ifdef HAVE_CONFIG_H -+#include -+#endif -+ -+#include -+#include -+#include -+#include -+ -+static struct pam_conv conv = { -+ misc_conv, -+ NULL -+}; -+ -+int main(int argc, char *argv[]) -+{ -+ pam_handle_t *pamh=NULL; -+ char *tst_arg = NULL; -+ int retval; -+ -+ if (argc > 1) -+ tst_arg = argv[1]; -+ -+ retval = pam_start(tst_arg, NULL, &conv, &pamh); -+ -+ retval = pam_open_session(pamh, 0); -+ -+ retval = pam_close_session(pamh, 0); -+ -+ if (pam_end(pamh,retval) != PAM_SUCCESS) { /* close Linux-PAM */ -+ pamh = NULL; -+ exit(1); -+ } -+ -+ return ( retval == PAM_SUCCESS ? 0:1 ); /* indicate success */ -+} -diff -up Linux-PAM-1.3.1/xtests/tst-pam_motd.sh.pam_motd-support-multiple-motd-paths1 Linux-PAM-1.3.1/xtests/tst-pam_motd.sh ---- Linux-PAM-1.3.1/xtests/tst-pam_motd.sh.pam_motd-support-multiple-motd-paths1 2022-04-25 12:32:36.947663225 +0200 -+++ Linux-PAM-1.3.1/xtests/tst-pam_motd.sh 2022-04-25 12:32:36.947663225 +0200 -@@ -0,0 +1,7 @@ -+#!/bin/bash -+ -+set -e -+ -+./tst-pam_motd1.sh -+./tst-pam_motd2.sh -+./tst-pam_motd3.sh diff --git a/SOURCES/pam-1.3.1-pam-pwhistory-load-conf-from-file.patch b/SOURCES/pam-1.3.1-pam-pwhistory-load-conf-from-file.patch deleted file mode 100644 index 35e3d94..0000000 --- a/SOURCES/pam-1.3.1-pam-pwhistory-load-conf-from-file.patch +++ /dev/null @@ -1,573 +0,0 @@ -diff -up Linux-PAM-1.3.1/modules/pam_pwhistory/Makefile.am.pam-pwhistory-load-conf-from-file Linux-PAM-1.3.1/modules/pam_pwhistory/Makefile.am ---- Linux-PAM-1.3.1/modules/pam_pwhistory/Makefile.am.pam-pwhistory-load-conf-from-file 2022-09-29 10:13:35.709355179 +0200 -+++ Linux-PAM-1.3.1/modules/pam_pwhistory/Makefile.am 2022-09-29 10:13:35.780355766 +0200 -@@ -10,9 +10,10 @@ EXTRA_DIST = README $(MANS) $(XMLS) tst- - - TESTS = tst-pam_pwhistory - --man_MANS = pam_pwhistory.8 pwhistory_helper.8 -+man_MANS = pam_pwhistory.8 pwhistory_helper.8 pwhistory.conf.5 - --XMLS = README.xml pam_pwhistory.8.xml pwhistory_helper.8.xml -+XMLS = README.xml pam_pwhistory.8.xml pwhistory_helper.8.xml \ -+ pwhistory.conf.5.xml - - securelibdir = $(SECUREDIR) - secureconfdir = $(SCONFIGDIR) -@@ -25,12 +26,14 @@ if HAVE_VERSIONING - pam_pwhistory_la_LDFLAGS += -Wl,--version-script=$(srcdir)/../modules.map - endif - --noinst_HEADERS = opasswd.h -+noinst_HEADERS = opasswd.h pwhistory_config.h -+ -+dist_secureconf_DATA = pwhistory.conf - - securelib_LTLIBRARIES = pam_pwhistory.la - pam_pwhistory_la_CFLAGS = $(AM_CFLAGS) - pam_pwhistory_la_LIBADD = $(top_builddir)/libpam/libpam.la @LIBCRYPT@ @LIBSELINUX@ --pam_pwhistory_la_SOURCES = pam_pwhistory.c opasswd.c -+pam_pwhistory_la_SOURCES = pam_pwhistory.c opasswd.c pwhistory_config.c - - sbin_PROGRAMS = pwhistory_helper - pwhistory_helper_CFLAGS = $(AM_CFLAGS) -DHELPER_COMPILE=\"pwhistory_helper\" @PIE_CFLAGS@ -diff -up Linux-PAM-1.3.1/modules/pam_pwhistory/pam_pwhistory.8.xml.pam-pwhistory-load-conf-from-file Linux-PAM-1.3.1/modules/pam_pwhistory/pam_pwhistory.8.xml ---- Linux-PAM-1.3.1/modules/pam_pwhistory/pam_pwhistory.8.xml.pam-pwhistory-load-conf-from-file 2017-02-10 11:10:15.000000000 +0100 -+++ Linux-PAM-1.3.1/modules/pam_pwhistory/pam_pwhistory.8.xml 2022-09-29 10:13:35.780355766 +0200 -@@ -36,6 +36,9 @@ - - authtok_type=STRING - -+ -+ conf=/path/to/config-file -+ - - - -@@ -104,7 +107,7 @@ - - - The last N passwords for each -- user are saved in /etc/security/opasswd. -+ user are saved. - The default is 10. Value of - 0 makes the module to keep the existing - contents of the opasswd file unchanged. -@@ -137,7 +140,26 @@ - - - -+ -+ -+ -+ -+ -+ -+ Use another configuration file instead of the default -+ /etc/security/pwhistory.conf. -+ -+ -+ -+ - -+ -+ The options for configuring the module behavior are described in the -+ pwhistory.conf -+ 5 manual page. The options -+ specified on the module command line override the values from the -+ configuration file. -+ - - - -@@ -223,6 +245,9 @@ password required pam_unix.so - SEE ALSO - - -+ pwhistory.conf5 -+ , -+ - pam.conf5 - , - -diff -up Linux-PAM-1.3.1/modules/pam_pwhistory/pam_pwhistory.c.pam-pwhistory-load-conf-from-file Linux-PAM-1.3.1/modules/pam_pwhistory/pam_pwhistory.c ---- Linux-PAM-1.3.1/modules/pam_pwhistory/pam_pwhistory.c.pam-pwhistory-load-conf-from-file 2022-09-29 10:13:35.711355195 +0200 -+++ Linux-PAM-1.3.1/modules/pam_pwhistory/pam_pwhistory.c 2022-09-29 10:13:35.780355766 +0200 -@@ -62,18 +62,11 @@ - #include - - #include "opasswd.h" -+#include "pwhistory_config.h" - - #define DEFAULT_BUFLEN 2048 - #define MAX_FD_NO 20000 - --struct options_t { -- int debug; -- int enforce_for_root; -- int remember; -- int tries; --}; --typedef struct options_t options_t; -- - - static void - parse_option (pam_handle_t *pamh, const char *argv, options_t *options) -@@ -304,6 +297,8 @@ pam_sm_chauthtok (pam_handle_t *pamh, in - options.remember = 10; - options.tries = 1; - -+ parse_config_file(pamh, argc, argv, &options); -+ - /* Parse parameters for module */ - for ( ; argc-- > 0; argv++) - parse_option (pamh, *argv, &options); -@@ -311,7 +306,6 @@ pam_sm_chauthtok (pam_handle_t *pamh, in - if (options.debug) - pam_syslog (pamh, LOG_DEBUG, "pam_sm_chauthtok entered"); - -- - if (options.remember == 0) - return PAM_IGNORE; - -diff -up Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory.conf.5.xml.pam-pwhistory-load-conf-from-file Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory.conf.5.xml ---- Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory.conf.5.xml.pam-pwhistory-load-conf-from-file 2022-09-29 10:13:35.780355766 +0200 -+++ Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory.conf.5.xml 2022-09-29 10:13:35.780355766 +0200 -@@ -0,0 +1,155 @@ -+ -+ -+ -+ -+ -+ -+ pwhistory.conf -+ 5 -+ Linux-PAM Manual -+ -+ -+ -+ pwhistory.conf -+ pam_pwhistory configuration file -+ -+ -+ -+ -+ DESCRIPTION -+ -+ pwhistory.conf provides a way to configure the -+ default settings for saving the last passwords for each user. -+ This file is read by the pam_pwhistory module and is the -+ preferred method over configuring pam_pwhistory directly. -+ -+ -+ The file has a very simple name = value format with possible comments -+ starting with # character. The whitespace at the beginning of line, end -+ of line, and around the = sign is ignored. -+ -+ -+ -+ -+ -+ OPTIONS -+ -+ -+ -+ -+ -+ -+ -+ Turns on debugging via -+ -+ syslog3 -+ . -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ If this option is set, the check is enforced for root, too. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ The last N passwords for each -+ user are saved. -+ The default is 10. Value of -+ 0 makes the module to keep the existing -+ contents of the opasswd file unchanged. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Prompt user at most N times -+ before returning with error. The default is 1. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Store password history in file -+ /path/filename rather than the default -+ location. The default location is -+ /etc/security/opasswd. -+ -+ -+ -+ -+ -+ -+ -+ EXAMPLES -+ -+ /etc/security/pwhistory.conf file example: -+ -+ -+debug -+remember=5 -+file=/tmp/opasswd -+ -+ -+ -+ -+ FILES -+ -+ -+ /etc/security/pwhistory.conf -+ -+ the config file for custom options -+ -+ -+ -+ -+ -+ -+ SEE ALSO -+ -+ -+ pwhistory8 -+ , -+ -+ pam_pwhistory8 -+ , -+ -+ pam.conf5 -+ , -+ -+ pam.d5 -+ , -+ -+ pam8 -+ -+ -+ -+ -+ -+ AUTHOR -+ -+ pam_pwhistory was written by Thorsten Kukuk. The support for -+ pwhistory.conf was written by Iker Pedrosa. -+ -+ -+ -+ -diff -up Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory_config.c.pam-pwhistory-load-conf-from-file Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory_config.c ---- Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory_config.c.pam-pwhistory-load-conf-from-file 2022-09-29 10:13:35.781355775 +0200 -+++ Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory_config.c 2022-09-29 10:14:33.377832622 +0200 -@@ -0,0 +1,195 @@ -+/* -+ * Copyright (c) 2022 Iker Pedrosa -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, and the entire permission notice in its entirety, -+ * including the disclaimer of warranties. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * ALTERNATIVELY, this product may be distributed under the terms of -+ * the GNU Public License, in which case the provisions of the GPL are -+ * required INSTEAD OF the above restrictions. (This clause is -+ * necessary due to a potential bad interaction between the GPL and -+ * the restrictions contained in a BSD-style copyright.) -+ * -+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -+ * OF THE POSSIBILITY OF SUCH DAMAGE. -+ */ -+ -+#include "config.h" -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include "pam_inline.h" -+#include "pwhistory_config.h" -+ -+#define PWHISTORY_DEFAULT_CONF "/etc/security/pwhistory.conf" -+ -+/* lookup a value for key in login.defs file or similar key value format */ -+static char * -+pwhistory_search_key(pam_handle_t *pamh UNUSED, -+ const char *file_name, -+ const char *key) -+{ -+ FILE *fp; -+ char *buf = NULL; -+ size_t buflen = 0; -+ char *retval = NULL; -+ -+#ifdef USE_ECONF -+ if (strcmp (file_name, LOGIN_DEFS) == 0) -+ return econf_search_key ("login", ".defs", key); -+#endif -+ -+ fp = fopen(file_name, "r"); -+ if (NULL == fp) -+ return NULL; -+ -+ while (!feof(fp)) { -+ char *tmp, *cp; -+#if defined(HAVE_GETLINE) -+ ssize_t n = getline(&buf, &buflen, fp); -+#elif defined (HAVE_GETDELIM) -+ ssize_t n = getdelim(&buf, &buflen, '\n', fp); -+#else -+ ssize_t n; -+ -+ if (buf == NULL) { -+ buflen = BUF_SIZE; -+ buf = malloc(buflen); -+ if (buf == NULL) { -+ fclose(fp); -+ return NULL; -+ } -+ } -+ buf[0] = '\0'; -+ if (fgets(buf, buflen - 1, fp) == NULL) -+ break; -+ else if (buf != NULL) -+ n = strlen(buf); -+ else -+ n = 0; -+#endif /* HAVE_GETLINE / HAVE_GETDELIM */ -+ cp = buf; -+ -+ if (n < 1) -+ break; -+ if (cp[n - 1] == '\n') -+ cp[n - 1] = '\0'; -+ -+ tmp = strchr(cp, '#'); /* remove comments */ -+ if (tmp) -+ *tmp = '\0'; -+ while (isspace((int)*cp)) /* remove spaces and tabs */ -+ ++cp; -+ if (*cp == '\0') /* ignore empty lines */ -+ continue; -+ -+ tmp = strsep (&cp, " \t="); -+ if (cp != NULL) -+ while (isspace((int)*cp) || *cp == '=') -+ ++cp; -+ else -+ cp = buf + n; /* empty string */ -+ -+ if (strcasecmp(tmp, key) == 0) { -+ retval = strdup(cp); -+ break; -+ } -+ } -+ fclose(fp); -+ -+ free(buf); -+ -+ return retval; -+} -+ -+void -+parse_config_file(pam_handle_t *pamh, int argc, const char **argv, -+ struct options_t *options) -+{ -+ const char *fname = NULL; -+ int i; -+ char *val; -+ -+ for (i = 0; i < argc; ++i) { -+ const char *str = pam_str_skip_prefix(argv[i], "conf="); -+ -+ if (str != NULL) { -+ fname = str; -+ } -+ } -+ -+ if (fname == NULL) { -+ fname = PWHISTORY_DEFAULT_CONF; -+ } -+ -+ val = pwhistory_search_key (pamh, fname, "debug"); -+ if (val != NULL) { -+ options->debug = 1; -+ free(val); -+ } -+ -+ val = pwhistory_search_key (pamh, fname, "enforce_for_root"); -+ if (val != NULL) { -+ options->enforce_for_root = 1; -+ free(val); -+ } -+ -+ val = pwhistory_search_key (pamh, fname, "remember"); -+ if (val != NULL) { -+ unsigned int temp; -+ if (sscanf(val, "%u", &temp) != 1) { -+ pam_syslog(pamh, LOG_ERR, -+ "Bad number supplied for remember argument"); -+ } else { -+ options->remember = temp; -+ } -+ free(val); -+ } -+ -+ val = pwhistory_search_key (pamh, fname, "retry"); -+ if (val != NULL) { -+ unsigned int temp; -+ if (sscanf(val, "%u", &temp) != 1) { -+ pam_syslog(pamh, LOG_ERR, -+ "Bad number supplied for retry argument"); -+ } else { -+ options->tries = temp; -+ } -+ free(val); -+ } -+ -+ val = pwhistory_search_key (pamh, fname, "file"); -+ if (val != NULL) { -+ if (*val != '/') { -+ pam_syslog (pamh, LOG_ERR, -+ "File path should be absolute: %s", val); -+ } else { -+ options->filename = val; -+ } -+ } -+} -diff -up Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory_config.h.pam-pwhistory-load-conf-from-file Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory_config.h ---- Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory_config.h.pam-pwhistory-load-conf-from-file 2022-09-29 10:13:35.781355775 +0200 -+++ Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory_config.h 2022-09-29 10:13:35.781355775 +0200 -@@ -0,0 +1,54 @@ -+/* -+ * Copyright (c) 2022 Iker Pedrosa -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, and the entire permission notice in its entirety, -+ * including the disclaimer of warranties. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * ALTERNATIVELY, this product may be distributed under the terms of -+ * the GNU Public License, in which case the provisions of the GPL are -+ * required INSTEAD OF the above restrictions. (This clause is -+ * necessary due to a potential bad interaction between the GPL and -+ * the restrictions contained in a BSD-style copyright.) -+ * -+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -+ * OF THE POSSIBILITY OF SUCH DAMAGE. -+ */ -+ -+#ifndef _PWHISTORY_CONFIG_H -+#define _PWHISTORY_CONFIG_H -+ -+#include -+ -+struct options_t { -+ int debug; -+ int enforce_for_root; -+ int remember; -+ int tries; -+ const char *filename; -+}; -+typedef struct options_t options_t; -+ -+void -+parse_config_file(pam_handle_t *pamh, int argc, const char **argv, -+ struct options_t *options); -+ -+#endif /* _PWHISTORY_CONFIG_H */ -diff -up Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory.conf.pam-pwhistory-load-conf-from-file Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory.conf ---- Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory.conf.pam-pwhistory-load-conf-from-file 2022-09-29 10:13:35.781355775 +0200 -+++ Linux-PAM-1.3.1/modules/pam_pwhistory/pwhistory.conf 2022-09-29 10:13:35.781355775 +0200 -@@ -0,0 +1,21 @@ -+# Configuration for remembering the last passwords used by a user. -+# -+# Enable the debugging logs. -+# Enabled if option is present. -+# debug -+# -+# root account's passwords are also remembered. -+# Enabled if option is present. -+# enforce_for_root -+# -+# Number of passwords to remember. -+# The default is 10. -+# remember = 10 -+# -+# Number of times to prompt for the password. -+# The default is 1. -+# retry = 1 -+# -+# The directory where the last passwords are kept. -+# The default is /etc/security/opasswd. -+# file = /etc/security/opasswd diff --git a/SOURCES/pam-1.3.1-pam-unix-shadow-password.patch b/SOURCES/pam-1.3.1-pam-unix-shadow-password.patch deleted file mode 100644 index bf183e5..0000000 --- a/SOURCES/pam-1.3.1-pam-unix-shadow-password.patch +++ /dev/null @@ -1,47 +0,0 @@ -diff -up Linux-PAM-1.3.1/modules/pam_unix/passverify.c.pam-unix-shadow-password Linux-PAM-1.3.1/modules/pam_unix/passverify.c ---- Linux-PAM-1.3.1/modules/pam_unix/passverify.c.pam-unix-shadow-password 2024-11-05 13:02:14.637785962 +0100 -+++ Linux-PAM-1.3.1/modules/pam_unix/passverify.c 2024-11-05 13:02:14.643785975 +0100 -@@ -73,9 +73,13 @@ verify_pwd_hash(const char *p, char *has - - strip_hpux_aging(hash); - hash_len = strlen(hash); -- if (!hash_len) { -+ -+ if (p && p[0] == '\0' && !nullok) { -+ /* The passed password is empty */ -+ retval = PAM_AUTH_ERR; -+ } else if (!hash_len) { - /* the stored password is NULL */ -- if (nullok) { /* this means we've succeeded */ -+ if (p && p[0] == '\0' && nullok) { /* this means we've succeeded */ - D(("user has empty password - access granted")); - retval = PAM_SUCCESS; - } else { -@@ -192,17 +196,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 - */ --#ifndef HELPER_COMPILE -- if (geteuid() || SELINUX_ENABLED) -- return PAM_UNIX_RUN_HELPER; --#endif -- *spwdent = pam_modutil_getspnam(pamh, name); -+ *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; diff --git a/SOURCES/pam-1.3.1-pam-userdb-prevent-garbage-characters-from-db.patch b/SOURCES/pam-1.3.1-pam-userdb-prevent-garbage-characters-from-db.patch deleted file mode 100644 index 37b3e72..0000000 --- a/SOURCES/pam-1.3.1-pam-userdb-prevent-garbage-characters-from-db.patch +++ /dev/null @@ -1,111 +0,0 @@ -From a7453aeeb398d6cbb7a709c4e2a1d75905220fff Mon Sep 17 00:00:00 2001 -From: Stanislav Zidek -Date: Fri, 16 Apr 2021 19:14:18 +0200 -Subject: [PATCH] pam_userdb: Prevent garbage characters from db - -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1791965 ---- - modules/pam_userdb/pam_userdb.8.xml | 3 +- - modules/pam_userdb/pam_userdb.c | 56 +++++++++++++++++------------ - 2 files changed, 36 insertions(+), 23 deletions(-) - -diff --git a/modules/pam_userdb/pam_userdb.8.xml b/modules/pam_userdb/pam_userdb.8.xml -index fa628ada..bce92850 100644 ---- a/modules/pam_userdb/pam_userdb.8.xml -+++ b/modules/pam_userdb/pam_userdb.8.xml -@@ -100,7 +100,8 @@ - - - -- Print debug information. -+ Print debug information. Note that password hashes, both from db -+ and computed, will be printed to syslog. - - - -diff --git a/modules/pam_userdb/pam_userdb.c b/modules/pam_userdb/pam_userdb.c -index dc2ca232..d59801bf 100644 ---- a/modules/pam_userdb/pam_userdb.c -+++ b/modules/pam_userdb/pam_userdb.c -@@ -194,7 +194,7 @@ user_lookup (pam_handle_t *pamh, const char *database, const char *cryptmode, - } - - if (data.dptr != NULL) { -- int compare = 0; -+ int compare = -2; - - if (ctrl & PAM_KEY_ONLY_ARG) - { -@@ -209,36 +209,48 @@ user_lookup (pam_handle_t *pamh, const char *database, const char *cryptmode, - char *cryptpw = NULL; - - if (data.dsize < 13) { -- compare = -2; -+ /* hash is too short */ -+ pam_syslog(pamh, LOG_INFO, "password hash in database is too short"); - } else if (ctrl & PAM_ICASE_ARG) { -- compare = -2; -+ pam_syslog(pamh, LOG_INFO, -+ "case-insensitive comparison only works with plaintext passwords"); - } else { -+ /* libdb is not guaranteed to produce null terminated strings */ -+ char *pwhash = strndup(data.dptr, data.dsize); -+ -+ if (pwhash == NULL) { -+ pam_syslog(pamh, LOG_CRIT, "strndup failed: data.dptr"); -+ } else { - #ifdef HAVE_CRYPT_R -- struct crypt_data *cdata = NULL; -- cdata = malloc(sizeof(*cdata)); -- if (cdata != NULL) { -- cdata->initialized = 0; -- cryptpw = crypt_r(pass, data.dptr, cdata); -- } -+ struct crypt_data *cdata = NULL; -+ cdata = malloc(sizeof(*cdata)); -+ if (cdata == NULL) { -+ pam_syslog(pamh, LOG_CRIT, "malloc failed: struct crypt_data"); -+ } else { -+ cdata->initialized = 0; -+ cryptpw = crypt_r(pass, pwhash, cdata); -+ } - #else -- cryptpw = crypt (pass, data.dptr); -+ cryptpw = crypt (pass, pwhash); - #endif -- if (cryptpw && strlen(cryptpw) == (size_t)data.dsize) { -- compare = memcmp(data.dptr, cryptpw, data.dsize); -- } else { -- compare = -2; -- if (ctrl & PAM_DEBUG_ARG) { -- if (cryptpw) -- pam_syslog(pamh, LOG_INFO, "lengths of computed and stored hashes differ"); -- else -- pam_syslog(pamh, LOG_INFO, "crypt() returned NULL"); -+ if (cryptpw && strlen(cryptpw) == (size_t)data.dsize) { -+ compare = memcmp(data.dptr, cryptpw, data.dsize); -+ } else { -+ if (ctrl & PAM_DEBUG_ARG) { -+ if (cryptpw) { -+ pam_syslog(pamh, LOG_INFO, "lengths of computed and stored hashes differ"); -+ pam_syslog(pamh, LOG_INFO, "computed hash: %s", cryptpw); -+ } else { -+ pam_syslog(pamh, LOG_ERR, "crypt() returned NULL"); -+ } -+ } - } -- } - #ifdef HAVE_CRYPT_R -- free(cdata); -+ free(cdata); - #endif -+ } -+ free(pwhash); - } -- - } else { - - /* Unknown password encryption method - --- -2.30.2 - diff --git a/SOURCES/pam-1.3.1-pam-usertype-SYS_UID_MAX.patch b/SOURCES/pam-1.3.1-pam-usertype-SYS_UID_MAX.patch deleted file mode 100644 index 4881a5e..0000000 --- a/SOURCES/pam-1.3.1-pam-usertype-SYS_UID_MAX.patch +++ /dev/null @@ -1,75 +0,0 @@ -diff -up Linux-PAM-1.3.1/configure.ac.pam-usertype-SYS_UID_MAX Linux-PAM-1.3.1/configure.ac ---- Linux-PAM-1.3.1/configure.ac.pam-usertype-SYS_UID_MAX 2022-06-22 16:41:09.169146826 +0200 -+++ Linux-PAM-1.3.1/configure.ac 2022-06-22 16:43:54.343373619 +0200 -@@ -615,12 +615,6 @@ if test x"$opt_uidmin" == x; then - fi - AC_DEFINE_UNQUOTED(PAM_USERTYPE_UIDMIN, $opt_uidmin, [Minimum regular user uid.]) - --AC_ARG_WITH([sysuidmin], AS_HELP_STRING([--with-sysuidmin=],[default value for system user min uid (101)]), opt_sysuidmin=$withval) --if test x"$opt_sysuidmin" == x; then -- opt_sysuidmin=101 --fi --AC_DEFINE_UNQUOTED(PAM_USERTYPE_SYSUIDMIN, $opt_sysuidmin, [Minimum system user uid.]) -- - AC_ARG_WITH([kerneloverflowuid], AS_HELP_STRING([--with-kernel-overflow-uid=],[kernel overflow uid, default (uint16_t)-2=65534]), opt_kerneloverflowuid=$withval) - if test x"$opt_kerneloverflowuid" == x; then - opt_kerneloverflowuid=65534 -diff -up Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.8.xml.pam-usertype-SYS_UID_MAX Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.8.xml ---- Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.8.xml.pam-usertype-SYS_UID_MAX 2022-06-22 16:41:09.155146722 +0200 -+++ Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.8.xml 2022-06-22 16:41:09.169146826 +0200 -@@ -31,7 +31,7 @@ - pam_usertype.so is designed to succeed or fail authentication - based on type of the account of the authenticated user. - The type of the account is decided with help of -- SYS_UID_MIN and SYS_UID_MAX -+ SYS_UID_MAX - settings in /etc/login.defs. One use is to select - whether to load other modules based on this test. - -diff -up Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.c.pam-usertype-SYS_UID_MAX Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.c ---- Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.c.pam-usertype-SYS_UID_MAX 2022-06-22 16:41:09.155146722 +0200 -+++ Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.c 2022-06-22 16:41:09.169146826 +0200 -@@ -277,7 +277,6 @@ static int - pam_usertype_is_system(pam_handle_t *pamh, uid_t uid) - { - uid_t uid_min; -- uid_t sys_min; - uid_t sys_max; - - if (uid == (uid_t)-1) { -@@ -285,21 +284,19 @@ pam_usertype_is_system(pam_handle_t *pam - return PAM_USER_UNKNOWN; - } - -- if (uid <= 99) { -- /* Reserved. */ -- return PAM_SUCCESS; -- } -- - if (uid == PAM_USERTYPE_OVERFLOW_UID) { - /* nobody */ - return PAM_SUCCESS; - } - - uid_min = pam_usertype_get_id(pamh, "UID_MIN", PAM_USERTYPE_UIDMIN); -- sys_min = pam_usertype_get_id(pamh, "SYS_UID_MIN", PAM_USERTYPE_SYSUIDMIN); - sys_max = pam_usertype_get_id(pamh, "SYS_UID_MAX", uid_min - 1); - -- return uid >= sys_min && uid <= sys_max ? PAM_SUCCESS : PAM_AUTH_ERR; -+ if (uid <= sys_max && uid < uid_min) { -+ return PAM_SUCCESS; -+ } -+ -+ return PAM_AUTH_ERR; - } - - static int -@@ -336,7 +333,7 @@ pam_usertype_evaluate(struct pam_usertyp - - /** - * Arguments: -- * - issystem: uid in -+ * - issystem: uid less than SYS_UID_MAX - * - isregular: not issystem - * - use_uid: use user that runs application not that is being authenticate (same as in pam_succeed_if) - * - audit: log unknown users to syslog diff --git a/SOURCES/pam-1.3.1-pam-usertype.patch b/SOURCES/pam-1.3.1-pam-usertype.patch deleted file mode 100644 index bada491..0000000 --- a/SOURCES/pam-1.3.1-pam-usertype.patch +++ /dev/null @@ -1,712 +0,0 @@ -diff -up Linux-PAM-1.3.1/configure.ac.pam-usertype Linux-PAM-1.3.1/configure.ac ---- Linux-PAM-1.3.1/configure.ac.pam-usertype 2020-05-15 10:03:27.247468160 +0200 -+++ Linux-PAM-1.3.1/configure.ac 2020-05-15 10:03:27.270468089 +0200 -@@ -606,6 +606,27 @@ AC_SUBST([HAVE_KEY_MANAGEMENT], $HAVE_KE - - AM_CONDITIONAL([HAVE_KEY_MANAGEMENT], [test "$have_key_syscalls" = 1]) - -+dnl -+dnl Get values for default uid ranges in login.defs used in pam_usertype -+dnl -+AC_ARG_WITH([uidmin], AS_HELP_STRING([--with-uidmin=],[default value for regular user min uid (1000)]), opt_uidmin=$withval) -+if test x"$opt_uidmin" == x; then -+ opt_uidmin=1000 -+fi -+AC_DEFINE_UNQUOTED(PAM_USERTYPE_UIDMIN, $opt_uidmin, [Minimum regular user uid.]) -+ -+AC_ARG_WITH([sysuidmin], AS_HELP_STRING([--with-sysuidmin=],[default value for system user min uid (101)]), opt_sysuidmin=$withval) -+if test x"$opt_sysuidmin" == x; then -+ opt_sysuidmin=101 -+fi -+AC_DEFINE_UNQUOTED(PAM_USERTYPE_SYSUIDMIN, $opt_sysuidmin, [Minimum system user uid.]) -+ -+AC_ARG_WITH([kerneloverflowuid], AS_HELP_STRING([--with-kernel-overflow-uid=],[kernel overflow uid, default (uint16_t)-2=65534]), opt_kerneloverflowuid=$withval) -+if test x"$opt_kerneloverflowuid" == x; then -+ opt_kerneloverflowuid=65534 -+fi -+AC_DEFINE_UNQUOTED(PAM_USERTYPE_OVERFLOW_UID, $opt_kerneloverflowuid, [Kernel overflow uid.]) -+ - dnl Files to be created from when we run configure - AC_CONFIG_FILES([Makefile libpam/Makefile libpamc/Makefile libpamc/test/Makefile \ - libpam_misc/Makefile conf/Makefile conf/pam_conv1/Makefile \ -@@ -636,6 +657,7 @@ AC_CONFIG_FILES([Makefile libpam/Makefil - modules/pam_timestamp/Makefile modules/pam_tty_audit/Makefile \ - modules/pam_umask/Makefile \ - modules/pam_unix/Makefile modules/pam_userdb/Makefile \ -+ modules/pam_usertype/Makefile \ - modules/pam_warn/Makefile modules/pam_wheel/Makefile \ - modules/pam_xauth/Makefile doc/Makefile doc/specs/Makefile \ - doc/man/Makefile doc/sag/Makefile doc/adg/Makefile \ -diff -up Linux-PAM-1.3.1/modules/Makefile.am.pam-usertype Linux-PAM-1.3.1/modules/Makefile.am ---- Linux-PAM-1.3.1/modules/Makefile.am.pam-usertype 2020-05-15 10:03:27.247468160 +0200 -+++ Linux-PAM-1.3.1/modules/Makefile.am 2020-05-15 10:03:27.270468089 +0200 -@@ -12,7 +12,7 @@ SUBDIRS = pam_access pam_cracklib pam_de - pam_selinux pam_sepermit pam_shells pam_stress \ - pam_succeed_if pam_time pam_timestamp \ - pam_tty_audit pam_umask \ -- pam_unix pam_userdb pam_warn pam_wheel pam_xauth -+ pam_unix pam_userdb pam_usertype pam_warn pam_wheel pam_xauth - - CLEANFILES = *~ - -diff -up Linux-PAM-1.3.1/modules/pam_usertype/Makefile.am.pam-usertype Linux-PAM-1.3.1/modules/pam_usertype/Makefile.am ---- Linux-PAM-1.3.1/modules/pam_usertype/Makefile.am.pam-usertype 2020-05-15 10:03:27.270468089 +0200 -+++ Linux-PAM-1.3.1/modules/pam_usertype/Makefile.am 2020-05-15 10:03:27.270468089 +0200 -@@ -0,0 +1,34 @@ -+# -+# Copyright (c) 2005, 2006, 2009 Thorsten Kukuk -+# Copyright (c) 2020 Red Hat, Inc. -+# -+ -+CLEANFILES = *~ -+MAINTAINERCLEANFILES = $(MANS) README -+ -+EXTRA_DIST = README ${MANS} ${XMLS} tst-pam_usertype -+ -+TESTS = tst-pam_usertype -+ -+man_MANS = pam_usertype.8 -+ -+XMLS = README.xml pam_usertype.8.xml -+ -+securelibdir = $(SECUREDIR) -+secureconfdir = $(SCONFIGDIR) -+ -+AM_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include \ -+ $(WARN_CFLAGS) -+AM_LDFLAGS = -no-undefined -avoid-version -module -+if HAVE_VERSIONING -+ AM_LDFLAGS += -Wl,--version-script=$(srcdir)/../modules.map -+endif -+ -+securelib_LTLIBRARIES = pam_usertype.la -+pam_usertype_la_LIBADD = $(top_builddir)/libpam/libpam.la -+ -+if ENABLE_REGENERATE_MAN -+noinst_DATA = README -+README: pam_usertype.8.xml -+-include $(top_srcdir)/Make.xml.rules -+endif -diff -up Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.8.xml.pam-usertype Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.8.xml ---- Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.8.xml.pam-usertype 2020-05-15 10:03:27.270468089 +0200 -+++ Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.8.xml 2020-05-15 10:03:27.270468089 +0200 -@@ -0,0 +1,170 @@ -+ -+ -+ -+ -+ -+ -+ pam_usertype -+ 8 -+ Linux-PAM -+ -+ -+ -+ pam_usertype -+ check if the authenticated user is a system or regular account -+ -+ -+ -+ -+ -+ pam_usertype.so -+ flag -+ condition -+ -+ -+ -+ -+ -+ DESCRIPTION -+ -+ pam_usertype.so is designed to succeed or fail authentication -+ based on type of the account of the authenticated user. -+ The type of the account is decided with help of -+ SYS_UID_MIN and SYS_UID_MAX -+ settings in /etc/login.defs. One use is to select -+ whether to load other modules based on this test. -+ -+ -+ -+ The module should be given only one condition as module argument. -+ Authentication will succeed only if the condition is met. -+ -+ -+ -+ -+ OPTIONS -+ -+ The following flags are supported: -+ -+ -+ -+ -+ -+ -+ -+ Evaluate conditions using the account of the user whose UID -+ the application is running under instead of the user being -+ authenticated. -+ -+ -+ -+ -+ -+ -+ -+ Log unknown users to the system log. -+ -+ -+ -+ -+ -+ -+ Available conditions are: -+ -+ -+ -+ -+ -+ -+ Succeed if the user is a system user. -+ -+ -+ -+ -+ -+ Succeed if the user is a regular user. -+ -+ -+ -+ -+ -+ -+ MODULE TYPES PROVIDED -+ -+ All module types (, , -+ and ) are provided. -+ -+ -+ -+ -+ RETURN VALUES -+ -+ -+ -+ PAM_SUCCESS -+ -+ -+ The condition was true. -+ -+ -+ -+ -+ -+ PAM_AUTH_ERR -+ -+ -+ The condition was false. -+ -+ -+ -+ -+ -+ PAM_SERVICE_ERR -+ -+ -+ A service error occurred or the arguments can't be -+ parsed correctly. -+ -+ -+ -+ -+ -+ PAM_USER_UNKNOWN -+ -+ -+ User was not found. -+ -+ -+ -+ -+ -+ -+ -+ -+ EXAMPLES -+ -+ Skip remaining modules if the user is a system user: -+ -+ -+account sufficient pam_usertype.so issystem -+ -+ -+ -+ -+ SEE ALSO -+ -+ -+ login.defs5 -+ , -+ -+ pam8 -+ -+ -+ -+ -+ -+ AUTHOR -+ Pavel Březina <pbrezina@redhat.com> -+ -+ -diff -up Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.c.pam-usertype Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.c ---- Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.c.pam-usertype 2020-05-15 10:03:27.270468089 +0200 -+++ Linux-PAM-1.3.1/modules/pam_usertype/pam_usertype.c 2020-05-15 10:16:08.053198025 +0200 -@@ -0,0 +1,394 @@ -+/****************************************************************************** -+ * Check user type based on login.defs. -+ * -+ * Copyright (c) 2020 Red Hat, Inc. -+ * Written by Pavel Březina -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, and the entire permission notice in its entirety, -+ * including the disclaimer of warranties. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * ALTERNATIVELY, this product may be distributed under the terms of -+ * the GNU Public License, in which case the provisions of the GPL are -+ * required INSTEAD OF the above restrictions. (This clause is -+ * necessary due to a potential bad interaction between the GPL and -+ * the restrictions contained in a BSD-style copyright.) -+ * -+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -+ * OF THE POSSIBILITY OF SUCH DAMAGE. -+ * -+ */ -+ -+#include "config.h" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define PAM_SM_AUTH -+#define PAM_SM_ACCOUNT -+#define PAM_SM_SESSION -+#define PAM_SM_PASSWORD -+ -+#include -+#include -+#include -+ -+#define LOGIN_DEFS "/etc/login.defs" -+ -+enum pam_usertype_op { -+ OP_IS_SYSTEM, -+ OP_IS_REGULAR, -+ -+ OP_SENTINEL -+}; -+ -+struct pam_usertype_opts { -+ enum pam_usertype_op op; -+ int use_uid; -+ int audit; -+}; -+ -+static int -+pam_usertype_parse_args(struct pam_usertype_opts *opts, -+ pam_handle_t *pamh, -+ int argc, -+ const char **argv) -+{ -+ int i; -+ -+ memset(opts, 0, sizeof(struct pam_usertype_opts)); -+ opts->op = OP_SENTINEL; -+ -+ for (i = 0; i < argc; i++) { -+ if (strcmp(argv[i], "use_uid") == 0) { -+ opts->use_uid = 1; -+ } else if (strcmp(argv[i], "audit") == 0) { -+ opts->audit = 1; -+ } else if (strcmp(argv[i], "issystem") == 0) { -+ opts->op = OP_IS_SYSTEM; -+ } else if (strcmp(argv[i], "isregular") == 0) { -+ opts->op = OP_IS_REGULAR; -+ } else { -+ pam_syslog(pamh, LOG_WARNING, "Unknown argument: %s", argv[i]); -+ /* Just continue. */ -+ } -+ } -+ -+ if (opts->op == OP_SENTINEL) { -+ pam_syslog(pamh, LOG_ERR, "Operation not specified"); -+ return PAM_SERVICE_ERR; -+ } -+ -+ return PAM_SUCCESS; -+} -+ -+static int -+pam_usertype_get_uid(struct pam_usertype_opts *opts, -+ pam_handle_t *pamh, -+ uid_t *_uid) -+{ -+ struct passwd *pwd; -+ const void *prompt; -+ const char *username; -+ int ret; -+ -+ /* Get uid of user that runs the application. */ -+ if (opts->use_uid) { -+ pwd = pam_modutil_getpwuid(pamh, getuid()); -+ if (pwd == NULL) { -+ pam_syslog(pamh, LOG_ERR, -+ "error retrieving information about user %lu", -+ (unsigned long)getuid()); -+ return PAM_USER_UNKNOWN; -+ } -+ -+ *_uid = pwd->pw_uid; -+ return PAM_SUCCESS; -+ } -+ -+ /* Get uid of user that is being authenticated. */ -+ ret = pam_get_item(pamh, PAM_USER_PROMPT, &prompt); -+ if (ret != PAM_SUCCESS || prompt == NULL || strlen(prompt) == 0) { -+ prompt = "login: "; -+ } -+ -+ ret = pam_get_user(pamh, &username, prompt); -+ if (ret != PAM_SUCCESS || username == NULL) { -+ pam_syslog(pamh, LOG_ERR, "error retrieving user name: %s", -+ pam_strerror(pamh, ret)); -+ return ret; -+ } -+ -+ pwd = pam_modutil_getpwnam(pamh, username); -+ if (pwd == NULL) { -+ if (opts->audit) { -+ pam_syslog(pamh, LOG_NOTICE, -+ "error retrieving information about user %s", username); -+ } -+ -+ return PAM_USER_UNKNOWN; -+ } -+ -+ *_uid = pwd->pw_uid; -+ -+ return PAM_SUCCESS; -+} -+ -+#define MAX_UID_VALUE 0xFFFFFFFFUL -+ -+/* lookup a value for key in login.defs file or similar key value format */ -+char * -+pam_usertype_search_key(pam_handle_t *pamh UNUSED, -+ const char *file_name, -+ const char *key) -+{ -+ FILE *fp; -+ char *buf = NULL; -+ size_t buflen = 0; -+ char *retval = NULL; -+ -+ fp = fopen(file_name, "r"); -+ if (NULL == fp) -+ return NULL; -+ -+ while (!feof(fp)) { -+ char *tmp, *cp; -+#if defined(HAVE_GETLINE) -+ ssize_t n = getline(&buf, &buflen, fp); -+#elif defined (HAVE_GETDELIM) -+ ssize_t n = getdelim(&buf, &buflen, '\n', fp); -+#else -+ ssize_t n; -+ -+ if (buf == NULL) { -+ buflen = BUF_SIZE; -+ buf = malloc(buflen); -+ if (buf == NULL) { -+ fclose(fp); -+ return NULL; -+ } -+ } -+ buf[0] = '\0'; -+ if (fgets(buf, buflen - 1, fp) == NULL) -+ break; -+ else if (buf != NULL) -+ n = strlen(buf); -+ else -+ n = 0; -+#endif /* HAVE_GETLINE / HAVE_GETDELIM */ -+ cp = buf; -+ -+ if (n < 1) -+ break; -+ if (cp[n - 1] == '\n') -+ cp[n - 1] = '\0'; -+ -+ tmp = strchr(cp, '#'); /* remove comments */ -+ if (tmp) -+ *tmp = '\0'; -+ while (isspace((int)*cp)) /* remove spaces and tabs */ -+ ++cp; -+ if (*cp == '\0') /* ignore empty lines */ -+ continue; -+ -+ tmp = strsep (&cp, " \t="); -+ if (cp != NULL) -+ while (isspace((int)*cp) || *cp == '=') -+ ++cp; -+ else -+ cp = ""; -+ -+ if (strcasecmp(tmp, key) == 0) { -+ retval = strdup(cp); -+ break; -+ } -+ } -+ fclose(fp); -+ -+ free(buf); -+ -+ return retval; -+} -+ -+static uid_t -+pam_usertype_get_id(pam_handle_t *pamh, -+ const char *key, -+ uid_t default_value) -+{ -+ unsigned long ul; -+ char *value; -+ char *ep; -+ uid_t uid; -+ -+ value = pam_usertype_search_key(pamh, LOGIN_DEFS, key); -+ if (value == NULL) { -+ return default_value; -+ } -+ -+ /* taken from get_lastlog_uid_max() */ -+ ep = value + strlen(value); -+ while (ep > value && isspace(*(--ep))) { -+ *ep = '\0'; -+ } -+ -+ errno = 0; -+ ul = strtoul(value, &ep, 10); -+ if (!(ul >= MAX_UID_VALUE -+ || (uid_t)ul >= MAX_UID_VALUE -+ || (errno != 0 && ul == 0) -+ || value == ep -+ || *ep != '\0')) { -+ uid = (uid_t)ul; -+ } else { -+ uid = default_value; -+ } -+ -+ free(value); -+ -+ return uid; -+} -+ -+static int -+pam_usertype_is_system(pam_handle_t *pamh, uid_t uid) -+{ -+ uid_t uid_min; -+ uid_t sys_min; -+ uid_t sys_max; -+ -+ if (uid == (uid_t)-1) { -+ pam_syslog(pamh, LOG_WARNING, "invalid uid"); -+ return PAM_USER_UNKNOWN; -+ } -+ -+ if (uid <= 99) { -+ /* Reserved. */ -+ return PAM_SUCCESS; -+ } -+ -+ if (uid == PAM_USERTYPE_OVERFLOW_UID) { -+ /* nobody */ -+ return PAM_SUCCESS; -+ } -+ -+ uid_min = pam_usertype_get_id(pamh, "UID_MIN", PAM_USERTYPE_UIDMIN); -+ sys_min = pam_usertype_get_id(pamh, "SYS_UID_MIN", PAM_USERTYPE_SYSUIDMIN); -+ sys_max = pam_usertype_get_id(pamh, "SYS_UID_MAX", uid_min - 1); -+ -+ return uid >= sys_min && uid <= sys_max ? PAM_SUCCESS : PAM_AUTH_ERR; -+} -+ -+static int -+pam_usertype_is_regular(pam_handle_t *pamh, uid_t uid) -+{ -+ int ret; -+ -+ ret = pam_usertype_is_system(pamh, uid); -+ switch (ret) { -+ case PAM_SUCCESS: -+ return PAM_AUTH_ERR; -+ case PAM_USER_UNKNOWN: -+ return PAM_USER_UNKNOWN; -+ default: -+ return PAM_SUCCESS; -+ } -+} -+ -+static int -+pam_usertype_evaluate(struct pam_usertype_opts *opts, -+ pam_handle_t *pamh, -+ uid_t uid) -+{ -+ switch (opts->op) { -+ case OP_IS_SYSTEM: -+ return pam_usertype_is_system(pamh, uid); -+ case OP_IS_REGULAR: -+ return pam_usertype_is_regular(pamh, uid); -+ default: -+ pam_syslog(pamh, LOG_ERR, "Unknown operation: %d", opts->op); -+ return PAM_SERVICE_ERR; -+ } -+} -+ -+/** -+ * Arguments: -+ * - issystem: uid in -+ * - isregular: not issystem -+ * - use_uid: use user that runs application not that is being authenticate (same as in pam_succeed_if) -+ * - audit: log unknown users to syslog -+ */ -+int -+pam_sm_authenticate(pam_handle_t *pamh, int flags UNUSED, -+ int argc, const char **argv) -+{ -+ struct pam_usertype_opts opts; -+ uid_t uid; -+ int ret; -+ -+ ret = pam_usertype_parse_args(&opts, pamh, argc, argv); -+ if (ret != PAM_SUCCESS) { -+ return ret; -+ } -+ -+ ret = pam_usertype_get_uid(&opts, pamh, &uid); -+ if (ret != PAM_SUCCESS) { -+ return ret; -+ } -+ -+ return pam_usertype_evaluate(&opts, pamh, uid); -+} -+ -+int -+pam_sm_setcred(pam_handle_t *pamh UNUSED, int flags UNUSED, -+ int argc UNUSED, const char **argv UNUSED) -+{ -+ return PAM_IGNORE; -+} -+ -+int -+pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char **argv) -+{ -+ return pam_sm_authenticate(pamh, flags, argc, argv); -+} -+ -+int -+pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char **argv) -+{ -+ return pam_sm_authenticate(pamh, flags, argc, argv); -+} -+ -+int -+pam_sm_close_session(pam_handle_t *pamh, int flags, int argc, const char **argv) -+{ -+ return pam_sm_authenticate(pamh, flags, argc, argv); -+} -+ -+int -+pam_sm_chauthtok(pam_handle_t *pamh, int flags, int argc, const char **argv) -+{ -+ return pam_sm_authenticate(pamh, flags, argc, argv); -+} -diff -up Linux-PAM-1.3.1/modules/pam_usertype/README.xml.pam-usertype Linux-PAM-1.3.1/modules/pam_usertype/README.xml ---- Linux-PAM-1.3.1/modules/pam_usertype/README.xml.pam-usertype 2020-05-15 10:03:27.270468089 +0200 -+++ Linux-PAM-1.3.1/modules/pam_usertype/README.xml 2020-05-15 10:03:27.270468089 +0200 -@@ -0,0 +1,41 @@ -+ -+ -+--> -+]> -+ -+
-+ -+ -+ -+ -+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" -+ href="pam_usertype.8.xml" xpointer='xpointer(//refnamediv[@id = "pam_usertype-name"]/*)'/> -+ -+ -+ -+ -+
-+ -+
-+ -+
-+ -+
-+ -+
-+ -+
-+ -+
-+ -+
-+ -+
-diff -up Linux-PAM-1.3.1/modules/pam_usertype/tst-pam_usertype.pam-usertype Linux-PAM-1.3.1/modules/pam_usertype/tst-pam_usertype ---- Linux-PAM-1.3.1/modules/pam_usertype/tst-pam_usertype.pam-usertype 2020-05-15 10:03:27.270468089 +0200 -+++ Linux-PAM-1.3.1/modules/pam_usertype/tst-pam_usertype 2020-05-15 10:03:27.270468089 +0200 -@@ -0,0 +1,2 @@ -+#!/bin/sh -+../../tests/tst-dlopen .libs/pam_usertype.so diff --git a/SOURCES/pam-1.3.1-tty-audit-manfix.patch b/SOURCES/pam-1.3.1-tty-audit-manfix.patch deleted file mode 100644 index 3d17963..0000000 --- a/SOURCES/pam-1.3.1-tty-audit-manfix.patch +++ /dev/null @@ -1,33 +0,0 @@ -From e31dd6c7d0faa7a06d3ebd50a0b6957b9f822d15 Mon Sep 17 00:00:00 2001 -From: Tomas Mraz -Date: Wed, 7 Aug 2019 18:13:57 +0200 -Subject: [PATCH] pam_tty_audit: Manual page clarification about password - logging - -* modules/pam_tty_audit/pam_tty_audit.8.xml: Explanation why passwords -can be sometimes logged even when the option is not set. ---- - modules/pam_tty_audit/pam_tty_audit.8.xml | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/modules/pam_tty_audit/pam_tty_audit.8.xml b/modules/pam_tty_audit/pam_tty_audit.8.xml -index 59a3406..e346c68 100644 ---- a/modules/pam_tty_audit/pam_tty_audit.8.xml -+++ b/modules/pam_tty_audit/pam_tty_audit.8.xml -@@ -149,6 +149,13 @@ - greater than or equal to min_uid will be - matched. -
-+ -+ Please note that passwords in some circumstances may be logged by TTY auditing -+ even if the is not used. For example, all input to -+ an ssh session will be logged - even if there is a password being typed into -+ some software running at the remote host because only the local TTY state -+ affects the local TTY auditing. -+ - - - --- -2.20.1 - diff --git a/SOURCES/pam-1.3.1-unix-default-rounds.patch b/SOURCES/pam-1.3.1-unix-default-rounds.patch deleted file mode 100644 index bb4a156..0000000 --- a/SOURCES/pam-1.3.1-unix-default-rounds.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up Linux-PAM-1.3.1/modules/pam_unix/pam_unix_passwd.c.unix-default-rounds Linux-PAM-1.3.1/modules/pam_unix/pam_unix_passwd.c ---- Linux-PAM-1.3.1/modules/pam_unix/pam_unix_passwd.c.unix-default-rounds 2023-11-02 09:59:54.533238124 +0100 -+++ Linux-PAM-1.3.1/modules/pam_unix/pam_unix_passwd.c 2023-11-02 10:40:58.017404936 +0100 -@@ -607,7 +607,7 @@ pam_sm_chauthtok(pam_handle_t *pamh, int - unsigned int ctrl, lctrl; - int retval; - int remember = -1; -- int rounds = -1; -+ int rounds = 0; - int pass_min_len = 0; - - /* */ diff --git a/SOURCES/pam-1.3.1-unix-enable-bcrypt.patch b/SOURCES/pam-1.3.1-unix-enable-bcrypt.patch deleted file mode 100644 index 9264765..0000000 --- a/SOURCES/pam-1.3.1-unix-enable-bcrypt.patch +++ /dev/null @@ -1,174 +0,0 @@ -From f7abb8c1ef3aa31e6c2564a8aaf69683a77c2016 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= -Date: Thu, 15 Nov 2018 15:01:57 +0100 -Subject: [PATCH] pam_unix: Use bcrypt b-variant for computing new hashes. - -Bcrypt hashes used the "$2a$" prefix since 1997. -However, in 2011 an implementation bug was discovered in bcrypt -affecting the handling of characters in passphrases with the 8th -bit set. - -Besides fixing the bug, OpenBSD 5.5 introduced the "$2b$" prefix -for a behavior that exactly matches crypt_blowfish's "$2y$", and -the crypt_blowfish implementation supports it as well since v1.1. - -That said new computed bcrypt hashes should use the "$2b$" prefix. - -* modules/pam_unix/passverify.c: Use bcrypt b-variant. ---- - modules/pam_unix/passverify.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/modules/pam_unix/passverify.c b/modules/pam_unix/passverify.c -index 9c1771e2..1f433b3a 100644 ---- a/modules/pam_unix/passverify.c -+++ b/modules/pam_unix/passverify.c -@@ -385,7 +385,7 @@ PAMH_ARG_DECL(char * create_password_hash, - /* algoid = "$1" */ - return crypt_md5_wrapper(password); - } else if (on(UNIX_BLOWFISH_PASS, ctrl)) { -- algoid = "$2a$"; -+ algoid = "$2b$"; - } else if (on(UNIX_SHA256_PASS, ctrl)) { - algoid = "$5$"; - } else if (on(UNIX_SHA512_PASS, ctrl)) { --- -2.41.0 - -diff -up Linux-PAM-1.3.1/configure.ac.legacy-xcrypt Linux-PAM-1.3.1/configure.ac ---- Linux-PAM-1.3.1/configure.ac.legacy-xcrypt 2023-10-26 12:08:46.896437225 +0200 -+++ Linux-PAM-1.3.1/configure.ac 2023-10-26 12:10:38.289654696 +0200 -@@ -395,19 +395,32 @@ AC_SUBST(LIBAUDIT) - AM_CONDITIONAL([HAVE_AUDIT_TTY_STATUS], - [test "x$HAVE_AUDIT_TTY_STATUS" = xyes]) - --AC_CHECK_HEADERS(xcrypt.h crypt.h) --AS_IF([test "x$ac_cv_header_xcrypt_h" = "xyes"], -- [crypt_libs="xcrypt crypt"], -- [crypt_libs="crypt"]) -+AC_CHECK_HEADERS(crypt.h) - - BACKUP_LIBS=$LIBS --AC_SEARCH_LIBS([crypt],[$crypt_libs], LIBCRYPT="${ac_lib:+-l$ac_lib}", LIBCRYPT="") --AC_CHECK_FUNCS(crypt_r crypt_gensalt_r) -+LIBCRYPT="" -+PKG_CHECK_MODULES([CRYPT], [libcrypt], [ -+ CFLAGS="$CFLAGS $CRYPT_CFLAGS" -+ CPPFLAGS="$CPPFLAGS $CRYPT_CFLAGS" -+ LIBS="$LIBS $CRYPT_LIBS" -+ LIBCRYPT="$CRYPT_LIBS" -+], [ -+ AC_SEARCH_LIBS([crypt_gensalt_rn],[crypt]) -+ case "$ac_cv_search_crypt_gensalt_rn" in -+ -l*) LIBCRYPT="$ac_cv_search_crypt_gensalt_rn" ;; -+ no) AC_SEARCH_LIBS([crypt_r],[crypt]) -+ case "$ac_cv_search_crypt_r" in -+ -l*) LIBCRYPT="$ac_cv_search_crypt_r" ;; -+ no ) AC_SEARCH_LIBS([crypt],[crypt]) -+ case "$ac_cv_search_crypt" in -+ -l*) LIBCRYPT="$ac_cv_search_crypt" ;; -+ esac ;; -+ esac ;; -+ esac -+]) -+AC_CHECK_FUNCS([crypt_r]) - LIBS=$BACKUP_LIBS - AC_SUBST(LIBCRYPT) --if test "$LIBCRYPT" = "-lxcrypt" -a "$ac_cv_header_xcrypt_h" = "yes" ; then -- AC_DEFINE([HAVE_LIBXCRYPT], 1, [Define to 1 if xcrypt support should be compiled in.]) --fi - - AC_ARG_WITH([randomdev], AS_HELP_STRING([--with-randomdev=(|yes|no)],[use specified random device instead of /dev/urandom or 'no' to disable]), opt_randomdev=$withval) - if test "$opt_randomdev" = yes -o -z "$opt_randomdev"; then -diff -up Linux-PAM-1.3.1/modules/pam_pwhistory/opasswd.c.legacy-xcrypt Linux-PAM-1.3.1/modules/pam_pwhistory/opasswd.c ---- Linux-PAM-1.3.1/modules/pam_pwhistory/opasswd.c.legacy-xcrypt 2023-10-26 12:08:46.896437225 +0200 -+++ Linux-PAM-1.3.1/modules/pam_pwhistory/opasswd.c 2023-10-26 12:11:14.437725259 +0200 -@@ -52,9 +52,7 @@ - #include - #include - --#if defined (HAVE_XCRYPT_H) --#include --#elif defined (HAVE_CRYPT_H) -+#ifdef HAVE_CRYPT_H - #include - #endif - -diff -up Linux-PAM-1.3.1/modules/pam_unix/bigcrypt.c.legacy-xcrypt Linux-PAM-1.3.1/modules/pam_unix/bigcrypt.c ---- Linux-PAM-1.3.1/modules/pam_unix/bigcrypt.c.legacy-xcrypt 2017-02-10 11:10:15.000000000 +0100 -+++ Linux-PAM-1.3.1/modules/pam_unix/bigcrypt.c 2023-10-26 12:08:46.896437225 +0200 -@@ -29,9 +29,7 @@ - #include - #include - #include --#ifdef HAVE_LIBXCRYPT --#include --#elif defined(HAVE_CRYPT_H) -+#ifdef HAVE_CRYPT_H - #include - #endif - -diff -up Linux-PAM-1.3.1/modules/pam_unix/passverify.c.legacy-xcrypt Linux-PAM-1.3.1/modules/pam_unix/passverify.c ---- Linux-PAM-1.3.1/modules/pam_unix/passverify.c.legacy-xcrypt 2023-10-26 12:08:46.895437223 +0200 -+++ Linux-PAM-1.3.1/modules/pam_unix/passverify.c 2023-10-26 12:16:25.470320408 +0200 -@@ -19,9 +19,7 @@ - #include - #include - #include --#ifdef HAVE_LIBXCRYPT --#include --#elif defined(HAVE_CRYPT_H) -+#ifdef HAVE_CRYPT_H - #include - #endif - -@@ -406,23 +404,19 @@ PAMH_ARG_DECL(char * create_password_has - return crypted; - } - --#ifdef HAVE_CRYPT_GENSALT_R -- if (on(UNIX_BLOWFISH_PASS, ctrl)) { -- char entropy[17]; -- crypt_make_salt(entropy, sizeof(entropy) - 1); -- sp = crypt_gensalt_r (algoid, rounds, -- entropy, sizeof(entropy), -- salt, sizeof(salt)); -- } else { --#endif -- sp = stpcpy(salt, algoid); -- if (on(UNIX_ALGO_ROUNDS, ctrl)) { -- sp += snprintf(sp, sizeof(salt) - (16 + 1 + (sp - salt)), "rounds=%u$", rounds); -- } -- crypt_make_salt(sp, 16); --#ifdef HAVE_CRYPT_GENSALT_R -+#if defined(CRYPT_GENSALT_IMPLEMENTS_AUTO_ENTROPY) && CRYPT_GENSALT_IMPLEMENTS_AUTO_ENTROPY -+ /* -+ * Any version of libcrypt supporting auto entropy is -+ * guaranteed to have crypt_gensalt_rn(). -+ */ -+ sp = crypt_gensalt_rn(algoid, rounds, NULL, 0, salt, sizeof(salt)); -+#else -+ sp = stpcpy(salt, algoid); -+ if (on(UNIX_ALGO_ROUNDS, ctrl)) { -+ sp += snprintf(sp, sizeof(salt) - (16 + 1 + (sp - salt)), "rounds=%u$", rounds); - } --#endif -+ crypt_make_salt(sp, 16); -+#endif /* CRYPT_GENSALT_IMPLEMENTS_AUTO_ENTROPY */ - #ifdef HAVE_CRYPT_R - sp = NULL; - cdata = malloc(sizeof(*cdata)); -diff -up Linux-PAM-1.3.1/modules/pam_userdb/pam_userdb.c.legacy-xcrypt Linux-PAM-1.3.1/modules/pam_userdb/pam_userdb.c ---- Linux-PAM-1.3.1/modules/pam_userdb/pam_userdb.c.legacy-xcrypt 2023-10-26 12:08:46.880437194 +0200 -+++ Linux-PAM-1.3.1/modules/pam_userdb/pam_userdb.c 2023-10-26 12:08:46.896437225 +0200 -@@ -17,9 +17,7 @@ - #include - #include - #include --#ifdef HAVE_LIBXCRYPT --#include --#elif defined(HAVE_CRYPT_H) -+#ifdef HAVE_CRYPT_H - #include - #endif - diff --git a/SOURCES/pam-1.3.1-unix-improve-logging.patch b/SOURCES/pam-1.3.1-unix-improve-logging.patch deleted file mode 100644 index 682b4d5..0000000 --- a/SOURCES/pam-1.3.1-unix-improve-logging.patch +++ /dev/null @@ -1,57 +0,0 @@ -From a6845905869ccabb5eb802be37241eabec085dc7 Mon Sep 17 00:00:00 2001 -From: Tomas Mraz -Date: Mon, 14 Oct 2019 16:52:46 +0200 -Subject: [PATCH] pam_unix: Add logging useful for debugging problems - -Two messages added about obtaining the username are guarded -by the debug option as these should not be normally -logged - they can be useful for debugging but they do not -indicate any special condition. - -The message about authenticating user with blank password is -still just LOG_DEBUG priority but it is logged unconditionally -because it is somewhat extraordinary condition to have an user -with blank password. - -* modules/pam_unix/pam_unix_auth.c (pam_sm_authenticate): Replace - D() macro calls which are not enabled on production builds with - regular pam_syslog() calls. ---- - modules/pam_unix/pam_unix_auth.c | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/modules/pam_unix/pam_unix_auth.c b/modules/pam_unix/pam_unix_auth.c -index 681e49d..3fca945 100644 ---- a/modules/pam_unix/pam_unix_auth.c -+++ b/modules/pam_unix/pam_unix_auth.c -@@ -130,15 +130,16 @@ pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) - AUTH_RETURN; - } - if (on(UNIX_DEBUG, ctrl)) -- D(("username [%s] obtained", name)); -+ pam_syslog(pamh, LOG_DEBUG, "username [%s] obtained", name); - } else { -- D(("trouble reading username")); - if (retval == PAM_CONV_AGAIN) { - D(("pam_get_user/conv() function is not ready yet")); - /* it is safe to resume this function so we translate this - * retval to the value that indicates we're happy to resume. - */ - retval = PAM_INCOMPLETE; -+ } else if (on(UNIX_DEBUG, ctrl)) { -+ pam_syslog(pamh, LOG_DEBUG, "could not obtain username"); - } - AUTH_RETURN; - } -@@ -146,7 +147,7 @@ pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) - /* if this user does not have a password... */ - - if (_unix_blankpasswd(pamh, ctrl, name)) { -- D(("user '%s' has blank passwd", name)); -+ pam_syslog(pamh, LOG_DEBUG, "user [%s] has blank password; authenticated without it", name); - name = NULL; - retval = PAM_SUCCESS; - AUTH_RETURN; --- -2.20.1 - diff --git a/SOURCES/pam-1.3.1-wheel-pam_ruser-fallback.patch b/SOURCES/pam-1.3.1-wheel-pam_ruser-fallback.patch deleted file mode 100644 index a92f884..0000000 --- a/SOURCES/pam-1.3.1-wheel-pam_ruser-fallback.patch +++ /dev/null @@ -1,134 +0,0 @@ -From 6bf9b454eb971083f0cce49faa2aa1cde329ff5d Mon Sep 17 00:00:00 2001 -From: ikerexxe -Date: Wed, 26 Aug 2020 14:44:23 +0200 -Subject: [PATCH 1/3] pam_wheel: improve coding style - -modules/pam_wheel/pam_wheel.c: improve indentation and explicitly state -condition statements ---- - modules/pam_wheel/pam_wheel.c | 36 ++++++++++++++++++----------------- - 1 file changed, 19 insertions(+), 17 deletions(-) - -diff --git a/modules/pam_wheel/pam_wheel.c b/modules/pam_wheel/pam_wheel.c -index a025ebaf..94cb7d89 100644 ---- a/modules/pam_wheel/pam_wheel.c -+++ b/modules/pam_wheel/pam_wheel.c -@@ -130,25 +130,27 @@ perform_check (pam_handle_t *pamh, int ctrl, const char *use_group) - } - - if (ctrl & PAM_USE_UID_ARG) { -- tpwd = pam_modutil_getpwuid (pamh, getuid()); -- if (!tpwd) { -- if (ctrl & PAM_DEBUG_ARG) { -+ tpwd = pam_modutil_getpwuid (pamh, getuid()); -+ if (tpwd == NULL) { -+ if (ctrl & PAM_DEBUG_ARG) { - pam_syslog(pamh, LOG_NOTICE, "who is running me ?!"); -- } -- return PAM_SERVICE_ERR; -- } -- fromsu = tpwd->pw_name; -+ } -+ return PAM_SERVICE_ERR; -+ } -+ fromsu = tpwd->pw_name; - } else { -- fromsu = pam_modutil_getlogin(pamh); -- if (fromsu) { -- tpwd = pam_modutil_getpwnam (pamh, fromsu); -- } -- if (!fromsu || !tpwd) { -- if (ctrl & PAM_DEBUG_ARG) { -- pam_syslog(pamh, LOG_NOTICE, "who is running me ?!"); -- } -- return PAM_SERVICE_ERR; -- } -+ fromsu = pam_modutil_getlogin(pamh); -+ -+ if (fromsu != NULL) { -+ tpwd = pam_modutil_getpwnam (pamh, fromsu); -+ } -+ -+ if (fromsu == NULL || tpwd == NULL) { -+ if (ctrl & PAM_DEBUG_ARG) { -+ pam_syslog(pamh, LOG_NOTICE, "who is running me ?!"); -+ } -+ return PAM_SERVICE_ERR; -+ } - } - - /* --- -2.26.2 - - -From 9091ea1d81e85f49a221b0325d27b22ce69e444a Mon Sep 17 00:00:00 2001 -From: ikerexxe -Date: Thu, 27 Aug 2020 09:16:15 +0200 -Subject: [PATCH 2/3] pam_wheel: if getlogin fails fallback to PAM_RUSER - -modules/pam_wheel/pam_wheel.c: if getlogin fails to obtain the real user -ID, then try with PAM_RUSER. - -Resolves: -https://bugzilla.redhat.com/show_bug.cgi?id=1866866 ---- - modules/pam_wheel/pam_wheel.c | 10 ++++++++++ - 1 file changed, 10 insertions(+) - -diff --git a/modules/pam_wheel/pam_wheel.c b/modules/pam_wheel/pam_wheel.c -index 94cb7d89..7fa3cfa9 100644 ---- a/modules/pam_wheel/pam_wheel.c -+++ b/modules/pam_wheel/pam_wheel.c -@@ -141,6 +141,16 @@ perform_check (pam_handle_t *pamh, int ctrl, const char *use_group) - } else { - fromsu = pam_modutil_getlogin(pamh); - -+ /* if getlogin fails try a fallback to PAM_RUSER */ -+ if (fromsu == NULL) { -+ const char *rhostname; -+ -+ retval = pam_get_item(pamh, PAM_RHOST, (const void **)&rhostname); -+ if (retval != PAM_SUCCESS || rhostname == NULL) { -+ retval = pam_get_item(pamh, PAM_RUSER, (const void **)&fromsu); -+ } -+ } -+ - if (fromsu != NULL) { - tpwd = pam_modutil_getpwnam (pamh, fromsu); - } --- -2.26.2 - - -From a3a5cbf86083c43026b558e2023f597530626267 Mon Sep 17 00:00:00 2001 -From: ikerexxe -Date: Wed, 9 Sep 2020 10:32:03 +0200 -Subject: [PATCH 3/3] pam_wheel: clarify use_uid option in man page - -modules/pam_wheel/pam_wheel.8.xml: indicate that use_uid option uses the -real uid of the calling process. ---- - modules/pam_wheel/pam_wheel.8.xml | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/modules/pam_wheel/pam_wheel.8.xml b/modules/pam_wheel/pam_wheel.8.xml -index b32f5e2b..ee8c7d26 100644 ---- a/modules/pam_wheel/pam_wheel.8.xml -+++ b/modules/pam_wheel/pam_wheel.8.xml -@@ -122,9 +122,9 @@ - - - -- The check for wheel membership will be done against -- the current uid instead of the original one (useful when -- jumping with su from one account to another for example). -+ The check will be done against the real uid of the calling process, -+ instead of trying to obtain the user from the login session -+ associated with the terminal in use. - - - --- -2.26.2 - diff --git a/SOURCES/pam-1.5.1-pam-faillock-avoid-logging-erroneous.patch b/SOURCES/pam-1.5.1-pam-faillock-avoid-logging-erroneous.patch deleted file mode 100644 index 016bb15..0000000 --- a/SOURCES/pam-1.5.1-pam-faillock-avoid-logging-erroneous.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 10086bc69663fa819277af244eeb5b629a2403b8 Mon Sep 17 00:00:00 2001 -From: Deepak Das -Date: Mon, 10 Oct 2022 21:21:35 +0530 -Subject: [PATCH] pam_faillock: avoid logging an erroneous consecutive login - failure message - -* modules/pam_faillock/pam_faillock.c (write_tally): Avoid logging -a consecutive login failure message for the root user in case when -even_deny_root is not set. - -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2082442 ---- - modules/pam_faillock/pam_faillock.c | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - -diff --git a/modules/pam_faillock/pam_faillock.c b/modules/pam_faillock/pam_faillock.c -index ddbb90e7..ca1c7035 100644 ---- a/modules/pam_faillock/pam_faillock.c -+++ b/modules/pam_faillock/pam_faillock.c -@@ -374,9 +374,11 @@ write_tally(pam_handle_t *pamh, struct options *opts, struct tally_data *tallies - } - close(audit_fd); - #endif -- if (!(opts->flags & FAILLOCK_FLAG_NO_LOG_INFO)) { -- pam_syslog(pamh, LOG_INFO, "Consecutive login failures for user %s account temporarily locked", -- opts->user); -+ if (!(opts->flags & FAILLOCK_FLAG_NO_LOG_INFO) && -+ ((opts->flags & FAILLOCK_FLAG_DENY_ROOT) || (opts->uid != 0))) { -+ pam_syslog(pamh, LOG_INFO, -+ "Consecutive login failures for user %s account temporarily locked", -+ opts->user); - } - } - --- -2.38.1 - diff --git a/SOURCES/pam-1.5.1-pam-faillock-clarify-missing-user.patch b/SOURCES/pam-1.5.1-pam-faillock-clarify-missing-user.patch deleted file mode 100644 index 3f15eb8..0000000 --- a/SOURCES/pam-1.5.1-pam-faillock-clarify-missing-user.patch +++ /dev/null @@ -1,53 +0,0 @@ -From bcbf145ce925934214e48200c27c9ff736452549 Mon Sep 17 00:00:00 2001 -From: Deepak Das -Date: Mon, 10 Oct 2022 17:55:53 +0530 -Subject: [PATCH] pam_faillock: Clarify missing user faillock files after - reboot - -* modules/pam_faillock/faillock.conf.5.xml: Adding note related to missing -user specific faillock files after reboot. - -* modules/pam_faillock/pam_faillock.8.xml: Adding note related to missing -user specific faillock files after reboot. - -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2062512 ---- - modules/pam_faillock/faillock.conf.5.xml | 4 ++++ - modules/pam_faillock/pam_faillock.8.xml | 6 ++++++ - 2 files changed, 10 insertions(+) - -diff --git a/modules/pam_faillock/faillock.conf.5.xml b/modules/pam_faillock/faillock.conf.5.xml -index 04a84107..8faa5915 100644 ---- a/modules/pam_faillock/faillock.conf.5.xml -+++ b/modules/pam_faillock/faillock.conf.5.xml -@@ -44,6 +44,10 @@ - The directory where the user files with the failure records are kept. The - default is /var/run/faillock. - -+ -+ Note: These files will disappear after reboot on systems configured with -+ directory /var/run/faillock mounted on virtual memory. -+ - - - -diff --git a/modules/pam_faillock/pam_faillock.8.xml b/modules/pam_faillock/pam_faillock.8.xml -index 79bcbbd0..b7b7b0db 100644 ---- a/modules/pam_faillock/pam_faillock.8.xml -+++ b/modules/pam_faillock/pam_faillock.8.xml -@@ -327,6 +327,12 @@ session required pam_selinux.so open - /var/run/faillock/* - - the files logging the authentication failures for users -+ -+ Note: These files will disappear after reboot on systems configured with -+ directory /var/run/faillock mounted on virtual memory. -+ For persistent storage use the option dir= in -+ file /etc/security/faillock.conf. -+ - - - --- -2.38.1 - diff --git a/SOURCES/pam-1.5.1-pam-lastlog-check-localtime_r-return-value.patch b/SOURCES/pam-1.5.1-pam-lastlog-check-localtime_r-return-value.patch deleted file mode 100644 index 80ad508..0000000 --- a/SOURCES/pam-1.5.1-pam-lastlog-check-localtime_r-return-value.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 40c271164dbcebfc5304d0537a42fb42e6b6803c Mon Sep 17 00:00:00 2001 -From: Iker Pedrosa -Date: Mon, 26 Sep 2022 12:16:53 +0200 -Subject: [PATCH] pam_lastlog: check localtime_r() return value - -Check the return value of localtime_r() before calling strftime(). This -function crashes if the argument is NULL. - -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2012871 - -Signed-off-by: Iker Pedrosa ---- - modules/pam_lastlog/pam_lastlog.c | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/modules/pam_lastlog/pam_lastlog.c b/modules/pam_lastlog/pam_lastlog.c -index abd048df..121e7560 100644 ---- a/modules/pam_lastlog/pam_lastlog.c -+++ b/modules/pam_lastlog/pam_lastlog.c -@@ -573,12 +573,12 @@ last_login_failed(pam_handle_t *pamh, int announce, const char *user, time_t llt - time_t lf_time; - - lf_time = utuser.ut_tv.tv_sec; -- tm = localtime_r (&lf_time, &tm_buf); -- strftime (the_time, sizeof (the_time), -- /* TRANSLATORS: "strftime options for date of last login" */ -- _(" %a %b %e %H:%M:%S %Z %Y"), tm); -- -- date = the_time; -+ if ((tm = localtime_r (&lf_time, &tm_buf)) != NULL) { -+ strftime (the_time, sizeof (the_time), -+ /* TRANSLATORS: "strftime options for date of last login" */ -+ _(" %a %b %e %H:%M:%S %Z %Y"), tm); -+ date = the_time; -+ } - } - - /* we want & have the host? */ --- -2.38.1 - diff --git a/SOURCES/password-auth.pamd b/SOURCES/password-auth.pamd deleted file mode 100644 index 5de6f4d..0000000 --- a/SOURCES/password-auth.pamd +++ /dev/null @@ -1,18 +0,0 @@ -#%PAM-1.0 -# This file is auto-generated. -# User changes will be destroyed the next time authselect is run. -auth required pam_env.so -auth sufficient pam_unix.so try_first_pass nullok -auth required pam_deny.so - -account required pam_unix.so - -password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= -password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow -password required pam_deny.so - -session optional pam_keyinit.so revoke -session required pam_limits.so --session optional pam_systemd.so -session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid -session required pam_unix.so diff --git a/SOURCES/postlogin.pamd b/SOURCES/postlogin.pamd deleted file mode 100644 index 2ce9af4..0000000 --- a/SOURCES/postlogin.pamd +++ /dev/null @@ -1,8 +0,0 @@ -#%PAM-1.0 -# This file is auto-generated. -# User changes will be destroyed the next time authselect is run. - -session optional pam_umask.so silent -session [success=1 default=ignore] pam_succeed_if.so service !~ gdm* service !~ su* quiet -session [default=1] pam_lastlog.so nowtmp showfailed -session optional pam_lastlog.so silent noupdate showfailed diff --git a/SOURCES/smartcard-auth.pamd b/SOURCES/smartcard-auth.pamd deleted file mode 100644 index e8a6745..0000000 --- a/SOURCES/smartcard-auth.pamd +++ /dev/null @@ -1,4 +0,0 @@ -#%PAM-1.0 -# This file is auto-generated. -# User changes will be destroyed the next time authselect is run. -auth sufficient pam_sss.so allow_missing_name diff --git a/SOURCES/system-auth.pamd b/SOURCES/system-auth.pamd deleted file mode 100644 index 5de6f4d..0000000 --- a/SOURCES/system-auth.pamd +++ /dev/null @@ -1,18 +0,0 @@ -#%PAM-1.0 -# This file is auto-generated. -# User changes will be destroyed the next time authselect is run. -auth required pam_env.so -auth sufficient pam_unix.so try_first_pass nullok -auth required pam_deny.so - -account required pam_unix.so - -password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= -password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow -password required pam_deny.so - -session optional pam_keyinit.so revoke -session required pam_limits.so --session optional pam_systemd.so -session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid -session required pam_unix.so diff --git a/SOURCES/config-util.5 b/config-util.5 similarity index 92% rename from SOURCES/config-util.5 rename to config-util.5 index 17d7f8a..625f17b 100644 --- a/SOURCES/config-util.5 +++ b/config-util.5 @@ -8,7 +8,7 @@ config-util \- Common PAM configuration file for configuration utilities .sp 2 .SH DESCRIPTION -The purpose of this configuration file is to provide common +The purpose of this configuration file is to provide common configuration file for all configuration utilities which must be run from the supervisor account and use the userhelper wrapper application. @@ -23,7 +23,7 @@ There are not usually any other modules in the individual configuration files of these utilities. .sp -It is possible for example to modify duration of the validity of the +It is possible for example to modify duration of the validity of the authentication timestamp there. See .BR pam_timestamp(8) for details. diff --git a/SOURCES/config-util.pamd b/config-util.pamd similarity index 100% rename from SOURCES/config-util.pamd rename to config-util.pamd diff --git a/SOURCES/dlopen.sh b/dlopen.sh similarity index 100% rename from SOURCES/dlopen.sh rename to dlopen.sh diff --git a/SOURCES/gpl-2.0.txt b/gpl-2.0.txt similarity index 100% rename from SOURCES/gpl-2.0.txt rename to gpl-2.0.txt diff --git a/macros.pam b/macros.pam new file mode 100644 index 0000000..774327a --- /dev/null +++ b/macros.pam @@ -0,0 +1,5 @@ +%_pam_libdir %{_libdir} +%_pam_moduledir %{_libdir}/security +%_pam_secconfdir %{_sysconfdir}/security +%_pam_confdir %{_sysconfdir}/pam.d +%_pam_vendordir %{_datadir}/pam.d diff --git a/SOURCES/other.pamd b/other.pamd similarity index 100% rename from SOURCES/other.pamd rename to other.pamd diff --git a/SOURCES/pam-1.3.0-unix-nomsg.patch b/pam-1.5.3-unix-nomsg.patch similarity index 54% rename from SOURCES/pam-1.3.0-unix-nomsg.patch rename to pam-1.5.3-unix-nomsg.patch index 33c2267..3a8abbb 100644 --- a/SOURCES/pam-1.3.0-unix-nomsg.patch +++ b/pam-1.5.3-unix-nomsg.patch @@ -1,7 +1,8 @@ -diff -up Linux-PAM-1.3.0/modules/pam_unix/pam_unix_passwd.c.nomsg Linux-PAM-1.3.0/modules/pam_unix/pam_unix_passwd.c ---- Linux-PAM-1.3.0/modules/pam_unix/pam_unix_passwd.c.nomsg 2016-04-11 13:08:47.000000000 +0200 -+++ Linux-PAM-1.3.0/modules/pam_unix/pam_unix_passwd.c 2017-04-20 16:51:24.853106709 +0200 -@@ -687,12 +687,6 @@ pam_sm_chauthtok(pam_handle_t *pamh, int +Index: Linux-PAM-1.5.3/modules/pam_unix/pam_unix_passwd.c +=================================================================== +--- Linux-PAM-1.5.3.orig/modules/pam_unix/pam_unix_passwd.c ++++ Linux-PAM-1.5.3/modules/pam_unix/pam_unix_passwd.c +@@ -678,12 +678,6 @@ pam_sm_chauthtok(pam_handle_t *pamh, int return PAM_SUCCESS; } else if (off(UNIX__IAMROOT, ctrl) || (on(UNIX_NIS, ctrl) && _unix_comesfromsource(pamh, user, 0, 1))) { diff --git a/pam-1.6.0-redhat-modules.patch b/pam-1.6.0-redhat-modules.patch new file mode 100644 index 0000000..66aa8ff --- /dev/null +++ b/pam-1.6.0-redhat-modules.patch @@ -0,0 +1,24 @@ +diff -up Linux-PAM-1.6.0/configure.ac.redhat-modules Linux-PAM-1.6.0/configure.ac +--- Linux-PAM-1.6.0/configure.ac.redhat-modules 2024-01-23 13:16:34.854753145 +0100 ++++ Linux-PAM-1.6.0/configure.ac 2024-01-23 13:17:52.855859922 +0100 +@@ -774,6 +774,8 @@ AC_CONFIG_FILES([Makefile libpam/Makefil + po/Makefile.in \ + Make.xml.rules \ + modules/Makefile \ ++ modules/pam_chroot/Makefile \ ++ modules/pam_postgresok/Makefile \ + modules/pam_access/Makefile \ + modules/pam_canonicalize_user/Makefile \ + modules/pam_debug/Makefile modules/pam_deny/Makefile \ +diff -up Linux-PAM-1.6.0/modules/Makefile.am.redhat-modules Linux-PAM-1.6.0/modules/Makefile.am +--- Linux-PAM-1.6.0/modules/Makefile.am.redhat-modules 2024-01-17 11:29:36.000000000 +0100 ++++ Linux-PAM-1.6.0/modules/Makefile.am 2024-01-23 13:16:34.855753147 +0100 +@@ -48,6 +48,8 @@ SUBDIRS := \ + pam_debug \ + pam_deny \ + pam_echo \ ++ pam_chroot \ ++ pam_postgresok \ + pam_env \ + pam_exec \ + pam_faildelay \ diff --git a/pam-1.6.1-noflex.patch b/pam-1.6.1-noflex.patch new file mode 100644 index 0000000..fa35dc7 --- /dev/null +++ b/pam-1.6.1-noflex.patch @@ -0,0 +1,24 @@ +diff -up Linux-PAM-1.6.1/doc/Makefile.am.noflex Linux-PAM-1.6.1/doc/Makefile.am +--- Linux-PAM-1.6.1/doc/Makefile.am.noflex 2024-04-09 18:22:59.000000000 +0200 ++++ Linux-PAM-1.6.1/doc/Makefile.am 2024-04-10 11:09:39.304086982 +0200 +@@ -2,7 +2,7 @@ + # Copyright (c) 2005, 2006 Thorsten Kukuk + # + +-SUBDIRS = man specs sag adg mwg ++SUBDIRS = man sag adg mwg + + CLEANFILES = *~ + DISTCLEANFILES = custom-html.xsl custom-man.xsl +diff -up Linux-PAM-1.6.1/Makefile.am.noflex Linux-PAM-1.6.1/Makefile.am +--- Linux-PAM-1.6.1/Makefile.am.noflex 2024-04-10 11:09:39.304086982 +0200 ++++ Linux-PAM-1.6.1/Makefile.am 2024-04-10 11:13:15.057352362 +0200 +@@ -4,7 +4,7 @@ + + AUTOMAKE_OPTIONS = 1.9 gnu dist-xz no-dist-gzip check-news + +-SUBDIRS = libpam_internal libpam tests libpamc libpam_misc modules po conf \ ++SUBDIRS = libpam_internal libpam tests libpamc libpam_misc modules po doc \ + xtests + + if HAVE_DOC diff --git a/SOURCES/pam-1.3.1-pam-access-local.patch b/pam-1.6.1-pam-access-local.patch similarity index 54% rename from SOURCES/pam-1.3.1-pam-access-local.patch rename to pam-1.6.1-pam-access-local.patch index 2b82d49..89a0d39 100644 --- a/SOURCES/pam-1.3.1-pam-access-local.patch +++ b/pam-1.6.1-pam-access-local.patch @@ -1,99 +1,3 @@ -From 08992030c56c940c0707ccbc442b1c325aa01e6d Mon Sep 17 00:00:00 2001 -From: Tomas Mraz -Date: Tue, 6 Apr 2021 12:27:38 +0200 -Subject: [PATCH] pam_access: clean up the remote host matching code - -* modules/pam_access/pam_access.c (from_match): Split out remote_match() - function and avoid calling it when matching against LOCAL keyword. - There is also no point in doing domain match against TTY or SERVICE. ---- - modules/pam_access/pam_access.c | 44 +++++++++++++++++++++------------ - 1 file changed, 28 insertions(+), 16 deletions(-) - -diff --git a/modules/pam_access/pam_access.c b/modules/pam_access/pam_access.c -index 98848c54..277192b9 100644 ---- a/modules/pam_access/pam_access.c -+++ b/modules/pam_access/pam_access.c -@@ -160,6 +160,7 @@ static int list_match (pam_handle_t *, char *, char *, struct login_info *, - static int user_match (pam_handle_t *, char *, struct login_info *); - static int group_match (pam_handle_t *, const char *, const char *, int); - static int from_match (pam_handle_t *, char *, struct login_info *); -+static int remote_match (pam_handle_t *, char *, struct login_info *); - static int string_match (pam_handle_t *, const char *, const char *, int); - static int network_netmask_match (pam_handle_t *, const char *, const char *, struct login_info *); - -@@ -589,11 +590,9 @@ group_match (pam_handle_t *pamh, const char *tok, const char* usr, - /* from_match - match a host or tty against a list of tokens */ - - static int --from_match (pam_handle_t *pamh UNUSED, char *tok, struct login_info *item) -+from_match (pam_handle_t *pamh, char *tok, struct login_info *item) - { - const char *string = item->from; -- int tok_len; -- int str_len; - int rv; - - if (item->debug) -@@ -616,14 +615,29 @@ from_match (pam_handle_t *pamh UNUSED, char *tok, struct login_info *item) - } else if ((rv = string_match(pamh, tok, string, item->debug)) != NO) { - /* ALL or exact match */ - return rv; -- } else if (tok[0] == '.') { /* domain: match last fields */ -- if ((str_len = strlen(string)) > (tok_len = strlen(tok)) -- && strcasecmp(tok, string + str_len - tok_len) == 0) -- return (YES); -- } else if (item->from_remote_host == 0) { /* local: no PAM_RHOSTS */ -- if (strcasecmp(tok, "LOCAL") == 0) -- return (YES); -- } else if (tok[(tok_len = strlen(tok)) - 1] == '.') { -+ } else if (strcasecmp(tok, "LOCAL") == 0) { -+ /* LOCAL matches only local accesses */ -+ if (!item->from_remote_host) -+ return YES; -+ return NO; -+ } else if (item->from_remote_host) { -+ return remote_match(pamh, tok, item); -+ } -+ return NO; -+} -+ -+static int -+remote_match (pam_handle_t *pamh, char *tok, struct login_info *item) -+{ -+ const char *string = item->from; -+ size_t tok_len = strlen(tok); -+ size_t str_len; -+ -+ if (tok[0] == '.') { /* domain: match last fields */ -+ if ((str_len = strlen(string)) > tok_len -+ && strcasecmp(tok, string + str_len - tok_len) == 0) -+ return YES; -+ } else if (tok[tok_len - 1] == '.') { - struct addrinfo hint; - - memset (&hint, '\0', sizeof (hint)); -@@ -661,13 +675,11 @@ from_match (pam_handle_t *pamh UNUSED, char *tok, struct login_info *item) - runp = runp->ai_next; - } - } -- } else { -- /* Assume network/netmask with a IP of a host. */ -- if (network_netmask_match(pamh, tok, string, item)) -- return YES; -+ return NO; - } - -- return NO; -+ /* Assume network/netmask with an IP of a host. */ -+ return network_netmask_match(pamh, tok, string, item); - } - - /* string_match - match a string against one token */ --- -2.47.0 - - From ecaaf4456e5aeacae1acdb1775bb5aadd3b19e13 Mon Sep 17 00:00:00 2001 From: Iker Pedrosa Date: Wed, 16 Oct 2024 12:41:09 +0200 diff --git a/SOURCES/pam-1.3.1-pam-access-resolve-ip.patch b/pam-1.6.1-pam-access-resolve-ip.patch similarity index 59% rename from SOURCES/pam-1.3.1-pam-access-resolve-ip.patch rename to pam-1.6.1-pam-access-resolve-ip.patch index 27cbdf5..2d4e06c 100644 --- a/SOURCES/pam-1.3.1-pam-access-resolve-ip.patch +++ b/pam-1.6.1-pam-access-resolve-ip.patch @@ -1,46 +1,62 @@ -diff -up Linux-PAM-1.5.1/modules/pam_access/access.conf.5.xml.pam-access-resolve-ip Linux-PAM-1.5.1/modules/pam_access/access.conf.5.xml ---- Linux-PAM-1.5.1/modules/pam_access/access.conf.5.xml.pam-access-resolve-ip 2020-11-25 17:57:02.000000000 +0100 -+++ Linux-PAM-1.5.1/modules/pam_access/access.conf.5.xml 2024-11-21 10:04:58.553127026 +0100 -@@ -226,6 +226,14 @@ - item and the line will be most probably ignored. For this reason, it is not - recommended to put spaces around the ':' characters. +From 940747f88c16e029b69a74e80a2e94f65cb3e628 Mon Sep 17 00:00:00 2001 +From: Thorsten Kukuk +Date: Thu, 14 Nov 2024 10:27:28 +0100 +Subject: [PATCH] pam_access: rework resolving of tokens as hostname + +* modules/pam_access/pam_access.c: separate resolving of IP addresses + from hostnames. Don't resolve TTYs or display variables as hostname + (#834). + Add "nodns" option to disallow resolving of tokens as hostname. +* modules/pam_access/pam_access.8.xml: document nodns option +* modules/pam_access/access.conf.5.xml: document that hostnames should + be written as FQHN. +--- + modules/pam_access/access.conf.5.xml | 4 ++ + modules/pam_access/pam_access.8.xml | 46 ++++++++++++------ + modules/pam_access/pam_access.c | 72 +++++++++++++++++++++++++++- + 3 files changed, 105 insertions(+), 17 deletions(-) + +diff --git a/modules/pam_access/access.conf.5.xml b/modules/pam_access/access.conf.5.xml +index 0b93db00..10b8ba92 100644 +--- a/modules/pam_access/access.conf.5.xml ++++ b/modules/pam_access/access.conf.5.xml +@@ -233,6 +233,10 @@ + An IPv6 link local host address must contain the interface + identifier. IPv6 link local network/netmask is not supported. + -+ An IPv6 link local host address must contain the interface -+ identifier. IPv6 link local network/netmask is not supported. -+ -+ + Hostnames should be written as Fully-Qualified Host Name (FQHN) to avoid + confusion with device names or PAM service names. + - -diff -up Linux-PAM-1.5.1/modules/pam_access/pam_access.8.xml.pam-access-resolve-ip Linux-PAM-1.5.1/modules/pam_access/pam_access.8.xml ---- Linux-PAM-1.5.1/modules/pam_access/pam_access.8.xml.pam-access-resolve-ip 2020-11-25 17:57:02.000000000 +0100 -+++ Linux-PAM-1.5.1/modules/pam_access/pam_access.8.xml 2024-11-21 10:04:58.553127026 +0100 -@@ -25,11 +25,14 @@ - + +diff --git a/modules/pam_access/pam_access.8.xml b/modules/pam_access/pam_access.8.xml +index c991d7a0..71a4f7ee 100644 +--- a/modules/pam_access/pam_access.8.xml ++++ b/modules/pam_access/pam_access.8.xml +@@ -22,11 +22,14 @@ + debug + + noaudit + - + nodefgroup -- + - noaudit -+ + nodns - - accessfile=file -@@ -114,7 +117,46 @@ + + quiet_log +@@ -132,6 +135,33 @@ + + - - -- ++ ++ + nodefgroup + + @@ -66,32 +82,16 @@ diff -up Linux-PAM-1.5.1/modules/pam_access/pam_access.8.xml.pam-access-resolve- + + + -+ -+ -+ quiet_log -+ -+ -+ -+ Do not log denials with -+ syslog3. -+ -+ -+ -+ -+ -+ -+ fieldsep=separators - - - -@@ -152,20 +194,6 @@ - + + + quiet_log +@@ -185,20 +215,6 @@ -- + - - -- +- nodefgroup - - - @@ -102,30 +102,41 @@ diff -up Linux-PAM-1.5.1/modules/pam_access/pam_access.8.xml.pam-access-resolve- - - - - +- -diff -up Linux-PAM-1.5.1/modules/pam_access/pam_access.c.pam-access-resolve-ip Linux-PAM-1.5.1/modules/pam_access/pam_access.c ---- Linux-PAM-1.5.1/modules/pam_access/pam_access.c.pam-access-resolve-ip 2024-11-21 10:04:58.547127010 +0100 -+++ Linux-PAM-1.5.1/modules/pam_access/pam_access.c 2024-11-21 10:04:58.553127026 +0100 -@@ -92,6 +92,7 @@ struct login_info { - int debug; /* Print debugging messages. */ + +diff --git a/modules/pam_access/pam_access.c b/modules/pam_access/pam_access.c +index 48e7c7e9..109115e9 100644 +--- a/modules/pam_access/pam_access.c ++++ b/modules/pam_access/pam_access.c +@@ -100,6 +100,7 @@ struct login_info { int only_new_group_syntax; /* Only allow group entries of the form "(xyz)" */ int noaudit; /* Do not audit denials */ + int quiet_log; /* Do not log denials */ + int nodns; /* Do not try to resolve tokens as hostnames */ const char *fs; /* field separator */ const char *sep; /* list-element separator */ int from_remote_host; /* If PAM_RHOST was used for from */ -@@ -143,6 +144,8 @@ parse_args(pam_handle_t *pamh, struct lo - loginfo->only_new_group_syntax = YES; - } else if (strcmp (argv[i], "noaudit") == 0) { +@@ -154,6 +155,8 @@ parse_args(pam_handle_t *pamh, struct login_info *loginfo, loginfo->noaudit = YES; + } else if (strcmp (argv[i], "quiet_log") == 0) { + loginfo->quiet_log = YES; + } else if (strcmp (argv[i], "nodns") == 0) { + loginfo->nodns = YES; } else { pam_syslog(pamh, LOG_ERR, "unrecognized option [%s]", argv[i]); } -@@ -700,6 +703,39 @@ string_match (pam_handle_t *pamh, const +@@ -820,7 +823,7 @@ remote_match (pam_handle_t *pamh, char *tok, struct login_info *item) + if ((str_len = strlen(string)) > tok_len + && strcasecmp(tok, string + str_len - tok_len) == 0) + return YES; +- } else if (tok[tok_len - 1] == '.') { /* internet network numbers (end with ".") */ ++ } else if (tok[tok_len - 1] == '.') { /* internet network numbers/subnet (end with ".") */ + struct addrinfo hint; + + memset (&hint, '\0', sizeof (hint)); +@@ -895,6 +898,39 @@ string_match (pam_handle_t *pamh, const char *tok, const char *string, } @@ -165,7 +176,7 @@ diff -up Linux-PAM-1.5.1/modules/pam_access/pam_access.c.pam-access-resolve-ip L /* network_netmask_match - match a string against one token * where string is a hostname or ip (v4,v6) address and tok * represents either a hostname, a single ip (v4,v6) address -@@ -761,10 +797,42 @@ network_netmask_match (pam_handle_t *pam +@@ -956,10 +992,42 @@ network_netmask_match (pam_handle_t *pamh, return NO; } } @@ -209,3 +220,6 @@ diff -up Linux-PAM-1.5.1/modules/pam_access/pam_access.c.pam-access-resolve-ip L * Let getaddrinfo sort everything out */ if (getaddrinfo (tok, NULL, NULL, &ai) != 0) +-- +2.47.0 + diff --git a/pam-1.6.1-pam-env-econf-read-file-fixes.patch b/pam-1.6.1-pam-env-econf-read-file-fixes.patch new file mode 100644 index 0000000..0663588 --- /dev/null +++ b/pam-1.6.1-pam-env-econf-read-file-fixes.patch @@ -0,0 +1,86 @@ +From aabd5314a6d76968c377969b49118a2df3f97003 Mon Sep 17 00:00:00 2001 +From: "Dmitry V. Levin" +Date: Sun, 19 May 2024 15:00:00 +0000 +Subject: [PATCH 1/2] pam_env: fix NULL dereference on error path in + econf_read_file + +* modules/pam_env/pam_env.c [USE_ECONF] (econf_read_file): Handle NULL +value returned by econf_getStringValue(). + +Resolves: https://github.com/linux-pam/linux-pam/issues/796 +--- + modules/pam_env/pam_env.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/modules/pam_env/pam_env.c b/modules/pam_env/pam_env.c +index 2cc58228..6d39bb24 100644 +--- a/modules/pam_env/pam_env.c ++++ b/modules/pam_env/pam_env.c +@@ -287,7 +287,7 @@ econf_read_file(const pam_handle_t *pamh, const char *filename, const char *deli + char *val; + + error = econf_getStringValue (key_file, NULL, keys[i], &val); +- if (error != ECONF_SUCCESS) { ++ if (error != ECONF_SUCCESS || val == NULL) { + pam_syslog(pamh, LOG_ERR, "Unable to get string from key %s: %s", + keys[i], + econf_errString(error)); +-- +2.45.1 + + +From 75292685a625153c6e28bdd820e97421c258c04a Mon Sep 17 00:00:00 2001 +From: "Dmitry V. Levin" +Date: Sun, 19 May 2024 15:00:00 +0000 +Subject: [PATCH 2/2] pam_env: fix error handling in econf_read_file + +* modules/pam_env/pam_env.c [USE_ECONF] (econf_read_file): Make sure +the returned array of strings is properly initialized +when econf_getStringValue() fails to return a value. +--- + modules/pam_env/pam_env.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/modules/pam_env/pam_env.c b/modules/pam_env/pam_env.c +index 6d39bb24..7c146439 100644 +--- a/modules/pam_env/pam_env.c ++++ b/modules/pam_env/pam_env.c +@@ -273,7 +273,7 @@ econf_read_file(const pam_handle_t *pamh, const char *filename, const char *deli + return PAM_ABORT; + } + +- *lines = malloc((key_number +1)* sizeof(char**)); ++ *lines = calloc((key_number + 1), sizeof(char**)); + if (*lines == NULL) { + pam_syslog(pamh, LOG_ERR, "Cannot allocate memory."); + econf_free(keys); +@@ -281,8 +281,7 @@ econf_read_file(const pam_handle_t *pamh, const char *filename, const char *deli + return PAM_BUF_ERR; + } + +- (*lines)[key_number] = 0; +- ++ size_t n = 0; + for (size_t i = 0; i < key_number; i++) { + char *val; + +@@ -293,7 +292,7 @@ econf_read_file(const pam_handle_t *pamh, const char *filename, const char *deli + econf_errString(error)); + } else { + econf_unescnl(val); +- if (asprintf(&(*lines)[i],"%s%c%s", keys[i], delim[0], val) < 0) { ++ if (asprintf(&(*lines)[n],"%s%c%s", keys[i], delim[0], val) < 0) { + pam_syslog(pamh, LOG_ERR, "Cannot allocate memory."); + econf_free(keys); + econf_freeFile(key_file); +@@ -303,6 +302,7 @@ econf_read_file(const pam_handle_t *pamh, const char *filename, const char *deli + return PAM_BUF_ERR; + } + free (val); ++ n++; + } + } + +-- +2.45.1 + diff --git a/pam-1.6.1-sast-fixes.patch b/pam-1.6.1-sast-fixes.patch new file mode 100644 index 0000000..d2557c4 --- /dev/null +++ b/pam-1.6.1-sast-fixes.patch @@ -0,0 +1,212 @@ +From 5eccaf9b3488d3f6da800281363697e4e4834e77 Mon Sep 17 00:00:00 2001 +From: Iker Pedrosa +Date: Wed, 22 May 2024 11:16:28 +0200 +Subject: [PATCH 1/5] pam_faillock: close the audit socket after use + +* modules/pam_faillock/pam_faillock.c (check_tally): Close the audit +socket when it will no longer be used. + +``` +Error: RESOURCE_LEAK (CWE-772): +Linux-PAM-1.6.0/modules/pam_faillock/pam_faillock.c:247: open_fn: Returning handle opened by "audit_open". +Linux-PAM-1.6.0/modules/pam_faillock/pam_faillock.c:247: var_assign: Assigning: "audit_fd" = handle returned from "audit_open()". +Linux-PAM-1.6.0/modules/pam_faillock/pam_faillock.c:256: noescape: Resource "audit_fd" is not freed or pointed-to in "audit_log_user_message". +Linux-PAM-1.6.0/modules/pam_faillock/pam_faillock.c:258: leaked_handle: Handle variable "audit_fd" going out of scope leaks the handle. +256| audit_log_user_message(audit_fd, AUDIT_RESP_ACCT_UNLOCK_TIMED, buf, +257| rhost, NULL, tty, 1); +258|-> } +259| #endif +260| opts->flags |= FAILLOCK_FLAG_UNLOCKED; +``` + +Resolves: https://issues.redhat.com/browse/RHEL-36475 +Signed-off-by: Iker Pedrosa +--- + modules/pam_faillock/pam_faillock.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/modules/pam_faillock/pam_faillock.c b/modules/pam_faillock/pam_faillock.c +index e636a24e..f39a9d95 100644 +--- a/modules/pam_faillock/pam_faillock.c ++++ b/modules/pam_faillock/pam_faillock.c +@@ -255,6 +255,7 @@ check_tally(pam_handle_t *pamh, struct options *opts, struct tally_data *tallies + snprintf(buf, sizeof(buf), "op=pam_faillock suid=%u ", opts->uid); + audit_log_user_message(audit_fd, AUDIT_RESP_ACCT_UNLOCK_TIMED, buf, + rhost, NULL, tty, 1); ++ audit_close(audit_fd); + } + #endif + opts->flags |= FAILLOCK_FLAG_UNLOCKED; +-- +2.45.2 + + +From d00f6cb366b492de455f9b72fcbd2e49abf323e0 Mon Sep 17 00:00:00 2001 +From: Iker Pedrosa +Date: Wed, 22 May 2024 11:20:02 +0200 +Subject: [PATCH 2/5] pam_rootok: close the audit socket on error path + +* modules/pam_rootok/pam_rootok.c (log_callback): Close the audit socket +if vasprintf returned an error. + +``` +Error: RESOURCE_LEAK (CWE-772): +Linux-PAM-1.6.0/modules/pam_rootok/pam_rootok.c:59: open_fn: Returning handle opened by "audit_open". +Linux-PAM-1.6.0/modules/pam_rootok/pam_rootok.c:59: var_assign: Assigning: "audit_fd" = handle returned from "audit_open()". +Linux-PAM-1.6.0/modules/pam_rootok/pam_rootok.c:69: leaked_handle: Handle variable "audit_fd" going out of scope leaks the handle. +67| va_end(ap); +68| if (ret < 0) { +69|-> return 0; +70| } +71| audit_log_user_avc_message(audit_fd, AUDIT_USER_AVC, buf, NULL, NULL, +``` + +Resolves: https://issues.redhat.com/browse/RHEL-36475 +Signed-off-by: Iker Pedrosa +--- + modules/pam_rootok/pam_rootok.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/modules/pam_rootok/pam_rootok.c b/modules/pam_rootok/pam_rootok.c +index 6d2dfa07..1b88fb19 100644 +--- a/modules/pam_rootok/pam_rootok.c ++++ b/modules/pam_rootok/pam_rootok.c +@@ -66,6 +66,7 @@ log_callback (int type UNUSED, const char *fmt, ...) + ret = vasprintf (&buf, fmt, ap); + va_end(ap); + if (ret < 0) { ++ audit_close(audit_fd); + return 0; + } + audit_log_user_avc_message(audit_fd, AUDIT_USER_AVC, buf, NULL, NULL, +-- +2.45.2 + + +From 1ca5bfed50bd9f6c2f1e3e36c2df3253923dadf6 Mon Sep 17 00:00:00 2001 +From: Iker Pedrosa +Date: Wed, 22 May 2024 12:27:00 +0200 +Subject: [PATCH 3/5] pam_timestamp: close the timestamp file on error path + +* modules/pam_timestamp/pam_timestamp.c (pam_sm_authenticate) +[WITH_OPENSSL]: Close the timestamp file if hmac_size returned +an error. + +``` +Error: RESOURCE_LEAK (CWE-772): +Linux-PAM-1.6.0/modules/pam_timestamp/pam_timestamp.c:450: open_fn: Returning handle opened by "open". [Note: The source code implementation of the function has been overridden by a user model.] +Linux-PAM-1.6.0/modules/pam_timestamp/pam_timestamp.c:450: var_assign: Assigning: "fd" = handle returned from "open(path, 131072)". +Linux-PAM-1.6.0/modules/pam_timestamp/pam_timestamp.c:460: noescape: Resource "fd" is not freed or pointed-to in "fstat". +Linux-PAM-1.6.0/modules/pam_timestamp/pam_timestamp.c:484: leaked_handle: Handle variable "fd" going out of scope leaks the handle. +482| #ifdef WITH_OPENSSL +483| if (hmac_size(pamh, debug, &maclen)) { +484|-> return PAM_AUTH_ERR; +485| } +486| #else +``` + +Resolves: https://issues.redhat.com/browse/RHEL-36475 +Signed-off-by: Iker Pedrosa +--- + modules/pam_timestamp/pam_timestamp.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/modules/pam_timestamp/pam_timestamp.c b/modules/pam_timestamp/pam_timestamp.c +index 7c5457c4..edecc052 100644 +--- a/modules/pam_timestamp/pam_timestamp.c ++++ b/modules/pam_timestamp/pam_timestamp.c +@@ -481,6 +481,7 @@ pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) + + #ifdef WITH_OPENSSL + if (hmac_size(pamh, debug, &maclen)) { ++ close(fd); + return PAM_AUTH_ERR; + } + #else +-- +2.45.2 + + +From 667204d7e3e4a0341c529f7566d62dd64dd80866 Mon Sep 17 00:00:00 2001 +From: Iker Pedrosa +Date: Wed, 22 May 2024 12:25:34 +0200 +Subject: [PATCH 4/5] pam_namespace: free SELinux context + +* modules/pam_namespace/pam_namespace.c [WITH_SELINUX] (form_context): +Free SELinux context before returning. + +``` +Error: RESOURCE_LEAK (CWE-772): +Linux-PAM-1.6.0/modules/pam_namespace/pam_namespace.c:928: alloc_arg: "getexeccon" allocates memory that is stored into "scon". +Linux-PAM-1.6.0/modules/pam_namespace/pam_namespace.c:1004: leaked_storage: Variable "scon" going out of scope leaks the storage it points to. +1002| } +1003| /* Should never get here */ +1004|-> return PAM_SUCCESS; +1005| } +1006| #endif +``` + +Resolves: https://issues.redhat.com/browse/RHEL-36475 +Signed-off-by: Iker Pedrosa +--- + modules/pam_namespace/pam_namespace.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/modules/pam_namespace/pam_namespace.c b/modules/pam_namespace/pam_namespace.c +index e499d95a..781dac20 100644 +--- a/modules/pam_namespace/pam_namespace.c ++++ b/modules/pam_namespace/pam_namespace.c +@@ -1003,6 +1003,7 @@ static int form_context(const struct polydir_s *polyptr, + return rc; + } + /* Should never get here */ ++ freecon(scon); + return PAM_SUCCESS; + } + #endif +-- +2.45.2 + + +From bd2f695b3d89efe0c52bba975f9540634125178a Mon Sep 17 00:00:00 2001 +From: Iker Pedrosa +Date: Wed, 22 May 2024 12:29:07 +0200 +Subject: [PATCH 5/5] pam_namespace: free SELinux context on error path + +* modules/pam_namespace/pam_namespace.c (create_polydir) [WITH_SELINUX]: +Free SELinux context in case of an error. + +``` +Error: RESOURCE_LEAK (CWE-772): +Linux-PAM-1.6.0/modules/pam_namespace/pam_namespace.c:1433: alloc_arg: "getfscreatecon_raw" allocates memory that is stored into "oldcon_raw". +Linux-PAM-1.6.0/modules/pam_namespace/pam_namespace.c:1462: leaked_storage: Variable "oldcon_raw" going out of scope leaks the storage it points to. +1460| pam_syslog(idata->pamh, LOG_ERR, +1461| "Error creating directory %s: %m", dir); +1462|-> return PAM_SESSION_ERR; +1463| } +1464| +``` + +Resolves: https://issues.redhat.com/browse/RHEL-36475 +Signed-off-by: Iker Pedrosa +--- + modules/pam_namespace/pam_namespace.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/modules/pam_namespace/pam_namespace.c b/modules/pam_namespace/pam_namespace.c +index 781dac20..2dab49ef 100644 +--- a/modules/pam_namespace/pam_namespace.c ++++ b/modules/pam_namespace/pam_namespace.c +@@ -1462,6 +1462,9 @@ static int create_polydir(struct polydir_s *polyptr, + if (rc == -1) { + pam_syslog(idata->pamh, LOG_ERR, + "Error creating directory %s: %m", dir); ++#ifdef WITH_SELINUX ++ freecon(oldcon_raw); ++#endif + return PAM_SESSION_ERR; + } + +-- +2.45.2 + diff --git a/SPECS/pam.spec b/pam.spec similarity index 77% rename from SPECS/pam.spec rename to pam.spec index ee87fa4..794593a 100644 --- a/SPECS/pam.spec +++ b/pam.spec @@ -1,166 +1,70 @@ -%define pam_redhat_version 0.99.11 +%global so_ver 0 +%global pam_redhat_version 1.2.0 Summary: An extensible library which provides authentication for applications Name: pam -Version: 1.3.1 -Release: 36%{?dist} +Version: 1.6.1 +Release: 7%{?dist} # The library is BSD licensed with option to relicense as GPLv2+ # - this option is redundant as the BSD license allows that anyway. -# pam_timestamp, pam_loginuid, and pam_console modules are GPLv2+. -License: BSD and GPLv2+ -Group: System Environment/Base +# pam_timestamp and pam_loginuid modules are GPLv2+. +License: BSD-3-Clause AND GPL-2.0-or-later +URL: http://www.linux-pam.org/ Source0: https://github.com/linux-pam/linux-pam/releases/download/v%{version}/Linux-PAM-%{version}.tar.xz Source1: https://github.com/linux-pam/linux-pam/releases/download/v%{version}/Linux-PAM-%{version}.tar.xz.asc -Source2: https://releases.pagure.org/pam-redhat/pam-redhat-%{pam_redhat_version}.tar.bz2 +Source2: https://releases.pagure.org/pam-redhat/pam-redhat-%{pam_redhat_version}.tar.xz +Source3: macros.%{name} Source5: other.pamd -Source6: system-auth.pamd -Source7: password-auth.pamd -Source8: fingerprint-auth.pamd -Source9: smartcard-auth.pamd Source10: config-util.pamd Source11: dlopen.sh Source12: system-auth.5 Source13: config-util.5 Source15: pamtmp.conf -Source16: postlogin.pamd Source17: postlogin.5 Source18: https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt -Patch1: pam-1.2.0-redhat-modules.patch -Patch4: pam-1.1.0-console-nochmod.patch -Patch5: pam-1.1.0-notally.patch -Patch7: pam-1.2.1-faillock.patch -Patch8: pam-1.2.1-faillock-admin-group.patch -Patch9: pam-1.3.1-noflex.patch -Patch10: pam-1.1.3-nouserenv.patch -Patch13: pam-1.1.6-limits-user.patch -Patch15: pam-1.1.8-full-relro.patch -# FIPS related - non upstreamable -Patch20: pam-1.2.0-unix-no-fallback.patch -Patch28: pam-1.1.1-console-errmsg.patch -# Upstreamed partially -Patch29: pam-1.3.0-pwhistory-helper.patch -Patch31: pam-1.1.8-audit-user-mgmt.patch -Patch32: pam-1.2.1-console-devname.patch -Patch33: pam-1.3.0-unix-nomsg.patch -Patch34: pam-1.3.1-coverity.patch -Patch35: pam-1.3.1-console-build.patch -Patch36: pam-1.3.1-faillock-update.patch -Patch37: pam-1.3.1-namespace-mntopts.patch -Patch38: pam-1.3.1-lastlog-no-showfailed.patch -Patch39: pam-1.3.1-lastlog-unlimited-fsize.patch -Patch40: pam-1.3.1-unix-improve-logging.patch -Patch41: pam-1.3.1-tty-audit-manfix.patch -Patch42: pam-1.3.1-fds-closing.patch -Patch43: pam-1.3.1-authtok-verify-fix.patch -Patch44: pam-1.3.1-motd-manpage.patch -# Upstreamed -Patch45: pam-1.3.1-pam-usertype.patch -# Upstreamed -Patch46: pam-1.3.1-audit-error.patch -# Upstreamed -Patch47: pam-1.3.1-pam-modutil-close-write.patch -# https://github.com/linux-pam/linux-pam/commit/6bf9b454eb971083f0cce49faa2aa1cde329ff5d -# https://github.com/linux-pam/linux-pam/commit/9091ea1d81e85f49a221b0325d27b22ce69e444a -# https://github.com/linux-pam/linux-pam/commit/a3a5cbf86083c43026b558e2023f597530626267 -Patch48: pam-1.3.1-wheel-pam_ruser-fallback.patch -# https://github.com/linux-pam/linux-pam/commit/491e5500b6b3913f531574208274358a2df88659 -Patch49: pam-1.3.1-namespace-gdm-doc.patch -# https://github.com/linux-pam/linux-pam/commit/a7453aeeb398d6cbb7a709c4e2a1d75905220fff -Patch50: pam-1.3.1-pam-userdb-prevent-garbage-characters-from-db.patch -# https://github.com/linux-pam/linux-pam/commit/3234488f2c52a021eec87df1990d256314c21bff -Patch51: pam-1.3.1-pam-limits-unlimited-value.patch -# https://github.com/linux-pam/linux-pam/commit/a35e092e24ee7632346a0e1b4a203c04d4cd2c62 -Patch52: pam-1.3.1-pam-keyinit-thread-safe.patch -# https://github.com/linux-pam/linux-pam/commit/f9c9c72121eada731e010ab3620762bcf63db08f -Patch53: pam-1.3.1-pam-motd-support-multiple-motd-paths.patch -# https://github.com/linux-pam/linux-pam/commit/8eaf5570cf011148a0b55c53570df5edaafebdb0 -Patch54: pam-1.3.1-pam-motd-fix-segmentation-fault.patch -# https://github.com/linux-pam/linux-pam/commit/62cd745d730e5ba13d5d7092ac566fc0b2148e61 -Patch55: pam-1.3.1-pam-motd-fix-memory-leak.patch -# Needed by the next patch. Already upstreamed -Patch56: pam-1.3.1-pam-cc-compat.patch -Patch57: pam-1.3.1-inline.patch -# https://github.com/linux-pam/linux-pam/commit/9bcbe96d9e82a23d983c0618178a8dc25596ac2d -# https://github.com/linux-pam/linux-pam/commit/fc867a9e22eac2c9a0ed0577776bba4df21c9aad -Patch58: pam-1.3.1-faillock-load-conf-from-file.patch -# https://github.com/linux-pam/linux-pam/commit/370064ef6f99581b08d473a42bb3417d5dda3e4e -Patch59: pam-1.3.1-pam-usertype-SYS_UID_MAX.patch -# https://github.com/linux-pam/linux-pam/commit/ba2f6dd8b81ea2a58262c1709bec906b6852591d -# https://github.com/linux-pam/linux-pam/commit/1180bde923a22605fe8075cd1fe7992ed7513411 -Patch60: pam-1.3.1-pam-pwhistory-load-conf-from-file.patch -# https://github.com/linux-pam/linux-pam/commit/d57ab22133654033ee1da89f128a81572d320985 -# https://github.com/linux-pam/linux-pam/commit/c2c0434bd634a817f2b16ce7f58fc96c04e88b03 -Patch61: pam-1.3.1-pam-motd-avoid-unnecessary-logging.patch -# https://github.com/linux-pam/linux-pam/commit/40c271164dbcebfc5304d0537a42fb42e6b6803c -Patch62: pam-1.5.1-pam-lastlog-check-localtime_r-return-value.patch -# https://github.com/linux-pam/linux-pam/commit/bcbf145ce925934214e48200c27c9ff736452549 -Patch63: pam-1.5.1-pam-faillock-clarify-missing-user.patch -# https://github.com/linux-pam/linux-pam/commit/10086bc69663fa819277af244eeb5b629a2403b8 -Patch64: pam-1.5.1-pam-faillock-avoid-logging-erroneous.patch -# https://github.com/linux-pam/linux-pam/commit/55f206447a1e4ee26e307e7a9c069236e823b1a5 -# https://github.com/linux-pam/linux-pam/commit/80bfda5962e5be3daa70e0fc8c75fc97d1c55121 -Patch65: pam-1.3.1-pam-misc-configurable.patch -# https://github.com/linux-pam/linux-pam/commit/530c9f9e2d746e1d168c6b17863debda7664ac7c -# https://github.com/linux-pam/linux-pam/commit/f7abb8c1ef3aa31e6c2564a8aaf69683a77c2016 -Patch66: pam-1.3.1-unix-enable-bcrypt.patch -Patch67: pam-1.3.1-unix-default-rounds.patch -# https://github.com/linux-pam/linux-pam/commit/d54870f993e97fe75e2cd0470a3701d5af22877c -Patch68: pam-1.3.1-faillock-create-tallydir.patch -# https://github.com/linux-pam/linux-pam/commit/23393bef92c1e768eda329813d7af55481c6ca9f -Patch69: pam-1.3.1-access-handle-hostnames.patch -# https://github.com/linux-pam/linux-pam/commit/031bb5a5d0d950253b68138b498dc93be69a64cb -Patch70: pam-1.3.1-namespace-protect-dir.patch -# https://github.com/linux-pam/linux-pam/commit/c85513220c1bd3150e39c6277422d29cfa44acc7 -# https://github.com/linux-pam/linux-pam/commit/1648734a69c31e9ce834da70144ac9a453296807 -Patch71: pam-1.3.1-audit-messages-formatting.patch -# https://github.com/linux-pam/linux-pam/commit/b3020da7da384d769f27a8713257fbe1001878be -# https://github.com/linux-pam/linux-pam/commit/8d0c575336ad301cd14e16ad2fdec6fe621764b8 -Patch72: pam-1.3.1-pam-unix-shadow-password.patch -# https://github.com/linux-pam/linux-pam/commit/08992030c56c940c0707ccbc442b1c325aa01e6d +Patch1: pam-1.6.0-redhat-modules.patch +Patch2: pam-1.6.1-noflex.patch +Patch3: pam-1.5.3-unix-nomsg.patch +# https://github.com/linux-pam/linux-pam/commit/bd2f695b3d89efe0c52bba975f9540634125178a +Patch4: pam-1.6.1-sast-fixes.patch +# https://github.com/linux-pam/linux-pam/commit/aabd5314a6d76968c377969b49118a2df3f97003 +Patch5: pam-1.6.1-pam-env-econf-read-file-fixes.patch # https://github.com/linux-pam/linux-pam/commit/641dfd1084508c63f3590e93a35b80ffc50774e5 -Patch73: pam-1.3.1-pam-access-local.patch -# https://github.com/linux-pam/linux-pam/commit/ec1fb9ddc6c252d8c61379e9385ca19c036fcb96 -Patch74: pam-1.3.1-libpam-support-long-lines.patch +Patch6: pam-1.6.1-pam-access-local.patch # https://github.com/linux-pam/linux-pam/commit/940747f88c16e029b69a74e80a2e94f65cb3e628 -Patch75: pam-1.3.1-pam-access-resolve-ip.patch +Patch7: pam-1.6.1-pam-access-resolve-ip.patch -%define _pamlibdir %{_libdir} -%define _moduledir %{_libdir}/security -%define _secconfdir %{_sysconfdir}/security -%define _pamconfdir %{_sysconfdir}/pam.d +%{load:%{SOURCE3}} -%if %{?WITH_SELINUX:0}%{!?WITH_SELINUX:1} -%define WITH_SELINUX 1 -%endif -%if %{?WITH_AUDIT:0}%{!?WITH_AUDIT:1} -%define WITH_AUDIT 1 -%endif -%global _performance_build 1 +### Dependencies ### +Requires(meta): authselect >= 1.3 +Requires: gdbm +Requires: libpwquality%{?_isa} +Requires: pam-libs%{?_isa} = %{version}-%{release} +Requires: setup -Recommends: cracklib-dicts >= 2.8 -Requires: libpwquality >= 0.9.9 -Requires(post): coreutils, /sbin/ldconfig -BuildRequires: autoconf >= 2.60 -BuildRequires: automake, libtool -BuildRequires: bison, flex, sed -BuildRequires: cracklib-devel -BuildRequires: perl-interpreter, pkgconfig, gettext-devel -BuildRequires: libtirpc-devel, libnsl2-devel -%if %{WITH_AUDIT} -BuildRequires: audit-libs-devel >= 1.0.8 -Requires: audit-libs >= 1.0.8 -%endif -%if %{WITH_SELINUX} -BuildRequires: libselinux-devel >= 1.33.2 -Requires: libselinux >= 1.33.2 -%endif -Requires: glibc >= 2.3.90-37 -BuildRequires: libdb-devel -# Following deps are necessary only to build the pam library documentation. -BuildRequires: linuxdoc-tools, elinks, libxslt -BuildRequires: docbook-style-xsl, docbook-dtds +Suggests: libdb-convert-util -URL: http://www.linux-pam.org/ +### Build Dependencies ### +BuildRequires: audit-libs-devel +BuildRequires: autoconf +BuildRequires: automake +BuildRequires: bison +BuildRequires: flex +BuildRequires: gcc +BuildRequires: gdbm-devel +BuildRequires: gettext-devel +BuildRequires: libeconf-devel +BuildRequires: libselinux-devel +BuildRequires: libtirpc-devel +BuildRequires: libtool +BuildRequires: libxcrypt-devel +BuildRequires: make +BuildRequires: openssl-devel +BuildRequires: perl-interpreter +BuildRequires: pkgconfig +BuildRequires: sed +BuildRequires: systemd %description PAM (Pluggable Authentication Modules) is a system security tool that @@ -168,9 +72,8 @@ allows system administrators to set authentication policy without having to recompile programs that handle authentication. %package devel -Group: Development/Libraries Summary: Files needed for developing PAM-aware applications and modules for PAM -Requires: pam%{?_isa} = %{version}-%{release} +Requires: pam-libs%{?_isa} = %{version}-%{release} %description devel PAM (Pluggable Authentication Modules) is a system security tool that @@ -179,6 +82,37 @@ having to recompile programs that handle authentication. This package contains header files used for building both PAM-aware applications and modules for use with the PAM system. +%package doc +Summary: Extra documentation for PAM. +Requires: pam = %{version}-%{release} +Obsoletes: pam-docs < 1.5.2-6 +Provides: pam-docs = %{version}-%{release} +BuildArch: noarch +BuildRequires: docbook5-schemas +BuildRequires: docbook5-style-xsl +BuildRequires: elinks +BuildRequires: libxslt +BuildRequires: linuxdoc-tools + +%description doc +PAM (Pluggable Authentication Modules) is a system security tool that +allows system administrators to set authentication policy without +having to recompile programs that handle authentication. The pam-doc +contains extra documentation for PAM. Currently, this includes additional +documentation in txt and html format. + +%package libs +Summary: Shared libraries of the PAM package +# Make sure that if we don't try to upgrade -libs but not the +# main pam package and get file conflicts: +Conflicts: pam < 1.5.2-11 + +%description libs +PAM (Pluggable Authentication Modules) is a system security tool that +allows system administrators to set authentication policy without +having to recompile programs that handle authentication. The pam-libs +contains the shared libraries for PAM. + %prep %setup -q -n Linux-PAM-%{version} -a 2 perl -pi -e "s/ppc64-\*/ppc64-\* \| ppc64p7-\*/" build-aux/config.sub @@ -189,154 +123,109 @@ mv pam-redhat-%{pam_redhat_version}/* modules cp %{SOURCE18} . -%patch1 -p1 -b .redhat-modules -%patch4 -p1 -b .nochmod -%patch5 -p1 -b .notally -%patch7 -p1 -b .faillock -%patch8 -p1 -b .admin-group -%patch9 -p1 -b .noflex -%patch10 -p1 -b .nouserenv -%patch13 -p1 -b .limits -%patch15 -p1 -b .relro -%patch20 -p1 -b .no-fallback -%patch28 -p1 -b .errmsg -%patch29 -p1 -b .pwhhelper -%patch31 -p1 -b .audit-user-mgmt -%patch32 -p1 -b .devname -%patch33 -p1 -b .nomsg -%patch34 -p1 -b .coverity -%patch35 -p1 -b .console-build -%patch36 -p1 -b .faillock-update -%patch37 -p1 -b .mntopts -%patch38 -p1 -b .no-showfailed -%patch39 -p1 -b .unlimited-fsize -%patch40 -p1 -b .improve-logging -%patch41 -p1 -b .tty-audit-manfix -%patch42 -p1 -b .fds-closing -%patch43 -p1 -b .authtok-verify-fix -%patch44 -p1 -b .motd-manpage -%patch45 -p1 -b .pam-usertype -%patch46 -p1 -b .audit-error -%patch47 -p1 -b .pam-modutil-close-write -%patch48 -p1 -b .wheel-pam_ruser-fallback -%patch49 -p1 -b .namespace-gdm-doc -%patch50 -p1 -b .pam-userdb-prevent-garbage-characters-from-db -%patch51 -p1 -b .pam-limits-unlimited-value -%patch52 -p1 -b .pam-keyinit-thread-safe -%patch53 -p1 -b .pam-motd-support-multiple-motd-paths -%patch54 -p1 -b .pam-motd-fix-segmentation-fault -%patch55 -p1 -b .pam-motd-fix-memory-leak -%patch56 -p1 -b .pam-cc-compat -%patch57 -p1 -b .inline -%patch58 -p1 -b .faillock-load-conf-from-file -%patch59 -p1 -b .pam-usertype-SYS_UID_MAX -%patch60 -p1 -b .pam-pwhistory-load-conf-from-file -%patch61 -p1 -b .pam-motd-avoid-unnecessary-logging -%patch62 -p1 -b .pam-lastlog-check-localtime_r-return-value -%patch63 -p1 -b .pam-faillock-clarify-missing-user -%patch64 -p1 -b .pam-faillock-avoid-logging-erroneous -%patch65 -p1 -b .pam-misc-configurable -%patch66 -p1 -b .unix-enable-bcrypt -%patch67 -p1 -b .unix-default-rounds -%patch68 -p1 -b .faillock-create-tallydir -%patch69 -p1 -b .access-handle-hostnames -%patch70 -p1 -b .namespace-protect-dir -%patch71 -p1 -b .audit-messages-formatting -%patch72 -p1 -b .pam-unix-shadow-password -%patch73 -p1 -b .pam-access-local -%patch74 -p1 -b .libpam-support-long-lines -%patch75 -p1 -b .pam-access-resolve-ip +%patch -P 1 -p1 -b .redhat-modules +%patch -P 2 -p1 -b .noflex +%patch -P 3 -p1 -b .nomsg +%patch -P 4 -p1 -b .sast-fixes +%patch -P 5 -p1 -b .pam-env-econf-read-file-fixes +%patch -P 6 -p1 -b .pam-access-local +%patch -P 7 -p1 -b .pam-access-resolve-ip autoreconf -i %build %configure \ - --disable-rpath \ - --libdir=%{_pamlibdir} \ - --includedir=%{_includedir}/security \ -%if ! %{WITH_SELINUX} - --disable-selinux \ -%endif -%if ! %{WITH_AUDIT} - --disable-audit \ -%endif - --disable-static \ - --disable-prelude -make -C po update-gmo -make -# we do not use _smp_mflags because the build of sources in yacc/flex fails + --libdir=%{_pam_libdir} \ + --includedir=%{_includedir}/security \ + --disable-rpath \ + --disable-static \ + --disable-prelude \ + --disable-nis \ + --enable-audit \ + --enable-openssl \ + --enable-selinux \ + --enable-lastlog \ + --enable-db=gdbm +%make_build -C po update-gmo +%make_build %install mkdir -p doc/txts for readme in modules/pam_*/README ; do - cp -f ${readme} doc/txts/README.`dirname ${readme} | sed -e 's|^modules/||'` + cp -f ${readme} doc/txts/README.`dirname ${readme} | sed -e 's|^modules/||'` done -rm -rf doc/txts/README.pam_tally* -rm -rf doc/sag/html/*pam_tally* +# Install the macros file +install -D -m 644 %{SOURCE3} %{buildroot}%{_rpmconfigdir}/macros.d/macros.%{name} # Install the binaries, libraries, and modules. -make install DESTDIR=$RPM_BUILD_ROOT LDCONFIG=: +%make_install LDCONFIG=: -%if %{WITH_SELINUX} # Temporary compat link -ln -sf pam_sepermit.so $RPM_BUILD_ROOT%{_moduledir}/pam_selinux_permit.so -%endif +ln -sf pam_sepermit.so %{buildroot}%{_pam_moduledir}/pam_selinux_permit.so # RPM uses docs from source tree -rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/Linux-PAM +rm -rf %{buildroot}%{_datadir}/doc/Linux-PAM # Included in setup package -rm -f $RPM_BUILD_ROOT%{_sysconfdir}/environment +rm -f %{buildroot}%{_sysconfdir}/environment # Install default configuration files. -install -d -m 755 $RPM_BUILD_ROOT%{_pamconfdir} -install -m 644 %{SOURCE5} $RPM_BUILD_ROOT%{_pamconfdir}/other -install -m 644 %{SOURCE6} $RPM_BUILD_ROOT%{_pamconfdir}/system-auth -install -m 644 %{SOURCE7} $RPM_BUILD_ROOT%{_pamconfdir}/password-auth -install -m 644 %{SOURCE8} $RPM_BUILD_ROOT%{_pamconfdir}/fingerprint-auth -install -m 644 %{SOURCE9} $RPM_BUILD_ROOT%{_pamconfdir}/smartcard-auth -install -m 644 %{SOURCE10} $RPM_BUILD_ROOT%{_pamconfdir}/config-util -install -m 644 %{SOURCE16} $RPM_BUILD_ROOT%{_pamconfdir}/postlogin -install -m 600 /dev/null $RPM_BUILD_ROOT%{_secconfdir}/opasswd -install -d -m 755 $RPM_BUILD_ROOT/var/log -install -d -m 755 $RPM_BUILD_ROOT/var/run/faillock -install -d -m 755 $RPM_BUILD_ROOT%{_sysconfdir}/motd.d -install -d -m 755 $RPM_BUILD_ROOT/usr/lib/motd.d -install -d -m 755 $RPM_BUILD_ROOT/run/motd.d +install -d -m 755 %{buildroot}%{_pam_confdir} +install -d -m 755 %{buildroot}%{_pam_vendordir} +install -m 644 %{SOURCE5} %{buildroot}%{_pam_confdir}/other +install -m 644 %{SOURCE10} %{buildroot}%{_pam_confdir}/config-util +install -m 600 /dev/null %{buildroot}%{_pam_secconfdir}/opasswd +install -d -m 755 %{buildroot}/var/log +install -d -m 755 %{buildroot}/var/run/faillock # Install man pages. -install -m 644 %{SOURCE12} %{SOURCE13} %{SOURCE17} $RPM_BUILD_ROOT%{_mandir}/man5/ -ln -sf system-auth.5 $RPM_BUILD_ROOT%{_mandir}/man5/password-auth.5 -ln -sf system-auth.5 $RPM_BUILD_ROOT%{_mandir}/man5/fingerprint-auth.5 -ln -sf system-auth.5 $RPM_BUILD_ROOT%{_mandir}/man5/smartcard-auth.5 +install -m 644 %{SOURCE12} %{SOURCE13} %{SOURCE17} %{buildroot}%{_mandir}/man5/ +ln -sf system-auth.5 %{buildroot}%{_mandir}/man5/password-auth.5 +ln -sf system-auth.5 %{buildroot}%{_mandir}/man5/fingerprint-auth.5 +ln -sf system-auth.5 %{buildroot}%{_mandir}/man5/smartcard-auth.5 for phase in auth acct passwd session ; do - ln -sf pam_unix.so $RPM_BUILD_ROOT%{_moduledir}/pam_unix_${phase}.so + ln -sf pam_unix.so %{buildroot}%{_pam_moduledir}/pam_unix_${phase}.so done # Remove .la files and make new .so links -- this depends on the value # of _libdir not changing, and *not* being /usr/lib. for lib in libpam libpamc libpam_misc ; do -rm -f $RPM_BUILD_ROOT%{_pamlibdir}/${lib}.la + rm -f %{buildroot}%{_pam_libdir}/${lib}.la done -rm -f $RPM_BUILD_ROOT%{_moduledir}/*.la +rm -f %{buildroot}%{_pam_moduledir}/*.la -%if "%{_pamlibdir}" != "%{_libdir}" -install -d -m 755 $RPM_BUILD_ROOT%{_libdir} +%if "%{_pam_libdir}" != "%{_libdir}" +install -d -m 755 %{buildroot}%{_libdir} for lib in libpam libpamc libpam_misc ; do -pushd $RPM_BUILD_ROOT%{_libdir} -ln -sf %{_pamlibdir}/${lib}.so.*.* ${lib}.so -popd -rm -f $RPM_BUILD_ROOT%{_pamlibdir}/${lib}.so + pushd %{buildroot}%{_libdir} + ln -sf %{_pam_libdir}/${lib}.so.*.* ${lib}.so + popd + rm -f %{buildroot}%{_pam_libdir}/${lib}.so done %endif # Duplicate doc file sets. -rm -fr $RPM_BUILD_ROOT/usr/share/doc/pam +rm -fr %{buildroot}/usr/share/doc/pam # Install the file for autocreation of /var/run subdirectories on boot -install -m644 -D %{SOURCE15} $RPM_BUILD_ROOT%{_prefix}/lib/tmpfiles.d/pam.conf +install -m644 -D %{SOURCE15} %{buildroot}%{_prefix}/lib/tmpfiles.d/pam.conf + +# Install systemd unit file. +install -m644 -D modules/pam_namespace/pam_namespace.service \ + %{buildroot}%{_unitdir}/pam_namespace.service + +# Install doc files to unified location. +install -d -m 755 %{buildroot}%{_pkgdocdir}/{adg/html,mwg/html,sag/html,txts} +install -p -m 644 doc/specs/rfc86.0.txt %{buildroot}%{_pkgdocdir} +install -p -m 644 doc/txts/* %{buildroot}%{_pkgdocdir}/txts +for i in adg mwg sag; do + install -p -m 644 doc/$i/*.txt %{buildroot}%{_pkgdocdir}/$i + cp -pr doc/$i/html/* %{buildroot}%{_pkgdocdir}/$i/html +done +find %{buildroot}%{_pkgdocdir} -type d | xargs chmod 755 +find %{buildroot}%{_pkgdocdir} -type f | xargs chmod 644 %find_lang Linux-PAM @@ -344,261 +233,375 @@ install -m644 -D %{SOURCE15} $RPM_BUILD_ROOT%{_prefix}/lib/tmpfiles.d/pam.conf # Make sure every module subdirectory gave us a module. Yes, this is hackish. for dir in modules/pam_* ; do if [ -d ${dir} ] ; then -%if ! %{WITH_SELINUX} - [ ${dir} = "modules/pam_selinux" ] && continue - [ ${dir} = "modules/pam_sepermit" ] && continue -%endif -%if ! %{WITH_AUDIT} - [ ${dir} = "modules/pam_tty_audit" ] && continue -%endif - [ ${dir} = "modules/pam_tally" ] && continue - [ ${dir} = "modules/pam_tally2" ] && continue - if ! ls -1 $RPM_BUILD_ROOT%{_moduledir}/`basename ${dir}`*.so ; then - echo ERROR `basename ${dir}` did not build a module. - exit 1 - fi + [ ${dir} = "modules/pam_selinux" ] && continue + [ ${dir} = "modules/pam_sepermit" ] && continue + [ ${dir} = "modules/pam_tty_audit" ] && continue + if ! ls -1 %{buildroot}%{_pam_moduledir}/`basename ${dir}`*.so ; then + echo ERROR `basename ${dir}` did not build a module. + exit 1 + fi fi done # Check for module problems. Specifically, check that every module we just # installed can actually be loaded by a minimal PAM-aware application. -/sbin/ldconfig -n $RPM_BUILD_ROOT%{_pamlibdir} -for module in $RPM_BUILD_ROOT%{_moduledir}/pam*.so ; do - if ! env LD_LIBRARY_PATH=$RPM_BUILD_ROOT%{_pamlibdir} \ - %{SOURCE11} -ldl -lpam -L$RPM_BUILD_ROOT%{_libdir} ${module} ; then - echo ERROR module: ${module} cannot be loaded. - exit 1 - fi +/sbin/ldconfig -n %{buildroot}%{_pam_libdir} +for module in %{buildroot}%{_pam_moduledir}/pam*.so ; do + if ! env LD_LIBRARY_PATH=%{buildroot}%{_pam_libdir} \ + %{SOURCE11} -ldl -lpam -L%{buildroot}%{_libdir} ${module} ; then + echo ERROR module: ${module} cannot be loaded. + exit 1 + fi done -%post -p /sbin/ldconfig - -%postun -p /sbin/ldconfig - %files -f Linux-PAM.lang -%dir %{_pamconfdir} -%config(noreplace) %{_pamconfdir}/other -%config(noreplace) %{_pamconfdir}/system-auth -%config(noreplace) %{_pamconfdir}/password-auth -%config(noreplace) %{_pamconfdir}/fingerprint-auth -%config(noreplace) %{_pamconfdir}/smartcard-auth -%config(noreplace) %{_pamconfdir}/config-util -%config(noreplace) %{_pamconfdir}/postlogin -%{!?_licensedir:%global license %%doc} %license Copyright %license gpl-2.0.txt -%doc doc/txts -%doc doc/sag/*.txt doc/sag/html -%{_pamlibdir}/libpam.so.* -%{_pamlibdir}/libpamc.so.* -%{_pamlibdir}/libpam_misc.so.* -%{_sbindir}/pam_console_apply +%dir %{_pam_confdir} +%dir %{_pam_vendordir} +%config(noreplace) %{_pam_confdir}/other +%config(noreplace) %{_pam_confdir}/config-util +%{_rpmconfigdir}/macros.d/macros.%{name} +%{_sbindir}/pam_namespace_helper %{_sbindir}/faillock %attr(4755,root,root) %{_sbindir}/pam_timestamp_check %attr(4755,root,root) %{_sbindir}/unix_chkpwd %attr(0700,root,root) %{_sbindir}/unix_update %attr(0755,root,root) %{_sbindir}/mkhomedir_helper %attr(0755,root,root) %{_sbindir}/pwhistory_helper -%dir %{_moduledir} -%{_moduledir}/pam_access.so -%{_moduledir}/pam_chroot.so -%{_moduledir}/pam_console.so -%{_moduledir}/pam_cracklib.so -%{_moduledir}/pam_debug.so -%{_moduledir}/pam_deny.so -%{_moduledir}/pam_echo.so -%{_moduledir}/pam_env.so -%{_moduledir}/pam_exec.so -%{_moduledir}/pam_faildelay.so -%{_moduledir}/pam_faillock.so -%{_moduledir}/pam_filter.so -%{_moduledir}/pam_ftp.so -%{_moduledir}/pam_group.so -%{_moduledir}/pam_issue.so -%{_moduledir}/pam_keyinit.so -%{_moduledir}/pam_lastlog.so -%{_moduledir}/pam_limits.so -%{_moduledir}/pam_listfile.so -%{_moduledir}/pam_localuser.so -%{_moduledir}/pam_loginuid.so -%{_moduledir}/pam_mail.so -%{_moduledir}/pam_mkhomedir.so -%{_moduledir}/pam_motd.so -%{_moduledir}/pam_namespace.so -%{_moduledir}/pam_nologin.so -%{_moduledir}/pam_permit.so -%{_moduledir}/pam_postgresok.so -%{_moduledir}/pam_pwhistory.so -%{_moduledir}/pam_rhosts.so -%{_moduledir}/pam_rootok.so -%if %{WITH_SELINUX} -%{_moduledir}/pam_selinux.so -%{_moduledir}/pam_selinux_permit.so -%{_moduledir}/pam_sepermit.so -%endif -%{_moduledir}/pam_securetty.so -%{_moduledir}/pam_shells.so -%{_moduledir}/pam_stress.so -%{_moduledir}/pam_succeed_if.so -%{_moduledir}/pam_time.so -%{_moduledir}/pam_timestamp.so -%if %{WITH_AUDIT} -%{_moduledir}/pam_tty_audit.so -%endif -%{_moduledir}/pam_umask.so -%{_moduledir}/pam_unix.so -%{_moduledir}/pam_unix_acct.so -%{_moduledir}/pam_unix_auth.so -%{_moduledir}/pam_unix_passwd.so -%{_moduledir}/pam_unix_session.so -%{_moduledir}/pam_userdb.so -%{_moduledir}/pam_usertype.so -%{_moduledir}/pam_warn.so -%{_moduledir}/pam_wheel.so -%{_moduledir}/pam_xauth.so -%{_moduledir}/pam_filter -%dir %{_secconfdir} -%config(noreplace) %{_secconfdir}/access.conf -%config(noreplace) %{_secconfdir}/chroot.conf -%config %{_secconfdir}/console.perms -%config(noreplace) %{_secconfdir}/console.handlers -%config(noreplace) %{_secconfdir}/faillock.conf -%config(noreplace) %{_secconfdir}/group.conf -%config(noreplace) %{_secconfdir}/limits.conf -%dir %{_secconfdir}/limits.d -%config(noreplace) %{_secconfdir}/namespace.conf -%dir %{_secconfdir}/namespace.d -%attr(755,root,root) %config(noreplace) %{_secconfdir}/namespace.init -%config(noreplace) %{_secconfdir}/pam_env.conf -%config(noreplace) %{_secconfdir}/pwhistory.conf -%config(noreplace) %{_secconfdir}/time.conf -%config(noreplace) %{_secconfdir}/opasswd -%dir %{_secconfdir}/console.apps -%dir %{_secconfdir}/console.perms.d -%dir /var/run/console -%if %{WITH_SELINUX} -%config(noreplace) %{_secconfdir}/sepermit.conf +%dir %{_pam_moduledir} +%{_pam_moduledir}/pam_access.so +%{_pam_moduledir}/pam_canonicalize_user.so +%{_pam_moduledir}/pam_chroot.so +%{_pam_moduledir}/pam_debug.so +%{_pam_moduledir}/pam_deny.so +%{_pam_moduledir}/pam_echo.so +%{_pam_moduledir}/pam_env.so +%{_pam_moduledir}/pam_exec.so +%{_pam_moduledir}/pam_faildelay.so +%{_pam_moduledir}/pam_faillock.so +%{_pam_moduledir}/pam_filter.so +%{_pam_moduledir}/pam_ftp.so +%{_pam_moduledir}/pam_group.so +%{_pam_moduledir}/pam_issue.so +%{_pam_moduledir}/pam_keyinit.so +%{_pam_moduledir}/pam_lastlog.so +%{_pam_moduledir}/pam_limits.so +%{_pam_moduledir}/pam_listfile.so +%{_pam_moduledir}/pam_localuser.so +%{_pam_moduledir}/pam_loginuid.so +%{_pam_moduledir}/pam_mail.so +%{_pam_moduledir}/pam_mkhomedir.so +%{_pam_moduledir}/pam_motd.so +%{_pam_moduledir}/pam_namespace.so +%{_pam_moduledir}/pam_nologin.so +%{_pam_moduledir}/pam_permit.so +%{_pam_moduledir}/pam_postgresok.so +%{_pam_moduledir}/pam_pwhistory.so +%{_pam_moduledir}/pam_rhosts.so +%{_pam_moduledir}/pam_rootok.so +%{_pam_moduledir}/pam_selinux.so +%{_pam_moduledir}/pam_selinux_permit.so +%{_pam_moduledir}/pam_sepermit.so +%{_pam_moduledir}/pam_securetty.so +%{_pam_moduledir}/pam_setquota.so +%{_pam_moduledir}/pam_shells.so +%{_pam_moduledir}/pam_stress.so +%{_pam_moduledir}/pam_succeed_if.so +%{_pam_moduledir}/pam_time.so +%{_pam_moduledir}/pam_timestamp.so +%{_pam_moduledir}/pam_tty_audit.so +%{_pam_moduledir}/pam_umask.so +%{_pam_moduledir}/pam_unix.so +%{_pam_moduledir}/pam_unix_acct.so +%{_pam_moduledir}/pam_unix_auth.so +%{_pam_moduledir}/pam_unix_passwd.so +%{_pam_moduledir}/pam_unix_session.so +%{_pam_moduledir}/pam_userdb.so +%{_pam_moduledir}/pam_usertype.so +%{_pam_moduledir}/pam_warn.so +%{_pam_moduledir}/pam_wheel.so +%{_pam_moduledir}/pam_xauth.so +%{_pam_moduledir}/pam_filter +%{_unitdir}/pam_namespace.service +%dir %{_pam_secconfdir} +%config(noreplace) %{_pam_secconfdir}/access.conf +%config(noreplace) %{_pam_secconfdir}/chroot.conf +%config(noreplace) %{_pam_secconfdir}/faillock.conf +%config(noreplace) %{_pam_secconfdir}/group.conf +%config(noreplace) %{_pam_secconfdir}/limits.conf +%dir %{_pam_secconfdir}/limits.d +%config(noreplace) %{_pam_secconfdir}/namespace.conf +%dir %{_pam_secconfdir}/namespace.d +%attr(755,root,root) %config(noreplace) %{_pam_secconfdir}/namespace.init +%config(noreplace) %{_pam_secconfdir}/pam_env.conf +%config(noreplace) %{_pam_secconfdir}/pwhistory.conf +%config(noreplace) %{_pam_secconfdir}/time.conf +%config(noreplace) %{_pam_secconfdir}/opasswd +%config(noreplace) %{_pam_secconfdir}/sepermit.conf %dir /var/run/sepermit -%endif %dir /var/run/faillock -%dir %{_sysconfdir}/motd.d -%dir /run/motd.d -%dir /usr/lib/motd.d %{_prefix}/lib/tmpfiles.d/pam.conf %{_mandir}/man5/* %{_mandir}/man8/* %files devel +%dir %{_pkgdocdir} +%doc %{_pkgdocdir}/rfc86.0.txt %{_includedir}/security %{_mandir}/man3/* %{_libdir}/libpam.so %{_libdir}/libpamc.so %{_libdir}/libpam_misc.so -%doc doc/mwg/*.txt doc/mwg/html -%doc doc/adg/*.txt doc/adg/html -%doc doc/specs/rfc86.0.txt +%{_libdir}/pkgconfig/pam.pc +%{_libdir}/pkgconfig/pam_misc.pc +%{_libdir}/pkgconfig/pamc.pc + +%files doc +%doc %{_pkgdocdir} + +%files libs +%license Copyright +%license gpl-2.0.txt +%{_pam_libdir}/libpam.so.%{so_ver}* +%{_pam_libdir}/libpamc.so.%{so_ver}* +%{_pam_libdir}/libpam_misc.so.%{so_ver}* %changelog -* Mon Nov 25 2024 Iker Pedrosa - 1.3.1-36 +* Thu Nov 21 2024 Iker Pedrosa - 1.6.1-7 - pam_access: rework resolving of tokens as hostname. - Resolves: CVE-2024-10963 and RHEL-66242 + Resolves: CVE-2024-10963 and RHEL-66241 -* Mon Nov 4 2024 Iker Pedrosa - 1.3.1-35 -- pam_unix: always run the helper to obtain shadow password file entries. - CVE-2024-10041. Resolves: RHEL-62877 +* Mon Nov 4 2024 Iker Pedrosa - 1.6.1-6 - pam_access: always match local address and clarify LOCAL keyword behaviour. - Resolves: RHEL-23018 -- libpam: support long lines in service files. Resolves: RHEL-5051 + Resolves: RHEL-65223 -* Thu Apr 4 2024 Iker Pedrosa - 1.3.1-34 -- fix formatting of audit messages. Resolves: RHEL-28620 +* Tue Oct 29 2024 Troy Dawson +- Bump release for October 2024 mass rebuild: + Resolves: RHEL-64018 -* Mon Feb 12 2024 Iker Pedrosa - 1.3.1-33 -- pam_namespace: protect_dir(): use O_DIRECTORY to prevent local DoS - situations. CVE-2024-22365. Resolves: RHEL-21242 +* Fri Aug 30 2024 Iker Pedrosa - 1.6.1-4 +- spec: Use Requires(meta): authselect. Resolves: RHEL-56703 -* Fri Jan 26 2024 Iker Pedrosa - 1.3.1-32 -- pam_access: handle hostnames in access.conf. Resolves: RHEL-3374 +* Mon Jun 24 2024 Troy Dawson +- Bump release for June 2024 mass rebuild -* Mon Jan 8 2024 Iker Pedrosa - 1.3.1-31 -- pam_faillock: create tallydir before creating tallyfile. Resolves: RHEL-19810 +* Tue Jun 18 2024 Iker Pedrosa - 1.6.1-2 +- Fix static analyzer detected issues. Resolves: RHEL-36475 +- pam_env: fixes for NULL environment variables -* Thu Nov 2 2023 Iker Pedrosa - 1.3.1-30 -- pam_unix: enable bcrypt. Resolves: RHEL-5057 +* Wed Apr 10 2024 Iker Pedrosa - 1.6.1-1 +- Rebase to release 1.6.1 +- Disable nis support -* Mon Jun 26 2023 Iker Pedrosa - 1.3.1-27 -- pam_misc: make length of misc_conv() configurable and set to 4096. Resolves: #2209785 +* Thu Feb 15 2024 Iker Pedrosa - 1.6.0-2 +- pam_unix: do not warn if password aging is disabled (#2263689) -* Tue May 16 2023 Iker Pedrosa - 1.3.1-26 -- smartcard-auth: modify the content to remove unnecessary modules. Resolves: #1983683 +* Tue Jan 23 2024 Iker Pedrosa - 1.6.0-1 +- Rebase to release 1.6.0 + Resolves: #2258964 -* Tue Nov 29 2022 Iker Pedrosa - 1.3.1-25 -- pam_motd: avoid unnecessary logging. Resolves: #2091062 -- pam_lastlog: check localtime_r() return value. Resolves: #2012871 -- pam_faillock: clarify missing user faillock files after reboot. Resolves: #2062512 -- pam_faillock: avoid logging an erroneous consecutive login failure message. Resolves: #2082442 +* Sun Jan 21 2024 Fedora Release Engineering +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild -* Thu Sep 29 2022 Iker Pedrosa - 1.3.1-24 -- pam_pwhistory: load configuration from file. Resolves: #2068461 +* Mon Dec 18 2023 Ding-Yi Chen - 1.5.3-9 +- pam.conf: Remove tallylog (#2253817) -* Wed Jul 13 2022 Iker Pedrosa - 1.3.1-22 -- Regenerate the /run/motd.d at each boot. Resolves: #2104878 +* Tue Nov 21 2023 Iker Pedrosa - 1.5.3-8 +- Suggest libdb-convert-util (#2245149 and #1788543) -* Thu Jun 23 2022 Iker Pedrosa - 1.3.1-21 -- pam_usertype: only use SYS_UID_MAX for system users. Resolves: #1949137 +* Tue Nov 7 2023 Iker Pedrosa - 1.5.3-7 +- Include openssl-devel build dependency -* Thu May 26 2022 Iker Pedrosa - 1.3.1-20 -- faillock: load configuration from file. Resolves: #1978029 +* Fri Nov 3 2023 Iker Pedrosa - 1.5.3-6 +- Drop explicit dependencies (#2247250) -* Mon May 23 2022 Iker Pedrosa - 1.3.1-19 -- Add the motd.d directories (empty) to silence warnings and to - provide proper ownership for them. Resolves: #2014458 +* Mon Oct 30 2023 Iker Pedrosa - 1.5.3-5 +- Explicitly state package dependencies and reorganize them -* Thu May 19 2022 Iker Pedrosa - 1.3.1-18 -- pam_motd: fix memory leak. Resolves: #2014458 +* Mon Oct 23 2023 Iker Pedrosa - 1.5.2-4 +- Switch pam_userdb from BerkeleyDB to GDBM (#2245149 and #1788543) -* Tue May 17 2022 Iker Pedrosa - 1.3.1-17 -- pam_keyinit: thread-safe implementation. Resolves: #1997969 -- pam_motd: support multiple motd paths specified, with filename overrides. Resolves: #2014458 +* Thu Oct 19 2023 Iker Pedrosa - 1.5.3-3 +- pam_pwhistory: fix passing NULL filename argument to pwhistory helper -* Fri Jan 28 2022 Iker Pedrosa - 1.3.1-16 -- pam_limits: "Unlimited" is not a valid value for RLIMIT_NOFILE. Resolves: #2047655 +* Thu Jul 20 2023 Fedora Release Engineering +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild -* Mon May 3 2021 Iker Pedrosa 1.3.1-15 -- pam_userdb: Prevent garbage characters from db (#1791965) +* Fri May 19 2023 Björn Esser - 1.5.3-1 +- Rebase to release 1.5.3 + Resolves: #2196709 +- Drop pam-1.5.2-pwhistory-config.patch and pam-1.5.2-configure-c99.patch, + as those patches are implemented upstream +- Realign left-over patches +- Update build requirements for documentation (docbook5) +- Remove --enable-vendordir from configuration +- Enable (deprecated) pam_lastlog module -* Thu Nov 5 2020 Iker Pedrosa 1.3.1-14 -- Revert 1.3.1-12 +* Tue Apr 25 2023 Björn Esser - 1.5.2-19 +- Replace deprecated '%%patchN' with '%%patch -P N' -* Fri Oct 30 2020 Iker Pedrosa 1.3.1-13 -- pam_wheel: if getlogin fails fallback to PAM_RUSER: fixed malformed patch (#1866866) -- pam_namespace: polyinstantiation refer to gdm doc (#1861841) +* Tue Apr 25 2023 Arjun Shankar - 1.5.2-18 +- Port configure script to C99 -* Thu Jul 16 2020 Peter Robinson - 1.3.1-12 -- Add the motd.d directories (empty) to silence warnings and to - provide proper ownership for them (#1847501) +* Thu Feb 9 2023 Iker Pedrosa - 1.5.2-17 +- Remove pam_console (#2166692) +- Rebase to pam-redhat-1.2.0 -* Fri May 15 2020 Iker Pedrosa 1.3.1-11 -- pam_usertype: fixed malformed patch +* Thu Jan 19 2023 Fedora Release Engineering +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild -* Tue Apr 21 2020 Iker Pedrosa 1.3.1-10 +* Mon Dec 19 2022 Iker Pedrosa - 1.5.2-15 +- SPDX license migration + +* Fri Jul 22 2022 Fedora Release Engineering +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Mon Jul 18 2022 Iker Pedrosa - 1.5.2-13 +- pam_pwhistory: load config from file + +* Sun Feb 27 2022 Zbigniew Jędrzejewski-Szmek - 1.5.2-12 +- Add Conflicts for pam version before the split + +* Thu Feb 17 2022 Björn Esser - 1.5.2-11 +- Split shared libraries into pam-libs package (#2055572) + +* Thu Jan 20 2022 Fedora Release Engineering +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Mon Jan 10 2022 Ondrej Mosnacek - 1.5.2-9 +- Remove conflicting ownership of motd.d directories + +* Tue Nov 16 2021 Pavel Březina - 1.5.2-8 +- systemd-auth, smartcard-auth, fingerprint-auth, password-auth and postlogin are now owned by authselect (#2023738) + +* Fri Nov 12 2021 Björn Esser - 1.5.2-7 +- Rebuild(libnsl2) + +* Wed Oct 06 2021 Björn Esser - 1.5.2-6 +- Remove old cruft from spec file +- Rename docs sub-package to doc +- Replace $RPM_BUILD_ROOT with %%{buildroot} +- Move documentation to %%{_pkgdocdir} +- Constantly use spaces for indentation + +* Thu Sep 23 2021 Björn Esser - 1.5.2-5 +- Rebase to pam-redhat-1.1.5 +- Drop explicit dependency on openssl, as auto-deps will pull it in +- Conditionalize BR: openssl >= 3.0.0 to supported distributions + +* Thu Sep 23 2021 Iker Pedrosa - 1.5.2-4 +- Remove the /etc/motd.d directory to exclude its ownership from pam (#1968131) +- pam_timestamp: enable openssl hmac authentication on supported + distributions (Fedora >= 36 and RHEL >= 9) (#1947294) +- Clean spec file: organize dependencies and move URL location + +* Thu Sep 23 2021 Björn Esser - 1.5.2-3 +- Update patch for parallel build + +* Wed Sep 22 2021 Björn Esser - 1.5.2-2 +- Add a patch to fix parallel builds with autgenerated sources + +* Sat Sep 04 2021 Björn Esser - 1.5.2-1 +- Rebase to release 1.5.2 + Resolves: #2001208 +- Add so_ver macro to avoid accidental soname bumps +- Add a patch to fix a missing header include in pam_console + +* Thu Jul 22 2021 Iker Pedrosa - 1.5.1-9 +- Add macros file to allow other packages to stop hardcoding directory names + +* Fri Jul 9 2021 Iker Pedrosa - 1.5.1-8 +- Fix issues detected by covscan tool + +* Thu Jun 10 2021 Björn Esser - 1.5.1-7 +- Change the default password hash method to yescrypt + +* Thu Jun 10 2021 Björn Esser - 1.5.1-6 +- Add a patch to not use crypt_checksalt for password expiration + Resolves: #1965345, #1967150 + +* Fri Apr 16 2021 Benjamin Berg - 1.5.1-5 +- Add script to avoid fingerprint-auth issues for long term Fedora users + Resolves: #1942443 + +* Mon Apr 12 2021 Iker Pedrosa - 1.5.1-4 +- Change fingerprint-auth.pamd to return PAM_AUTHINFO_UNAVAIL from pam_fprintd.so +- Clean auto-generated message from pam stack files + +* Tue Jan 26 2021 Fedora Release Engineering - 1.5.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Mon Nov 30 2020 Iker Pedrosa - 1.5.1-2 +- Add BuildRequires: make (#1902520) + +* Thu Nov 26 2020 Iker Pedrosa - 1.5.1-1 +- Rebase to release 1.5.1 +- fix CVE-2020-27780: authentication bypass when the user doesn't exist + and root password is blank (#1901173) + +* Wed Nov 11 2020 Iker Pedrosa - 1.5.0-1 +- Rebase to release 1.5.0 +- Rebase to pam-redhat-1.1.4 +- Remove pam_cracklib, pam_tally and pam_tally2 +- spec file cleanup + +* Fri Nov 6 2020 Iker Pedrosa - 1.4.0-7 +- libpam: fix memory leak in pam_start (#1894630) + +* Mon Oct 19 2020 Iker Pedrosa - 1.4.0-6 +- pam_unix: fix missing initialization of daysleft (#1887077) +- pam_motd: change privilege message prompt to default (#1861640) + +* Wed Oct 14 2020 Iker Pedrosa - 1.4.0-5 +- pam_motd: read motd files with target user credentials skipping unreadable ones (#1861640) +- Clarify upstreamed patches + +* Tue Aug 04 2020 Tom Stellard - 1.4.0-4 +- Add BuildRequires: gcc +- https://docs.fedoraproject.org/en-US/packaging-guidelines/C_and_C++/#_packaging + +* Tue Jul 28 2020 Fedora Release Engineering - 1.4.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Thu Jul 2 2020 Iker Pedrosa - 1.4.0-2 +- Enable layered configuration with distribution configs in /usr/share/pam.d +- Added new pam-redhat tarball to lookaside cache + +* Wed Jun 24 2020 Iker Pedrosa - 1.4.0-1 +- Rebased to release 1.4.0 +- Rebased to pam-redhat-1.1.3 +- Removed pam_cracklib as it has been deprecated + +* Mon Jun 22 2020 Iker Pedrosa - 1.3.1-28 +- pam_faillock: change /run/faillock/$USER permissions to 0660 (#1661822) + +* Wed Jun 17 2020 Iker Pedrosa - 1.3.1-27 +- pam_unix and pam_usertype: avoid determining if user exists (#1629598) + +* Thu May 14 2020 Iker Pedrosa 1.3.1-26 +- pam_tty_audit: if kernel audit is disabled return PAM_IGNORE (#1775357) - pam_modutil_sanitize_helper_fds: fix SIGPIPE effect of PAM_MODUTIL_PIPE_FD (#1791970) -* Fri Apr 17 2020 Iker Pedrosa 1.3.1-9 -- pam_usertype: new module to tell if uid is in login.defs ranges (#1810474) -- pam_tty_audit: if kernel audit is disabled return PAM_IGNORE (#1775357) +* Thu Apr 23 2020 Iker Pedrosa - 1.3.1-25 +- docs: splitted documentation in subpackage -docs -* Thu Dec 19 2019 Tomáš Mráz 1.3.1-8 -- pam_motd: Document how to properly silence unwanted motd messages +* Mon Mar 9 2020 Iker Pedrosa - 1.3.1-24 +- pam_selinux: check unknown object classes or permissions in current policy -* Mon Dec 16 2019 Tomáš Mráz 1.3.1-6 +* Tue Feb 4 2020 Pavel Březina - 1.3.1-23 +- Add pam_usertype.so + +* Wed Jan 29 2020 Fedora Release Engineering - 1.3.1-22 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Wed Dec 18 2019 Tomáš Mráz 1.3.1-21 - pam_faillock: Fix regression in admin_group support -* Wed Oct 16 2019 Tomáš Mráz 1.3.1-5 -- pam_faillock: Support configuration file /etc/security/faillock.conf -- pam_faillock: Support local_users_only option +* Wed Oct 16 2019 Tomáš Mráz 1.3.1-20 - pam_namespace: Support noexec, nosuid and nodev flags for tmpfs mounts -- Drop tallylog and pam_tally[2] documentation +- Drop tallylog and pam_tally documentation +- pam_faillock: Support local_users_only option - pam_lastlog: Do not display failed attempts with PAM_SILENT flag - pam_lastlog: Support unlimited option to override fsize limit - pam_unix: Log if user authenticated without password @@ -606,13 +609,70 @@ done - Optimize closing fds when spawning helpers - Fix duplicate password verification in pam_authtok_verify() -* Fri Dec 7 2018 Tomáš Mráz 1.3.1-4 -- Drop pam_tally2 which was obsoleted and deprecated long time ago +* Mon Sep 9 2019 Tomáš Mráz 1.3.1-19 +- pam_faillock: Support configuration file /etc/security/faillock.conf -* Mon Sep 10 2018 Tomáš Mráz 1.3.1-3 +* Thu Jul 25 2019 Fedora Release Engineering - 1.3.1-18 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Fri Feb 01 2019 Fedora Release Engineering - 1.3.1-17 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Mon Jan 14 2019 Björn Esser - 1.3.1-16 +- Rebuilt for libcrypt.so.2 (#1666033) + +* Thu Dec 20 2018 Tomáš Mráz 1.3.1-15 +- Add the motd.d directories (empty) to silence warnings and to + provide proper ownership for them (#1660935) + +* Tue Dec 4 2018 Tomáš Mráz 1.3.1-14 +- Update Red Hat PAM modules to version 1.0.0 which includes pam_faillock +- Drop also pam_tally2 which was obsoleted and deprecated long time ago + +* Sun Dec 02 2018 Björn Esser - 1.3.1-13 +- Backport upstream commit reporting disabled or invalid hashes to syslog +- Backport upstream commit fixing syslog for disabled or invalid hashes + +* Wed Nov 28 2018 Robert Fairley 1.3.1-12 +- Backport upstream commit pam_motd: Support multiple motd paths specified, with filename overrides (#69) +- Backport upstream commit pam_motd: Fix segmentation fault when no motd_dir specified (#76) + +* Mon Nov 26 2018 Tomáš Mráz 1.3.1-11 +- Completely drop the check of invalid or disabled salt via crypt_checksalt + +* Sun Nov 25 2018 Björn Esser - 1.3.1-10 +- Fix passphraseless sudo with crypt_checksalt (#1653023) + +* Fri Nov 23 2018 Björn Esser - 1.3.1-9 +- Backport upstream commit removing an obsolete prototype +- Backport upstream commit preferring bcrypt_b ($2b$) for blowfish +- Backport upstream commit preferring gensalt with autoentropy +- Backport upstream commit using crypt_checksalt for password aging +- Backport upstream commit adding support for (gost-)yescrypt +- Update the no-MD5-fallback patch for alignment + +* Fri Nov 16 2018 Björn Esser - 1.3.1-8 +- Use %%ldconfig_scriptlets +- Drop Requires(post), not needed anymore +- Prefer %%global over %%define + +* Tue Nov 13 2018 Björn Esser - 1.3.1-7 +- when building against libxcrypt >= 4.3.3-2, we can avoid the explicit + dependency on libxcrypt >= 4.3.3-1 + +* Mon Nov 12 2018 Björn Esser - 1.3.1-6 +- add explicit (Build)Requires for libxcrypt >= 4.3.3-1 + +* Mon Nov 12 2018 Björn Esser - 1.3.1-5 +- rebuilt against libxcrypt-4.3.3 to enable the use of crypt_gensalt_r + +* Mon Sep 10 2018 Tomáš Mráz 1.3.1-4 - add pam_umask to postlogin PAM configuration file - fix some issues found by Coverity scan +* Fri Jul 13 2018 Fedora Release Engineering - 1.3.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + * Fri Jun 8 2018 Tomáš Mráz 1.3.1-1 - use /run instead of /var/run in pamtmp.conf (#1588612) @@ -1323,12 +1383,12 @@ support) - pam_unix: always honor nis flag on password change (by Aaron Hope) * Wed Aug 24 2005 Tomas Mraz 0.80-7 -- don't fail in audit code when audit is not compiled in +- don't fail in audit code when audit is not compiled in on the newest kernels (#166422) * Mon Aug 01 2005 Tomas Mraz 0.80-6 - add option to pam_loginuid to require auditd - + * Fri Jul 29 2005 Tomas Mraz 0.80-5 - fix NULL dereference in pam_userdb (#164418) @@ -1463,17 +1523,17 @@ support) * Tue Oct 19 2004 Tomas Mraz 0.77-63 - Fix checking of group %%group syntax in pam_limits -- Drop fencepost patch as it was already fixed +- Drop fencepost patch as it was already fixed by upstream change from 0.75 to 0.77 - Fix brokenshadow patch * Mon Oct 11 2004 Tomas Mraz 0.77-62 - Added bluetooth, raw1394 and flash to console.perms -- pam_console manpage fix +- pam_console manpage fix * Mon Oct 11 2004 Tomas Mraz 0.77-61 - #129328 pam_env shouldn't abort on missing /etc/environment -- #126985 pam_stack should always copy the conversation function +- #126985 pam_stack should always copy the conversation function - #127524 add /etc/security/opasswd to files * Tue Sep 28 2004 Phil Knirsch 0.77-60 @@ -1490,7 +1550,7 @@ support) * Mon Sep 13 2004 Tomas Mraz 0.77-56 - #75454 fixed locking when changing password -- #127054 +- #127054 - #125653 removed unnecessary getgrouplist call - #124979 added quiet option to pam_succeed_if @@ -1501,7 +1561,7 @@ support) - Move pam_console.lock to /var/run/console/ * Thu Jul 29 2004 Dan Walsh 0.77-53 -- Close fd[1] before pam_modutilread so that unix_verify will complete +- Close fd[1] before pam_modutilread so that unix_verify will complete * Tue Jul 27 2004 Alan Cox 0.77-52 - First chunk of Steve Grubb's resource leak and other fixes @@ -1613,7 +1673,7 @@ support) - Cleanup unix_chkpwd * Mon Nov 03 2003 Dan Walsh 0.77-17.sel -- Fix tty handling +- Fix tty handling - Add back multiple handling * Mon Oct 27 2003 Dan Walsh 0.77-16.sel @@ -1635,7 +1695,7 @@ support) - Add Russell Coker patch to handle /dev/pty * Fri Oct 17 2003 Dan Walsh 0.77-13.sel -- Turn on Selinux +- Turn on Selinux * Fri Oct 17 2003 Dan Walsh 0.77-12 - Fix pam_timestamp to work when 0 seconds have elapsed @@ -1644,7 +1704,7 @@ support) - Turn off selinux * Thu Sep 25 2003 Dan Walsh 0.77-10.sel -- Turn on Selinux and remove multiple choice of context. +- Turn on Selinux and remove multiple choice of context. * Wed Sep 24 2003 Dan Walsh 0.77-10 - Turn off selinux @@ -1731,9 +1791,9 @@ support) - use $ISA in default configs * Fri Oct 04 2002 Elliot Lee 0.75-42 -- Since cracklib-dicts location will not be correctly detected without +- Since cracklib-dicts location will not be correctly detected without that package being installed, add buildreq for cracklib-dicts. -- Add patch57: makes configure use $LIBNAME when searching for cracklib +- Add patch57: makes configure use $LIBNAME when searching for cracklib dicts, and error out if not found. * Thu Sep 12 2002 Than Ngo 0.75-41.1 diff --git a/SOURCES/pamtmp.conf b/pamtmp.conf similarity index 75% rename from SOURCES/pamtmp.conf rename to pamtmp.conf index e4cfe2a..e94a860 100644 --- a/SOURCES/pamtmp.conf +++ b/pamtmp.conf @@ -1,4 +1,3 @@ d /run/console 0755 root root - d /run/faillock 0755 root root - d /run/sepermit 0755 root root - -d /run/motd.d 0755 root root - diff --git a/SOURCES/postlogin.5 b/postlogin.5 similarity index 100% rename from SOURCES/postlogin.5 rename to postlogin.5 diff --git a/sources b/sources new file mode 100644 index 0000000..b676524 --- /dev/null +++ b/sources @@ -0,0 +1,2 @@ +SHA512 (Linux-PAM-1.6.1.tar.xz) = ddb5a5f296f564b76925324550d29f15d342841a97815336789c7bb922a8663e831edeb54f3dcd1eaf297e3325c9e2e6c14b8740def5c43cf3f160a8a14fa2ea +SHA512 (pam-redhat-1.2.0.tar.xz) = f676a6c8df0cf3836018b1a67ded1d40937b88ff046e5c6b22bac46cb05e27970ef6a7ce224269e4c0d1ca9375c72e77880cf9114e936a7de9c423bf443d27ee diff --git a/SOURCES/system-auth.5 b/system-auth.5 similarity index 100% rename from SOURCES/system-auth.5 rename to system-auth.5