diff options
author | peter <peter@FreeBSD.org> | 2008-08-28 02:25:51 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2008-08-28 02:25:51 +0000 |
commit | ea50d71feb02a78d4d5fa746a26ca7ddc6e8cb19 (patch) | |
tree | daf40952cf309641cc6c7d987989fd2abce2d758 /sendmail/test/t_setuid.c | |
parent | a2b986fa722f9860a6c56bb5cc724b7e2937d1b7 (diff) | |
download | FreeBSD-src-ea50d71feb02a78d4d5fa746a26ca7ddc6e8cb19.zip FreeBSD-src-ea50d71feb02a78d4d5fa746a26ca7ddc6e8cb19.tar.gz |
Stage 1 of sendmail dist tree flattening. contrib/sendmail/contrib
prevents doing this in one pass.
Diffstat (limited to 'sendmail/test/t_setuid.c')
-rw-r--r-- | sendmail/test/t_setuid.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/sendmail/test/t_setuid.c b/sendmail/test/t_setuid.c new file mode 100644 index 0000000..6533339 --- /dev/null +++ b/sendmail/test/t_setuid.c @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2001 Sendmail, Inc. and its suppliers. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the sendmail distribution. + * + */ + +/* +** This program checks to see if your version of setuid works. +** Compile it, make it set-user-ID root, and run it as yourself (NOT as +** root). +** +** NOTE: This should work everywhere, but Linux has the ability +** to use the undocumented setcap() call to make this break. +** +** Compilation is trivial -- just "cc t_setuid.c". Make it set-user-ID, +** root and then execute it as a non-root user. +*/ + +#include <sys/types.h> +#include <unistd.h> +#include <stdio.h> + +#ifndef lint +static char id[] = "@(#)$Id: t_setuid.c,v 8.7 2001/09/23 03:35:41 ca Exp $"; +#endif /* ! lint */ + +static void +printuids(str, r, e) + char *str; + uid_t r, e; +{ + printf("%s (should be %d/%d): r/euid=%d/%d\n", str, (int) r, (int) e, + (int) getuid(), (int) geteuid()); +} + +int +main(argc, argv) + int argc; + char **argv; +{ + int fail = 0; + uid_t realuid = getuid(); + + printuids("initial uids", realuid, 0); + + if (geteuid() != 0) + { + printf("SETUP ERROR: re-run set-user-ID root\n"); + exit(1); + } + + if (getuid() == 0) + { + printf("SETUP ERROR: must be run by a non-root user\n"); + exit(1); + } + + if (setuid(1) < 0) + printf("setuid(1) failure\n"); + printuids("after setuid(1)", 1, 1); + + if (geteuid() != 1) + { + fail++; + printf("MAYDAY! Wrong effective uid\n"); + } + + if (getuid() != 1) + { + fail++; + printf("MAYDAY! Wrong real uid\n"); + } + + + /* do activity here */ + if (setuid(0) == 0) + { + fail++; + printf("MAYDAY! setuid(0) succeeded (should have failed)\n"); + } + else + { + printf("setuid(0) failed (this is correct)\n"); + } + printuids("after setuid(0)", 1, 1); + + if (geteuid() != 1) + { + fail++; + printf("MAYDAY! Wrong effective uid\n"); + } + if (getuid() != 1) + { + fail++; + printf("MAYDAY! Wrong real uid\n"); + } + printf("\n"); + + if (fail) + { + printf("\nThis system cannot use setuid (maybe use setreuid)\n"); + exit(1); + } + + printf("\nIt is safe to use setuid on this system\n"); + exit(0); +} |