timedir_is_good = 1; /* now there's an assumption for ya... */
+ /* become root */
+ be_root();
/*
* walk through the path one directory at a time
}
}
+ /* relinquish root */
+ be_user();
+
return (timestamp_is_old);
}
{
register int fd;
+ /* become root */
+ be_root();
+
if (timedir_is_good) {
unlink(timestampfile_p);
if ((fd = open(timestampfile_p, O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0)
perror("update_timestamp: open");
close(fd);
}
+
+ /* relinquish root */
+ be_user();
}
exit(1);
}
#ifdef __svr4__
+ be_root();
if ((spw_ent = getspnam(pw_ent->pw_name)) == NULL) {
(void) sprintf(user, "%u", uid);
log_error(GLOBAL_NO_PW_ENT);
inform_user(GLOBAL_NO_PW_ENT);
exit(1);
}
+ be_user();
encrypted = spw_ent -> sp_pwdp;
#else
encrypted = pw_ent -> pw_passwd;
syslog(pri, logline);
closelog();
#else
+ /* become root */
+ be_root();
+
if ((fp = fopen(LOGFILE, "a")) == NULL) {
(void) sprintf(logline, "Can\'t open log file: %s", LOGFILE);
send_mail();
(void) fprintf(fp, "%s\n", logline);
(void) fclose(fp);
}
+
+ /* relinquish root */
+ be_user();
#endif
}
int fd[2];
char buf[MAXLOGLEN + 1024];
+ /* become root for find_path() */
+ be_root();
+
if ((mailer = find_path(mailer)) == NULL) {
(void) fprintf(stderr, "%s not found\n", mailer);
exit(1);
}
+
+ /* relinquish root */
+ be_user();
+
+ /* catch children as they die */
(void) signal(SIGCHLD, reapchild);
if (fork())
/*
* we don't want any security problems ...
*/
- if (setuid(uid)) {
- perror("setuid(uid)");
- exit(1);
- }
+ be_full_user();
+
(void) signal(SIGHUP, SIG_IGN);
(void) signal(SIGINT, SIG_IGN);
(void) signal(SIGQUIT, SIG_IGN);
FILE *sudoers_fp;
int i, return_code;
+ /* become root */
+ be_root();
+
if ((sudoers_fp = fopen(SUDOERS, "r")) == NULL) {
perror(SUDOERS);
log_error(NO_SUDOERS_FILE);
*/
(void) fclose(sudoers_fp);
+ /* relinquish root */
+ be_user();
+
/*
* if a parsing error occurred, set return_code accordingly
*/
load_globals(); /* load the user host cmnd and uid variables */
+ /*
+ * We only want to be root when we absolutely need it.
+ * This will effectively do setreuid(0, uid) but for portability...
+ */
+ be_root();
+ be_user();
+
clean_envp(envp); /* build Envp based on envp (w/o LD_*) */
rtn = validate();
case VALIDATE_OK:
check_user();
log_error(ALL_SYSTEMS_GO);
- if (setuid(0)) {
- perror("setuid(0)");
- exit(1);
- }
+ be_root();
execve(cmnd, &Argv[1], Envp);
- perror(cmnd);
+ perror(cmnd); /* execve() failed! */
+ exit(-1);
break;
case VALIDATE_NO_USER:
case VALIDATE_ERROR:
default:
log_error(rtn);
- if (setuid(uid)) {
- perror("setuid(uid)");
- exit(1);
- }
+ be_full_user();
inform_user(rtn);
exit(1);
break;
}
-
- /*
- * If we get here it's an error (execve failed)
- */
- return (-1);
}
* loading the cmnd global variable from argv[1]
*/
strncpy(path, Argv[1], MAXPATHLEN)[MAXPATHLEN] = 0;
+ /* become root for find_path() only */
+ be_root();
cmnd = find_path(path); /* get the absolute path */
+ be_user();
if (cmnd == NULL) {
(void) fprintf(stderr, "%s: %s: command not found\n", Argv[0], Argv[1]);
exit(1);
*tenvp = NULL;
}
+
+
+
+/**********************************************************************
+ *
+ * be_root()
+ *
+ * this function sets the real and effective uids to 0
+ */
+
+void be_root()
+{
+ if (setuid(0)) {
+ perror("setuid(0)");
+ exit(1);
+ }
+}
+
+
+
+/**********************************************************************
+ *
+ * be_user()
+ *
+ * this function sets the effective uid to the value of uid
+ */
+
+void be_user()
+{
+ if (seteuid(uid)) {
+ perror("seteuid(uid)");
+ exit(1);
+ }
+}
+
+
+
+/**********************************************************************
+ *
+ * be_full_user()
+ *
+ * this function sets the real and effective uids to the value of uid
+ * since our euid is probably already uid we need to setuid(0) first
+ */
+
+void be_full_user()
+{
+ if (setuid(0)) {
+ perror("setuid(0)");
+ exit(1);
+ }
+ if (setuid(uid)) {
+ perror("setuid(uid)");
+ exit(1);
+ }
+}
void check_user();
void clean_envp();
int validate();
+void be_root();
+void be_user();
+void be_full_user();
/* Most of these variables are declared in main() so they don't need
* to be extern'ed here if this is main...
*/
#ifdef hpux
#define getdtablesize() (sysconf(_SC_OPEN_MAX))
+#define seteuid(__EUID) (setresuid((uid_t)-1, __EUID, (uid_t)-1))
#ifndef USE_CWD
#define USE_CWD
#endif /* USE_CWD */