Просмотр исходного кода

lib/parse_ini.c - Initial drop privs

Handling the race condition left from suid bins. Moving previous patches from my private copy.
Spenser Reinhardt 11 лет назад
Родитель
Сommit
78d893ba84
1 измененных файлов с 21 добавлено и 0 удалено
  1. 21 0
      lib/parse_ini.c

+ 21 - 0
lib/parse_ini.c

@@ -93,6 +93,19 @@ np_arg_list* np_get_defaults(const char *locator, const char *default_section){
 	np_arg_list *defaults=NULL;
 	np_ini_info i;
 	struct stat fstat;
+	uid_t euid = -1;
+	uid_t egid = -1;
+	bool is_uid_set = false;
+
+	if (getuid() != getuid()) {
+		is_uid_set = true;
+		euid = geteuid();
+		egid = getegid();
+		if (seteuid(getuid()) != 0)
+			die(STATE_UNKNOWN, "%s %s\n", _("Can't drop user permissions."), strerror(errno));
+		if (setegid(getgid()) != 0)
+			die(STATE_UNKNOWN, "%s %s\n", _("Can't drop group permissions."), strerror(errno));
+	}
 
 	parse_locator(locator, default_section, &i);
 	/* If a file was specified or if we're using the default file. */
@@ -123,6 +136,14 @@ np_arg_list* np_get_defaults(const char *locator, const char *default_section){
 
 	if (i.file != NULL) free(i.file);
 	free(i.stanza);
+
+	if (is_uid_set == true) {
+		if (seteuid(euid) != 0)
+			die(STATE_UNKNOWN, "%s %s\n", _("Can't restore user id."), strerror(errno));
+		if (setegid(egid) != 0)
+			die(STATE_UNKNOWN, "%s %s\n", _("Can't restore group id."), strerror(errno));
+	}
+
 	return defaults;
 }