summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: ba3112f)
raw | patch | inline | side by side (parent: ba3112f)
author | Holger Weiss <hweiss@users.sourceforge.net> | |
Sun, 17 Jun 2007 19:22:51 +0000 (19:22 +0000) | ||
committer | Holger Weiss <hweiss@users.sourceforge.net> | |
Sun, 17 Jun 2007 19:22:51 +0000 (19:22 +0000) |
'Location:' strings using sscanf(3) (Nobuhiro Ban - 1687867)
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1742 f882894a-f735-0410-b71e-b25c423dba1c
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1742 f882894a-f735-0410-b71e-b25c423dba1c
NEWS | patch | blob | history | |
plugins/check_http.c | patch | blob | history |
index 75fc1c7c85a45be07fbe3a1e22b5708144f42ce6..8c9938c5fb9c2a597dc0c7cd28cb8776eddcda38 100644 (file)
--- a/NEWS
+++ b/NEWS
This file documents the major additions and syntax changes between releases.
+1.4.10 or 1.5 ??
+ Fix check_http buffer overflow vulnerability when following HTTP redirects
+
1.4.9 4th June 2006
Inclusion of contrib/check_cluster2 as check_cluster with some improvements
New/improved -E/--skip-stderr and -S/--skip-stdout options for check_by_ssh
diff --git a/plugins/check_http.c b/plugins/check_http.c
index 6773e65bcc47c052764461dfbf3b6bc78d1fb32a..45d24a98ac06a4eae6feafb74dcc7cc5d5aeadf4 100644 (file)
--- a/plugins/check_http.c
+++ b/plugins/check_http.c
enum {
MAX_IPV4_HOSTLENGTH = 255,
HTTP_PORT = 80,
- HTTPS_PORT = 443
+ HTTPS_PORT = 443,
+ MAX_PORT = 65535
};
#ifdef HAVE_SSL
/* 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
char xx[2];
char type[6];
char *addr;
- char port[6];
char *url;
addr = malloc (MAX_IPV4_HOSTLENGTH + 1);
die (STATE_UNKNOWN, _("HTTP 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 ) {
}
/* 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 */
_("HTTP 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);
server_address = strdup (addr);
free (server_url);
- server_url = strdup (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 ();
}