Re: problem with capabilities inheritance and auditing in python

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

 



On Tue, Feb 10, 2009 at 3:38 PM, Serge E. Hallyn <serue@xxxxxxxxxx> wrote:
> Quoting Xavier Toth (txtoth@xxxxxxxxx):
>> On Tue, Feb 10, 2009 at 2:33 PM, Stephen Smalley <sds@xxxxxxxxxxxxx> 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@xxxxxxxxxx> wrote:
>> >> > Quoting Xavier Toth (txtoth@xxxxxxxxx):
>> >> >> 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
>

You're right 'setcap cap_audit_write=p audit-wrapper' is sufficient.

Ted

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

[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux