]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
subsystem: Prevent endless loop
authorSamanta Navarro <ferivoz@riseup.net>
Tue, 23 May 2023 11:53:53 +0000 (11:53 +0000)
committerSerge Hallyn <serge@hallyn.com>
Thu, 25 May 2023 13:25:42 +0000 (08:25 -0500)
If a user has home directory "/" and login shell "*" then login and su
enter an endless loop by constantly switching to the next subsystem.

This could also be achieved with a layered approach so just checking
for "/" as home directory is not enough to protect against such a
misconfiguration.

Just break the loop if it progressed too far. I doubt that this has
negative impact on any real setup.

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
libmisc/sub.c

index d30c4c76841b3eaaa7918f7a8a1c99ef974d3949..821596d134b65f38544be856b947f86e57728a29 100644 (file)
 #include <sys/types.h>
 #include "prototypes.h"
 #include "defines.h"
+#define        MAX_SUBROOT2    "maximum subsystem depth reached\n"
 #define        BAD_SUBROOT2    "invalid root `%s' for user `%s'\n"
 #define        NO_SUBROOT2     "no subsystem root `%s' for user `%s'\n"
+#define        MAX_DEPTH       1024
 /*
  * subsystem - change to subsystem root
  *
  */
 void subsystem (const struct passwd *pw)
 {
+       static int depth = 0;
+
+       /*
+        * Prevent endless loop on misconfigured systems.
+        */
+       if (++depth > MAX_DEPTH) {
+               printf (_("Maximum subsystem depth reached\n"));
+               SYSLOG ((LOG_WARN, MAX_SUBROOT2));
+               closelog ();
+               exit (EXIT_FAILURE);
+       }
+
        /*
         * The new root directory must begin with a "/" character.
         */