crux-musl

Unnamed repository; edit this file 'description' to name the repository.
git clone https://codeberg.org/emmett1/crux-musl
Log | Files | Refs | README | LICENSE

busybox-suidwrapper.c (1454B)


      1 #include <unistd.h>
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 #include <string.h>
      5 #include <libgen.h>
      6 
      7 int main(int argc, char **argv)
      8 {
      9     const char * cmds[] = {
     10         "su",
     11         "ping",
     12         "ping6",
     13         "traceroute",
     14         "passwd",
     15         "login",
     16         "vlock",
     17         "wall"
     18     };
     19 
     20     const char * baseexec = basename(argv[0]);
     21 
     22     if (!strcmp("busybox-suidwrapper", baseexec))
     23     {
     24         if (argc > 1 && !strcmp("-l", argv[1])){
     25           for (int i = 0; i < sizeof(cmds) / sizeof(cmds[0]); ++i)
     26           {
     27             printf("%s ", cmds[i]);
     28           }
     29           printf("\n");
     30         } else {
     31           printf("busybox SUID wrapper\n\nSupported commands:\n");
     32           printf("Usage:\n -l\tList available SUID commands\n");
     33           if (argc > 1) return 1;
     34         }
     35         return 0;
     36     }
     37 
     38     for (int i = 0; i < sizeof(cmds) / sizeof(cmds[0]); ++i)
     39     {
     40         if (!strcmp(cmds[i], baseexec))
     41         {
     42             char **newargv = malloc(sizeof(char *) * (argc + 2));
     43             newargv[0] = "/bin/busybox";
     44             newargv[1] = (char *)baseexec;
     45             for (int i = 1; i < argc; i++)
     46                 newargv[i + 1] = argv[i];
     47             newargv[argc + 1] = NULL;
     48 
     49             int ret = execv("/bin/busybox", newargv);
     50             free(newargv);
     51             perror(argv[0]);
     52             return ret;
     53         }
     54     }
     55     fprintf(stderr, "%s","error: command not in suid whitelist!\n");
     56     return 1;
     57 }