I'm writing a program that spawns child processes. For security reasons, I want to limit what these processes can do. I know of security measures from outside the program such as chroot
or ulimit
, but I want to do something more than that. I want to limit the system calls done by the child process (for example preventing calls to open()
, fork()
and such things). Is there any way to do that? Optimally, the blocked system calls should return with an error but if that's not possible, then killing the process is also good.
I guess it can be done wuth ptrace()
but from the man page I don't really understand how to use it for this purpose.
It sounds like SECCOMP_FILTER, added in kernel version 3.5, is what you're after. The
libseccomp
library provides an easy-to-use API for this functionality.By the way,
chroot()
andsetrlimit()
are both system calls that can be called within your program - you'd probably want to use one or both of these in addition to seccomp filtering.If you want to do it the
ptrace
way, you have some options (and some are really simple). First of all, I recommend you to follow the tutorial explained here. With it you can learn how to know what system calls are being called, and also the basicptrace
knowledge (don't worry, it's a very short tutorial). The options (that I know) you have are the following:PTRACE_SETREGS
, putting wrong values in them, and you can also change the return value of the system call if you want (again, withPTRACE_SETREGS
).PTRACE_SETREGS
).