Bug fixes and new features.

- Made the CHECK_GID feature optional (by compile-time configuration).
- The supplementary group access list is now set, if the target user has a pwent.
- Target users can be required to have a pwent (by compile-time configuration).
- Child exit statuses are now correctly propagated to the parent.
- Updated the README.
- Bumped version number to 0.5.
This commit is contained in:
Sune Foldager 2008-07-07 22:15:59 +02:00
parent d2ea4e1057
commit 6f3ffa2ea8
3 changed files with 40 additions and 8 deletions

5
README
View File

@ -70,6 +70,11 @@ DEFAULT_UID The default (numeric) UID to become, if no UID is given vi
DEFAULT_GID The same as DEFAULT_UID, but for the GID. The same reasons and DEFAULT_GID The same as DEFAULT_UID, but for the GID. The same reasons and
restrictions apply. restrictions apply.
REQUIRE_PWENT If set, target users are reuired to have passwd-entries. These are
used to set the supplementary group access list. Defaults to 0.
ALLOW_CHECKGID If set, enabled the CHECK_GID feature, q.v. Defaults to 1.
The following configuration parameters shouldn't normally be changed. In case you have a The following configuration parameters shouldn't normally be changed. In case you have a
clash with some other ENV arguments to the target program, they can be changed, however. clash with some other ENV arguments to the target program, they can be changed, however.

View File

