by craig on 1/12/20, 12:30 PM with 13 comments
by q3k on 1/13/20, 12:44 PM
Poignantly, the naive approach of 'let's just block read(2) to prevent file access' doesn't work - there's multiple ways to bypass simple read(2) filtering like this. The easiest that come to mind are:
- using readv(2)
- using sendfile(2)
- sym/hardlinks to bypass path checks, and the inherent TOCTOU exploits of further naive checks
The same applies to any other policy you wish to implement, and for every one of those you need to consider the collection of all Linux syscalls and filter all of the relevant ones. There's around 300 syscalls in Linux as of writing.Not to mention typical newbie mistakes that this project makes: not following forks, not checking for 32-bit syscalls, etc.
gVisor [1] does this well - instead of filtering, it reimplements the logic for handling Linux syscalls in userspace (eg., is actually responsible for handing out FDs and other handles, presenting the filesystem to the user, etc).
by roryrjb on 1/13/20, 7:59 AM
by minitech on 1/13/20, 8:55 AM
if regs.Orig_rax == 0 {
mean it only intercepts the read syscall? Seems like any security someone was hoping to provide with this could be bypassed entirely by accident (e.g. a script in a language that always uses readv).Anyway if that is what it means you should probably not describe this as “to run untrusted code”.
by cixter on 1/13/20, 12:53 PM
by riyakhanna1983 on 1/13/20, 2:25 PM
by emmelaich on 1/13/20, 11:01 PM