Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock

Please unblock package libapache2-mod-auth-mellon.

It fixes two security issues:
- Fix a denial of service attack in the logout handler.
- Fix a cross-site session transfer vulnerability
  [CVE-2017-6807].

unblock libapache2-mod-auth-mellon/0.12.0-2

Thanks,
Thijs
diff -Nru libapache2-mod-auth-mellon-0.12.0/debian/changelog 
libapache2-mod-auth-mellon-0.12.0/debian/changelog
--- libapache2-mod-auth-mellon-0.12.0/debian/changelog  2016-03-09 
10:14:01.000000000 +0000
+++ libapache2-mod-auth-mellon-0.12.0/debian/changelog  2017-03-13 
13:06:19.000000000 +0000
@@ -1,3 +1,11 @@
+libapache2-mod-auth-mellon (0.12.0-2) unstable; urgency=high
+
+  * Backport upstream patches for security issues:
+    - Fix a denial of service attack in the logout handler.
+    - Fix a cross-site session transfer vulnerability [CVE-2017-6807]. 
+
+ -- Thijs Kinkhorst <th...@debian.org>  Mon, 13 Mar 2017 13:06:19 +0000
+
 libapache2-mod-auth-mellon (0.12.0-1) unstable; urgency=high
 
   * New upstream release.
