aboutsummaryrefslogtreecommitdiffstats
path: root/src/firejail
diff options
context:
space:
mode:
Diffstat (limited to 'src/firejail')
-rw-r--r--src/firejail/checkcfg.c11
-rw-r--r--src/firejail/firejail.h4
-rw-r--r--src/firejail/main.c4
-rw-r--r--src/firejail/profile.c4
-rw-r--r--src/firejail/sandbox.c13
-rw-r--r--src/firejail/usage.c3
6 files changed, 38 insertions, 1 deletions
diff --git a/src/firejail/checkcfg.c b/src/firejail/checkcfg.c
index 430b0c5a6..4fdbe1897 100644
--- a/src/firejail/checkcfg.c
+++ b/src/firejail/checkcfg.c
@@ -36,7 +36,9 @@ int checkcfg(int val) {
36 int i; 36 int i;
37 for (i = 0; i < CFG_MAX; i++) 37 for (i = 0; i < CFG_MAX; i++)
38 cfg_val[i] = 1; // most of them are enabled by default 38 cfg_val[i] = 1; // most of them are enabled by default
39
39 cfg_val[CFG_RESTRICTED_NETWORK] = 0; // disabled by default 40 cfg_val[CFG_RESTRICTED_NETWORK] = 0; // disabled by default
41 cfg_val[CFG_FORCE_NONEWPRIVS ] = 0; // disabled by default
40 42
41 // open configuration file 43 // open configuration file
42 char *fname; 44 char *fname;
@@ -106,6 +108,15 @@ int checkcfg(int val) {
106 else 108 else
107 goto errout; 109 goto errout;
108 } 110 }
111 // nonewprivs
112 else if (strncmp(ptr, "force-nonewprivs ", 17) == 0) {
113 if (strcmp(ptr + 17, "yes") == 0)
114 cfg_val[CFG_SECCOMP] = 1;
115 else if (strcmp(ptr + 17, "no") == 0)
116 cfg_val[CFG_SECCOMP] = 0;
117 else
118 goto errout;
119 }
109 // seccomp 120 // seccomp
110 else if (strncmp(ptr, "seccomp ", 8) == 0) { 121 else if (strncmp(ptr, "seccomp ", 8) == 0) {
111 if (strcmp(ptr + 8, "yes") == 0) 122 if (strcmp(ptr + 8, "yes") == 0)
diff --git a/src/firejail/firejail.h b/src/firejail/firejail.h
index f4a176caf..661073730 100644
--- a/src/firejail/firejail.h
+++ b/src/firejail/firejail.h
@@ -237,6 +237,7 @@ extern int arg_rlimit_nproc; // rlimit nproc
237extern int arg_rlimit_fsize; // rlimit fsize 237extern int arg_rlimit_fsize; // rlimit fsize
238extern int arg_rlimit_sigpending;// rlimit sigpending 238extern int arg_rlimit_sigpending;// rlimit sigpending
239extern int arg_nogroups; // disable supplementary groups 239extern int arg_nogroups; // disable supplementary groups
240extern int arg_nonewprivs; // set the NO_NEW_PRIVS prctl
240extern int arg_noroot; // create a new user namespace and disable root user 241extern int arg_noroot; // create a new user namespace and disable root user
241extern int arg_netfilter; // enable netfilter 242extern int arg_netfilter; // enable netfilter
242extern int arg_netfilter6; // enable netfilter6 243extern int arg_netfilter6; // enable netfilter6
@@ -565,7 +566,8 @@ void sandboxfs(int op, pid_t pid, const char *patqh);
565#define CFG_SECCOMP 5 566#define CFG_SECCOMP 5
566#define CFG_NETWORK 6 567#define CFG_NETWORK 6
567#define CFG_RESTRICTED_NETWORK 7 568#define CFG_RESTRICTED_NETWORK 7
568#define CFG_MAX 8 // this should always be the last entry 569#define CFG_FORCE_NONEWPRIVS 8
570#define CFG_MAX 9 // this should always be the last entry
569int checkcfg(int val); 571int checkcfg(int val);
570 572
571// fs_rdwr.c 573// fs_rdwr.c
diff --git a/src/firejail/main.c b/src/firejail/main.c
index a540d468b..2f4a78d4b 100644
--- a/src/firejail/main.c
+++ b/src/firejail/main.c
@@ -77,6 +77,7 @@ int arg_rlimit_nproc = 0; // rlimit nproc
77int arg_rlimit_fsize = 0; // rlimit fsize 77int arg_rlimit_fsize = 0; // rlimit fsize
78int arg_rlimit_sigpending = 0; // rlimit fsize 78int arg_rlimit_sigpending = 0; // rlimit fsize
79int arg_nogroups = 0; // disable supplementary groups 79int arg_nogroups = 0; // disable supplementary groups
80int arg_nonewprivs = 0; // set the NO_NEW_PRIVS prctl
80int arg_noroot = 0; // create a new user namespace and disable root user 81int arg_noroot = 0; // create a new user namespace and disable root user
81int arg_netfilter; // enable netfilter 82int arg_netfilter; // enable netfilter
82int arg_netfilter6; // enable netfilter6 83int arg_netfilter6; // enable netfilter6
@@ -1367,6 +1368,9 @@ int main(int argc, char **argv) {
1367 } 1368 }
1368 } 1369 }
1369#endif 1370#endif
1371 else if (strcmp(argv[i], "--nonewprivs") == 0) {
1372 arg_nonewprivs = 1;
1373 }
1370 else if (strncmp(argv[i], "--env=", 6) == 0) 1374 else if (strncmp(argv[i], "--env=", 6) == 0)
1371 env_store(argv[i] + 6); 1375 env_store(argv[i] + 6);
1372 else if (strncmp(argv[i], "--nosound", 9) == 0) { 1376 else if (strncmp(argv[i], "--nosound", 9) == 0) {
diff --git a/src/firejail/profile.c b/src/firejail/profile.c
index 3bf294e00..192f36974 100644
--- a/src/firejail/profile.c
+++ b/src/firejail/profile.c
@@ -131,6 +131,10 @@ int profile_check_line(char *ptr, int lineno, const char *fname) {
131 131
132 return 0; 132 return 0;
133 } 133 }
134 else if (strcmp(ptr, "nonewprivs") == 0) {
135 arg_nonewprivs = 1;
136 return 0;
137 }
134 else if (strcmp(ptr, "seccomp") == 0) { 138 else if (strcmp(ptr, "seccomp") == 0) {
135#ifdef HAVE_SECCOMP 139#ifdef HAVE_SECCOMP
136 if (checkcfg(CFG_SECCOMP)) 140 if (checkcfg(CFG_SECCOMP))
diff --git a/src/firejail/sandbox.c b/src/firejail/sandbox.c
index 5cfee44d8..6133a610d 100644
--- a/src/firejail/sandbox.c
+++ b/src/firejail/sandbox.c
@@ -748,6 +748,19 @@ int sandbox(void* sandbox_arg) {
748 } 748 }
749 749
750 //**************************************** 750 //****************************************
751 // Set NO_NEW_PRIVS if desired
752 //****************************************
753 if (arg_nonewprivs || checkcfg(CFG_FORCE_NONEWPRIVS)) {
754 int no_new_privs = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
755
756 if(no_new_privs != 0)
757 errExit("NO_NEW_PRIVS");
758 else if (arg_debug)
759 printf("NO_NEW_PRIVS set\n");
760 }
761
762
763 //****************************************
751 // fork the application and monitor it 764 // fork the application and monitor it
752 //**************************************** 765 //****************************************
753 pid_t app_pid = fork(); 766 pid_t app_pid = fork();
diff --git a/src/firejail/usage.c b/src/firejail/usage.c
index ef02c0d72..45bf2e3b1 100644
--- a/src/firejail/usage.c
+++ b/src/firejail/usage.c
@@ -157,6 +157,9 @@ void usage(void) {
157 printf("\tuser. root user does not exist in the new namespace. This option\n"); 157 printf("\tuser. root user does not exist in the new namespace. This option\n");
158 printf("\tis not supported for --chroot and --overlay configurations.\n\n"); 158 printf("\tis not supported for --chroot and --overlay configurations.\n\n");
159#endif 159#endif
160 printf(" --nonewprivs - sets the NO_NEW_PRIVS prctl - the child processes\n");
161 printf("\tcannot gain privileges using execve(2); in particular, this prevents\n");
162 printf("\tgaining privileges by calling a suid binary\n\n");
160 printf(" --nosound - disable sound system.\n\n"); 163 printf(" --nosound - disable sound system.\n\n");
161 164
162 printf(" --output=logfile - stdout logging and log rotation. Copy stdout and stderr\n"); 165 printf(" --output=logfile - stdout logging and log rotation. Copy stdout and stderr\n");