mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
Check the HTTP Referer header on all requests
The referer was only checked in WSGIExecutioner classes: - jsonserver - KerberosWSGIExecutioner - xmlserver - jsonserver_kerb This left /i18n_messages, /session/login_kerberos, /session/login_x509, /session/login_password, /session/change_password and /session/sync_token unprotected against CSRF attacks. CVE-2023-5455 Signed-off-by: Rob Crittenden <rcritten@redhat.com>
This commit is contained in:
committed by
Antonio Torres
parent
11877d5903
commit
13778d88ca
@@ -156,6 +156,19 @@ _success_template = """<html>
|
||||
</html>"""
|
||||
|
||||
class HTTP_Status(plugable.Plugin):
|
||||
def check_referer(self, environ):
|
||||
if "HTTP_REFERER" not in environ:
|
||||
logger.error("Rejecting request with missing Referer")
|
||||
return False
|
||||
if (not environ["HTTP_REFERER"].startswith(
|
||||
"https://%s/ipa" % self.api.env.host)
|
||||
and not self.env.in_tree):
|
||||
logger.error("Rejecting request with bad Referer %s",
|
||||
environ["HTTP_REFERER"])
|
||||
return False
|
||||
logger.debug("Valid Referer %s", environ["HTTP_REFERER"])
|
||||
return True
|
||||
|
||||
def not_found(self, environ, start_response, url, message):
|
||||
"""
|
||||
Return a 404 Not Found error.
|
||||
@@ -331,9 +344,6 @@ class wsgi_dispatch(Executioner, HTTP_Status):
|
||||
self.__apps[key] = app
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class WSGIExecutioner(Executioner):
|
||||
"""
|
||||
Base class for execution backends with a WSGI application interface.
|
||||
@@ -898,6 +908,9 @@ class jsonserver_session(jsonserver, KerberosSession):
|
||||
|
||||
logger.debug('WSGI jsonserver_session.__call__:')
|
||||
|
||||
if not self.check_referer(environ):
|
||||
return self.bad_request(environ, start_response, 'denied')
|
||||
|
||||
# Redirect to login if no Kerberos credentials
|
||||
ccache_name = self.get_environ_creds(environ)
|
||||
if ccache_name is None:
|
||||
@@ -950,6 +963,9 @@ class KerberosLogin(Backend, KerberosSession):
|
||||
def __call__(self, environ, start_response):
|
||||
logger.debug('WSGI KerberosLogin.__call__:')
|
||||
|
||||
if not self.check_referer(environ):
|
||||
return self.bad_request(environ, start_response, 'denied')
|
||||
|
||||
# Redirect to login if no Kerberos credentials
|
||||
user_ccache_name = self.get_environ_creds(environ)
|
||||
if user_ccache_name is None:
|
||||
@@ -968,6 +984,9 @@ class login_x509(KerberosLogin):
|
||||
def __call__(self, environ, start_response):
|
||||
logger.debug('WSGI login_x509.__call__:')
|
||||
|
||||
if not self.check_referer(environ):
|
||||
return self.bad_request(environ, start_response, 'denied')
|
||||
|
||||
if 'KRB5CCNAME' not in environ:
|
||||
return self.unauthorized(
|
||||
environ, start_response, 'KRB5CCNAME not set',
|
||||
@@ -1016,6 +1035,9 @@ class login_password(Backend, KerberosSession):
|
||||
|
||||
logger.debug('WSGI login_password.__call__:')
|
||||
|
||||
if not self.check_referer(environ):
|
||||
return self.bad_request(environ, start_response, 'denied')
|
||||
|
||||
# Get the user and password parameters from the request
|
||||
content_type = environ.get('CONTENT_TYPE', '').lower()
|
||||
if not content_type.startswith('application/x-www-form-urlencoded'):
|
||||
@@ -1148,6 +1170,9 @@ class change_password(Backend, HTTP_Status):
|
||||
def __call__(self, environ, start_response):
|
||||
logger.info('WSGI change_password.__call__:')
|
||||
|
||||
if not self.check_referer(environ):
|
||||
return self.bad_request(environ, start_response, 'denied')
|
||||
|
||||
# Get the user and password parameters from the request
|
||||
content_type = environ.get('CONTENT_TYPE', '').lower()
|
||||
if not content_type.startswith('application/x-www-form-urlencoded'):
|
||||
@@ -1365,6 +1390,9 @@ class xmlserver_session(xmlserver, KerberosSession):
|
||||
|
||||
logger.debug('WSGI xmlserver_session.__call__:')
|
||||
|
||||
if not self.check_referer(environ):
|
||||
return self.bad_request(environ, start_response, 'denied')
|
||||
|
||||
ccache_name = environ.get('KRB5CCNAME')
|
||||
|
||||
# Redirect to /ipa/xml if no Kerberos credentials
|
||||
|
||||
Reference in New Issue
Block a user