All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Serge E. Hallyn" <serue@us.ibm.com>
To: Xavier Toth <txtoth@gmail.com>
Cc: Stephen Smalley <sds@tycho.nsa.gov>,
	SELinux List <selinux@tycho.nsa.gov>
Subject: Re: problem with capabilities inheritance and auditing in python
Date: Tue, 10 Feb 2009 15:38:46 -0600	[thread overview]
Message-ID: <20090210213846.GB11776@us.ibm.com> (raw)
In-Reply-To: <cadfc0e40902101259q2c781ewa7056fad53beffb@mail.gmail.com>

Quoting Xavier Toth (txtoth@gmail.com):
> On Tue, Feb 10, 2009 at 2:33 PM, Stephen Smalley <sds@tycho.nsa.gov> wrote:
> > On Tue, 2009-02-10 at 14:20 -0600, Xavier Toth wrote:
> >> On Tue, Feb 10, 2009 at 12:34 PM, Serge E. Hallyn <serue@us.ibm.com> wrote:
> >> > Quoting Xavier Toth (txtoth@gmail.com):
> >> >> I was not putting capabilities on the script but rather on a compiled
> >> >> wrapper which execs a python script in which I need to do auditing.
> >> >> Will this not work?
> >> >
> >> > No, because of the way capabilities are re-calculated on exec().
> >> >
> >> >        pI' = pI
> >> >        pP' = (X&fP) | (pI & fI)
> >> >        pE' = fE ? pP' : 0
> >> >
> >> > So since the interpreter has fI=fP=fE=0 and is not setuid root (which
> >> > would fill in fP and/or fE to emulate privileged root), pP' and pE' will
> >> > be empty after exec().
> >> >
> >> > Now you could use a wrapper as follows:  Have the wrapper fill pI,
> >> > and then fill fI on the python interpreter.  Any user who has an
> >> > empty pI (which generally is all users) will execute python scripts
> >> > with no privilege, but when the wrapper execs the script, pP' will
> >> > be filled with (pI&fI) = full.
> >> >
> >> > -serge
> >> >
> >>
> >> Thanks for the clarification.
> >> For anyone one that is interested I've included some test code. The
> >> wrapper is a modified version of a wrapper Stephen sent me a link to.
> >> Basic steps to test are:
> >> 1) edit the wrapper to set the path to the audit_test.py script
> >> 2) compiler the wrapper
> >>     gcc -o audit-wrapper audit-wrapper.c -lcap
> >> 3) set the capabilities on the wrapper and python
> >>     setcap cap_audit_write,cap_setfcap=epi audit-wrapper
> >
> > Why cap_setfcap (set file capability)?
> 
> The wrapper adds the 'i' back to cap_audit_write as it goes away when
> audit-wrapper runs.

> I was printing the capabilities in the wrapper for
> debug purposes when I noticed that it capabilities were "=
> cap_audit_write,cap_setfcap+ep". I think without the i cap_audit_write
> can't be inherited by the child process.
> 
> > And do you need to set fI on the wrapper at all, given that it isn't
> > inheriting anything from its caller?
> 
> Without cap_setfcap cap_set_proc fails, without cap_audit_write
> cap_set_proc fails (see cap_set_proc man page).
> 
> >
> >>     setcap cap_audit_write=ei /usr/bin/python
> >
> > Is setting fE required on the interpreter?
> 
> I tried 'i' only it wouldn't work without 'e'.

Right, without 'e' the final exec() will end up with
cap_audit_write in pP' but not pE', so you won't be
able to actually exercise the privilege (without using
cap_set_proc() which I assume python doesn't support).

It's no big deal, but your use of fI still is more liberal
than it needs to be.  The following should suffice:

     setcap cap_audit_write=p audit-wrapper
     setcap cap_audit_write=ei /usr/bin/python

Now anyone running audit-wrapper will get cap_audit_write
in pP', but not be able to exercise it (it's not in pE').
Audit-wrapper can put cap_audit_write into pI because it's
in pP.  Finally, when audit-wrapper execs the python script,
that will run with pP'=pI'=pP'=cap_audit_write.

-serge

--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.

  parent reply	other threads:[~2009-02-10 21:38 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-02-05 17:08 problem with capabilities inheritance and auditing in python Xavier Toth
2009-02-05 18:10 ` Stephen Smalley
2009-02-06 21:56   ` Xavier Toth
2009-02-09 14:02     ` Stephen Smalley
2009-02-09 16:42       ` Xavier Toth
2009-02-09 20:17         ` Stephen Smalley
2009-02-09 20:42           ` Serge E. Hallyn
2009-02-10 17:00             ` Xavier Toth
2009-02-10 18:34               ` Serge E. Hallyn
2009-02-10 20:20                 ` Xavier Toth
2009-02-10 20:33                   ` Stephen Smalley
2009-02-10 20:59                     ` Xavier Toth
2009-02-10 21:08                       ` Stephen Smalley
2009-02-10 21:30                         ` Serge E. Hallyn
2009-02-10 21:38                       ` Serge E. Hallyn [this message]
2009-02-10 21:45                         ` Xavier Toth
2009-02-10 21:25                   ` Stephen Smalley
2009-02-10 21:37                     ` Xavier Toth
2009-02-10 21:38                       ` Stephen Smalley
2009-02-10 21:46                       ` Serge E. Hallyn
2009-02-10 21:44                     ` Serge E. Hallyn

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=20090210213846.GB11776@us.ibm.com \
    --to=serue@us.ibm.com \
    --cc=sds@tycho.nsa.gov \
    --cc=selinux@tycho.nsa.gov \
    --cc=txtoth@gmail.com \
    /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.