I'm using pledge(2) to harden an application on OpenBSD, but cannot find a promise that will allow it to run. Even after adding all the promises listed in the pledge manpage (apart from "error") it still fails with SIGABRT.
I'm calling this: pledge("stdio rpath wpath cpath dpath tmppath inet mcast fattr chown " "flock unix dns getpw sendfd recvfd tape tty proc exec " "prot_exec settime ps vminfo id pf route wroute audio video " "bpf unveil", NULL); and getting this: openbsd72$ kdump | tail 71505 arp-scan RET kbind 0 71505 arp-scan CALL open(0xf00c9939b8a,0x2<O_RDWR>) 71505 arp-scan NAMI "/dev/bpf" 71505 arp-scan RET open 3 71505 arp-scan CALL kbind(0x7f7ffffc9638,24,0x9e68113ba2b6b588) 71505 arp-scan RET kbind 0 71505 arp-scan CALL ioctl(3,BIOCVERSION,0x7f7ffffc9740) 71505 arp-scan PLDG ioctl, "tty", errno 1 Operation not permitted 71505 arp-scan PSIG SIGABRT SIG_DFL 71505 arp-scan NAMI "arp-scan.core" It is failing in the libpcap library, with the calling sequence: pcap_findalldevs() -> pcap_open_live() -> pcap_activate() -> ioctl() For context I'm applying the pledge patch from the OpenBSD arp-scan port to the upstream code on github. The initial patch, which pledges a small set of promises after setup is complete is working fine. But when I try to add a more extensive pledge() as the first statement in main(), I cannot find a set of promises that will allow it to run the setup code. Here's my outline of the planned changes from the pull request: "@sthen: this is the PR for your OpenBSD pledge(2) patch. I'm planning to extend it a bit by calling pledge initially as the very first thing in main() with the most that arp-scan will ever need, including rpath, wpath and perhaps others in addition to stdio dns bpf. Then, when we've parsed the args and opened files & sockets, call pledge again with a reduced set. Maybe could also tune the reduced set based on args - I suspect we don't need dns without --resolve. I was also considering changing the execpromises from NULL to "" (empty string). From my reading of the manpage, promises (and presumably also execpromises) of NULL mean don't change current settings (presumably everything) whereas an empty string means nothing (well apart from _exit(2)). It probably won't change much in practice, as the process would never be able to call execve(), but arp-scan doesn't ever fork() or execve() so I don't think we need any execpromises at all." Full details in this github pull request: https://github.com/royhills/arp-scan/pull/132 Any ideas what I'm doing wrong? Thanks, Roy