tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: How Unix manages processes in userland



On 2013-12-07 jklowden%schemamania.org@localhost wrote:
Matthew Orgass <darkstar%city-net.com@localhost> wrote:

the basic Unix/BSD security model, while useful for servers, does
not cover how users actually interact with a personal computer.
For that to be true, you'd have to explain how a personal computer is
not like a server, and why that matters to the security model.  ISTM
the Unix security model was invented precisely to control user
interaction with the system.
  Servers usually are trying to accomplish a more limited task, so it is 
often possible to run fewer and simpler applications and to put some 
effort into determining what should be run and as what uid/gid and then 
setting it up so that happens.  I think the basic issues affect servers as 
well, just much less severely.  Personal computer users run and install 
software without trusting the source, but the current security model is 
based on trusting applications.  Often it is quite complex software and we 
want to be able to try it and see how it works before putting any 
significant effort into setup.
  In terms of a security properties, I think what I am most looking for is 
to control:
1) what gets written to disk, particularly so that stuff I care about 
doesn't get overwritten but also to be able to tell what is using disk 
space and be able to delete stuff that isn't needed when the disk fills up 
(and ideally prevent it from unnecessarily filling up in the first place)
2) private data should not be removed from my computer without my consent

3) preserve a trusted communication path with various levels of control software
4) get good battery life on mobile devices and still be able to play audio 
and video without skipping
  With #3, #1 could be implemented as a reliable rollback mechanism. #2 is 
harder, but very important IMO.  Solving #2 is likely to make other 
options available for #1.  Also, in general an application like mplayer 
usually has no need to write to any file at all but contains a lot of 
complex code from a variety of sources, so being able to easily and 
reliably prevent it from doing that ever would eliminate a whole class of 
possible issues (there are still side channel issues, of course, and 
potential issues with whatever i/o methods it uses).
  Networking was never really integrated into the Unix security model that 
much, and being able to revoke any network access for a process and its 
decendents seems like a basic minimal starting point to even possibly be 
able to address #2.
  #4 has often not been classified as a security issue, but unintended 
sucking of battery life is a DOS attack that can be very significant in 
practice and the control methods needed to deal with it are closely 
related to other security properties.
Fixing that involves defining and limiting what any individual application and application instances can do (in a way relevent to the user, such as this app can only modify files in this particular directory
So you want to associate permissions with programs instead of users.
Which is what setuid(2) gives you without creating a new vector of
things that can have permissions granted to them.  That it's not used
very much suggests to me the "application may do" model is of limited
use.
  setuid doesn't really do most what I am looking for and is clunky at 
what it does do.  True capability systems are one extreme form of 
application based privileges and I think there are some ways that those 
ideas can be useful within an overall more unixy framework.
  It seems to me that one core aspect of the traditional unix model is 
"the privileges of a process or any of its direct decendents will never 
increase" and IMO that seems likely to make a better foundation than a 
true capability system if most code runs with almost no privileges and 
simpler privileged code organizes higher level tasks (this is much more 
easily said than made to work in practice :/).  OTOH, there are already 
multiple ways that things don't quite work that way in practice and it 
seems to me like some such way is needed.  IMO, descriptor passing should 
be the main such method and there should probably be some increased 
ability to pass capabilities via file descriptors (being careful how this 
affects current apps).  OTOH, passing a descriptor should give the 
application the ability to use the descriptor, not have some magical 
effect.
  Describing file privileges in terms of read/write/execute for 
user/group/other also seems fundamental to me; it might be possible to 
tweak that a little (I've wondered if subuser users and groups might make 
sense or some other method of one login user using multiple uids), but any 
major change probably means it is a bad idea to try to run in the same OS 
as apps designed for the current model.  I think it would be possible to 
associate decreased permissions with an application by some other method, 
but not increased.
  Since networking is currently so permisive there is a lot that could be 
done there that would cause current apps to fail in a safe way when run in 
the restrictive environment.  I also think there could be a unified 
privilege delegation model that could assign particular privileges to 
particular uids without breaking the fundamental security model (NetBSD 
already has some ways of doing that), although there are also many failed 
attempts to do this and I don't like any of the more general ones I've 
seen (most of what is called capabilities on unixy systems are trying to 
do this).
  Whatever basic model is used, the main challenge seems to me to be able 
to define privileges in a way that is useful but not annoying to the user 
and can be enforced reliably.  When try 1 at doing this fails it should 
also be possible to make a reasonably safe transition to try 2.  It should 
be possible to have split points in simpler privileged code that can 
choose one method or another such that most code will not have access to 
both methods, although this can easily get complicated.  Some possible 
uses of a dbus type system would need to do this to be safely used with 
current code.
  Things like systrace and SE linux try to apply privilege restriction at 
a level where there are complex interactions between things treated as 
separate privileges.
  I don't think Plan9 directly tried address the issues I mentioned but 
has some ideas that might be helpful.
  Phone oriented OSes seem to be trying various new security models, 
although I don't know much about the details.
  It might make sense to create a basic "server of hardware" via the 
current code base and run a completely different OS with a completely 
different security model in a virtual machine.  OSes with significantly 
different security models that I know about have so far tried to run 
directly on hardware, which makes it very difficult to support enough 
hardware to reach enough potential users to possibly have an impact.
  OTOH, I tend to think it is possible to adapt the current model in a way 
that provides a smooth transition with a configurable level of security 
vs. interoperability with current applications that fails in a safe way. 
Some things that make sense to me to start in that direction are:
1) a disable_network() system call and no_new_file_desciptors() system 
call (and equivalent flags to posix_spawn).  Possibly some other way to 
pass descriptors that doesn't use AF_UNIX.
2) a highly restricted execution environment such that a process basically 
can just use the file descriptors passed to it.  Also, a way to associate 
this with a particular application such that it cannot be accidently run 
outside that restricted environment.  This might need changes to how 
shared libraries are loaded to work.
3) a service framework that can help organize #2 and new shell 
functionality to help organize #2
-Matt


Home | Main Index | Thread Index | Old Index