|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T i
Length: 3206 (0xc86) Types: TextFile Names: »is_something.c«
└─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen └─⟦3da311d67⟧ »./cops/1.04/cops_104.tar.Z« └─⟦6a2577110⟧ └─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen └─⟦6a2577110⟧ »./cops/1.04/cops_104.tar« └─⟦this⟧ »cops_104/src/is_something.c« └─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen └─⟦ed5edc051⟧ »./cops/1.02/cops.102.tar« └─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen └─⟦db60b44f1⟧ »./cops/1.02/cops.102.tar.Z« └─⟦ed5edc051⟧ └─⟦this⟧ »cops/src/is_something.c«
/* Usage: is_xxx [-gv] <filename> This checks determines whether a file is (group or world) writable, readable, or SUID, and returns a 0 if false, 1 if true. The -g option checks for group status, the -v option prints out the result as well. Permissions bits: vvv--- Permission bits 1 = execute 00000 2 = writable ^ 4 = readable + Setuid bits Setuid bits: 1 = sticky 2 = set group id 4 = set user od Pete Shipley (shipley@mica.berkeley.edu) gutted my original code, made in cleaner and smarter, and combined everything into one compact file. What a deal, huh? Then I came along and beat up his code and made it look ugly again (I changed the is_writeable option to return true if _any_ parent directories are writable, not just the target. So you can blame me if you want. Better yet, just send me a patch if I blew it.) */ #include <sys/types.h> #include <sys/stat.h> #ifdef SETUID #define G_TEST 02000 /* set group id */ #define W_TEST 04000 /* set user id */ #define G_REPORT_STRING "%s is set gid\n" #define W_REPORT_STRING "%s is set uid\n" #endif SETUID #ifdef READABLE #define G_TEST 00040 /* group readable */ #define W_TEST 00004 /* world readable */ #define G_REPORT_STRING "%s is group readable\n" #define W_REPORT_STRING "%s is world readable\n" #endif READABLE #ifdef WRITABLE #define G_TEST 00020 /* group writable */ #define W_TEST 00002 /* world writable */ #define G_REPORT_STRING "%s is group writable\n" #define W_REPORT_STRING "%s is world writable\n" #endif WRITABLE main(argc,argv) int argc; char **argv; { register int group = 0, verbose = 0, xmode; static struct stat statb; /* check out arguments */ if (argc < 2) { (void) printf("Usage: %s [-gv] file\n",argv[0]); exit(0); } /* parse arguments */ if (argc > 2) { while (argv[1][0] == '-' && argv[1][1] != '\0') { if (argv[1][1] == 'g') { group++; argv++; } if (argv[1][1] == 'v') { verbose++; argv++; } } } /* get stats on file in question */ if (stat(*++argv,&statb) < 0) { perror(*argv); exit(2); } /* the write stuff, so to speak... What I'm doing in this mess is to parse the file in question, check out whole path; 'cause if anything is world writable, you can compromise. */ #ifdef WRITABLE { char foo_dirs[256][256]; /* 256 levels of dirs, max len each 256 chars */ char *foo_file; int i = 0, j; foo_file = *argv; strcpy(foo_dirs[i++], foo_file); j=strlen(foo_file) - 1; do { if (foo_file[j] == '/') strncpy(foo_dirs[i++], foo_file, j); } while (--j > 0); for (j = 0; j < i; j++) { if (stat(foo_dirs[j],&statb) < 0) continue; else if (!group) { if (statb.st_mode & W_TEST) exit(0); } else if (statb.st_mode & G_TEST) exit(0); } exit(1); } #endif WRITABLE /* test premissions on file in question */ if (group) { xmode = statb.st_mode & G_TEST; } else { xmode = statb.st_mode & W_TEST; } /* report finding */ if(verbose && xmode) { (void) printf( (group ? G_REPORT_STRING : W_REPORT_STRING), *argv); } exit(!xmode); }