You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							228 lines
						
					
					
						
							6.1 KiB
						
					
					
				
			
		
		
	
	
							228 lines
						
					
					
						
							6.1 KiB
						
					
					
				# --- SDE-COPYRIGHT-NOTE-BEGIN --- | 
						|
# This copyright note is auto-generated by ./scripts/Create-CopyPatch. | 
						|
# | 
						|
# Filename: package/.../dhcp/dhcp-3.0+paranoia.patch | 
						|
# Copyright (C) 2004 - 2006 The T2 SDE Project | 
						|
# Copyright (C) 1998 - 2003 Clifford Wolf | 
						|
# | 
						|
# More information can be found in the files COPYING and README. | 
						|
# | 
						|
# This patch file is dual-licensed. It is available under the license the | 
						|
# patched project is licensed under, as long as it is an OpenSource license | 
						|
# as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms | 
						|
# of the GNU General Public License as published by the Free Software | 
						|
# Foundation; either version 2 of the License, or (at your option) any later | 
						|
# version. | 
						|
# --- SDE-COPYRIGHT-NOTE-END --- | 
						|
 | 
						|
borrowed from ari edelkind's site | 
						|
http://www.episec.com/people/edelkind/patches/dhcp/dhcp-3.0+paranoia.patch | 
						|
 | 
						|
--- | 
						|
 | 
						|
paranoia (non-root/chroot) patch for ISC dhcp 3.0 | 
						|
file to patch: dhcp-3.0/server/dhcpd.c | 
						|
 | 
						|
update from paranoia patch for ISC dhcp 2.0 | 
						|
 | 
						|
Adds 3 options: | 
						|
 | 
						|
	-user <user> | 
						|
	-group <group> | 
						|
	-chroot <chroot_dir> | 
						|
 | 
						|
Notes: | 
						|
	-DPARANOIA must be passed as an argument to the --copts option | 
						|
	of configure.  Otherwise, the paranoia code will not be compiled | 
						|
	in.  Example:  ./configure --copts -DPARANOIA | 
						|
 | 
						|
	The chroot() call has been delayed in order to allow /dev/log to | 
						|
	be reopened after the configuration file has been read.  This is | 
						|
	beneficial for systems on which /dev/log is a unix domain socket. | 
						|
	The main side effect is that dhcpd.conf should be placed in /etc, | 
						|
	instead of <chroot_dir>/etc. | 
						|
 | 
						|
	If dhcpd is to be run on a sysV-style architecture (or, more | 
						|
	generally, if /dev/log is a character device), one may opt to | 
						|
	create the <chroot_dir>/dev/log character device and add | 
						|
	-DEARLY_CHROOT to the --copts option of configure (in addition to | 
						|
	-DPARANOIA).  This will perform the chroot() call at the earliest | 
						|
	convenience (before reading the configuration file). | 
						|
 | 
						|
	If the -user option is used, the lease and pid file directories | 
						|
	should be writable to the server process after it drops | 
						|
	privileges. | 
						|
 | 
						|
 | 
						|
ari edelkind (12/10/2001) | 
						|
last modified 12/10/2001 | 
						|
 | 
						|
 | 
						|
--- dhcp-3.0/server/dhcpd.c	Thu Jun 21 22:12:58 2001 | 
						|
+++ dhcp-3.0+paranoia/server/dhcpd.c	Wed Oct 17 08:23:00 2001 | 
						|
@@ -56,6 +56,16 @@ | 
						|
 #include "version.h" | 
						|
 #include <omapip/omapip_p.h> | 
						|
  | 
						|
+#if defined (PARANOIA) | 
						|
+#  include <sys/types.h> | 
						|
+#  include <unistd.h> | 
						|
+#  include <pwd.h> | 
						|
+/* get around the ISC declaration of group */ | 
						|
+#  define group real_group  | 
						|
+#    include <grp.h> | 
						|
+#  undef group | 
						|
+#endif /* PARANOIA */ | 
						|
+ | 
						|
 static void usage PROTO ((void)); | 
						|
  | 
						|
 TIME cur_time; | 
						|
@@ -204,6 +214,22 @@ | 
						|
 	omapi_object_dereference (&listener, MDL); | 
						|
 } | 
						|
  | 
						|
+#if defined (PARANOIA) | 
						|
+/* to be used in one of two possible scenarios */ | 
						|
+static void setup_chroot (char *chroot_dir) { | 
						|
+	if (geteuid()) | 
						|
+		log_fatal ("you must be root to use chroot"); | 
						|
+ | 
						|
+	if (chroot(chroot_dir)) { | 
						|
+		log_fatal ("chroot(\"%s\"): %m", chroot_dir); | 
						|
+	} | 
						|
+	if (chdir ("/")) { | 
						|
+		/* probably permission denied */ | 
						|
+		log_fatal ("chdir(\"/\"): %m"); | 
						|
+	} | 
						|
+} | 
						|
+#endif /* PARANOIA */ | 
						|
+ | 
						|
 int main (argc, argv, envp) | 
						|
 	int argc; | 
						|
 	char **argv, **envp; | 
						|
@@ -236,6 +262,14 @@ | 
						|
 	char *traceinfile = (char *)0; | 
						|
 	char *traceoutfile = (char *)0; | 
						|
 #endif | 
						|
+#if defined (PARANOIA) | 
						|
+	char *set_user   = 0; | 
						|
+	char *set_group  = 0; | 
						|
+	char *set_chroot = 0; | 
						|
+ | 
						|
+	uid_t set_uid = 0; | 
						|
