On 2017/06/01 14:54, Todd C. Miller wrote: > On Thu, 01 Jun 2017 21:21:46 +0100, Stuart Henderson wrote: > > > I've backed this out because it SIGABRTs for me and for others who tested. > > e.g.: > > > > nslookup(90023): sysctl 2: 1 13 16 0 -178384 32639 > > nslookup(90023): syscall 202 "" > > Whoops, pledge does not allow KERN_DNSJACKPORT, even read-only. > This requires an addition to kern_pledge.c to work. > > - todd >
like so..(with the revert of the revert included). Index: sys/kern/kern_pledge.c =================================================================== RCS file: /cvs/src/sys/kern/kern_pledge.c,v retrieving revision 1.210 diff -u -p -u -7 -r1.210 kern_pledge.c --- sys/kern/kern_pledge.c 30 May 2017 15:04:45 -0000 1.210 +++ sys/kern/kern_pledge.c 1 Jun 2017 21:09:39 -0000 @@ -973,14 +973,17 @@ pledge_sysctl(struct proc *p, int miblen if ((p->p_p->ps_pledge & (PLEDGE_ROUTE | PLEDGE_INET | PLEDGE_DNS))) { if (miblen == 6 && /* getifaddrs() */ mib[0] == CTL_NET && mib[1] == PF_ROUTE && mib[2] == 0 && (mib[3] == 0 || mib[3] == AF_INET6 || mib[3] == AF_INET) && mib[4] == NET_RT_IFLIST) return (0); + if (miblen == 2 && /* kern.dnsjackport */ + mib[0] == CTL_KERN && mib[1] == KERN_DNSJACKPORT) + return (0); } if ((p->p_p->ps_pledge & PLEDGE_DISKLABEL)) { if (miblen == 2 && /* kern.rawpartition */ mib[0] == CTL_KERN && mib[1] == KERN_RAWPARTITION) return (0); Index: usr.sbin/bind/bin/dig/dighost.c =================================================================== RCS file: /cvs/src/usr.sbin/bind/bin/dig/dighost.c,v retrieving revision 1.17 diff -u -p -r1.17 dighost.c --- usr.sbin/bind/bin/dig/dighost.c 1 Jun 2017 20:18:44 -0000 1.17 +++ usr.sbin/bind/bin/dig/dighost.c 1 Jun 2017 21:09:59 -0000 @@ -34,6 +34,8 @@ #include <string.h> #include <limits.h> +#include <sys/sysctl.h> + #ifdef HAVE_LOCALE_H #include <locale.h> #endif @@ -2778,6 +2780,15 @@ recv_done(isc_task_t *task, isc_event_t isc_region_t r; isc_buffer_t *buf = NULL; #endif + static int checked_jackport; + static int jackport; + + if (!checked_jackport) { + int dnsjacking[2] = { CTL_KERN, KERN_DNSJACKPORT }; + size_t portlen = sizeof(jackport); + sysctl(dnsjacking, 2, &jackport, &portlen, NULL, 0); + checked_jackport = 1; + } UNUSED(task); INSIST(!free_now); @@ -2854,6 +2865,7 @@ recv_done(isc_task_t *task, isc_event_t * sent to 0.0.0.0, :: or to a multicast addresses. * XXXMPA broadcast needs to be handled here as well. */ + if (jackport == 0) if ((!isc_sockaddr_eqaddr(&query->sockaddr, &any) && !isc_sockaddr_ismulticast(&query->sockaddr)) || isc_sockaddr_getport(&query->sockaddr) !=