aboutsummaryrefslogtreecommitdiffstats
path: root/src/firejail/network_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/firejail/network_main.c')
-rw-r--r--src/firejail/network_main.c35
1 files changed, 20 insertions, 15 deletions
diff --git a/src/firejail/network_main.c b/src/firejail/network_main.c
index 907b84642..8a9c47f0e 100644
--- a/src/firejail/network_main.c
+++ b/src/firejail/network_main.c
@@ -23,6 +23,7 @@
23#include <sys/stat.h> 23#include <sys/stat.h>
24#include <unistd.h> 24#include <unistd.h>
25#include <net/if.h> 25#include <net/if.h>
26#include <stdarg.h>
26 27
27// configure bridge structure 28// configure bridge structure
28// - extract ip address and mask from the bridge interface 29// - extract ip address and mask from the bridge interface
@@ -127,13 +128,11 @@ void net_configure_veth_pair(Bridge *br, const char *ifname, pid_t child) {
127 else 128 else
128 dev = br->veth_name; 129 dev = br->veth_name;
129 130
130 net_create_veth(dev, ifname, child); 131 char *cstr;
131 132 if (asprintf(&cstr, "%d", child) == -1)
132 // add interface to the bridge 133 errExit("asprintf");
133 net_bridge_add_interface(br->dev, dev); 134 sbox_run(SBOX_ROOT | SBOX_CAPS_NETWORK | SBOX_SECCOMP, 7, PATH_FNET, "create", "veth", dev, ifname, br->dev, cstr);
134 135 free(cstr);
135 // bring up the interface
136 net_if_up(dev);
137 136
138 char *msg; 137 char *msg;
139 if (asprintf(&msg, "%d.%d.%d.%d address assigned to sandbox", PRINT_IP(br->ipsandbox)) == -1) 138 if (asprintf(&msg, "%d.%d.%d.%d address assigned to sandbox", PRINT_IP(br->ipsandbox)) == -1)
@@ -290,47 +289,53 @@ void net_dns_print(pid_t pid) {
290} 289}
291 290
292void network_main(pid_t child) { 291void network_main(pid_t child) {
292 char *cstr;
293 if (asprintf(&cstr, "%d", child) == -1)
294 errExit("asprintf");
295
293 // create veth pair or macvlan device 296 // create veth pair or macvlan device
294 if (cfg.bridge0.configured) { 297 if (cfg.bridge0.configured) {
295 if (cfg.bridge0.macvlan == 0) { 298 if (cfg.bridge0.macvlan == 0) {
296 net_configure_veth_pair(&cfg.bridge0, "eth0", child); 299 net_configure_veth_pair(&cfg.bridge0, "eth0", child);
297 } 300 }
298 else 301 else
299 net_create_macvlan(cfg.bridge0.devsandbox, cfg.bridge0.dev, child); 302 sbox_run(SBOX_ROOT | SBOX_CAPS_NETWORK | SBOX_SECCOMP, 6, PATH_FNET, "create", "macvlan", cfg.bridge0.devsandbox, cfg.bridge0.dev, cstr);
300 } 303 }
301 304
302 if (cfg.bridge1.configured) { 305 if (cfg.bridge1.configured) {
303 if (cfg.bridge1.macvlan == 0) 306 if (cfg.bridge1.macvlan == 0)
304 net_configure_veth_pair(&cfg.bridge1, "eth1", child); 307 net_configure_veth_pair(&cfg.bridge1, "eth1", child);
305 else 308 else
306 net_create_macvlan(cfg.bridge1.devsandbox, cfg.bridge1.dev, child); 309 sbox_run(SBOX_ROOT | SBOX_CAPS_NETWORK | SBOX_SECCOMP, 6, PATH_FNET, "create", "macvlan", cfg.bridge1.devsandbox, cfg.bridge1.dev, cstr);
307 } 310 }
308 311
309 if (cfg.bridge2.configured) { 312 if (cfg.bridge2.configured) {
310 if (cfg.bridge2.macvlan == 0) 313 if (cfg.bridge2.macvlan == 0)
311 net_configure_veth_pair(&cfg.bridge2, "eth2", child); 314 net_configure_veth_pair(&cfg.bridge2, "eth2", child);
312 else 315 else
313 net_create_macvlan(cfg.bridge2.devsandbox, cfg.bridge2.dev, child); 316 sbox_run(SBOX_ROOT | SBOX_CAPS_NETWORK | SBOX_SECCOMP, 6, PATH_FNET, "create", "macvlan", cfg.bridge2.devsandbox, cfg.bridge2.dev, cstr);
314 } 317 }
315 318
316 if (cfg.bridge3.configured) { 319 if (cfg.bridge3.configured) {
317 if (cfg.bridge3.macvlan == 0) 320 if (cfg.bridge3.macvlan == 0)
318 net_configure_veth_pair(&cfg.bridge3, "eth3", child); 321 net_configure_veth_pair(&cfg.bridge3, "eth3", child);
319 else 322 else
320 net_create_macvlan(cfg.bridge3.devsandbox, cfg.bridge3.dev, child); 323 sbox_run(SBOX_ROOT | SBOX_CAPS_NETWORK | SBOX_SECCOMP, 6, PATH_FNET, "create", "macvlan", cfg.bridge3.devsandbox, cfg.bridge3.dev, cstr);
321 } 324 }
322 325
323 // move interfaces in sandbox 326 // move interfaces in sandbox
324 if (cfg.interface0.configured) { 327 if (cfg.interface0.configured) {
325 net_move_interface(cfg.interface0.dev, child); 328 sbox_run(SBOX_ROOT | SBOX_CAPS_NETWORK | SBOX_SECCOMP, 4, PATH_FNET, "moveif", cfg.interface0.dev, cstr);
326 } 329 }
327 if (cfg.interface1.configured) { 330 if (cfg.interface1.configured) {
328 net_move_interface(cfg.interface1.dev, child); 331 sbox_run(SBOX_ROOT | SBOX_CAPS_NETWORK | SBOX_SECCOMP, 4, PATH_FNET, "moveif", cfg.interface1.dev, cstr);
329 } 332 }
330 if (cfg.interface2.configured) { 333 if (cfg.interface2.configured) {
331 net_move_interface(cfg.interface2.dev, child); 334 sbox_run(SBOX_ROOT | SBOX_CAPS_NETWORK | SBOX_SECCOMP, 4, PATH_FNET, "moveif", cfg.interface3.dev, cstr);
332 } 335 }
333 if (cfg.interface3.configured) { 336 if (cfg.interface3.configured) {
334 net_move_interface(cfg.interface3.dev, child); 337 sbox_run(SBOX_ROOT | SBOX_CAPS_NETWORK | SBOX_SECCOMP, 4, PATH_FNET, "moveif", cfg.interface3.dev, cstr);
335 } 338 }
339
340 free(cstr);
336} 341}