]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
CVE-2010-1452: Fix handling of missing path segments in the parsed URI structure.
authorPaul Querna <pquerna@apache.org>
Wed, 21 Jul 2010 18:25:01 +0000 (18:25 +0000)
committerPaul Querna <pquerna@apache.org>
Wed, 21 Jul 2010 18:25:01 +0000 (18:25 +0000)
If a specially crafted request was sent, it is possible to crash mod_dav,
mod_cache or mod_session, as they accessed a field that is set to NULL
by the URI parser, assuming that it always put in a valid string.

PR: 49246
Submitted by: Mark Drayton
Patch by: Jeff Trawick

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@966348 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
include/httpd.h
modules/cache/cache_storage.c
modules/dav/main/util.c
modules/session/mod_session.c

diff --git a/CHANGES b/CHANGES
index 8cf626986bae4a8811ec01db4395987aac1e2d5b..96d99b42d544ee887b9249166a361f83ac76edfd 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,10 @@
 
 Changes with Apache 2.3.7
 
+  *) SECURITY: CVE-2010-1452 (cve.mitre.org)
+     mod_dav, mod_cache, mod_session: Fix Handling of requests without a path 
+     segment. PR: 49246 [Mark Drayton, Jeff Trawick]
+
   *) core/mod_authz_core: Introduce new access_checker_ex hook that enables
      mod_authz_core to bypass authentication if access should be allowed by
      IP address/env var/... [Stefan Fritsch]
index 492755c28f1882f3dc6b1cb968a0e131a11893a6..c74a38e98c17ea22806b70d4fd44a972440ad0b1 100644 (file)
@@ -922,7 +922,7 @@ struct request_rec {
 
     /** The URI without any parsing performed */
     char *unparsed_uri;        
-    /** The path portion of the URI */
+    /** The path portion of the URI, or "/" if no path provided */
     char *uri;
     /** The filename on disk corresponding to this response */
     char *filename;
index 606beb876ea2ab96def6fce41daf501d8f9ba889..0e2a698f53db1babd70995f685245b8b0c4fd920 100644 (file)
@@ -479,7 +479,7 @@ apr_status_t cache_generate_key_default(request_rec *r, apr_pool_t* p,
      * Check if we need to ignore session identifiers in the URL and do so
      * if needed.
      */
-    path = r->parsed_uri.path;
+    path = r->uri;
     querystring = r->parsed_uri.query;
     if (conf->ignore_session_id->nelts) {
         int i;
@@ -578,7 +578,7 @@ apr_status_t cache_generate_key_default(request_rec *r, apr_pool_t* p,
      */
     cache->key = apr_pstrdup(r->pool, *key);
     ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL,
-                 "cache: Key for entity %s?%s is %s", r->parsed_uri.path,
+                 "cache: Key for entity %s?%s is %s", r->uri,
                  r->parsed_uri.query, *key);
 
     return APR_SUCCESS;
index 3af8ecb78ea32f576e5a987dfe9ad515fa17b43c..7659b721da7e1143fd241773eda3c0628d47dc71 100644 (file)
@@ -625,7 +625,8 @@ static dav_error * dav_process_if_header(request_rec *r, dav_if_header **p_ih)
 
             /* 2518 specifies this must be an absolute URI; just take the
              * relative part for later comparison against r->uri */
-            if ((rv = apr_uri_parse(r->pool, uri, &parsed_uri)) != APR_SUCCESS) {
+            if ((rv = apr_uri_parse(r->pool, uri, &parsed_uri)) != APR_SUCCESS
+                || !parsed_uri.path) {
                 return dav_new_error(r->pool, HTTP_BAD_REQUEST,
                                      DAV_ERR_IF_TAGGED, rv,
                                      "Invalid URI in tagged If-header.");
index 2c08f86096acc8efae42a24ebedc2082c2ad7471..2775ad0329f885d772731607f7fc149988c8220f 100644 (file)
@@ -63,7 +63,7 @@ static int session_included(request_rec * r, session_dir_conf * conf)
         included = 0;
         for (i = 0; !included && i < conf->includes->nelts; i++) {
             const char *include = includes[i];
-            if (strncmp(r->parsed_uri.path, include, strlen(include))) {
+            if (strncmp(r->uri, include, strlen(include))) {
                 included = 1;
             }
         }
@@ -72,7 +72,7 @@ static int session_included(request_rec * r, session_dir_conf * conf)
     if (conf->excludes->nelts) {
         for (i = 0; included && i < conf->includes->nelts; i++) {
             const char *exclude = excludes[i];
-            if (strncmp(r->parsed_uri.path, exclude, strlen(exclude))) {
+            if (strncmp(r->uri, exclude, strlen(exclude))) {
                 included = 0;
             }
         }