xref: /freebsd/contrib/sendmail/test/t_setuid.c (revision e6bfd18d21b225af6a0ed67ceeaf1293b7b9eba5)
1 /*
2  * Copyright (c) 2001 Proofpoint, Inc. and its suppliers.
3  *	All rights reserved.
4  *
5  * By using this file, you agree to the terms and conditions set
6  * forth in the LICENSE file which can be found at the top level of
7  * the sendmail distribution.
8  *
9  */
10 
11 /*
12 **  This program checks to see if your version of setuid works.
13 **  Compile it, make it set-user-ID root, and run it as yourself (NOT as
14 **  root).
15 **
16 **	NOTE:  This should work everywhere, but Linux has the ability
17 **	to use the undocumented setcap() call to make this break.
18 **
19 **  Compilation is trivial -- just "cc t_setuid.c".  Make it set-user-ID,
20 **  root and then execute it as a non-root user.
21 */
22 
23 #include <sys/types.h>
24 #include <unistd.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 
28 #ifndef lint
29 static char id[] = "@(#)$Id: t_setuid.c,v 8.8 2013-11-22 20:52:01 ca Exp $";
30 #endif
31 
32 static void
33 printuids(str, r, e)
34 	char *str;
35 	uid_t r, e;
36 {
37 	printf("%s (should be %d/%d): r/euid=%d/%d\n", str, (int) r, (int) e,
38 	       (int) getuid(), (int) geteuid());
39 }
40 
41 int
42 main(argc, argv)
43 	int argc;
44 	char **argv;
45 {
46 	int fail = 0;
47 	uid_t realuid = getuid();
48 
49 	printuids("initial uids", realuid, 0);
50 
51 	if (geteuid() != 0)
52 	{
53 		printf("SETUP ERROR: re-run set-user-ID root\n");
54 		exit(1);
55 	}
56 
57 	if (getuid() == 0)
58 	{
59 		printf("SETUP ERROR: must be run by a non-root user\n");
60 		exit(1);
61 	}
62 
63 	if (setuid(1) < 0)
64 		printf("setuid(1) failure\n");
65 	printuids("after setuid(1)", 1, 1);
66 
67 	if (geteuid() != 1)
68 	{
69 		fail++;
70 		printf("MAYDAY!  Wrong effective uid\n");
71 	}
72 
73 	if (getuid() != 1)
74 	{
75 		fail++;
76 		printf("MAYDAY!  Wrong real uid\n");
77 	}
78 
79 
80 	/* do activity here */
81 	if (setuid(0) == 0)
82 	{
83 		fail++;
84 		printf("MAYDAY!  setuid(0) succeeded (should have failed)\n");
85 	}
86 	else
87 	{
88 		printf("setuid(0) failed (this is correct)\n");
89 	}
90 	printuids("after setuid(0)", 1, 1);
91 
92 	if (geteuid() != 1)
93 	{
94 		fail++;
95 		printf("MAYDAY!  Wrong effective uid\n");
96 	}
97 	if (getuid() != 1)
98 	{
99 		fail++;
100 		printf("MAYDAY!  Wrong real uid\n");
101 	}
102 	printf("\n");
103 
104 	if (fail)
105 	{
106 		printf("\nThis system cannot use setuid (maybe use setreuid)\n");
107 		exit(1);
108 	}
109 
110 	printf("\nIt is safe to use setuid on this system\n");
111 	exit(0);
112 }
113