A go program that uses pledge("dns") mostly works except for two
incompatibilities with the way golang's dns library works. Otherwise
pledge("rpath") is required.

1. go likes to stat /etc/hosts to check for changes. I think this is
reasonable behavior. Patch below adds a whitelist to the kernel to permit
this. (libc does not currently cache results, but it could..?)

2. go tries to look a file called mdns.allow which does not exist on openbsd.
There are several platform dependent branches in go/src/net/conf.go, trying to
read this file should be avoided on openbsd. Patch left as an exercise.

Point 2 is also trivially worked around by performing a dummy lookup of
localhost before enabling pledge, so no urgency, but point 1 requires a code
change somewhere.


Index: kern_pledge.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_pledge.c,v
retrieving revision 1.278
diff -u -p -r1.278 kern_pledge.c
--- kern_pledge.c       20 Jan 2022 03:43:30 -0000      1.278
+++ kern_pledge.c       30 Jan 2022 21:01:43 -0000
@@ -733,12 +733,17 @@ pledge_namei(struct proc *p, struct name
 
                break;
        case SYS_stat:
-               /* DNS needs /etc/resolv.conf. */
+               /* DNS needs /etc/{resolv.conf,hosts}. */
                if ((ni->ni_pledge == PLEDGE_RPATH) &&
-                   (pledge & PLEDGE_DNS) &&
-                   strcmp(path, "/etc/resolv.conf") == 0) {
-                       ni->ni_cnd.cn_flags |= BYPASSUNVEIL;
-                       return (0);
+                   (pledge & PLEDGE_DNS)) {
+                       if (strcmp(path, "/etc/resolv.conf") == 0) {
+                               ni->ni_cnd.cn_flags |= BYPASSUNVEIL;
+                               return (0);
+                       }
+                       if (strcmp(path, "/etc/hosts") == 0) {
+                               ni->ni_cnd.cn_flags |= BYPASSUNVEIL;
+                               return (0);
+                       }
                }
                break;
        }

Reply via email to