linux-hotplug.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Scott James Remnant <scott@canonical.com>
To: linux-hotplug@vger.kernel.org
Subject: Re: [security] Race condition in udev
Date: Tue, 25 Aug 2009 18:05:23 +0000	[thread overview]
Message-ID: <1251223523.4175.100.camel@quest> (raw)
In-Reply-To: <20090821102407.GA29609@florz.florz.dyndns.org>

[-- Attachment #1: Type: text/plain, Size: 3037 bytes --]

On Tue, 2009-08-25 at 19:31 +0200, Florian Zumbiehl wrote:

> actually, I even explained _how_ this could lead to temporarily wider
> permissions than configured, but let's trace through an example for
> Mr. POSIX:
> 
> Assumption:
> 
>  /dev/foo is configured to be owned by user root, group users, mode 0646.
>  The attacker tries to open /dev/foo for writing as a user that's not
>  root, not a member of the group root, but a member of the group users.
> 
> The Trace:
> 
>   action                     | owner | group | mode    | open(O_WRONLY)?
>  ----------------------------+-------+-------+---------+-----------------
>   mknod(/dev/foo)            | root  | root  | 0644(?) | no
>   chmod(/dev/foo,0646)       | root  | root  | 0646    | yes
>   chown(/dev/foo,root,users) | root  | users | 0646    | no
> 
> Could we now take care of the bug?
> 
Sure, let's invert the chmod() and chown()...

BUT WAIT!

Assumption:

 /dev/foo is configured to be owned by user mrposix, mode 0466.  The
 attacker (mrposix) tries to open /dev/foo for writing.

The Trace:

  action                        | owner   | mode    | open(O_WRONLY)?
  ------------------------------+---------+---------+-----------------
  mknod(/dev/foo)               | root    | 0644    | no
  chown(/dev/foo,mrposix,users) | mrposix | 0644    | yes
  chmod(/dev/foo,0466)          | mrposix | 0466    | no


In other words, exactly the same race.

Since we don't have a chownmod syscall, we have to do this
non-atomically, which means that either there's a race for denying
access for particular users or a race for denying access for particular
groups.


Now, let's put aside for a moment the fact that either of these modes is
insane.  Which of the two attempts to deny access _should_ work?

The surprising answer is that the attempt to deny access to the *user*
is the one that should work (ie. don't change the code), not the attempt
to deny access to a group.


There's a simple reason for this.

A user's uid is fixed, and is a key fact of that user's privilege.  The
only way for "mrposix" to change users is if he was really root in the
first place, or has access to a setuid program.

A user's gid *is not* fixed, in fact, a user may be a member of any one
or more groups at their own choice.  An entry in /etc/passwd
or /etc/groups does not *force* the user into those groups, it simply
grants the user *access* to be a member of those groups.

There are tried, tested and (most importantly) *permitted* methods for a
user to shed group membership.  Since a user can shed their group
membership in this way, they can work around your attempt to restrict
access, and thus grant themselves write access after all.


(This is, in fact, why it's "insane" to deny access using modes; a user
 can always find a way to become *less* privileged, and thus if you're
 trying to deny them access to things, actually gain privilege)

Scott
-- 
Scott James Remnant
scott@canonical.com

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

  parent reply	other threads:[~2009-08-25 18:05 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-08-21 10:24 [security] Race condition in udev Florian Zumbiehl
2009-08-21 11:14 ` Kay Sievers
2009-08-21 11:25 ` Florian Zumbiehl
2009-08-21 11:59 ` Kay Sievers
2009-08-22  0:19 ` Florian Zumbiehl
2009-08-22  2:25 ` Bryan Kadzban
2009-08-22  3:11 ` Florian Zumbiehl
2009-08-25 11:32 ` Florian Zumbiehl
2009-08-25 11:58 ` Scott James Remnant
2009-08-25 12:03 ` Kay Sievers
2009-08-25 12:21 ` Florian Zumbiehl
2009-08-25 12:43 ` Scott James Remnant
2009-08-25 12:55 ` Florian Zumbiehl
2009-08-25 13:11 ` Florian Zumbiehl
2009-08-25 13:31 ` Scott James Remnant
2009-08-25 14:22 ` Florian Zumbiehl
2009-08-25 16:08 ` Scott James Remnant
2009-08-25 16:27 ` Florian Zumbiehl
2009-08-25 16:49 ` Scott James Remnant
2009-08-25 17:31 ` Florian Zumbiehl
2009-08-25 17:42 ` Greg KH
2009-08-25 18:04 ` Robby Workman
2009-08-25 18:05 ` Scott James Remnant [this message]
2009-08-25 18:11 ` Florian Zumbiehl
2009-08-25 18:17 ` Kay Sievers
2009-08-25 18:20 ` Greg KH
2009-08-25 18:21 ` Greg KH
2009-08-25 18:38 ` Florian Zumbiehl
2009-08-25 18:53 ` Florian Zumbiehl
2009-08-25 19:10 ` Greg KH
2009-08-25 19:28 ` Mr POSIX
2009-08-25 21:55 ` Florian Zumbiehl
2009-08-26 11:22 ` Scott James Remnant
2009-08-26 17:41 ` Florian Zumbiehl
2009-08-26 21:00 ` Greg KH
2009-08-27  6:54 ` Matthias Schwarzott
2009-08-27 15:09 ` Florian Zumbiehl
2009-08-27 15:13 ` Florian Zumbiehl
2009-08-27 15:22 ` Greg KH
2009-08-27 15:52 ` Florian Zumbiehl
2009-08-27 16:03 ` Florian Zumbiehl
2009-08-28 17:34 ` Florian Zumbiehl
2009-08-29 14:15 ` Kay Sievers
2009-08-29 14:20 ` Florian Zumbiehl
2009-08-29 14:32 ` Kay Sievers
2009-08-29 14:41 ` Florian Zumbiehl
2009-08-29 14:47 ` Kay Sievers
2009-08-29 14:58 ` Florian Zumbiehl
2009-09-04 19:12 ` Florian Zumbiehl
2009-09-04 19:16 ` Florian Zumbiehl

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=1251223523.4175.100.camel@quest \
    --to=scott@canonical.com \
    --cc=linux-hotplug@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).