diff options
Diffstat (limited to 'www/apache13-fp/files/patch-fe')
-rw-r--r-- | www/apache13-fp/files/patch-fe | 312 |
1 files changed, 167 insertions, 145 deletions
diff --git a/www/apache13-fp/files/patch-fe b/www/apache13-fp/files/patch-fe index 03fc4063b108..37fc9d5550fc 100644 --- a/www/apache13-fp/files/patch-fe +++ b/www/apache13-fp/files/patch-fe @@ -1,146 +1,168 @@ -*** src/support/suexec.c.orig Tue Apr 21 15:14:06 1998 ---- src/support/suexec.c Fri May 22 17:59:43 1998 -*************** -*** 70,75 **** ---- 70,98 ---- - * - * - */ +--- src/support/suexec.c.orig Mon Jun 21 19:51:41 1999 ++++ src/support/suexec.c Thu Sep 9 18:58:04 1999 +@@ -70,11 +70,35 @@ + * + * + */ ++/* ++ * "System" CGI modification 97.05.10 by Rick Franchuk (rickf@netnation.com) ++ * ++ * I found that while it's great to make scripts run under the UID and GID ++ * specified in httpd.conf or what /etc/passwd says is 'cool', suEXEC can ++ * really put a damper on 'System' cgi's, forcing copies of the scripts ++ * to be installed into users' home directories. That didn't seem very ++ * fitting... so I changed it so that the target UID check is disabled in ++ * a system directory #defined in suexec+.h. I hope you all find it useful. ++ * ++ * The docroot check had to be bypassed to allow functionality for VirtualHost ++ * entries. I'm somewhat suprised noone encountered that behavior before. ++ */ + /* -+ * "System" CGI modification 97.05.10 by Rick Franchuk (rickf@netnation.com) -+ * -+ * I found that while it's great to make scripts run under the UID and GID -+ * specified in httpd.conf or what /etc/passwd says is 'cool', suEXEC can -+ * really put a damper on 'System' cgi's, forcing copies of the scripts -+ * to be installed into users' home directories. That didn't seem very -+ * fitting... so I changed it so that the target UID check is disabled in -+ * a system directory #defined in suexec+.h. I hope you all find it useful. -+ * -+ * The docroot check had to be bypassed to allow functionality for VirtualHost -+ * entries. I'm somewhat suprised noone encountered that behavior before. -+ */ -+ /* -+ * "FPEXE modification made on 98.05.19 by Scot Hetzel (hetzels@westbend.net) -+ * based on previous FPEXE modifications supplied by Mark Wormgoor -+ * (riddles@ipe.nl) -+ * -+ * Changes were made in order to use Suexec and Frontpage 98 at the same time. -+ * After we change to the target_uid and target_gid. We check if cmd = FPEXE, -+ * if it does then we execute the cmd without performing any further tests. -+ * -+ */ - - #include "conf.h" - #include <sys/param.h> -*************** -*** 393,398 **** ---- 416,429 ---- - } - - /* -+ * We logged everything, changed to the target uid/gid, and know the -+ * user is ok. We run fpexe now and bail out before anything goes wrong. -+ */ -+ #ifdef FPEXE -+ if ((strcmp(cmd, FPEXE)) != NULL) { -+ #endif -+ -+ /* - * Get the current working directory, as well as the proper - * document root (dependant upon whether or not it is a - * ~userdir request). Error out if we cannot get either one, -*************** -*** 423,432 **** ---- 454,468 ---- - } - } - -+ /* -+ * This section must be commented out to work properly with -+ * VirtualHosts running CGI in thier own directories. -+ * - if ((strncmp(cwd, dwd, strlen(dwd))) != 0) { - log_err("command not in docroot (%s/%s)\n", cwd, cmd); - exit(114); - } -+ */ - - /* - * Stat the cwd and verify it is a directory, or error out. -*************** -*** 472,477 **** ---- 508,516 ---- - * Error out if the target name/group is different from - * the name/group of the cwd or the program. - */ -+ #ifdef SYSTEM_CGI -+ if (strncmp(cwd, SYSTEM_CGI, strlen(SYSTEM_CGI))) { -+ #endif - if ((uid != dir_info.st_uid) || - (gid != dir_info.st_gid) || - (uid != prg_info.st_uid) || -*************** -*** 482,487 **** ---- 521,530 ---- - prg_info.st_uid, prg_info.st_gid); - exit(120); - } -+ #ifdef SYSTEM_CGI -+ } -+ #endif -+ - /* - * Error out if the program is not executable for the user. - * Otherwise, she won't find any error in the logs except for -*************** -*** 493,498 **** ---- 536,584 ---- - } - - clean_env(); -+ -+ #ifdef FPEXE -+ } -+ else { -+ -+ /* The following taken from mod_frontpage.c to check permissions */ -+ -+ /* -+ * We can't stat the stub dir. Make sure the stub directory is not -+ * owned by root and not group/world writable -+ */ -+ if ((lstat(FPSTUBDIR, &dir_info) == -1 || -+ dir_info.st_uid || -+ (dir_info.st_mode & (S_IWGRP | S_IWOTH)) || -+ (!S_ISDIR(dir_info.st_mode)))) { -+ /* -+ * User recovery: set directory to be owned by by root with -+ * permissions r*x*-x*-x. -+ */ -+ log_err("Incorrect permissions on stub directory \"%-.1024s\"", -+ FPSTUBDIR); -+ exit (250); -+ } -+ -+ /* -+ * We can't stat the stub. Make sure the stub is not owned by root, -+ * set-uid, set-gid, and is not group/world writable or executable. -+ */ -+ if ((stat(cmd, &prg_info) == -1 || -+ prg_info.st_uid || -+ !(prg_info.st_mode & S_ISUID) || -+ (prg_info.st_mode & S_ISGID) || -+ (prg_info.st_mode & (S_IWGRP | S_IWOTH)) || -+ !(prg_info.st_mode & (S_IXGRP | S_IXOTH)))) { -+ /* -+ * User recovery: set stub to be owned by by root with permissions -+ * r*s*-x*-x. -+ */ -+ log_err("Incorrect permissions on stub \"%-.1024s\"", cmd); -+ exit (251); -+ } -+ } -+ #endif - - /* - * Be sure to close the log file so the CGI can't ++ * "FPEXE modification made on 98.05.19 by Scot Hetzel (hetzels@westbend.net) ++ * based on previous FPEXE modifications supplied by Mark Wormgoor ++ * (riddles@ipe.nl) ++ * ++ * Changes were made in order to use Suexec and Frontpage 98 at the same time. ++ * After we change to the target_uid and target_gid. We check if cmd = FPEXE, ++ * if it does then we execute the cmd without performing any further tests. ++ * ++ */ + + #include "ap_config.h" + #include <sys/param.h> + #include <sys/stat.h> + #include <sys/types.h> ++#include <login_cab.h> + + #include <stdarg.h> + +@@ -250,6 +274,7 @@ + char *cmd; /* command to be executed */ + char cwd[AP_MAXPATH]; /* current working directory */ + char dwd[AP_MAXPATH]; /* docroot working directory */ ++ login_cap_t *lc; /* user resource limits */ + struct passwd *pw; /* password entry holder */ + struct group *gr; /* group entry holder */ + struct stat dir_info; /* directory info holder */ +@@ -404,6 +429,19 @@ + } + + /* ++ * Apply user resource limits based on login class. ++ */ ++ if ((lc = login_getclassbyname(pw->pw_class, pw)) == NULL) { ++ log_err("login_getclassbyname() failed\n"); ++ exit(248); ++ } ++ ++ if ((setusercontext(lc, pw, uid, LOGIN_SETRESOURCES)) != 0) { ++ log_err("setusercontext() failed\n"); ++ exit(249); ++ } ++ ++ /* + * Change UID/GID here so that the following tests work over NFS. + * + * Initialize the group access list for the target user, +@@ -423,6 +461,14 @@ + } + + /* ++ * We logged everything, changed to the target uid/gid, and know the ++ * user is ok. We run fpexe now and bail out before anything goes wrong. ++ */ ++#ifdef FPEXE ++ if ((strcmp(cmd, FPEXE)) != NULL) { ++#endif ++ ++ /* + * Get the current working directory, as well as the proper + * document root (dependant upon whether or not it is a + * ~userdir request). Error out if we cannot get either one, +@@ -453,10 +499,15 @@ + } + } + ++ /* ++ * This section must be commented out to work properly with ++ * VirtualHosts running CGI in thier own directories. ++ * + if ((strncmp(cwd, dwd, strlen(dwd))) != 0) { + log_err("command not in docroot (%s/%s)\n", cwd, cmd); + exit(114); + } ++ */ + + /* + * Stat the cwd and verify it is a directory, or error out. +@@ -502,6 +553,9 @@ + * Error out if the target name/group is different from + * the name/group of the cwd or the program. + */ ++#ifdef SYSTEM_CGI ++ if (strncmp(cwd, SYSTEM_CGI, strlen(SYSTEM_CGI))) { ++#endif + if ((uid != dir_info.st_uid) || + (gid != dir_info.st_gid) || + (uid != prg_info.st_uid) || +@@ -513,6 +567,10 @@ + prg_info.st_uid, prg_info.st_gid); + exit(120); + } ++#ifdef SYSTEM_CGI ++ } ++#endif ++ + /* + * Error out if the program is not executable for the user. + * Otherwise, she won't find any error in the logs except for +@@ -524,6 +582,49 @@ + } + + clean_env(); ++ ++#ifdef FPEXE ++ } ++ else { ++ ++ /* The following taken from mod_frontpage.c to check permissions */ ++ ++ /* ++ * We can't stat the stub dir. Make sure the stub directory is not ++ * owned by root and not group/world writable ++ */ ++ if ((lstat(FPSTUBDIR, &dir_info) == -1 || ++ dir_info.st_uid || ++ (dir_info.st_mode & (S_IWGRP | S_IWOTH)) || ++ (!S_ISDIR(dir_info.st_mode)))) { ++ /* ++ * User recovery: set directory to be owned by by root with ++ * permissions r*x*-x*-x. ++ */ ++ log_err("Incorrect permissions on stub directory \"%-.1024s\"", ++ FPSTUBDIR); ++ exit (250); ++ } ++ ++ /* ++ * We can't stat the stub. Make sure the stub is not owned by root, ++ * set-uid, set-gid, and is not group/world writable or executable. ++ */ ++ if ((stat(cmd, &prg_info) == -1 || ++ prg_info.st_uid || ++ !(prg_info.st_mode & S_ISUID) || ++ (prg_info.st_mode & S_ISGID) || ++ (prg_info.st_mode & (S_IWGRP | S_IWOTH)) || ++ !(prg_info.st_mode & (S_IXGRP | S_IXOTH)))) { ++ /* ++ * User recovery: set stub to be owned by by root with permissions ++ * r*s*-x*-x. ++ */ ++ log_err("Incorrect permissions on stub \"%-.1024s\"", cmd); ++ exit (251); ++ } ++ } ++#endif + + /* + * Be sure to close the log file so the CGI can't |