struct passwd* usr;
if (!myconfig)
+ {
myconfig = calloc(1, sizeof(struct dg_config));
+ myconfig->shed_uid = (uid_t)-1;
+ myconfig->shed_gid = (gid_t)-1;
+ }
switch ($1)
{
break;
case TYPE_SUSER:
+ if (!strcmp($3, "root"))
+ {
+ fprintf(stderr, "%s: I refuse to run as root! Aborting.\n", config);
+ graceful_exit(1);
+ }
myconfig->shed_user = strdup($3);
if ((usr = getpwnam($3)) != NULL)
- myconfig->shed_uid = usr->pw_uid;
+ {
+ if (usr->pw_uid != 0)
+ myconfig->shed_uid = usr->pw_uid;
+ else
+ {
+ fprintf(stderr, "%s: I refuse to run as %s (uid 0!) Aborting.\n", config, $3);
+ graceful_exit(1);
+ }
+ }
else
- fprintf(stderr, "%s: no such group '%s'\n", config, $3);
- break;
+ fprintf(stderr, "%s: no such user '%s'\n", config, $3);
+ break;
case TYPE_PATH_CHROOT:
if (myconfig->chroot) free(myconfig->chroot);
case TYPE_SUID:
if (!myconfig->shed_user)
{
+ /* Naive user protection - do not allow running as user root */
+ if ($3 == 0)
+ {
+ fprintf(stderr, "%s: I refuse to run as root! Aborting.\n", config);
+ graceful_exit(1);
+ }
myconfig->shed_uid = $3;
}
}
/* Fill the rest with defaults */
- if (!myconfig->shed_user && myconfig->shed_uid == 0)
+ if (!myconfig->shed_user && myconfig->shed_uid == -1)
{
struct passwd *pw;
if ((pw = getpwnam(defconfig.shed_user)))
myconfig->shed_uid = defconfig.shed_uid;
}
- if (!myconfig->shed_group && myconfig->shed_gid == 0)
+ if (!myconfig->shed_group && myconfig->shed_gid == -1)
{
struct group *gr;
if ((gr = getgrnam(defconfig.shed_group)))