Re: Keyrings, user namespaces and the user_struct

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

 



On Tue, Oct 25, 2016 at 11:17 AM, Jann Horn <jann@xxxxxxxxx> wrote:
> On Tue, Oct 25, 2016 at 11:05:08AM -0700, James Bottomley wrote:
>> On Tue, 2016-10-25 at 19:06 +0200, Jann Horn wrote:
>> > On Tue, Oct 25, 2016 at 09:56:45AM -0700, James Bottomley wrote:
>> > > On Tue, 2016-10-25 at 17:53 +0100, David Howells wrote:
>> > > > David Howells <dhowells@xxxxxxxxxx> wrote:
>> > > >
>> > > > >  (2) If a process's user_namespace doesn't match that recorded
>> > > > > in a
>> > > > > key then
>> > > > >      it gets ENOKEY if it tries to refer to it or access it and
>> > > > > can't see it
>> > > > >      in /proc/keys.
>> > > >
>> > > > There's another possibility here - since user_namespaces are
>> > > > hierarchical, does it make sense to let a process see keys that
>> > > > are
>> > > > in an ancestral namespace?
>> > >
>> > > I think that should be the decision of the owner.  If you're
>> > > creating a
>> > > userns to de-privilege the next user, likely you don't want this,
>> > > but
>> > > if you're creating a userns to enhance it, then you do.
>> > >
>> > > I think you want to behave exactly as the mount namespace does: on
>> > > initial clone, you get a fully cloned mount tree and then you
>> > > customise
>> > > it by unmounting pieces.
>> >
>> > The issue with keys is that their interface is pretty broken when
>> > exposed to user namespaces with different UID mappings, and this also
>> > causes security issues where you can get access to other users'
>> > keyrings and stuff like that. The proposed fix works around that
>> > brokenness by simply never exposing keys to other namespaces.
>>
>> Define how ... we can fix the keyring interface if it's hugely
>> problematic.
>
> See http://lkml.iu.edu/hypermail/linux/kernel/1606.2/06794.html .
> Here's a copy of my explanation in that message:
>
> | Not just questionable, completely wrong. The gist is that there is a
> | *global* name -> key mapping for accessing keys by name, and user
> | keyrings are stored in there under the name "_uid.%u", where %u
> | refers to the *namespaced* UID. (See install_user_keyrings().)
> | The result is that, if e.g. the user with UID 1000 has no running
> | processes, a local attacker can enter a new user namespace, map UID
> | 1000 in the namespace to some KUID he controls, do
> | setresuid(1000, 1000, 1000), and now he owns user 1000's keyring.
> | This ends up permitting the attacker to dump the contents of KUID
> | 1000's keys after KUID 1000 signs in. I discovered this while going
> | through the kuid->uid conversions when I thought about writing this
> | feature the first time.

I found this issue, too, several years ago. ;-/

Can we use the namespacing of keys as an opportunity to fix things
like this?  Perhaps we could simply *remove* the concept of named keys
and keyrings.
_______________________________________________
Containers mailing list
Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linuxfoundation.org/mailman/listinfo/containers



[Index of Archives]     [Cgroups]     [Netdev]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux