summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2020-12-12 22:12:54 +0000
committerRoy Marples <roy@marples.name>2020-12-12 22:12:54 +0000
commit12cdb2be46e25e1ab99df18324b787ad8749dff7 (patch)
treed47a32a878032169c0dc7f178e7425150a0b2ffc
parent70aab5a945b54245dab612c58d3862ce1be845d6 (diff)
downloaddhcpcd-12cdb2be46e25e1ab99df18324b787ad8749dff7.tar.xz
privsep: Fix Linux i386 for SECCOMP as it just uses socketcall
Rather than accept(2), recv(2), etc..... which is horrible! Thanks to Steve Hirsch <stevehirsch49@msn.com> for testing.
-rw-r--r--src/privsep-linux.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/privsep-linux.c b/src/privsep-linux.c
index 050a30cf..d31d720d 100644
--- a/src/privsep-linux.c
+++ b/src/privsep-linux.c
@@ -34,6 +34,7 @@
#include <linux/audit.h>
#include <linux/filter.h>
+#include <linux/net.h>
#include <linux/seccomp.h>
#include <linux/sockios.h>
@@ -311,6 +312,23 @@ static struct sock_filter ps_seccomp_filter[] = {
#ifdef __NR_sendto
SECCOMP_ALLOW(__NR_sendto),
#endif
+#ifdef __NR_socketcall
+ /* i386 needs this and demonstrates why SECCOMP
+ * is poor compared to OpenBSD pledge(2) and FreeBSD capsicum(4)
+ * as this is soooo tied to the kernel API which changes per arch
+ * and likely libc as well. */
+ SECCOMP_ALLOW_ARG(__NR_socketcall, 0, SYS_ACCEPT),
+ SECCOMP_ALLOW_ARG(__NR_socketcall, 0, SYS_ACCEPT4),
+ SECCOMP_ALLOW_ARG(__NR_socketcall, 0, SYS_LISTEN),
+ SECCOMP_ALLOW_ARG(__NR_socketcall, 0, SYS_GETSOCKOPT), /* overflow */
+ SECCOMP_ALLOW_ARG(__NR_socketcall, 0, SYS_RECV),
+ SECCOMP_ALLOW_ARG(__NR_socketcall, 0, SYS_RECVFROM),
+ SECCOMP_ALLOW_ARG(__NR_socketcall, 0, SYS_RECVMSG),
+ SECCOMP_ALLOW_ARG(__NR_socketcall, 0, SYS_SEND),
+ SECCOMP_ALLOW_ARG(__NR_socketcall, 0, SYS_SENDMSG),
+ SECCOMP_ALLOW_ARG(__NR_socketcall, 0, SYS_SENDTO),
+ SECCOMP_ALLOW_ARG(__NR_socketcall, 0, SYS_SHUTDOWN),
+#endif
#ifdef __NR_shutdown
SECCOMP_ALLOW(__NR_shutdown),
#endif