Blame SOURCES/0001-Modify-am_handler-setup-to-run-before-mod_proxy.patch

3e4216
From e09a28a30e13e5c22b481010f26b4a7743a09280 Mon Sep 17 00:00:00 2001
3e4216
From: John Dennis <jdennis@redhat.com>
3e4216
Date: Tue, 5 Mar 2019 10:15:48 +0100
3e4216
Subject: [PATCH] Modify am_handler setup to run before mod_proxy
3e4216
3e4216
The way the ECP flow works is that when a client initiates the flow, the
3e4216
SP's response is HTTP 200, but not the requested content, but a signed XML
3e4216
document that contains the "samlp:AuthnRequest" element. The idea is that
3e4216
the ECP client would then determine the IDP and send the document to the
3e4216
IDP, get a samlp:Response and convey that to the SP to get access to the
3e4216
protected resource.
3e4216
3e4216
Internally, the auth check which is normally done with am_check_uid() set to
3e4216
apache's ap_hook_check_user_id() hook, just responds with OK, so it pretends
3e4216
to authenticate the user. Then in the usual flow, the request reaches the
3e4216
ap_hook_handler which handles the request. There in the pipeline, mellon
3e4216
registers functions am_handler() which should run first (APR_HOOK_FIRST),
3e4216
determine that this request is an ECP one and return the ECP AuthnRequest
3e4216
document. But in case the proxy module is also in the picture, the proxy
3e4216
module "races" for who gets to be the first to handle the request in the
3e4216
pipeline and wins. Therefore, the request reaches the protected resource
3e4216
via mod_proxy and returns it.
3e4216
3e4216
This fix modifies the ap_hook_handler() call to explicitly run before
3e4216
handlers from mod_proxy.c
3e4216
3e4216
To reproduce the bug:
3e4216
0) Have a SP with mellon connected to a Keycloak IDP (or any other IDP I
3e4216
   guess). In the example below, my SAML SP is saml.federation.test
3e4216
1) Set a Location protected by mellon that proxies requests to another
3e4216
   URL. For example:
3e4216
3e4216
    ProxyPass         /sp-proxy  http://app.federation.test/example_app/
3e4216
    <Location /sp-proxy>
3e4216
        AuthType Mellon
3e4216
        MellonEnable auth
3e4216
        Require valid-user
3e4216
    </Location>
3e4216
3e4216
2) call:
3e4216
 curl -L -H "Accept: application/vnd.paos+xml" \
3e4216
         -H 'PAOS: ver="urn:liberty:paos:2003-08";"urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp"' \
3e4216
          http://saml.federation.test/sp-proxy
3e4216
3e4216
Before the patch, you would see whatever is served from the proxied
3e4216
page. With the patch, you should get back a XML document with a
3e4216
samlp:AuthnRequest.
3e4216
---
3e4216
 mod_auth_mellon.c | 8 +++++++-
3e4216
 1 file changed, 7 insertions(+), 1 deletion(-)
3e4216
3e4216
diff --git a/mod_auth_mellon.c b/mod_auth_mellon.c
3e4216
index 74bd328..5330f48 100644
3e4216
--- a/mod_auth_mellon.c
3e4216
+++ b/mod_auth_mellon.c
3e4216
@@ -207,6 +207,12 @@ static int am_create_request(request_rec *r)
3e4216
 
3e4216
 static void register_hooks(apr_pool_t *p)
3e4216
 {
3e4216
+    /* Our handler needs to run before mod_proxy so that it can properly
3e4216
+     * return ECP AuthnRequest messages when running as a reverse proxy.
3e4216
+     * See: https://github.com/Uninett/mod_auth_mellon/pull/196
3e4216
+     */
3e4216
+    static const char * const run_handler_before[]={ "mod_proxy.c", NULL };
3e4216
+
3e4216
     ap_hook_access_checker(am_auth_mellon_user, NULL, NULL, APR_HOOK_MIDDLE);
3e4216
     ap_hook_check_user_id(am_check_uid, NULL, NULL, APR_HOOK_MIDDLE);
3e4216
     ap_hook_post_config(am_global_init, NULL, NULL, APR_HOOK_MIDDLE);
3e4216
@@ -222,7 +228,7 @@ static void register_hooks(apr_pool_t *p)
3e4216
      * Therefore this hook must run before any handler that may check
3e4216
      * r->handler and decide that it is the only handler for this URL.
3e4216
      */
3e4216
-    ap_hook_handler(am_handler, NULL, NULL, APR_HOOK_FIRST);
3e4216
+    ap_hook_handler(am_handler, NULL, run_handler_before, APR_HOOK_FIRST);
3e4216
 
3e4216
 #ifdef ENABLE_DIAGNOSTICS
3e4216
     ap_hook_open_logs(am_diag_log_init,NULL,NULL,APR_HOOK_MIDDLE);
3e4216
-- 
3e4216
2.19.2
3e4216