Walter did yo realy go Ohhhh?

Yigal Chripun yigal100 at gmail.com
Fri Jun 20 09:29:30 PDT 2008


Nick Sabalausky wrote:
> "Yigal Chripun" <yigal100 at gmail.com> wrote in message 
> news:g3ekcq$82e$1 at digitalmars.com...
>> Georg Wrede wrote:
>>> Yigal Chripun wrote:
>>>> could you explain please why there's a need for a sandbox in the
>>>> first-place?
>>> OS security protects the system and the other users from you.
>>>
>>> A sandbox protects you yourself from code that's run "as you".
>>>
>>> (That is, protects your files, etc.)
>> I disagree. OS security can and does protect the user's files from code
>> that's run "as the user" <-this is a bad concept.
>>
>> current OSes use ACLs (windows, linux, etc..) and there's nothing
>> stopping you from defining a file to be read only, or non-executable to
>> protect data, and the current practice is to define "users" for deamons
>> in order to protect data. that's why apache runs with user www-data with
>> its own ACL rules. you can achieve perfect security with this scheme if
>> you invest enough time to create a separate "user" for each process.
>> as an example, I can run my browser as a different limited user or use a
>> browser which runs inside a sandbox. I can get the same protection from
>> both but the sandbox solution has more overhead.
>>
>> it's easy to see all the problems with manually defining ACLs.
>> Newer OSes based on the concept of "capabilities" remove all those
>> problems. such OSes give processes defined capabilities unrelated to any
>> concept of a user (the concept of users is defined on top of the
>> capabilities mechanism).
>> Capabilities are basically the same as OOP - simplified example:
>> currently OSes are written in a procedural way, there are global data
>> structures and global system calls. i.e. you print to screen via
>> Stdout(text); in D which just calls in the end the appropriate syscall.
>> in a capabilities based OS, there is no such global syscalls/functions.
>> you need to hold an output instance (a handle in the OS - a Capability)
>> in order to call its print method. only if the process has that instance
>> it can print to the screen. security is implemented via the explicit
>> passing of such instances. so if the program received an output
>> instance, it received the right to print to the screen.
>>
>> No sandboxes/VMs/any other emulation layer is needed.
>>
>> --Yigal
> 
> If I understand all this right, it sounds like this is how it works within 
> the context of browser plugins and applets embedded in a webpage (ie, 
> something like Flash/Java Applet/ActiveX):
> 
> Old (current) way:
> A browser is run as user X. Thus, the browser can do anything user X can do. 
> A browser plugin, by its nature, can do anything the browser can do (read 
> locally stored webpages, read/write cookies cache and browser history, 
> delete everything in /home/userX, etc). So to prevent a malicious webpage 
> from embedding something that...well, acts maliciously, there are two 
> options:
> 
> 1. The browser plugin has to *be* a sandboxing platform like Flash or Java 
> Applets, but unlike ActiveX. This plugin/platform is trusted to not expose 
> unsafe things to the applets running inside of it.
> 
> 2. (Better) The browser sets up a special limited-rights user for 
> plugins/applets (or optionally, one for each plugin/applet, for 
> finer-grained control). The plugin/applet is run as this limited rights 
> user.
> 

yep

> New way:
> Sounds like basically the same thing except replace "user X" with "a few OS 
> handles", and "browser creates 'browserPlugin' user" with "browser 
> selectively passes its own OS handles to the plugins as it sees fit"?

not exactly the same thing. the major difference is this: with
users/roles/groups/rules/ACLs/etc.. the security is separate from the
code. see explanation below.
> 
> And I suppose you configure the OS to grant/disallow these handles in more 
> or less the same way user rights are currently granted? Except they're 
> granted to programs in addition to/instead of users? And I'd assume you'd 
> still need some sort of ACLs so a program can't just go, "Aha! I need to 
> open/save files, so I got a 'write file' handle and a 'read file' handle! 
> Now I can use those handles to read all of the person's private data and 
> overwrite the system files with pictures of potatoes!"
> 
the concept of users in the system is implemented /on top/ of the
Capabilities mechanisms in the kernel (or actually a micro-kernel to be
precise). The Kernel has no concept of users at all, this is all
implemented in user space.
think of it like this: processes on the system are entities that have
certain capabilities. they can exchange those capabilities with each
other. users would be implemented in that system also as entities (of a
different kind) that can have the same capabilities.  This means that
security is implemented at a lower level.

Here's a snippet from the relevant article on wikipedia:

suppose that the user program successfully executes the following statement:

    int fd = open("/etc/passwd", O_RDWR);

The variable fd now contains the index of a file descriptor in the
process's file descriptor table. This file descriptor is a capability.
Its existence in the process's file descriptor table is sufficient to
know that the process does indeed have legitimate access to the object.
A key feature of this arrangement is that the file descriptor table is
in kernel memory and cannot be directly manipulated by the user program.




More information about the Digitalmars-d mailing list