Messages in this thread Patch in this message | | | Date | Fri, 30 Apr 1999 23:34:25 +0200 | From | Pavel Machek <> | Subject | Capabilities: 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 *) ¬e, + 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] | |