From 29d625a085497be8babec7d2adfb3eeaa7114736 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Wed, 22 Aug 2018 11:43:32 +0200 Subject: [PATCH 1/2] setpriv: add --reset-env Clear environment in way like su(1), but PATH is set to hard-coded defaults and /etc/login.defs is not used at all (I guess we want to keep setpriv(1) simple). If you need anything more advanced than use env(1). Addresses: https://github.com/karelzak/util-linux/issues/325 Signed-off-by: Karel Zak --- sys-utils/setpriv.1 | 9 +++++++ sys-utils/setpriv.c | 57 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/sys-utils/setpriv.1 b/sys-utils/setpriv.1 index f989bf33c..e915316a9 100644 --- a/sys-utils/setpriv.1 +++ b/sys-utils/setpriv.1 @@ -165,6 +165,15 @@ to abort if AppArmor is not in use, and the transition may be ignored or cause .BR execve (2) to fail at AppArmor's whim. .TP +.BI \-\-reset\-env +Clears all the environment variables except TERM; initializes the environment variables HOME, SHELL, USER, LOGNAME +according to the user's passwd entry; sets PATH to \fI/usr/local/bin:/bin:/usr/bin\fR for a regual user and to +\fI/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin\fR for root. +.sp +The environment variable PATH may be different on systems where /bin and /sbin +are merged into /usr. The environment variable SHELL defaults to \fI/bin/sh\fR if none is given in the user's +passwd entry. +.TP .BR \-V , " \-\-version" Display version information and exit. .TP diff --git a/sys-utils/setpriv.c b/sys-utils/setpriv.c index 0d3a3b3c9..402b1cf1a 100644 --- a/sys-utils/setpriv.c +++ b/sys-utils/setpriv.c @@ -39,6 +39,7 @@ #include "xalloc.h" #include "pathnames.h" #include "signames.h" +#include "env.h" #ifndef PR_SET_NO_NEW_PRIVS # define PR_SET_NO_NEW_PRIVS 38 @@ -56,6 +57,11 @@ #define SETPRIV_EXIT_PRIVERR 127 /* how we exit when we fail to set privs */ +/* The shell to set SHELL env.variable if none is given in the user's passwd entry. */ +#define DEFAULT_SHELL "/bin/sh" + +static gid_t get_group(const char *s, const char *err); + enum cap_type { CAP_TYPE_EFFECTIVE = CAPNG_EFFECTIVE, CAP_TYPE_PERMITTED = CAPNG_PERMITTED, @@ -83,6 +89,7 @@ struct privctx { keep_groups:1, /* keep groups */ clear_groups:1, /* remove groups */ init_groups:1, /* initialize groups */ + reset_env:1, /* reset environment */ have_securebits:1; /* remove groups */ /* uids and gids */ @@ -138,10 +145,13 @@ static void __attribute__((__noreturn__)) usage(void) fputs(_(" --init-groups initialize supplementary groups\n"), out); fputs(_(" --groups set supplementary groups\n"), out); fputs(_(" --securebits set securebits\n"), out); + fputs(_(" --reset-env reset environment variables\n"), out); fputs(_(" --pdeathsig keep|clear|\n" " set or clear parent death signal\n"), out); fputs(_(" --selinux-label