tags 445475 patch thanks Hi
Attached you will find a patch from upstream CVS for the check_http.c file. Beside the CVE, it also fixes two other minor issues (an off-by-one and NULL pointer problem). I am trying to get some testing done, please feel free to comment. If you are busy, you could also give me permission to NMU, although it is a very young bug. Cheers Steffen
diff -u nagios-plugins-1.4.8/debian/changelog nagios-plugins-1.4.8/debian/changelog
--- nagios-plugins-1.4.8/debian/changelog
+++ nagios-plugins-1.4.8/debian/changelog
@@ -1,3 +1,15 @@
+nagios-plugins (1.4.8-2.1) unstable; urgency=high
+
+ * Non-maintainer upload by the testing-security team
+ * Include CVS patch to fix buffer overflow in redir function in
+ check_http.c, which was caused by parsing HTTP redirect strings
+ using sscanf
+ Fixes: CVE-2007-5198
+ * Include fix for off-by-one error and a NULL pointer, which leads
+ to a segfault
+
+ -- Steffen Joeris <[EMAIL PROTECTED]> Sat, 06 Oct 2007 09:12:18 +0000
+
nagios-plugins (1.4.8-2) unstable; urgency=low
* fix typo in upstream configure script which caused some plugins
diff -u nagios-plugins-1.4.8/debian/patches/00list nagios-plugins-1.4.8/debian/patches/00list
--- nagios-plugins-1.4.8/debian/patches/00list
+++ nagios-plugins-1.4.8/debian/patches/00list
@@ -10,0 +11 @@
+CVE-2007-5198.dpatch
only in patch2:
unchanged:
--- nagios-plugins-1.4.8.orig/debian/patches/CVE-2007-5198.dpatch
+++ nagios-plugins-1.4.8/debian/patches/CVE-2007-5198.dpatch
@@ -0,0 +1,133 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## CVE-2007-5198.dpatch
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Fixes CVE-2007-5198
+
[EMAIL PROTECTED]@
+--- check_http.c.orig 2007-10-06 07:53:29.000000000 +0000
++++ nagios-plugins-1.4.8/plugins/check_http.c 2007-10-06 08:16:02.000000000 +0000
+@@ -53,7 +53,8 @@
+ enum {
+ MAX_IPV4_HOSTLENGTH = 255,
+ HTTP_PORT = 80,
+- HTTPS_PORT = 443
++ HTTPS_PORT = 443,
++ MAX_PORT = 65535
+ };
+
+ #ifdef HAVE_SSL
+@@ -148,7 +149,7 @@
+
+ if (display_html == TRUE)
+ printf ("<A HREF=\"%s://%s:%d%s\" target=\"_blank\">",
+- use_ssl ? "https" : "http", host_name,
++ use_ssl ? "https" : "http", server_address,
+ server_port, server_url);
+
+ /* initialize alarm signal handling, set socket timeout, start timer */
+@@ -1057,14 +1058,14 @@
+
+ /* per RFC 2396 */
+ #define HDR_LOCATION "%*[Ll]%*[Oo]%*[Cc]%*[Aa]%*[Tt]%*[Ii]%*[Oo]%*[Nn]: "
+-#define URI_HTTP "%[HTPShtps]://"
+-#define URI_HOST "%[-.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]"
+-#define URI_PORT ":%[0123456789]"
++#define URI_HTTP "%5[HTPShtps]"
++#define URI_HOST "%255[-.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]"
++#define URI_PORT "%6d" /* MAX_PORT's width is 5 chars, 6 to detect overflow */
+ #define URI_PATH "%[-_.!~*'();/?:@&=+$,%#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]"
+-#define HD1 URI_HTTP URI_HOST URI_PORT URI_PATH
+-#define HD2 URI_HTTP URI_HOST URI_PATH
+-#define HD3 URI_HTTP URI_HOST URI_PORT
+-#define HD4 URI_HTTP URI_HOST
++#define HD1 URI_HTTP "://" URI_HOST ":" URI_PORT "/" URI_PATH
++#define HD2 URI_HTTP "://" URI_HOST "/" URI_PATH
++#define HD3 URI_HTTP "://" URI_HOST ":" URI_PORT
++#define HD4 URI_HTTP "://" URI_HOST
+ #define HD5 URI_PATH
+
+ void
+@@ -1075,7 +1076,6 @@
+ char xx[2];
+ char type[6];
+ char *addr;
+- char port[6];
+ char *url;
+
+ addr = malloc (MAX_IPV4_HOSTLENGTH + 1);
+@@ -1099,17 +1099,21 @@
+ }
+
+ pos += i;
+- pos += strspn (pos, " \t\r\n");
++ pos += strspn (pos, " \t");
++ for (; (i = strspn (pos, "\r\n")); pos += i) {
++ pos += i;
++ if (!(i = strspn (pos, " \t"))) {
++ die (STATE_UNKNOWN, _("HTTP UNKNOWN - Empty redirect location%s\n"),display_html ? "</A>" : "");
++ }
++ }
+
+- url = realloc (url, strcspn (pos, "\r\n"));
++ url = realloc (url, strcspn (pos, "\r\n")+ 1);
+ if (url == NULL)
+ die (STATE_UNKNOWN, _("could not allocate url\n"));
+
+ /* URI_HTTP, URI_HOST, URI_PORT, URI_PATH */
+- if (sscanf (pos, HD1, type, addr, port, url) == 4) {
++ if (sscanf (pos, HD1, type, addr, &i, url) == 4)
+ use_ssl = server_type_check (type);
+- i = atoi (port);
+- }
+
+ /* URI_HTTP URI_HOST URI_PATH */
+ else if (sscanf (pos, HD2, type, addr, url) == 3 ) {
+@@ -1118,10 +1122,9 @@
+ }
+
+ /* URI_HTTP URI_HOST URI_PORT */
+- else if(sscanf (pos, HD3, type, addr, port) == 3) {
++ else if(sscanf (pos, HD3, type, addr, &i) == 3) {
+ strcpy (url, HTTP_URL);
+ use_ssl = server_type_check (type);
+- i = atoi (port);
+ }
+
+ /* URI_HTTP URI_HOST */
+@@ -1141,7 +1144,7 @@
+ }
+ i = server_port;
+ strcpy (type, server_type);
+- strcpy (addr, host_name);
++ strcpy (addr, server_address);
+ }
+
+ else {
+@@ -1167,7 +1170,6 @@
+ _("WARNING - redirection creates an infinite loop - %s://%s:%d%s%s\n"),
+ type, addr, i, url, (display_html ? "</A>" : ""));
+
+- server_port = i;
+ strcpy (server_type, type);
+
+ free (host_name);
+@@ -1177,7 +1179,18 @@
+ server_address = strdup (addr);
+
+ free (server_url);
++ if ((url[0] == '/'))
+ server_url = strdup (url);
++ else if (asprintf(&server_url, "/%s", url) == -1)
++ die (STATE_UNKNOWN, _("HTTP UNKNOWN - Could not allocate server_url%s\n"), display_html ? "</A>" : "");
++ free(url);
++
++ if ((server_port = i) > MAX_PORT)
++ die (STATE_UNKNOWN, _("HTTP UNKNOWN - Redirection to port above %d - %s://%s:%d%s%s\n"),
++ MAX_PORT, server_type, server_address, server_port, server_url, display_html ? "</A>" : "");
++
++ if (verbose)
++ printf ("Redirection to %s://%s:%d%s\n", server_type, server_address, server_port, server_url);
+
+ check_http ();
+ }
signature.asc
Description: This is a digitally signed message part.

