------------------------------------------------------------
revno: 1882
fixes bug: https://launchpad.net/bugs/1952384
committer: Mark Sapiro <m...@msapiro.net>
branch nick: 2.1
timestamp: Tue 2021-11-30 09:50:49 -0800
message:
  Block CSRF attack against admin or admindb pages.
modified:
  Mailman/CSRFcheck.py
  Mailman/Cgi/admin.py
  Mailman/Cgi/admindb.py
  Mailman/Cgi/edithtml.py
  NEWS


--
lp:mailman/2.1
https://code.launchpad.net/~mailman-coders/mailman/2.1

Your team Mailman Checkins is subscribed to branch lp:mailman/2.1.
To unsubscribe from this branch go to 
https://code.launchpad.net/~mailman-coders/mailman/2.1/+edit-subscription
=== modified file 'Mailman/CSRFcheck.py'
--- Mailman/CSRFcheck.py	2021-11-12 23:23:52 +0000
+++ Mailman/CSRFcheck.py	2021-11-30 17:50:49 +0000
@@ -55,7 +55,7 @@
     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 @@
             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.',

=== modified file 'Mailman/Cgi/admin.py'
--- Mailman/Cgi/admin.py	2019-10-05 21:32:22 +0000
+++ Mailman/Cgi/admin.py	2021-11-30 17:50:49 +0000
@@ -107,7 +107,8 @@
                    'legend']
     params = cgidata.keys()
     if set(params) - set(safe_params):
-        csrf_checked = csrf_check(mlist, cgidata.getfirst('csrf_token'))
+        csrf_checked = csrf_check(mlist, cgidata.getfirst('csrf_token'),
+                                  'admin')
     else:
         csrf_checked = True
     # if password is present, void cookie to force password authentication.

=== modified file 'Mailman/Cgi/admindb.py'
--- Mailman/Cgi/admindb.py	2021-11-12 23:23:52 +0000
+++ Mailman/Cgi/admindb.py	2021-11-30 17:50:49 +0000
@@ -144,7 +144,8 @@
     safe_params = ['adminpw', 'admlogin', 'msgid', 'sender', 'details']
     params = cgidata.keys()
     if set(params) - set(safe_params):
-        csrf_checked = csrf_check(mlist, cgidata.getfirst('csrf_token'))
+        csrf_checked = csrf_check(mlist, cgidata.getfirst('csrf_token'),
+                                  'admindb')
     else:
         csrf_checked = True
     # if password is present, void cookie to force password authentication.

=== modified file 'Mailman/Cgi/edithtml.py'
--- Mailman/Cgi/edithtml.py	2018-07-11 06:52:22 +0000
+++ Mailman/Cgi/edithtml.py	2021-11-30 17:50:49 +0000
@@ -111,7 +111,8 @@
     safe_params = ['VARHELP', 'adminpw', 'admlogin']
     params = cgidata.keys()
     if set(params) - set(safe_params):
-        csrf_checked = csrf_check(mlist, cgidata.getfirst('csrf_token'))
+        csrf_checked = csrf_check(mlist, cgidata.getfirst('csrf_token'),
+                                  'admin')
     else:
         csrf_checked = True
     # if password is present, void cookie to force password authentication.

=== modified file 'NEWS'
--- NEWS	2021-11-22 04:31:11 +0000
+++ NEWS	2021-11-30 17:50:49 +0000
@@ -5,7 +5,12 @@
 
 Here is a history of user visible changes to Mailman.
 
-2.1.38 (xx-xxx-xxxx)
+2.1.38 (30-Nov-2021)
+
+  Security
+
+    - A potential CSRF attack against a list admin from a list member or
+      moderator has been blocked.  CVE-2021-44227  (LP: #1952384)
 
   Bug Fixes and other patches
 

_______________________________________________
Mailman-checkins mailing list -- mailman-checkins@python.org
To unsubscribe send an email to mailman-checkins-le...@python.org
https://mail.python.org/mailman3/lists/mailman-checkins.python.org/
Member address: arch...@jab.org

Reply via email to