[GSoC][RFC]: seccomp-assisted syscall filtering

Dmitry V. Levin ldv at altlinux.org
Mon Mar 26 19:30:16 UTC 2018


On Mon, Mar 26, 2018 at 10:05:57PM +0800, Chen Jingpiao wrote:
> On 03/25 10:36, Dmitry V. Levin wrote:
> > On Wed, Mar 21, 2018 at 10:17:08PM +0800, Chen Jingpiao wrote:
> > > On 03/12 02:29, Eugene Syromiatnikov wrote:
> > > > On Mon, Mar 12, 2018 at 10:38:37AM +0800, Chen Jingpiao wrote:
> [...]
> > It may be worth adding an option to explicitly enable/disable this
> > seccomp-based filter while it's being developed.  When it's ready for
> > non-experimental use, it will be enabled automatically depending on the
> > kernel support and tracing options, but we might want to keep the option
> > of disabling the feature explicitly.
> 
> Yes.
> 
> > 
> > Please note the following important points of this project that
> > I'd recommend to mention in the proposal:
> > 
> > - Runtime check for the seccomp semantics implemented by the kernel,
> >   similar to the runtime check for PTRACE_SEIZE, with fallback to the
> >   traditional filtering.
> 
> Yes, something like this [1]. I will do more research.
> 
> A demo:
> 
> bool
> test_seccomp_filter(void)
> {
> #ifdef SECCOMP_MODE_FILTER
> 	if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL, 0, 0) < 0) {
> 		debug_msg("SECCOMP_MODE_FILTER doesn't work: %s",
> 			  strerror(errno));
> 		return false;
> 	}
> 	return true;
> #else
> 	debug_msg("SECCOMP_MODE_FILTER doesn't work: not define SECCOMP_MODE_FILTER");
> 	return false;
> #endif
> }

Also we can check at runtime whether the kernel implements 4.8+ or older
seccomp because a simple check based on the kernel version is less
reliable as features are backported to older kernels sometimes.

Another case where we will have to use traditional PTRACE_SYSCALL
filtering is "strace -p".

> > - Optimization of the BPF code, for example, in some cases it's better
> >   to list traced syscalls, in other cases - to list those syscalls that
> >   are not traced.  Sometimes (e.g. -e trace=all) there is no point in
> >   enabling a seccomp-based filter even if the kernel supports it.
> 
> I have concerned this problem, but I have not found a satisfying way to
> deal with the problem.  One is count the numbers of traced syscall,
> and compare with nsyscalls. Other is if number_set.not is set, we unable
> seccomp filter (seems upcoming advanced filtering syntax delete the trace_set).
> 
> Second solution is not a good idea if use command:
> 
> $ strace -etrace=!%class[,/regex ...] PROG
> 
> $ grep -w TF linux/x86_64/syscallent.h | wc -l
> 60

If the set is a negation, this is not an obstacle, bpf filters can check
elements of the set almost the same way as with simple non-negated sets.

> Do you have any good suggestions? Thank you.

While it's good to have a good answer to this question,
the official gsoc coding period hasn't started yet so
you still have plenty of time to think about it.

> > With regards to the proposed timeline, please note the following subtasks
> > may take more time than expected:
> > - Integrating with the upcoming advanced filtering syntax (one of last
> >   year gsoc projects that is not merged yet but will hopefully be merged
> >   soon).
> > - Reviewing and merging to master.
> 
> Ok.
> 
> Thank you, I updated the proposal [2].

I'm slowly getting used to your style of writing in English ;)
but it would be great if you could make you proposal somewhat more readable.


-- 
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20180326/e2f2efb4/attachment.bin>


More information about the Strace-devel mailing list