@ -2,7 +2,7 @@
Superuser-exec wrapper for HTTP serves and other needs (made especially for lighttpd). Superuser-exec wrapper for HTTP serves and other needs (made especially for lighttpd).
Allows programs to be run with configurable uid/gid. Allows programs to be run with configurable uid/gid.
Version 0.4 (2006-06-09) Version 0.5 (2008-07-07)
For documentation on how to configure the wrapper, see the README. For documentation on how to configure the wrapper, see the README.
Command line option -v displays version, while -V displays compile-time configuration. Command line option -v displays version, while -V displays compile-time configuration.
@ -12,6 +12,11 @@ Brief version history:
Vers Date Changes Vers Date Changes
----------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------
0.5 2008-07-07 Added proper handling of the supplementary group access list. Fixed a
bug with passing on return values from the child process. Added
compile-time configuration options to disable the CHECK_GID feature and
to require the target user to have a pwent (in /etc/passwd).
Thanks to stbuehler, hoffie and _lotek from #lighttpd for help.
0.4 2006-06-09 Added a BSD license. 0.4 2006-06-09 Added a BSD license.
0.3 2005-09-27 Changed the wrapper to stay resident and propagate SIGTERM to the 0.3 2005-09-27 Changed the wrapper to stay resident and propagate SIGTERM to the
target. Not doing so will prevent the server from managing the target. target. Not doing so will prevent the server from managing the target.
@ -26,7 +31,7 @@ Vers Date Changes
License: License:
Copyright (c) 2006, Sune Foldager Copyright (c) 2008, Sune Foldager
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are Redistribution and use in source and binary forms, with or without modification, are
@ -76,6 +81,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define RC_WRONG_GROUP 22 #define RC_WRONG_GROUP 22
#define RC_EXEC 23 #define RC_EXEC 23
#define RC_BAD_OPTION 24 #define RC_BAD_OPTION 24
#define RC_CHILD_ABNORMAL_EXIT 25
#define RC_MISSING_PWENT 26
/* User configuration. */ /* User configuration. */
#include "execwrap_config.h" #include "execwrap_config.h"
@ -95,7 +103,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endif #endif
/* Useful macro and other stuff. */ /* Useful macro and other stuff. */
#define VERSION_STRING "ExecWrap v0.3 by Sune Foldager." #define VERSION_STRING "ExecWrap v0.5 Copyright (c) 2008, Sune Foldager."
#define STRLEN(a) (sizeof(a)-1) #define STRLEN(a) (sizeof(a)-1)
/* Shortcuts. */ /* Shortcuts. */
@ -111,8 +119,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h> #include <unistd.h>
#include <signal.h> #include <signal.h>
#include <pwd.h>
/* The global child PID and previous SIGTERM handler. */ /* The global child PID and previous SIGTERM handler. */
@ -155,6 +165,9 @@ int main(int argc, char* argv[], char* envp[])
printf("TARGET_PATH_PREFIX : %s\n", TARGET_PATH_PREFIX); printf("TARGET_PATH_PREFIX : %s\n", TARGET_PATH_PREFIX);
printf("DEFAULT_UID : %d\n", DEFAULT_UID); printf("DEFAULT_UID : %d\n", DEFAULT_UID);
printf("DEFAULT_GID : %d\n", DEFAULT_GID); printf("DEFAULT_GID : %d\n", DEFAULT_GID);
puts("");
printf("REQUIRE_PWENT : %d\n", REQUIRE_PWENT);
printf("ALLOW_CHECKGID : %d\n", ALLOW_CHECKGID);
return 0; return 0;
} }
@ -198,10 +211,12 @@ int main(int argc, char* argv[], char* envp[])
} }
/* Check GID instead of UID. */ /* Check GID instead of UID. */
#if ALLOW_CHECKGID
if(!strncmp(ENV_CHECK_GID, s, ENV_CHECK_GID_LEN)) if(!strncmp(ENV_CHECK_GID, s, ENV_CHECK_GID_LEN))
{ {
check_gid = 1; check_gid = 1;
} }
#endif
/* Use non-resident wrapping style. */ /* Use non-resident wrapping style. */
if(!strncmp(ENV_NON_RESIDENT, s, ENV_NON_RESIDENT_LEN)) if(!strncmp(ENV_NON_RESIDENT, s, ENV_NON_RESIDENT_LEN))
@ -214,6 +229,12 @@ int main(int argc, char* argv[], char* envp[])
/* See if we got all we need. */ /* See if we got all we need. */
if(!target) return RC_MISSING_CONFIG; if(!target) return RC_MISSING_CONFIG;
/* Fetch user information from passwd. */
struct passwd *pwent = getpwuid(uid);
#if REQUIRE_PWENT
if(!pwent) return RC_MISSING_PWENT;
#endif
/* Install the SIGTERM handler. */ /* Install the SIGTERM handler. */
if(!non_resident) if(!non_resident)
{ {
@ -225,7 +246,8 @@ int main(int argc, char* argv[], char* envp[])
if(non_resident || !(pid = fork())) if(non_resident || !(pid = fork()))
{ {
/* We're in the child. Drop privileges. */ /* We're in the child. Drop privileges and set the group list. */
if(pwent && initgroups(pwent->pw_name, gid)) return RC_SETGID;
if(setgid(gid)) return RC_SETGID; if(setgid(gid)) return RC_SETGID;
if(setuid(uid)) return RC_SETUID; if(setuid(uid)) return RC_SETUID;
@ -262,7 +284,6 @@ int main(int argc, char* argv[], char* envp[])
/* Here we're in the parent. Wait for the child to be done, and return. */ /* Here we're in the parent. Wait for the child to be done, and return. */
int status; int status;
wait(&status); wait(&status);
return status; if(WIFEXITED(status)) return WEXITSTATUS(status);
return RC_CHILD_ABNORMAL_EXIT;
} }

View File

@ -9,7 +9,7 @@ See the README for documentation.
/* Our parent must have this UID, or we will abort. */ /* Our parent must have this UID, or we will abort. */
#define PARENT_UID 104 #define PARENT_UID 106
/* Minimum UID we can switch to. */ /* Minimum UID we can switch to. */
#define TARGET_MIN_UID 1000 #define TARGET_MIN_UID 1000
@ -26,3 +26,9 @@ See the README for documentation.
/* Default GID to switch to, if none given. */ /* Default GID to switch to, if none given. */
#define DEFAULT_GID 65534 #define DEFAULT_GID 65534
/* Require users to have pwents (i.e. entries in /etc/passwd or similar)? */
#define REQUIRE_PWENT 0
/* Allow use of the CHECK_GID mode? */
#define ALLOW_CHECKGID 1