aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar netblue30 <netblue30@yahoo.com>2015-11-25 08:35:25 -0500
committerLibravatar netblue30 <netblue30@yahoo.com>2015-11-25 08:35:25 -0500
commita91649ccf77c2fa20206759ef986aa9967e38ea6 (patch)
treea82921724f471bf646e50ce365986f0e7bb847db
parentfixes (diff)
downloadfirejail-a91649ccf77c2fa20206759ef986aa9967e38ea6.tar.gz
firejail-a91649ccf77c2fa20206759ef986aa9967e38ea6.tar.zst
firejail-a91649ccf77c2fa20206759ef986aa9967e38ea6.zip
fixes
-rw-r--r--src/firejail/firejail.h1
-rw-r--r--src/firejail/fs_bin.c2
-rw-r--r--src/firejail/fs_home.c11
-rw-r--r--src/firejail/fs_whitelist.c2
-rw-r--r--src/firejail/restrict_users.c2
-rw-r--r--src/firejail/util.c34
-rw-r--r--todo43
7 files changed, 88 insertions, 7 deletions
diff --git a/src/firejail/firejail.h b/src/firejail/firejail.h
index 3ede58df6..a364de75f 100644
--- a/src/firejail/firejail.h
+++ b/src/firejail/firejail.h
@@ -322,6 +322,7 @@ int net_move_interface(const char *dev, unsigned pid);
322 322
323// util.c 323// util.c
324void drop_privs(int nogroups); 324void drop_privs(int nogroups);
325int mkpath_as_root(const char* path);
325void extract_command_name(const char *str); 326void extract_command_name(const char *str);
326void logsignal(int s); 327void logsignal(int s);
327void logmsg(const char *msg); 328void logmsg(const char *msg);
diff --git a/src/firejail/fs_bin.c b/src/firejail/fs_bin.c
index 38b9b06ca..946c75d30 100644
--- a/src/firejail/fs_bin.c
+++ b/src/firejail/fs_bin.c
@@ -55,7 +55,7 @@ static char *check_dir_or_file(const char *name) {
55 } 55 }
56 56
57 if (!fname) { 57 if (!fname) {
58 fprintf(stderr, "Warning: file %s not found\n", name); 58// fprintf(stderr, "Warning: file %s not found\n", name);
59 return NULL; 59 return NULL;
60 } 60 }
61 61
diff --git a/src/firejail/fs_home.c b/src/firejail/fs_home.c
index 23f036bd7..ca9f7b472 100644
--- a/src/firejail/fs_home.c
+++ b/src/firejail/fs_home.c
@@ -233,9 +233,12 @@ void fs_private(void) {
233 // create /home/user 233 // create /home/user
234 if (arg_debug) 234 if (arg_debug)
235 printf("Create a new user directory\n"); 235 printf("Create a new user directory\n");
236 int rv = mkdir(homedir, S_IRWXU); 236 if (mkdir(homedir, S_IRWXU) == -1) {
237 if (rv == -1) 237 if (mkpath_as_root(homedir) == -1)
238 errExit("mkdir"); 238 errExit("mkpath");
239 if (mkdir(homedir, S_IRWXU) == -1)
240 errExit("mkdir");
241 }
239 if (chown(homedir, u, g) < 0) 242 if (chown(homedir, u, g) < 0)
240 errExit("chown"); 243 errExit("chown");
241 } 244 }
@@ -346,7 +349,7 @@ void fs_check_private_dir(void) {
346 exit(1); 349 exit(1);
347 } 350 }
348 if (s1.st_uid != s2.st_uid) { 351 if (s1.st_uid != s2.st_uid) {
349 printf("Error: the two home directories must have the same owner\n"); 352 printf("Error: --private directory should be owned by the current user\n");
350 exit(1); 353 exit(1);
351 } 354 }
352} 355}
diff --git a/src/firejail/fs_whitelist.c b/src/firejail/fs_whitelist.c
index a38539078..d018554d5 100644
--- a/src/firejail/fs_whitelist.c
+++ b/src/firejail/fs_whitelist.c
@@ -75,7 +75,7 @@ static void whitelist_path(ProfileEntry *entry) {
75 assert(path); 75 assert(path);
76 const char *fname; 76 const char *fname;
77 char *wfile = NULL; 77 char *wfile = NULL;
78 78
79 if (entry->home_dir) { 79 if (entry->home_dir) {
80 fname = path + strlen(cfg.homedir); 80 fname = path + strlen(cfg.homedir);
81 if (*fname == '\0') { 81 if (*fname == '\0') {
diff --git a/src/firejail/restrict_users.c b/src/firejail/restrict_users.c
index 4930dd1ea..50a9a9b89 100644
--- a/src/firejail/restrict_users.c
+++ b/src/firejail/restrict_users.c
@@ -120,7 +120,7 @@ static void sanitize_home(void) {
120 120
121 // create user home directory 121 // create user home directory
122 if (mkdir(cfg.homedir, 0755) == -1) { 122 if (mkdir(cfg.homedir, 0755) == -1) {
123 if (mkpath(cfg.homedir)) 123 if (mkpath_as_root(cfg.homedir))
124 errExit("mkpath"); 124 errExit("mkpath");
125 if (mkdir(cfg.homedir, 0755) == -1) 125 if (mkdir(cfg.homedir, 0755) == -1)
126 errExit("mkdir"); 126 errExit("mkdir");
diff --git a/src/firejail/util.c b/src/firejail/util.c
index 89d0697fd..880e45465 100644
--- a/src/firejail/util.c
+++ b/src/firejail/util.c
@@ -75,6 +75,40 @@ void drop_privs(int nogroups) {
75} 75}
76 76
77 77
78int mkpath_as_root(const char* path) {
79 assert(path && *path);
80
81 // work on a copy of the path
82 char *file_path = strdup(path);
83 if (!file_path)
84 errExit("strdup");
85
86 char* p;
87 for (p=strchr(file_path+1, '/'); p; p=strchr(p+1, '/')) {
88 *p='\0';
89 if (mkdir(file_path, 0755)==-1) {
90 if (errno != EEXIST) {
91 *p='/';
92 free(file_path);
93 return -1;
94 }
95 }
96 else {
97 if (chmod(file_path, 0755) == -1)
98 errExit("chmod");
99 if (chown(file_path, 0, 0) == -1)
100 errExit("chown");
101 }
102
103 *p='/';
104 }
105
106 free(file_path);
107 return 0;
108}
109
110
111
78void logsignal(int s) { 112void logsignal(int s) {
79 if (!arg_debug) 113 if (!arg_debug)
80 return; 114 return;
diff --git a/todo b/todo
index f69b4f6dd..553933f00 100644
--- a/todo
+++ b/todo
@@ -96,3 +96,46 @@ Warning: cannot disable /sys/power directory
96Child process initialized 96Child process initialized
97 97
9816. add support for --ip, --iprange, --mac and --mtu for --interface option 9816. add support for --ip, --iprange, --mac and --mtu for --interface option
99
10017. private-home clashing with blacklist
101$ firejail --private-home=.mozilla
102Reading profile /etc/firejail/generic.profile
103Reading profile /etc/firejail/disable-mgmt.inc
104Reading profile /etc/firejail/disable-secret.inc
105Reading profile /etc/firejail/disable-common.inc
106
107** Note: you can use --noprofile to disable generic.profile **
108
109Parent pid 8193, child pid 8194
110/run/firejail/mnt/cp: cannot access `/home/netblue/.mozilla': Permission denied
111Error system cp -a --parents:duplicate(381): No such file or directory
112Child process initialized
113$ ls -la
114total 4
115drwx------ 3 test test 100 Nov 25 07:59 .
116drwxr-xr-x 3 65534 65534 60 Nov 25 07:59 ..
117-rw-r--r-- 1 test test 3392 Nov 25 07:59 .bashrc
118dr-x------ 2 65534 65534 40 Nov 24 17:53 .mozilla
119-rw------- 1 test test 0 Nov 25 07:59 .Xauthority
120
121
122
123
12418. whitelist clashing with blacklist
125$ firejail --whitelist=~/.mozilla
126Reading profile /etc/firejail/generic.profile
127Reading profile /etc/firejail/disable-mgmt.inc
128Reading profile /etc/firejail/disable-secret.inc
129Reading profile /etc/firejail/disable-common.inc
130
131** Note: you can use --noprofile to disable generic.profile **
132
133Parent pid 9440, child pid 9441
134Child process initialized
135$ ls -al
136total 8
137drwx------ 3 netblue netblue 100 Nov 25 08:09 .
138drwxr-xr-x 3 65534 65534 60 Nov 25 08:09 ..
139-rw-r--r-- 1 netblue netblue 3392 Nov 25 08:09 .bashrc
140dr-x------ 2 65534 65534 40 Nov 24 17:53 .mozilla
141-rw------- 1 netblue netblue 51 Nov 25 08:09 .Xauthority