Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Apr 2001 03:32:07 -0700
From:      Kris Kennaway <kris@obsecurity.org>
To:        dhcp-client@isc.org
Cc:        audit@FreeBSD.org
Subject:   Format string security patches
Message-ID:  <20010425033207.A68532@xor.obsecurity.org>

next in thread | raw e-mail | index | archive | help

--4Ckj6UjgE2iN1+kY
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Hi there,

The following patches are against the DHCP 2.0pl5 code, and include a
number of format string errors which may be exploitable under the
right (wrong) circumstances (I didn't check too closely yet), as well
as a number which are trivial and just silence compiler warnings.
There are also several bugs due to missing format string arguments
which I came across and fixed -- one or two I had to guess from
context.

Please send me back a copy of the version of this patch which you
eventually apply to your CVS repository so I can import the same patch
into FreeBSD -- thanks.

Kris

P.S.  I couldn't find a contact address on the ISC website for
security issues, so I hope this list is acceptible.  The website
contains a PGP key presumably for use in security matters, but doesn't
give a contact address with which to use it to contact ISC developers
directly.

Index: client/clparse.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mnt/ncvs/src/contrib/isc-dhcp/client/clparse.c,v
retrieving revision 1.6
diff -u -r1.6 clparse.c
--- client/clparse.c	2000/07/20 09:56:18	1.6
+++ client/clparse.c	2001/04/25 10:09:46
@@ -389,7 +389,7 @@
 				break;
 		}
 		if (i =3D=3D 256) {
-			parse_warn ("%s: expected option name.");
+			parse_warn ("%s: expected option name.", val);
 			skip_to_semi (cfile);
 			return 0;
 		}
Index: client/dhclient.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mnt/ncvs/src/contrib/isc-dhcp/client/dhclient.c,v
retrieving revision 1.18
diff -u -r1.18 dhclient.c
--- client/dhclient.c	2000/11/04 19:59:11	1.18
+++ client/dhclient.c	2001/04/25 10:10:44
@@ -178,11 +178,11 @@
=20
 	if (!quiet) {
 		note ("%s %s", message, DHCP_VERSION);
-		note (copyright);
-		note (arr);
+		note ("%s", copyright);
+		note ("%s", arr);
 		note ("");
-		note (contrib);
-		note (url);
+		note ("%s", contrib);
+		note ("%s", url);
 		note ("");
 	} else
 		log_perror =3D 0;
@@ -293,12 +293,12 @@
 static void usage (appname)
 	char *appname;
 {
-	note (message);
-	note (copyright);
-	note (arr);
+	note ("%s", message);
+	note ("%s", copyright);
+	note ("%s", arr);
 	note ("");
-	note (contrib);
-	note (url);
+	note ("%s", contrib);
+	note ("%s", url);
 	note ("");
=20
 	warn ("Usage: %s [-D] [-d] [-p <port>] [-cf conf-file]", appname);
Index: common/bpf.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mnt/ncvs/src/contrib/isc-dhcp/common/bpf.c,v
retrieving revision 1.1.1.5
diff -u -r1.1.1.5 bpf.c
--- common/bpf.c	1999/06/23 23:39:42	1.1.1.5
+++ common/bpf.c	2001/04/25 10:12:06
@@ -249,7 +249,7 @@
 		error ("Can't get bpf buffer length: %m");
 	info -> rbuf =3D malloc (info -> rbuf_max);
 	if (!info -> rbuf)
-		error ("Can't allocate %d bytes for bpf input buffer.");
+		error ("Can't allocate %d bytes for bpf input buffer.", info -> rbuf_max=
);
 	info -> rbuf_offset =3D 0;
 	info -> rbuf_len =3D 0;
=20
Index: common/errwarn.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mnt/ncvs/src/contrib/isc-dhcp/common/errwarn.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 errwarn.c
--- common/errwarn.c	1999/02/10 09:10:13	1.1.1.1
+++ common/errwarn.c	2001/04/25 10:08:43
@@ -71,7 +71,7 @@
   va_end (list);
=20
 #ifndef DEBUG
-  syslog (log_priority | LOG_ERR, mbuf);
+  syslog (log_priority | LOG_ERR, "%s", mbuf);
 #endif
=20
   /* Also log it to stderr? */
@@ -104,7 +104,7 @@
   va_end (list);
=20
 #ifndef DEBUG
-  syslog (log_priority | LOG_ERR, mbuf);
+  syslog (log_priority | LOG_ERR, "%s", mbuf);
 #endif
=20
   if (log_perror) {
@@ -130,7 +130,7 @@
   va_end (list);
=20
 #ifndef DEBUG
-  syslog (log_priority | LOG_INFO, mbuf);
+  syslog (log_priority | LOG_INFO, "%s", mbuf);
 #endif
=20
   if (log_perror) {
@@ -156,7 +156,7 @@
   va_end (list);
=20
 #ifndef DEBUG
-  syslog (log_priority | LOG_DEBUG, mbuf);
+  syslog (log_priority | LOG_DEBUG, "%s", mbuf);
 #endif
=20
   if (log_perror) {
@@ -231,8 +231,8 @@
 	va_end (list);
=20
 #ifndef DEBUG
-	syslog (log_priority | LOG_ERR, mbuf);
-	syslog (log_priority | LOG_ERR, token_line);
+	syslog (log_priority | LOG_ERR, "%s", mbuf);
+	syslog (log_priority | LOG_ERR, "%s", token_line);
 	if (lexline < 81)
 		syslog (log_priority | LOG_ERR,
 			"%s^", &spaces [sizeof spaces - lexchar]);
Index: common/print.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mnt/ncvs/src/contrib/isc-dhcp/common/print.c,v
retrieving revision 1.1.1.3
diff -u -r1.1.1.3 print.c
--- common/print.c	1999/02/28 20:34:39	1.1.1.3
+++ common/print.c	2001/04/25 10:13:19
@@ -150,7 +150,7 @@
 	for (i =3D 0; i < len; i++) {
 		if ((i & 15) =3D=3D 0) {
 			if (lbix)
-				note (lbuf);
+				note ("%s", lbuf);
 			sprintf (lbuf, "%03x:", i);
 			lbix =3D 4;
 		} else if ((i & 7) =3D=3D 0)
@@ -158,7 +158,7 @@
 		sprintf (&lbuf [lbix], " %02x", buf [i]);
 		lbix +=3D 3;
 	}
-	note (lbuf);
+	note ("%s", lbuf);
 }
=20
 void hash_dump (table)
@@ -178,7 +178,7 @@
 			if (bp -> len)
 				dump_raw (bp -> name, bp -> len);
 			else
-				note ((char *)bp -> name);
+				note ("%s", (char *)bp -> name);
 		}
 	}
 }
