aboutsummaryrefslogtreecommitdiffstats
path: root/Mailman/CSRFcheck.py
diff options
context:
space:
mode:
authorMark Sapiro <mark@msapiro.net>2021-11-30 09:50:49 -0800
committerMark Sapiro <mark@msapiro.net>2021-11-30 09:50:49 -0800
commita306294cf9e4d4a4ded2c840f9a1ce8ba412b6a7 (patch)
tree9f8f2843bf72bc8cfabe4d752eb7914e535d8f08 /Mailman/CSRFcheck.py
parentf63f8d81d718d779dd6cdb55c66bf3def0fe9041 (diff)
downloadmailman2-a306294cf9e4d4a4ded2c840f9a1ce8ba412b6a7.tar.gz
mailman2-a306294cf9e4d4a4ded2c840f9a1ce8ba412b6a7.tar.xz
mailman2-a306294cf9e4d4a4ded2c840f9a1ce8ba412b6a7.zip
Block CSRF attack against admin or admindb pages.
Diffstat (limited to '')
-rw-r--r--Mailman/CSRFcheck.py17
1 files changed, 15 insertions, 2 deletions
diff --git a/Mailman/CSRFcheck.py b/Mailman/CSRFcheck.py
index 4505f9d4..9a0b67fc 100644
--- a/Mailman/CSRFcheck.py
+++ b/Mailman/CSRFcheck.py
@@ -55,7 +55,7 @@ def csrf_token(mlist, contexts, user=None):
token = binascii.hexlify(marshal.dumps((issued, keymac)))
return token
-def csrf_check(mlist, token, options_user=None):
+def csrf_check(mlist, token, cgi_user=None):
""" check token by mailman cookie validation algorithm """
try:
issued, keymac = marshal.loads(binascii.unhexlify(token))
@@ -67,12 +67,25 @@ def csrf_check(mlist, token, options_user=None):
key, user = key.split('+', 1)
else:
user = None
+ # Don't allow unprivileged tokens for admin or admindb.
+ if cgi_user == 'admin':
+ if key not in ('admin', 'site'):
+ syslog('mischief',
+ 'admin form submitted with CSRF token issued for %s.',
+ key + '+' + user if user else key)
+ return False
+ elif cgi_user == 'admindb':
+ if key not in ('moderator', 'admin', 'site'):
+ syslog('mischief',
+ 'admindb form submitted with CSRF token issued for %s.',
+ key + '+' + user if user else key)
+ return False
if user:
# This is for CVE-2021-42097. The token is a user token because
# of the fix for CVE-2021-42096 but it must match the user for
# whom the options page is requested.
raw_user = UnobscureEmail(urllib.unquote(user))
- if options_user and options_user != raw_user:
+ if cgi_user and cgi_user != raw_user:
syslog('mischief',
'Form for user %s submitted with CSRF token '
'issued for %s.',