[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Moin update in testing



Hey folks,

There's been a set of security updates in moin in the last couple of
weeks, with 2 very important ones today. I've already coordinated with
the security team for fixes in Squeeze (1.9.3-1+squeeze4) and I've
uploaded into sid (1.9.5-4). In Wheezy, we're currently on
1.9.4-8. What would you say to a TPU upload with the attached debdiff?

-- 
Steve McIntyre, Cambridge, UK.                                steve@einval.com
"Since phone messaging became popular, the young generation has lost the
 ability to read or write anything that is longer than one hundred and sixty
 characters."  -- Ignatios Souvatzis
diff -Nru moin-1.9.4/debian/changelog moin-1.9.4/debian/changelog
--- moin-1.9.4/debian/changelog	2012-09-05 01:57:33.000000000 +0100
+++ moin-1.9.4/debian/changelog	2012-12-29 19:20:43.000000000 +0000
@@ -1,8 +1,22 @@
+moin (1.9.4-8+deb7u1) testing-proposed-updates; urgency=high
+
+  * Stack of security fixes from upstream:
+    + make taintfilename more secure
+    + escape user- or admin-defined css url
+    + use a constant time str comparison function to prevent timing
+      attacks
+    + fix remote code execution vulnerability in twikidraw/anywikidraw
+      actions (CVE-2012-XXXX).
+    + fix path traversal vulnerability in AttachFile action
+      (CVE-2012-XXXX).
+
+ -- Steve McIntyre <93sam@debian.org>  Sat, 29 Dec 2012 19:20:37 +0100
+
 moin (1.9.4-8) unstable; urgency=high
 
   * High urgency for a security fix
   * Add patch from upstream to fix a virtual group bug in ACL evaluation
-    (CVE-2012-XXXX).
+    (CVE-2012-4404).
 
  -- Steve McIntyre <93sam@debian.org>  Wed, 05 Sep 2012 01:57:30 +0100
 
diff -Nru moin-1.9.4/debian/patches/attachfile-path-traversal.patch moin-1.9.4/debian/patches/attachfile-path-traversal.patch
--- moin-1.9.4/debian/patches/attachfile-path-traversal.patch	1970-01-01 01:00:00.000000000 +0100
+++ moin-1.9.4/debian/patches/attachfile-path-traversal.patch	2012-12-29 19:12:17.000000000 +0000
@@ -0,0 +1,42 @@
+
+# HG changeset patch
+# User Thomas Waldmann <tw AT waldmann-edv DOT de>
+# Date 1356801565 -3600
+# Node ID 3c27131a3c5275dac568b073e930fb6b2e0be907
+# Parent  ef1bee86328f2bccf6bfa9f5050372a5ea686df6
+security: fix path traversal vulnerability in AttachFile action
+
+diff -r ef1bee86328f -r 3c27131a3c52 MoinMoin/action/AttachFile.py
+--- a/MoinMoin/action/AttachFile.py	Sat Dec 29 17:13:39 2012 +0100
++++ b/MoinMoin/action/AttachFile.py	Sat Dec 29 18:19:25 2012 +0100
+@@ -678,6 +678,18 @@
+ 
+ 
+ def move_file(request, pagename, new_pagename, attachment, new_attachment):
++    """
++    move a file attachment from pagename:attachment to new_pagename:new_attachment
++
++    @param pagename: original pagename
++    @param new_pagename: new pagename (may be same as original pagename)
++    @param attachment: original attachment filename
++                       note: attachment filename must not contain a path,
++                             use wikiutil.taintfilename() before calling move_file
++    @param new_attachment: new attachment filename (may be same as original filename)
++                       note: attachment filename must not contain a path,
++                             use wikiutil.taintfilename() before calling move_file
++    """
+     _ = request.getText
+ 
+     newpage = Page(request, new_pagename)
+@@ -740,6 +752,10 @@
+         upload_form(pagename, request, msg=_("Move aborted because new attachment name is empty."))
+ 
+     attachment = request.form.get('oldattachmentname')
++    if attachment != wikiutil.taintfilename(attachment):
++        upload_form(pagename, request, msg=_("Please use a valid filename for attachment '%(filename)s'.") % {
++                              'filename': attachment})
++        return
+     move_file(request, pagename, new_pagename, attachment, new_attachment)
+ 
+ 
+
diff -Nru moin-1.9.4/debian/patches/constant_time_strcmp.patch moin-1.9.4/debian/patches/constant_time_strcmp.patch
--- moin-1.9.4/debian/patches/constant_time_strcmp.patch	1970-01-01 01:00:00.000000000 +0100
+++ moin-1.9.4/debian/patches/constant_time_strcmp.patch	2012-12-29 19:07:48.000000000 +0000
@@ -0,0 +1,90 @@
+
+# HG changeset patch
+# User Thomas Waldmann <tw AT waldmann-edv DOT de>
+# Date 1355091650 -3600
+# Node ID 840ebd16ddd97b325b9977967632dc43cd18a198
+# Parent  b9450db6c129f71eb18dee16dc81a28e931654ea
+use a constant time str comparison function to prevent timing attacks
+
+diff -r b9450db6c129 -r 840ebd16ddd9 MoinMoin/security/textcha.py
+--- a/MoinMoin/security/textcha.py	Sat Dec 08 22:54:04 2012 +0100
++++ b/MoinMoin/security/textcha.py	Sun Dec 09 23:20:50 2012 +0100
+@@ -28,6 +28,8 @@
+ from MoinMoin import log
+ logging = log.getLogger(__name__)
+ 
++from werkzeug.security import safe_str_cmp as safe_str_equal
++
+ from MoinMoin import wikiutil
+ from MoinMoin.support.python_compatibility import hmac_new
+ 
+@@ -136,7 +139,7 @@
+             if not timestamp or timestamp + self.expiry_time < time():
+                 success = False
+             try:
+-                if self._compute_signature(self.question, timestamp) != signature:
++                if not safe_str_equal(self._compute_signature(self.question, timestamp), signature):
+                     success = False
+             except TypeError:
+                 success = False
+diff -r b9450db6c129 -r 840ebd16ddd9 MoinMoin/user.py
+--- a/MoinMoin/user.py	Sat Dec 08 22:54:04 2012 +0100
++++ b/MoinMoin/user.py	Sun Dec 09 23:20:50 2012 +0100
+@@ -28,6 +28,8 @@
+ except ImportError:
+     crypt = None
+ 
++from werkzeug.security import safe_str_cmp as safe_str_equal
++
+ from MoinMoin.support.python_compatibility import hash_new, hmac_new
+ 
+ from MoinMoin import config, caching, wikiutil, i18n, events
+@@ -538,7 +540,7 @@
+                     salt = d[:2]
+                     enc = crypt.crypt(password.encode('utf-8'), salt.encode('ascii'))
+ 
+-                if epwd == method + enc:
++                if safe_str_equal(epwd, method + enc):
+                     data['enc_password'] = encodePassword(password) # upgrade to SSHA
+                     return True, True
+                 return False, False
+@@ -548,7 +550,7 @@
+             salt = data[20:]
+             hash = hash_new('sha1', password.encode('utf-8'))
+             hash.update(salt)
+-            return hash.digest() == data[:20], False
++            return safe_str_equal(hash.digest(), data[:20]), False
+ 
+         # No encoded password match, this must be wrong password
+         return False, False
+@@ -1025,7 +1027,7 @@
+         # check hmac
+         # key must be of type string
+         h = hmac_new(str(self.recoverpass_key), str(stamp)).hexdigest()
+-        if h != parts[1]:
++        if not safe_str_equal(h, parts[1]):
+             return False
+         self.recoverpass_key = ""
+         self.enc_password = encodePassword(newpass)
+diff -r b9450db6c129 -r 840ebd16ddd9 MoinMoin/wikiutil.py
+--- a/MoinMoin/wikiutil.py	Sat Dec 08 22:54:04 2012 +0100
++++ b/MoinMoin/wikiutil.py	Sun Dec 09 23:20:50 2012 +0100
+@@ -20,6 +20,8 @@
+ from MoinMoin import log
+ logging = log.getLogger(__name__)
+ 
++from werkzeug.security import safe_str_cmp as safe_str_equal
++
+ from MoinMoin import config
+ from MoinMoin.support.python_compatibility import rsplit
+ from inspect import getargspec, isfunction, isclass, ismethod
+@@ -2553,7 +2555,7 @@
+     #       if the ticket was created within a session.
+     ourticket = createTicket(request, timestamp_str)
+     logging.debug("checkTicket: returning %r, got %r, expected %r" % (ticket == ourticket, ticket, ourticket))
+-    return ticket == ourticket
++    return safe_str_equal(ticket, ourticket)
+ 
+ 
+ def renderText(request, Parser, text):
+
diff -Nru moin-1.9.4/debian/patches/draw-taintfile.patch moin-1.9.4/debian/patches/draw-taintfile.patch
--- moin-1.9.4/debian/patches/draw-taintfile.patch	1970-01-01 01:00:00.000000000 +0100
+++ moin-1.9.4/debian/patches/draw-taintfile.patch	2012-12-29 19:10:35.000000000 +0000
@@ -0,0 +1,55 @@
+
+# HG changeset patch
+# User Thomas Waldmann <tw AT waldmann-edv DOT de>
+# Date 1356789929 -3600
+# Node ID 7e7e1cbb9d3fbef8be61fa0506ee26f96cfb28fb
+# Parent  671124d91dc125264ad2d78ccca80f0b6ddf8351
+security: fix remote code execution vulnerability in twikidraw/anywikidraw actions
+
+We have wikiutil.taintfilename() to make user supplied filenames safe,
+so that they can't contain any "special" characters like path separators, etc.
+It is used at many places in moin, but wasn't used here. :|
+
+diff -r 671124d91dc1 -r 7e7e1cbb9d3f MoinMoin/action/AttachFile.py
+--- a/MoinMoin/action/AttachFile.py	Mon Dec 24 23:49:10 2012 +0100
++++ b/MoinMoin/action/AttachFile.py	Sat Dec 29 15:05:29 2012 +0100
+@@ -603,6 +603,14 @@
+     """ A storage container (multiple objects in 1 tarfile) """
+ 
+     def __init__(self, request, pagename, containername):
++        """
++        @param pagename: a wiki page name
++        @param containername: the filename of the tar file.
++                              Make sure this is a simple filename, NOT containing any path components.
++                              Use wikiutil.taintfilename() to avoid somebody giving a container
++                              name that starts with e.g. ../../filename or you'll create a
++                              directory traversal and code execution vulnerability.
++        """
+         self.request = request
+         self.pagename = pagename
+         self.containername = containername
+diff -r 671124d91dc1 -r 7e7e1cbb9d3f MoinMoin/action/anywikidraw.py
+--- a/MoinMoin/action/anywikidraw.py	Mon Dec 24 23:49:10 2012 +0100
++++ b/MoinMoin/action/anywikidraw.py	Sat Dec 29 15:05:29 2012 +0100
+@@ -197,6 +197,8 @@
+ 
+ def execute(pagename, request):
+     target = request.values.get('target')
++    target = wikiutil.taintfilename(target)
++
+     awd = AnyWikiDraw(request, pagename, target)
+ 
+     do = request.values.get('do')
+diff -r 671124d91dc1 -r 7e7e1cbb9d3f MoinMoin/action/twikidraw.py
+--- a/MoinMoin/action/twikidraw.py	Mon Dec 24 23:49:10 2012 +0100
++++ b/MoinMoin/action/twikidraw.py	Sat Dec 29 15:05:29 2012 +0100
+@@ -208,6 +208,8 @@
+ 
+ def execute(pagename, request):
+     target = request.values.get('target')
++    target = wikiutil.taintfilename(target)
++
+     twd = TwikiDraw(request, pagename, target)
+ 
+     do = request.values.get('do')
+
diff -Nru moin-1.9.4/debian/patches/escape_css_url.patch moin-1.9.4/debian/patches/escape_css_url.patch
--- moin-1.9.4/debian/patches/escape_css_url.patch	1970-01-01 01:00:00.000000000 +0100
+++ moin-1.9.4/debian/patches/escape_css_url.patch	2012-12-12 16:07:38.000000000 +0000
@@ -0,0 +1,21 @@
+
+# HG changeset patch
+# User Thomas Waldmann <tw AT waldmann-edv DOT de>
+# Date 1354999660 -3600
+# Node ID d0567fba754edf749a62f3a31f7be5a70456b0b2
+# Parent  d3090fb6624f600c64076e161a47207496ad356b
+escape user- or admin-defined css url
+
+diff -r d3090fb6624f -r d0567fba754e MoinMoin/theme/__init__.py
+--- a/MoinMoin/theme/__init__.py	Sat Dec 08 21:20:24 2012 +0100
++++ b/MoinMoin/theme/__init__.py	Sat Dec 08 21:47:40 2012 +0100
+@@ -687,7 +687,7 @@
+         if theme:
+             href = '%s/%s/css/%s.css' % (self.cfg.url_prefix_static, self.name, href)
+         attrs = 'type="text/css" charset="%s" media="%s" href="%s"' % (
+-                self.stylesheetsCharset, media, href, )
++                self.stylesheetsCharset, media, wikiutil.escape(href, True), )
+         if title:
+             return '<link rel="alternate stylesheet" %s title="%s">' % (attrs, title)
+         else:
+
diff -Nru moin-1.9.4/debian/patches/secure_taintfile_name.patch moin-1.9.4/debian/patches/secure_taintfile_name.patch
--- moin-1.9.4/debian/patches/secure_taintfile_name.patch	1970-01-01 01:00:00.000000000 +0100
+++ moin-1.9.4/debian/patches/secure_taintfile_name.patch	2012-12-29 19:07:34.000000000 +0000
@@ -0,0 +1,25 @@
+
+# HG changeset patch
+# User Thomas Waldmann <tw AT waldmann-edv DOT de>
+# Date 1354998024 -3600
+# Node ID d3090fb6624f600c64076e161a47207496ad356b
+# Parent  20a27e94a7f956b65e342eedaa9436292db407e8
+make taintfilename more secure
+
+diff -r 20a27e94a7f9 -r d3090fb6624f MoinMoin/wikiutil.py
+--- a/MoinMoin/wikiutil.py	Fri Sep 28 15:04:15 2012 +0200
++++ b/MoinMoin/wikiutil.py	Sat Dec 08 21:20:24 2012 +0100
+@@ -2266,9 +2266,9 @@
+     @rtype: string
+     @return: (safer) filename
+     """
+-    for x in (os.pardir, ':', '/', '\\', '<', '>'):
+-        basename = basename.replace(x, '_')
+-
++    # note: filenames containing ../ (or ..\) are made safe by replacing
++    # the / (or the \). the .. will be kept, but is harmless then.
++    basename = re.sub('[\x00-\x1f:/\\\\<>"*?%|]', '_', basename)
+     return basename
+ 
+ 
+
diff -Nru moin-1.9.4/debian/patches/series moin-1.9.4/debian/patches/series
--- moin-1.9.4/debian/patches/series	2012-09-05 01:58:55.000000000 +0100
+++ moin-1.9.4/debian/patches/series	2012-12-29 19:12:21.000000000 +0000
@@ -6,3 +6,8 @@
 subscribercache.patch
 mail-verification.patch
 CVE-2012-XXX-virtual-group-ACL.patch
+constant_time_strcmp.patch
+escape_css_url.patch
+secure_taintfile_name.patch
+draw-taintfile.patch
+attachfile-path-traversal.patch

Attachment: signature.asc
Description: Digital signature


Reply to: