Your message dated Tue, 14 Mar 2017 17:33:57 +0000
with message-id <e1cnqkb-0000fv...@respighi.debian.org>
and subject line unblock libapache2-mod-auth-mellon
has caused the Debian Bug report #857712,
regarding unblock: libapache2-mod-auth-mellon/0.12.0-2
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact ow...@bugs.debian.org
immediately.)


-- 
857712: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=857712
Debian Bug Tracking System
Contact ow...@bugs.debian.org with problems
--- Begin Message ---
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

--- End Message ---
--- Begin Message ---
Unblocked libapache2-mod-auth-mellon.

--- End Message ---

Reply via email to