All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eduardo Otubo <eduardo.otubo@profitbricks.com>
To: "Daniel P. Berrange" <berrange@redhat.com>
Cc: qemu-devel@nongnu.org, pmoore@redhat.com
Subject: Re: [Qemu-devel] RFC: How to make seccomp reliable and useful ?
Date: Wed, 1 Mar 2017 23:38:56 +0100	[thread overview]
Message-ID: <20170301223856.GA20202@vader> (raw)
In-Reply-To: <20170216093316.GB7346@redhat.com>

On Thu, Feb 16, 2017 at 09=33=16AM +0000, Daniel P. Berrange wrote:
> On Thu, Feb 16, 2017 at 12:36:51AM +0100, Eduardo Otubo wrote:
> > On Wed, Feb 15, 2017 at 06=27=32PM +0000, Daniel P. Berrange wrote:

[...]

> > > 
> > > There is a reasonable easily identifiable set of syscalls that QEMU should
> > > never be permitted to use, no matter what configuration it is in, what helpers
> > > it spawns, or what libraries it links to. eg reboot, swapon, swapoff,  syslog,
> > > mount, unmount, kexec_*, etc - any syscall that affects global system state,
> > > rather than process local state should be forbidden.
> > > 
> > > There are some syscalls that are simply hardcoded to return ENOSYS which can
> > > be trivially blacklisted. afs_syscall, break, fattach, ftime, etc (see the
> > > man page 'unimplemented(2)').

I've been working on the blacklist, you can see here:
https://github.com/otubo/qemu/commit/31e603180081474ff35c5897813cb635f8e9a786

I didn't send as an RFC to the list because it's still an on going work,
but if you have any comments, please feel free.

> > > 
> > > There are some syscalls which are considered obsolete - they were previously
> > > useful, but no modern code would call them, as they have been superceeded.
> > > For example, readdir replaced by getdents. We could blacklist these by default
> > > but provide a way to allow use of obsolete syscalls if running on older systems.
> > > e.g. '-sandbox on,obsolete=allow'. They might be obsolete enough that we decide
> > > to just block them permanently with no opt in - would need to analyse when
> > > their replacements appeared in widespread use.

The obsolete part is also on my github (didn't send for the same
reason):
https://github.com/otubo/qemu/commit/54a57eb150ca3e5b67e9a81394c6cfa4ac82a6ff

Also, can't find anywhere a solid list of obsolete system calls, can you
elaborate a little more on how to determine this list?

> > > 
> > > There might be a few more syscalls which we can determine are never valid to
> > > use in QEMU or any library or helper program it might run. I expect this list
> > > to be very small though, given the impossibility of auditing code paths through
> > > millions of lines of code QEMU links to.
> > > 
> > > Everything else should be allowed.
> > > 
> > > At this point we have a highly reliable "-sandbox on" which we're not having
> > > to constantly patch.
> > > 
> > > 
> > > From here we need a way to allow a user to opt-in to more restrictive policies,
> > > accepting that it will block certain features. For example, there should be a
> > > a way to disable any means to elevate privileges from QEMU or things it spawns.
> > > e.g. '-sandbox on,elevateprivileges=deny'.
> > > 
> > > This would not only block the variuous set*uid|gid functions via seccomp, but
> > > should also prctl(PR_SET_NO_NEW_PRIVS). This would allows the user to optin to
> > > a restrictive world if they know they'll not require things like the setuid
> > > bridge helper.

Also, I was re-reading all documentation again, prctl(PR_SET_NO_NEW_PRIVS) is enabled
by default when using seccomp.

> > > 
> > > Similarly there should be an '-sandbox on,spawn=deny' which prevents the ability
> > > to fork/exec processes at all, whether privileged or not. This would block
> > > features like the qemu bridge helper, SMB server, ifup/down scripts, migration
> > > exec: protocol. These are all rarely used features though, so an opt-in to block
> > > their use is reasonable & desirable.
> > > 
> > > A -sandbox on,resourcecontrol=deny, which prevents QEMU from setting stuff like
> > > process affinity, schedular priority, etc. Some uses of QEMU might need them,
> > > but normally such controls are left to the mgmt app above QEMU to set prior to
> > > the exec() of QEMU.
> > > 
> > > 
> > > 
> > > The key is that these are *not* low level knobs controlling system calls, but
> > > moderately high level knobs controlling general concepts. This is a high enough
> > > level of abstraction to enable libvirt to automatically turn them on/off based
> > > on guest config, without libvirt having to know anything detailed about QEMU
> > > code impl for the features.
> > > 
> > > 
> > > Finally, for avoidance of doubt, I'm *not* actually proposing to implement this
> > > myself any time in the forseeable future. This mail came about from the fact
> > > that many people have questioned whether current seccomp code is anything other
> > > than "security theatre". I tend to agree with such an assessment myself, and was
> > > initially intending to just send a patch to remove seccomp, to stimulate some
> > > discussion. Instead, however, I decided to write this mail to see if we can
> > > identify a way forward to make seccomp both reliable and useful. If QEMU had the
> > > kind of approach outlined above, with a default blacklist instead of whitelist,
> > > and some opt-ins for stricter lists, it is something I think libvirt would be
> > > reasonably happy to enable out of the box. That would be a step forward from
> > > today where libvirt would never consider turning seccomp on by default.
> > > 
> > > Perhaps this re-working could be a GSoC idea for some interested student...
> > > 
> > 
> > I'm not a student, thus not eligible GSoC person but I would be more
> > than grateful to take this initiative of yours and transform into some
> > patches so we can make this feature something really useful and
> > reliable.
> 
> Sure, I just threw GSoC out there as one possible idea. If you or anyone
> else has time to work on it, that's great too.
> 
> > Perhaps now is not the right time to terse comments on every idea you
> > gave, I agree with most of them. I wrote the whole implementation of
> > this feature but actually became the maintainer because people approving
> > sycalls and sending pull-requests were too busy, and I could do it. But
> > to be completely honest I had few poor ideas on how to improve it and
> > almost no time to actually do it in the past. Time passed by and all I
> > did was approve new syscalls and turn them into pull-requests.
> > 
> > Let's spin up these ideas and hopefully incorporate into Qemu. Next step
> > I'm gonna dig into every topic and draft a little more. I guess we can
> > keep on this thread, or perhaps in separate ones. From there I can start
> > to write some code.
> 
> ok
> 
> Regards,
> Daniel
> -- 
> |: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
> |: http://libvirt.org              -o-             http://virt-manager.org :|
> |: http://entangle-photo.org       -o-    http://search.cpan.org/~danberr/ :|
> 

-- 
Eduardo Otubo
ProfitBricks GmbH

  reply	other threads:[~2017-03-01 22:39 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-15 18:27 [Qemu-devel] RFC: How to make seccomp reliable and useful ? Daniel P. Berrange
2017-02-15 23:36 ` Eduardo Otubo
2017-02-16  9:33   ` Daniel P. Berrange
2017-03-01 22:38     ` Eduardo Otubo [this message]
2017-03-02  9:35       ` Daniel P. Berrange
2017-02-16  8:38 ` Thomas Huth
2017-02-16  9:32   ` Daniel P. Berrange
2017-02-16  9:37     ` Thomas Huth
2017-02-16  9:41       ` Daniel P. Berrange

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170301223856.GA20202@vader \
    --to=eduardo.otubo@profitbricks.com \
    --cc=berrange@redhat.com \
    --cc=pmoore@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.