lkml.org 
[lkml]   [1999]   [May]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectCapabilities: ALPHA time
    Hi!

    Capabilities reached state where they are actually usefull. (I was
    able to lower permissions for programs like ping and rlogin). There
    are still some problems with headers (I include
    /usr/src/linux/include/linux/capability.h directly -- that's ugly),
    and there are problems with applications which do getuid() and then
    print failed - must be run as root when they actually do not need root
    at all (fping). Diff against kernel follows, and diff against
    http://www.goop.org/~jeremy/elf-caps.html follows, too (Jeremy, please
    apply at least parts which look clean to you).

    Pavel

    PS: I'd like this "obviously right" patch go in as soon as possible
    [well perhaps modulo "FLE" ugliness and modulo one printk], so please
    take a carefull look.

    --- clean/include/linux/elf.h Thu Jun 25 17:38:14 1998
    +++ linux/include/linux/elf.h Mon Apr 19 22:11:31 1999
    @@ -496,6 +496,39 @@
    Elf32_Word n_type; /* Content type */
    } Elf64_Nhdr;

    +/* Capabilities support
    + */
    +struct elf_capabilities {
    + Elf32_Word signature;
    + Elf32_Word version; /* Currently 0, this is so that you can append on the end painlessly */
    + Elf32_Word flags;
    +#define ECF_MAKE_EUID_UID 1
    +#define ECF_MAKE_EUID_XUID 2
    + Elf32_Word xuid;
    + Elf32_Word effective;
    + Elf32_Word effective1;
    + Elf32_Word effective2;
    + Elf32_Word effective3;
    + Elf32_Word permitted;
    + Elf32_Word permitted1;
    + Elf32_Word permitted2;
    + Elf32_Word permitted3;
    + Elf32_Word inheritable;
    + Elf32_Word inheritable1;
    + Elf32_Word inheritable2;
    + Elf32_Word inheritable3;
    + Elf32_Word known;
    + Elf32_Word known1;
    + Elf32_Word known2;
    + Elf32_Word known3;
    +};
    +
    +struct elf_capabilities_note {
    + Elf32_Nhdr notehdr;
    + __u32 note_signature; /* == "CAPS" */
    + struct elf_capabilities cap;
    +};
    +
    #if ELF_CLASS == ELFCLASS32

    extern Elf32_Dyn _DYNAMIC [];
    --- clean/fs/binfmt_elf.c Fri Mar 26 17:46:23 1999
    +++ linux/fs/binfmt_elf.c Fri Apr 30 22:59:40 1999
    @@ -7,6 +7,7 @@
    * Tools".
    *
    * Copyright 1993, 1994: Eric Youngdale (ericy@cais.com).
    + * Capabilities copyright 1999 Pavel Machek (pavel@ucw.cz).
    */

    #include <linux/module.h>
    @@ -425,8 +426,11 @@

    retval = -ENOEXEC;
    /* First of all, some simple consistency checks */
    - if (elf_ex.e_ident[0] != 0x7f ||
    - strncmp(&elf_ex.e_ident[1], "ELF", 3) != 0)
    + if (elf_ex.e_ident[0] != 0x7f)
    + goto out;
    +
    + if (strncmp(&elf_ex.e_ident[1], "ELF", 3) &&
    + strncmp(&elf_ex.e_ident[1], "FLE", 3))
    goto out;

    if (elf_ex.e_type != ET_EXEC && elf_ex.e_type != ET_DYN)
    @@ -473,6 +477,35 @@
    end_data = 0;

    for (i = 0; i < elf_ex.e_phnum; i++) {
    + if (elf_ppnt->p_type == PT_NOTE) {
    + struct elf_capabilities_note note;
    +
    + retval = read_exec(bprm->dentry, elf_ppnt->p_offset,
    + (void *) &note,
    + sizeof (struct elf_capabilities_note), 1);
    + if (retval<0)
    + goto out_free_ph;
    + if (note.note_signature != be32_to_cpu(0x43415053)) /* "CAPS" */
    + continue;
    +
    + retval = -ENOEXEC;
    + if (note.cap.signature != 0xca5ab1e) {
    + printk( "signature = %x, version = %x, header @ %x\n", note.cap.signature, note.cap.version, elf_ppnt->p_offset );
    + goto out_free_ph;
    + }
    + if (note.cap.flags & ECF_MAKE_EUID_UID) /* You may want to loose owner's uid */
    + bprm->e_uid = current->uid;
    + if (!bprm->e_uid) { /* We only honour random uid changes for root */
    + if (note.cap.flags & ECF_MAKE_EUID_XUID)
    + bprm->e_uid = note.cap.xuid;
    + }
    + cap_mask( bprm->cap_effective, note.cap.effective );
    + cap_mask( bprm->cap_permitted, note.cap.permitted );
    + cap_mask( bprm->cap_inheritable, note.cap.inheritable );
    +
    + printk( KERN_DEBUG "Now: uid = %d, effective = %x, permitted = %x, inheritable = %x\n", bprm->e_uid, bprm->cap_effective, bprm->cap_permitted, bprm->cap_inheritable );
    +
    + }
    if (elf_ppnt->p_type == PT_INTERP) {
    retval = -EINVAL;
    if (elf_interpreter)

    --
    I'm really pavel@atrey.karlin.mff.cuni.cz. Pavel
    Look at http://atrey.karlin.mff.cuni.cz/~pavel/ ;-).[unhandled content-type:application/x-gzip]
    \
     
     \ /
      Last update: 2005-03-22 13:51    [W:0.023 / U:0.684 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site