diff options
Diffstat (limited to 'usbmuxd/main.c')
| -rw-r--r-- | usbmuxd/main.c | 32 | 
1 files changed, 30 insertions, 2 deletions
| diff --git a/usbmuxd/main.c b/usbmuxd/main.c index 3318ecd..ea332a4 100644 --- a/usbmuxd/main.c +++ b/usbmuxd/main.c @@ -34,6 +34,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  #include <sys/un.h>  #include <sys/stat.h>  #include <getopt.h> +#include <pwd.h>  #include "log.h"  #include "usb.h" @@ -47,6 +48,7 @@ struct sigaction sa_old;  static int verbose = 0;  static int foreground = 0; +static int drop_privileges = 0;  int create_socket(void) {  	struct sockaddr_un bind_addr; @@ -222,6 +224,7 @@ static void usage()  	printf("\t-h|--help                 Print this message.\n");  	printf("\t-v|--verbose              Be verbose (use twice or more to increase).\n");  	printf("\t-f|--foreground           Do not daemonize (implies a verbosity of 4).\n"); +	printf("\t-d|--drop-privileges      Drop privileges after startup.\n");  	printf("\n");  } @@ -231,12 +234,13 @@ static void parse_opts(int argc, char **argv)  		{"help", 0, NULL, 'h'},  		{"foreground", 0, NULL, 'f'},  		{"verbose", 0, NULL, 'v'}, +		{"drop-privileges", 0, NULL, 'd'},  		{NULL, 0, NULL, 0}  	};  	int c;  	while (1) { -		c = getopt_long(argc, argv, "hfv", longopts, (int *) 0); +		c = getopt_long(argc, argv, "hfvd", longopts, (int *) 0);  		if (c == -1) {  			break;  		} @@ -251,6 +255,9 @@ static void parse_opts(int argc, char **argv)  		case 'v':  			++verbose;  			break; +		case 'd': +			drop_privileges = 1; +			break;  		default:  			usage();  			exit(2); @@ -304,7 +311,28 @@ int main(int argc, char *argv[])  			exit(EXIT_FAILURE);  		}  	} -	 + +	// drop elevated privileges +	if (drop_privileges && (getuid() == 0 || geteuid() == 0)) { +		struct passwd *pw = getpwnam("nobody"); +		if (pw) { +			setuid(pw->pw_uid); +		} else { +			usbmuxd_log(LL_ERROR, +				   "ERROR: Dropping privileges failed, check if user 'nobody' exists! Will now terminate."); +			log_disable_syslog(); +			exit(EXIT_FAILURE); +		} + +		// security check +		if (setuid(0) != -1) { +			usbmuxd_log(LL_ERROR, "ERROR: Failed to drop privileges properly!"); +			log_disable_syslog(); +			exit(EXIT_FAILURE); +		} +		usbmuxd_log(LL_NOTICE, "Successfully dropped privileges"); +	} +  	res = main_loop(listenfd);  	if(res < 0)  		usbmuxd_log(LL_FATAL, "main_loop failed"); | 