+	gid_t set_gid = 0; | 
						|
+#endif /* PARANOIA */ | 
						|
  | 
						|
 	/* Make sure we have stdin, stdout and stderr. */ | 
						|
 	status = open ("/dev/null", O_RDWR); | 
						|
@@ -298,6 +332,20 @@ | 
						|
 			if (++i == argc) | 
						|
 				usage (); | 
						|
 			server = argv [i]; | 
						|
+#if defined (PARANOIA) | 
						|
+		} else if (!strcmp (argv [i], "-user")) { | 
						|
+			if (++i == argc) | 
						|
+				usage (); | 
						|
+			set_user = argv [i]; | 
						|
+		} else if (!strcmp (argv [i], "-group")) { | 
						|
+			if (++i == argc) | 
						|
+				usage (); | 
						|
+			set_group = argv [i]; | 
						|
+		} else if (!strcmp (argv [i], "-chroot")) { | 
						|
+			if (++i == argc) | 
						|
+				usage (); | 
						|
+			set_chroot = argv [i]; | 
						|
+#endif /* PARANOIA */ | 
						|
 		} else if (!strcmp (argv [i], "-cf")) { | 
						|
 			if (++i == argc) | 
						|
 				usage (); | 
						|
@@ -397,6 +445,44 @@ | 
						|
 					     trace_seed_stop, MDL); | 
						|
 #endif | 
						|
  | 
						|
+#if defined (PARANOIA) | 
						|
+	/* get user and group info if those options were given */ | 
						|
+	if (set_user) { | 
						|
+		struct passwd *tmp_pwd; | 
						|
+ | 
						|
+		if (geteuid()) | 
						|
+			log_fatal ("you must be root to set user"); | 
						|
+ | 
						|
+		if (!(tmp_pwd = getpwnam(set_user))) | 
						|
+			log_fatal ("no such user: %s", set_user); | 
						|
+ | 
						|
+		set_uid = tmp_pwd->pw_uid; | 
						|
+ | 
						|
+		/* use the user's group as the default gid */ | 
						|
+		if (!set_group) | 
						|
+			set_gid = tmp_pwd->pw_gid; | 
						|
+	} | 
						|
+ | 
						|
+	if (set_group) { | 
						|
+/* get around the ISC declaration of group */ | 
						|
+#define group real_group | 
						|
+		struct group *tmp_grp; | 
						|
+ | 
						|
+		if (geteuid()) | 
						|
+			log_fatal ("you must be root to set group"); | 
						|
+ | 
						|
+		if (!(tmp_grp = getgrnam(set_group))) | 
						|
+			log_fatal ("no such group: %s", set_group); | 
						|
+ | 
						|
+		set_gid = tmp_grp->gr_gid; | 
						|
+#undef group | 
						|
+	} | 
						|
+ | 
						|
+#  if defined (EARLY_CHROOT) | 
						|
+	if (set_chroot) setup_chroot (set_chroot); | 
						|
+#  endif /* EARLY_CHROOT */ | 
						|
+#endif /* PARANOIA */ | 
						|
+ | 
						|
 	/* Default to the DHCP/BOOTP port. */ | 
						|
 	if (!local_port) | 
						|
 	{ | 
						|
@@ -500,6 +586,10 @@ | 
						|
  | 
						|
 	postconf_initialization (quiet); | 
						|
  | 
						|
+#if defined (PARANOIA) && !defined (EARLY_CHROOT) | 
						|
+	if (set_chroot) setup_chroot (set_chroot); | 
						|
+#endif /* PARANOIA && !EARLY_CHROOT */ | 
						|
+ | 
						|
         /* test option should cause an early exit */ | 
						|
  	if (cftest && !lftest)  | 
						|
  		exit(0); | 
						|
@@ -543,6 +633,22 @@ | 
						|
 			exit (0); | 
						|
 	} | 
						|
  | 
						|
+#if defined (PARANOIA) | 
						|
+	/* change uid to the specified one */ | 
						|
+ | 
						|
+	if (set_gid) { | 
						|
+		if (setgroups (0, (void *)0)) | 
						|
+			log_fatal ("setgroups: %m"); | 
						|
+		if (setgid (set_gid)) | 
						|
+			log_fatal ("setgid(%d): %m", (int) set_gid); | 
						|
+	}	 | 
						|
+ | 
						|
+	if (set_uid) { | 
						|
+		if (setuid (set_uid)) | 
						|
+			log_fatal ("setuid(%d): %m", (int) set_uid); | 
						|
+	} | 
						|
+#endif /* PARANOIA */ | 
						|
+ | 
						|
 	/* Read previous pid file. */ | 
						|
 	if ((i = open (path_dhcpd_pid, O_RDONLY)) >= 0) { | 
						|
 		status = read (i, pbuf, (sizeof pbuf) - 1); | 
						|
@@ -888,6 +994,10 @@ | 
						|
  | 
						|
 	log_fatal ("Usage: dhcpd [-p <UDP port #>] [-d] [-f]%s%s%s%s", | 
						|
 		   "\n             [-cf config-file] [-lf lease-file]", | 
						|
+#if defined (PARANOIA) | 
						|
+		   /* meld into the following string */ | 
						|
+		   "\n             [-user user] [-group group] [-chroot dir]" | 
						|
+#endif /* PARANOIA */ | 
						|
 #if defined (TRACING) | 
						|
 		   "\n		   [-tf trace-output-file]", | 
						|
 		   "\n		   [-play trace-input-file]",
 | 
						|
 |