1c2aa98e2SPeter Wemm /* 2*5dd76dd0SGregory Neil Shapiro * Copyright (c) 1999-2001 Proofpoint, Inc. and its suppliers. 340266059SGregory Neil Shapiro * All rights reserved. 440266059SGregory Neil Shapiro * 540266059SGregory Neil Shapiro * By using this file, you agree to the terms and conditions set 640266059SGregory Neil Shapiro * forth in the LICENSE file which can be found at the top level of 740266059SGregory Neil Shapiro * the sendmail distribution. 840266059SGregory Neil Shapiro * 940266059SGregory Neil Shapiro */ 1040266059SGregory Neil Shapiro 1140266059SGregory Neil Shapiro /* 12c2aa98e2SPeter Wemm ** This program checks to see if your version of seteuid works. 1340266059SGregory Neil Shapiro ** Compile it, make it set-user-ID root, and run it as yourself (NOT as 14c2aa98e2SPeter Wemm ** root). If it won't compile or outputs any MAYDAY messages, don't 15c2aa98e2SPeter Wemm ** define USESETEUID in conf.h. 16c2aa98e2SPeter Wemm ** 17c2aa98e2SPeter Wemm ** NOTE: It is not sufficient to have seteuid in your library. 18c2aa98e2SPeter Wemm ** You must also have saved uids that function properly. 19c2aa98e2SPeter Wemm ** 2040266059SGregory Neil Shapiro ** Compilation is trivial -- just "cc t_seteuid.c". Make it set-user-ID 21c2aa98e2SPeter Wemm ** root and then execute it as a non-root user. 22c2aa98e2SPeter Wemm */ 23c2aa98e2SPeter Wemm 24c2aa98e2SPeter Wemm #include <sys/types.h> 25c2aa98e2SPeter Wemm #include <unistd.h> 26c2aa98e2SPeter Wemm #include <stdio.h> 27c2aa98e2SPeter Wemm 2806f25ae9SGregory Neil Shapiro #ifndef lint 29*5dd76dd0SGregory Neil Shapiro static char id[] = "@(#)$Id: t_seteuid.c,v 8.9 2013/11/22 20:52:01 ca Exp $"; 3006f25ae9SGregory Neil Shapiro #endif /* ! lint */ 3106f25ae9SGregory Neil Shapiro 32c2aa98e2SPeter Wemm #ifdef __hpux 33c2aa98e2SPeter Wemm # define seteuid(e) setresuid(-1, e, -1) 3406f25ae9SGregory Neil Shapiro #endif /* __hpux */ 35c2aa98e2SPeter Wemm 3606f25ae9SGregory Neil Shapiro static void 3706f25ae9SGregory Neil Shapiro printuids(str, r, e) 3806f25ae9SGregory Neil Shapiro char *str; 3940266059SGregory Neil Shapiro uid_t r, e; 4006f25ae9SGregory Neil Shapiro { 4140266059SGregory Neil Shapiro printf("%s (should be %d/%d): r/euid=%d/%d\n", str, (int) r, (int) e, 4240266059SGregory Neil Shapiro (int) getuid(), (int) geteuid()); 4306f25ae9SGregory Neil Shapiro } 4406f25ae9SGregory Neil Shapiro 4506f25ae9SGregory Neil Shapiro int 4606f25ae9SGregory Neil Shapiro main(argc, argv) 4706f25ae9SGregory Neil Shapiro int argc; 4806f25ae9SGregory Neil Shapiro char **argv; 49c2aa98e2SPeter Wemm { 50c2aa98e2SPeter Wemm int fail = 0; 51c2aa98e2SPeter Wemm uid_t realuid = getuid(); 52c2aa98e2SPeter Wemm 53c2aa98e2SPeter Wemm printuids("initial uids", realuid, 0); 54c2aa98e2SPeter Wemm 55c2aa98e2SPeter Wemm if (geteuid() != 0) 56c2aa98e2SPeter Wemm { 5740266059SGregory Neil Shapiro printf("SETUP ERROR: re-run set-user-ID root\n"); 58c2aa98e2SPeter Wemm exit(1); 59c2aa98e2SPeter Wemm } 60c2aa98e2SPeter Wemm 61c2aa98e2SPeter Wemm if (getuid() == 0) 62c2aa98e2SPeter Wemm { 63c2aa98e2SPeter Wemm printf("SETUP ERROR: must be run by a non-root user\n"); 64c2aa98e2SPeter Wemm exit(1); 65c2aa98e2SPeter Wemm } 66c2aa98e2SPeter Wemm 67c2aa98e2SPeter Wemm if (seteuid(1) < 0) 68c2aa98e2SPeter Wemm printf("seteuid(1) failure\n"); 69c2aa98e2SPeter Wemm printuids("after seteuid(1)", realuid, 1); 70c2aa98e2SPeter Wemm 71c2aa98e2SPeter Wemm if (geteuid() != 1) 72c2aa98e2SPeter Wemm { 73c2aa98e2SPeter Wemm fail++; 74c2aa98e2SPeter Wemm printf("MAYDAY! Wrong effective uid\n"); 75c2aa98e2SPeter Wemm } 76c2aa98e2SPeter Wemm 77c2aa98e2SPeter Wemm /* do activity here */ 78c2aa98e2SPeter Wemm 79c2aa98e2SPeter Wemm if (seteuid(0) < 0) 80c2aa98e2SPeter Wemm { 81c2aa98e2SPeter Wemm fail++; 82c2aa98e2SPeter Wemm printf("seteuid(0) failure\n"); 83c2aa98e2SPeter Wemm } 84c2aa98e2SPeter Wemm printuids("after seteuid(0)", realuid, 0); 85c2aa98e2SPeter Wemm 86c2aa98e2SPeter Wemm if (geteuid() != 0) 87c2aa98e2SPeter Wemm { 88c2aa98e2SPeter Wemm fail++; 89c2aa98e2SPeter Wemm printf("MAYDAY! Wrong effective uid\n"); 90c2aa98e2SPeter Wemm } 91c2aa98e2SPeter Wemm if (getuid() != realuid) 92c2aa98e2SPeter Wemm { 93c2aa98e2SPeter Wemm fail++; 94c2aa98e2SPeter Wemm printf("MAYDAY! Wrong real uid\n"); 95c2aa98e2SPeter Wemm } 96c2aa98e2SPeter Wemm printf("\n"); 97c2aa98e2SPeter Wemm 98c2aa98e2SPeter Wemm if (seteuid(2) < 0) 99c2aa98e2SPeter Wemm { 100c2aa98e2SPeter Wemm fail++; 101c2aa98e2SPeter Wemm printf("seteuid(2) failure\n"); 102c2aa98e2SPeter Wemm } 103c2aa98e2SPeter Wemm printuids("after seteuid(2)", realuid, 2); 104c2aa98e2SPeter Wemm 105c2aa98e2SPeter Wemm if (geteuid() != 2) 106c2aa98e2SPeter Wemm { 107c2aa98e2SPeter Wemm fail++; 108c2aa98e2SPeter Wemm printf("MAYDAY! Wrong effective uid\n"); 109c2aa98e2SPeter Wemm } 110c2aa98e2SPeter Wemm 111c2aa98e2SPeter Wemm /* do activity here */ 112c2aa98e2SPeter Wemm 113c2aa98e2SPeter Wemm if (seteuid(0) < 0) 114c2aa98e2SPeter Wemm { 115c2aa98e2SPeter Wemm fail++; 116c2aa98e2SPeter Wemm printf("seteuid(0) failure\n"); 117c2aa98e2SPeter Wemm } 118c2aa98e2SPeter Wemm printuids("after seteuid(0)", realuid, 0); 119c2aa98e2SPeter Wemm 120c2aa98e2SPeter Wemm if (geteuid() != 0) 121c2aa98e2SPeter Wemm { 122c2aa98e2SPeter Wemm fail++; 123c2aa98e2SPeter Wemm printf("MAYDAY! Wrong effective uid\n"); 124c2aa98e2SPeter Wemm } 125c2aa98e2SPeter Wemm if (getuid() != realuid) 126c2aa98e2SPeter Wemm { 127c2aa98e2SPeter Wemm fail++; 128c2aa98e2SPeter Wemm printf("MAYDAY! Wrong real uid\n"); 129c2aa98e2SPeter Wemm } 130c2aa98e2SPeter Wemm 131c2aa98e2SPeter Wemm if (fail) 132c2aa98e2SPeter Wemm { 133c2aa98e2SPeter Wemm printf("\nThis system cannot use seteuid\n"); 134c2aa98e2SPeter Wemm exit(1); 135c2aa98e2SPeter Wemm } 136c2aa98e2SPeter Wemm 137c2aa98e2SPeter Wemm printf("\nIt is safe to define USESETEUID on this system\n"); 138c2aa98e2SPeter Wemm exit(0); 139c2aa98e2SPeter Wemm } 140