Index: common/tree.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mnt/ncvs/src/contrib/isc-dhcp/common/tree.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 tree.c
--- common/tree.c	1999/02/10 09:10:13	1.1.1.1
+++ common/tree.c	2001/04/25 10:13:53
@@ -275,7 +275,7 @@
 		return t1;
=20
 	      default:
-		warn ("Bad node id in tree: %d.");
+		warn ("Bad node id in tree: %d.", tree -> op);
 		t1 =3D MAX_TIME;
 		return t1;
 	}
Index: includes/dhcpd.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mnt/ncvs/src/contrib/isc-dhcp/includes/dhcpd.h,v
retrieving revision 1.1.1.6
diff -u -r1.1.1.6 dhcpd.h
--- includes/dhcpd.h	2000/07/20 08:36:42	1.1.1.6
+++ includes/dhcpd.h	2001/04/25 10:11:24
@@ -487,11 +487,11 @@
=20
 /* errwarn.c */
 extern int warnings_occurred;
-void error PROTO ((char *, ...));
-int warn PROTO ((char *, ...));
-int note PROTO ((char *, ...));
-int debug PROTO ((char *, ...));
-int parse_warn PROTO ((char *, ...));
+void error PROTO ((char *, ...)) __attribute__((format(printf, 1, 2)));
+int warn PROTO ((char *, ...)) __attribute__((format(printf, 1, 2)));
+int note PROTO ((char *, ...)) __attribute__((format(printf, 1, 2)));
+int debug PROTO ((char *, ...)) __attribute__((format(printf, 1, 2)));
+int parse_warn PROTO ((char *, ...)) __attribute__((format(printf, 1, 2)));
=20
 /* dhcpd.c */
 extern TIME cur_time;
@@ -905,7 +905,7 @@
 				 char *, struct client_lease *));
 int script_go PROTO ((struct interface_info *));
 void client_envadd PROTO ((struct client_state *,
-			   const char *, const char *, const char *, ...));
+			   const char *, const char *, const char *, ...)) __attribute__((forma=
t(printf, 4, 5)));
 int dhcp_option_ev_name (char *, size_t, struct option *);
=20
 struct client_lease *packet_to_lease PROTO ((struct packet *));

--4Ckj6UjgE2iN1+kY
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.4 (FreeBSD)
Comment: For info see http://www.gnupg.org

iD8DBQE65qemWry0BWjoQKURAnAjAKCf+kgrHOiai1nAm1fAbTIcL+EUXACgjlnn
wZ8o6a8skPVk8hB2EQ/ipQ0=
=U3Jf
-----END PGP SIGNATURE-----

--4Ckj6UjgE2iN1+kY--

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-audit" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010425033207.A68532>