Hi,

switchd(8)'s main proc needs to open the following paths, and which can be
unveiled:

/ -> read, it will open config files from anywhere in the system, and also
needs to open /etc/services

/dev -> read/write, in order to open /dev/tap* and /dev/switch*

Just before the main loop the devices were already opened so we can drop wpath
from pledge(2). We still need to keep rpath since the daemon may receive a
SIGHUP and reload the config files again, along with /etc/services.

Another option is to just remove the current pledge(2) placement and add the
one I have below, this way there's no need to unveil /dev, just / .

Comments? OK?

Index: switchd.c
===================================================================
RCS file: /cvs/src/usr.sbin/switchd/switchd.c,v
retrieving revision 1.16
diff -u -p -u -r1.16 switchd.c
--- switchd.c   10 Sep 2018 13:21:39 -0000      1.16
+++ switchd.c   11 Jul 2019 09:08:07 -0000
@@ -191,6 +191,10 @@ main(int argc, char *argv[])
 
        log_procinit("parent");
 
+       if (unveil("/", "r") == -1)
+               fatal("unveil");
+       if (unveil("/dev", "rw") == -1)
+               fatal("unveil");
        /*
         * pledge in the parent process:
         * stdio - for malloc and basic I/O including events.
@@ -221,6 +225,9 @@ main(int argc, char *argv[])
 
        if (parent_configure(sc) == -1)
                fatalx("configuration failed");
+
+       if (pledge("stdio rpath inet dns sendfd", NULL) == -1)
+               fatal("pledge");
 
        event_dispatch();
 

Reply via email to