Home | History | Annotate | Download | only in old
      1 /*
      2  * This was written by Andrew G. Morgan <morgan (at) kernel.org>
      3  *
      4  * This is a program that is intended to exec a subsequent program.
      5  * The purpose of this 'execcap' wrapper is to limit the inheritable
      6  * capabilities of the exec()'d program.  All environment variables
      7  * are inherited.
      8  */
      9 
     10 #include <sys/types.h>
     11 #include <errno.h>
     12 #include <stdio.h>
     13 #include <sys/capability.h>
     14 #include <unistd.h>
     15 #include <string.h>
     16 #include <stdlib.h>
     17 
     18 static void usage(void)
     19 {
     20     fprintf(stderr,
     21 "usage: execcap <caps> <command-path> [command-args...]\n\n"
     22 "  This program is a wrapper that can be used to limit the Inheritable\n"
     23 "  capabilities of a program to be executed.  Note, this wrapper is\n"
     24 "  intended to assist in overcoming a lack of support for filesystem\n"
     25 "  capability attributes and should be used to launch other files.\n"
     26 "  This program should _NOT_ be made setuid-0.\n\n"
     27 "[Copyright (c) 1998 Andrew G. Morgan <morgan (at) kernel.org>]\n");
     28 
     29     exit(1);
     30 }
     31 
     32 int main(int argc, char **argv)
     33 {
     34     cap_t new_caps;
     35 
     36     /* this program should not be made setuid-0 */
     37     if (getuid() && !geteuid()) {
     38 	usage();
     39     }
     40 
     41     /* check that we have at least 2 arguments */
     42     if (argc < 3) {
     43 	usage();
     44     }
     45 
     46     /* parse the first argument to obtain a set of capabilities */
     47     new_caps = cap_from_text(argv[1]);
     48     if (new_caps == NULL) {
     49 	fprintf(stderr, "requested capabilities were not recognized\n");
     50 	usage();
     51     }
     52 
     53     /* set these capabilities for the current process */
     54     if (cap_set_proc(new_caps) != 0) {
     55 	fprintf(stderr, "unable to set capabilities: %s\n", strerror(errno));
     56 	usage();
     57     }
     58 
     59     /* exec the program indicated by args 2 ... */
     60     execvp(argv[2], argv+2);
     61 
     62     /* if we fall through to here, our exec failed -- announce the fact */
     63     fprintf(stderr, "Unable to execute command: %s\n", strerror(errno));
     64 
     65     usage();
     66 
     67     return 0;
     68 }
     69