passt: Warn if we're running as root, abort if we can't change to nobody:nobody
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
fc93f97774
commit
3bb859c505
1 changed files with 29 additions and 0 deletions
29
passt.c
29
passt.c
|
@ -56,6 +56,8 @@
|
||||||
#include <linux/filter.h>
|
#include <linux/filter.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <linux/capability.h>
|
#include <linux/capability.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <grp.h>
|
||||||
|
|
||||||
#include "seccomp.h"
|
#include "seccomp.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
@ -186,6 +188,30 @@ static void seccomp(struct ctx *c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check_root() - Warn if we're running as root, exit if we can't drop to nobody
|
||||||
|
*/
|
||||||
|
static void check_root(void)
|
||||||
|
{
|
||||||
|
struct passwd *pw;
|
||||||
|
|
||||||
|
if (getuid() && geteuid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
fprintf(stderr, "Don't run this as root. Changing to nobody...\n");
|
||||||
|
pw = getpwnam("nobody");
|
||||||
|
if (!pw) {
|
||||||
|
perror("getpwnam");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (initgroups(pw->pw_name, pw->pw_gid) ||
|
||||||
|
setgid(pw->pw_gid) || setuid(pw->pw_uid)) {
|
||||||
|
fprintf(stderr, "Can't change to user/group nobody, exiting");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* drop_caps() - Drop capabilities we might have except for CAP_NET_BIND_SERVICE
|
* drop_caps() - Drop capabilities we might have except for CAP_NET_BIND_SERVICE
|
||||||
*/
|
*/
|
||||||
|
@ -223,6 +249,9 @@ int main(int argc, char **argv)
|
||||||
char *log_name;
|
char *log_name;
|
||||||
int nfds, i;
|
int nfds, i;
|
||||||
|
|
||||||
|
#ifndef PASST_LEGACY_NO_OPTIONS
|
||||||
|
check_root();
|
||||||
|
#endif
|
||||||
drop_caps();
|
drop_caps();
|
||||||
|
|
||||||
if (strstr(argv[0], "pasta") || strstr(argv[0], "passt4netns")) {
|
if (strstr(argv[0], "pasta") || strstr(argv[0], "passt4netns")) {
|
||||||
|
|
Loading…
Reference in a new issue