diff -Nru 
libapache2-mod-auth-mellon-0.12.0/debian/patches/01_logout_segfault.patch 
libapache2-mod-auth-mellon-0.12.0/debian/patches/01_logout_segfault.patch
--- libapache2-mod-auth-mellon-0.12.0/debian/patches/01_logout_segfault.patch   
1970-01-01 00:00:00.000000000 +0000
+++ libapache2-mod-auth-mellon-0.12.0/debian/patches/01_logout_segfault.patch   
2017-03-13 13:06:19.000000000 +0000
@@ -0,0 +1,39 @@
+From 6bdda9170a8f1757dabc5b109958657417728018 Mon Sep 17 00:00:00 2001
+From: Olav Morken <olav.mor...@uninett.no>
+Date: Tue, 24 May 2016 10:29:38 +0200
+Subject: [PATCH] Fix segmentation fault when receiving badly formed logout
+ message.
+
+If the logout message is badly formed, we won't get the entityID in
+`logout->parent.remote_providerID`. If we call `apr_hash_get()` with a
+null pointer, it will cause a segmentation fault.
+
+Add a check to validate that the entityID is correctly set.
+---
+ auth_mellon_handler.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/auth_mellon_handler.c b/auth_mellon_handler.c
+index ffc7ff7..748ec45 100644
+--- a/auth_mellon_handler.c
++++ b/auth_mellon_handler.c
+@@ -678,7 +678,8 @@ static int am_handle_logout_request(request_rec *r,
+     /* Process the logout message. Ignore missing signature. */
+     res = lasso_logout_process_request_msg(logout, msg);
+ #ifdef HAVE_lasso_profile_set_signature_verify_hint
+-    if(res != 0 && res != LASSO_DS_ERROR_SIGNATURE_NOT_FOUND) {
++    if(res != 0 && res != LASSO_DS_ERROR_SIGNATURE_NOT_FOUND &&
++       logout->parent.remote_providerID != NULL) {
+         if (apr_hash_get(cfg->do_not_verify_logout_signature,
+                          logout->parent.remote_providerID,
+                          APR_HASH_KEY_STRING)) {
+@@ -787,7 +788,8 @@ static int am_handle_logout_response(request_rec *r, 
LassoLogout *logout)
+ 
+     res = lasso_logout_process_response_msg(logout, r->args);
+ #ifdef HAVE_lasso_profile_set_signature_verify_hint
+-    if(res != 0 && res != LASSO_DS_ERROR_SIGNATURE_NOT_FOUND) {
++    if(res != 0 && res != LASSO_DS_ERROR_SIGNATURE_NOT_FOUND &&
++       logout->parent.remote_providerID != NULL) {
+         if (apr_hash_get(cfg->do_not_verify_logout_signature,
+                          logout->parent.remote_providerID,
+                          APR_HASH_KEY_STRING)) {
diff -Nru 
libapache2-mod-auth-mellon-0.12.0/debian/patches/02_session_transfer_vulnerability_CVE-2017-6807.patch
 
libapache2-mod-auth-mellon-0.12.0/debian/patches/02_session_transfer_vulnerability_CVE-2017-6807.patch
--- 
libapache2-mod-auth-mellon-0.12.0/debian/patches/02_session_transfer_vulnerability_CVE-2017-6807.patch
      1970-01-01 00:00:00.000000000 +0000
+++ 
libapache2-mod-auth-mellon-0.12.0/debian/patches/02_session_transfer_vulnerability_CVE-2017-6807.patch
      2017-03-13 13:06:19.000000000 +0000
@@ -0,0 +1,218 @@
+From 7af21c53da7bb1de024274ee6da30bc22316a079 Mon Sep 17 00:00:00 2001
+From: Olav Morken <olav.mor...@uninett.no>
+Date: Mon, 13 Mar 2017 09:55:48 +0100
+Subject: [PATCH] Fix Cross-Site Session Transfer vulnerability
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+mod_auth_mellon did not verify that the site the session was created
+for was the same site as the site the user accessed. This allows an
+attacker with access to one web site on a server to use the same
+session to get access to a different site running on the same server.
+
+This patch fixes this vulnerability by storing the cookie parameters
+used when creating the session in the session, and verifying those
+parameters when the session is loaded.
+
+Thanks to François Kooman for reporting this vulnerability.
+
+This vulnerability has been assigned CVE-2017-6807.
+---
+ NEWS                  | 24 ++++++++++++++++++++++++
+ auth_mellon.h         |  6 +++++-
+ auth_mellon_cache.c   | 18 +++++++++++++++++-
+ auth_mellon_cookie.c  | 28 ++++++++++++++++++++++++++++
+ auth_mellon_session.c | 43 ++++++++++++++++++++++++++++++++++++++++---
+ 5 files changed, 114 insertions(+), 5 deletions(-)
+
+diff --git a/auth_mellon.h b/auth_mellon.h
+index d19ef02..78a5f0d 100644
+--- a/auth_mellon.h
++++ b/auth_mellon.h
+@@ -290,6 +290,7 @@ typedef struct am_cache_env_t {
+ 
+ typedef struct am_cache_entry_t {
+     char key[AM_CACHE_KEYSIZE];
++    am_cache_storage_t cookie_token;
+     apr_time_t access;
+     apr_time_t expires;
+     int logged_in;
+@@ -373,6 +374,7 @@ void *auth_mellon_server_config(apr_pool_t *p, server_rec 
*s);
+ const char *am_cookie_get(request_rec *r);
+ void am_cookie_set(request_rec *r, const char *id);
+ void am_cookie_delete(request_rec *r);
++const char *am_cookie_token(request_rec *r);
+ 
+ 
+ void am_cache_init(am_mod_cfg_rec *mod_cfg);
+@@ -380,7 +382,9 @@ am_cache_entry_t *am_cache_lock(server_rec *s,
+                                 am_cache_key_t type, const char *key);
+ const char *am_cache_entry_get_string(am_cache_entry_t *e,
+                                       am_cache_storage_t *slot);
+-am_cache_entry_t *am_cache_new(server_rec *s, const char *key);
++am_cache_entry_t *am_cache_new(server_rec *s,
++                               const char *key,
++                               const char *cookie_token);
+ void am_cache_unlock(server_rec *s, am_cache_entry_t *entry);
+ 
+ void am_cache_update_expires(am_cache_entry_t *t, apr_time_t expires);
+diff --git a/auth_mellon_cache.c b/auth_mellon_cache.c
+index cdb1e91..9a5bb0e 100644
+--- a/auth_mellon_cache.c
++++ b/auth_mellon_cache.c
+@@ -273,12 +273,15 @@ const char *am_cache_entry_get_string(am_cache_entry_t 
*e,
+  * Parameters:
+  *  server_rec *s        The current server.
+  *  const char *key      The key of the session to allocate.
++ *  const char *cookie_token  The cookie token to tie the session to.
+  *
+  * Returns:
+  *  The new session entry on success. NULL if key is a invalid session
+  *  key.
+  */
+-am_cache_entry_t *am_cache_new(server_rec *s, const char *key)
++am_cache_entry_t *am_cache_new(server_rec *s,
++                               const char *key,
++                               const char *cookie_token)
+ {
+     am_cache_entry_t *t;
+     am_mod_cfg_rec *mod_cfg;
+@@ -374,6 +377,7 @@ am_cache_entry_t *am_cache_new(server_rec *s, const char 
*key)
+     t->logged_in = 0;
+     t->size = 0;
+ 
++    am_cache_storage_null(&t->cookie_token);
+     am_cache_storage_null(&t->user);
+     am_cache_storage_null(&t->lasso_identity);
+     am_cache_storage_null(&t->lasso_session);
+@@ -384,6 +388,18 @@ am_cache_entry_t *am_cache_new(server_rec *s, const char 
*key)
+     t->pool[0] = '\0';
+     t->pool_used = 1;
+ 
++    rv = am_cache_entry_store_string(t, &t->cookie_token, cookie_token);
++    if (rv != 0) {
++        /* For some strange reason our cookie token is too big to fit in the
++         * session. This should never happen outside of absurd configurations.
++         */
++        ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
++                     "Unable to store cookie token in new session.");
++        t->key[0] = '\0'; /* Mark the entry as free. */
++        apr_global_mutex_unlock(mod_cfg->lock);
++        return NULL;
++    }
++
+     return t;
+ }
+ 
+diff --git a/auth_mellon_cookie.c b/auth_mellon_cookie.c
+index 8b3bc23..445022f 100644
+--- a/auth_mellon_cookie.c
++++ b/auth_mellon_cookie.c
+@@ -252,3 +252,31 @@ void am_cookie_delete(request_rec *r)
+ 
+     apr_table_addn(r->err_headers_out, "Set-Cookie", cookie);
+ }
++
++/* Get string that is used to tie a session to a specific cookie.
++ *
++ *  request_rec *r       The current request.
++ * Returns:
++ *  The cookie token, as a fixed length byte buffer.
++ */
++const char *am_cookie_token(request_rec *r)
++{
++    const char *cookie_name = am_cookie_name(r);
++    const char *cookie_domain = ap_get_server_name(r);
++    const char *cookie_path = "/";
++    am_dir_cfg_rec *cfg = am_get_dir_cfg(r);
++
++    if (cfg->cookie_domain) {
++        cookie_domain = cfg->cookie_domain;
++    }
++
++    if (cfg->cookie_path) {
++        cookie_path = cfg->cookie_path;
++    }
++
++    return apr_psprintf(r->pool, "Name='%s' Domain='%s' Path='%s'",
++                        cookie_name,
++                        cookie_domain,
++                        cookie_path
++                        );
++}
+diff --git a/auth_mellon_session.c b/auth_mellon_session.c
+index eb6439a..fca6c01 100644
+--- a/auth_mellon_session.c
++++ b/auth_mellon_session.c
+@@ -22,6 +22,42 @@
+ #include "auth_mellon.h"
+ 
+ 
++/* Retrieve a session from the cache and validate its cookie settings
++ *
++ * Parameters:
++ *  request_rec *r       The request we received from the user.
++ *  am_cache_key_t type  AM_CACHE_SESSION or AM_CACHE_NAMEID
++ *  const char *key      The session key or user
++ *
++ * Returns:
++ *  The session associated, or NULL if unable to retrieve the given session.
++ */
++am_cache_entry_t *am_lock_and_validate(request_rec *r,
++                                       am_cache_key_t type,
++                                       const char *key)
++{
++    am_cache_entry_t *session = am_cache_lock(r->server, type, key);
++    if (session == NULL) {
++        return NULL;
++    }
++
++    const char *cookie_token_session = am_cache_entry_get_string(
++        session, &session->cookie_token);
++    const char *cookie_token_target = am_cookie_token(r);
++    if (strcmp(cookie_token_session, cookie_token_target)) {
++        ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
++                      "Session cookie parameter mismatch. "
++                      "Session created with {%s}, but current "
++                      "request has {%s}.",
++                      cookie_token_session,
++                      cookie_token_target);
++        am_cache_unlock(r->server, session);
++        return NULL;
++    }
++
++    return session;
++}
++
+ /* This function gets the session associated with a user, using a cookie
+  *
+  * Parameters:
+@@ -45,7 +81,7 @@ am_cache_entry_t *am_get_request_session(request_rec *r)
+         return NULL;
+     }
+ 
+-    return am_cache_lock(r->server, AM_CACHE_SESSION, session_id);
++    return am_lock_and_validate(r, AM_CACHE_SESSION, session_id);
+ }
+ 
+ /* This function gets the session associated with a user, using a NameID
+@@ -60,7 +96,7 @@ am_cache_entry_t *am_get_request_session(request_rec *r)
+  */
+ am_cache_entry_t *am_get_request_session_by_nameid(request_rec *r, char 
*nameid)
+ {
+-    return am_cache_lock(r->server, AM_CACHE_NAMEID, nameid);
++    return am_lock_and_validate(r, AM_CACHE_NAMEID, nameid);
+ }
+ 
+ /* This function creates a new session.
+@@ -87,7 +123,8 @@ am_cache_entry_t *am_new_request_session(request_rec *r)
+     /* Set session id. */
+     am_cookie_set(r, session_id);
+ 
+-    return am_cache_new(r->server, session_id);
++    const char *cookie_token = am_cookie_token(r);
++    return am_cache_new(r->server, session_id, cookie_token);
+ }
+ 
+ 
diff -Nru libapache2-mod-auth-mellon-0.12.0/debian/patches/series 
libapache2-mod-auth-mellon-0.12.0/debian/patches/series
--- libapache2-mod-auth-mellon-0.12.0/debian/patches/series     2014-08-29 
12:59:37.000000000 +0000
+++ libapache2-mod-auth-mellon-0.12.0/debian/patches/series     2017-03-13 
13:06:19.000000000 +0000
@@ -0,0 +1,2 @@
+01_logout_segfault.patch
+02_session_transfer_vulnerability_CVE-2017-6807.patch

Reply via email to