فهرست منبع

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 سال پیش
والد
کامیت
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_arg_list *defaults=NULL;
 	np_ini_info i;
 	np_ini_info i;
 	struct stat fstat;
 	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);
 	parse_locator(locator, default_section, &i);
 	/* If a file was specified or if we're using the default file. */
 	/* 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);
 	if (i.file != NULL) free(i.file);
 	free(i.stanza);
 	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;
 	return defaults;
 }
 }