]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
authorGuido van Rossum <guido@python.org>
Thu, 3 Feb 2005 14:59:43 +0000 (14:59 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 3 Feb 2005 14:59:43 +0000 (14:59 +0000)
Doc/lib/libsimplexmlrpc.tex
Lib/SimpleXMLRPCServer.py
Misc/NEWS

index f9afce0e188519eb4045a43ac763f9e6e56ce573..503f2469de68f7547074f930f0c0992257adb780 100644 (file)
@@ -55,19 +55,34 @@ simple, stand alone XML-RPC servers.
   period character.
 \end{methoddesc}
 
-\begin{methoddesc}[SimpleXMLRPCServer]{register_instance}{instance}
+\begin{methoddesc}[SimpleXMLRPCServer]{register_instance}{instance\optional{,
+                                       allow_dotted_names}}
   Register an object which is used to expose method names which have
   not been registered using \method{register_function()}.  If
   \var{instance} contains a \method{_dispatch()} method, it is called
   with the requested method name and the parameters from the request;
   the return value is returned to the client as the result.  If
   \var{instance} does not have a \method{_dispatch()} method, it is
-  searched for an attribute matching the name of the requested method;
+  searched for an attribute matching the name of the requested method.
+
+  If the optional \var{allow_dotted_names} argument is true and the
+  instance does not have a \method{_dispatch()} method, then
   if the requested method name contains periods, each component of the
   method name is searched for individually, with the effect that a
   simple hierarchical search is performed.  The value found from this
   search is then called with the parameters from the request, and the
   return value is passed back to the client.
+
+  \begin{notice}[warning]
+  Enabling the \var{allow_dotted_names} option allows intruders to access
+  your module's global variables and may allow intruders to execute
+  arbitrary code on your machine.  Only use this option on a secure,
+  closed network.
+  \end{notice}
+
+  \versionchanged[\var{allow_dotted_names} was added to plug a security hole;
+  prior versions are insecure]{2.3.5, 2.4.1}
+
 \end{methoddesc}
 
 \begin{methoddesc}{register_introspection_functions}{}
index 892a61e273880b56a7c208e1c6a49f645220f751..3cc75da90693afcc62f363bfad78096a65513af0 100644 (file)
@@ -107,14 +107,22 @@ import sys
 import types
 import os
 
-def resolve_dotted_attribute(obj, attr):
+def resolve_dotted_attribute(obj, attr, allow_dotted_names=True):
     """resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d
 
     Resolves a dotted attribute name to an object.  Raises
     an AttributeError if any attribute in the chain starts with a '_'.
+
+    If the optional allow_dotted_names argument is false, dots are not
+    supported and this function operates similar to getattr(obj, attr).
     """
 
-    for i in attr.split('.'):
+    if allow_dotted_names:
+        attrs = attr.split('.')
+    else:
+        attrs = [attr]
+
+    for i in attrs:
         if i.startswith('_'):
             raise AttributeError(
                 'attempt to access private attribute "%s"' % i
@@ -156,7 +164,7 @@ class SimpleXMLRPCDispatcher:
         self.funcs = {}
         self.instance = None
 
-    def register_instance(self, instance):
+    def register_instance(self, instance, allow_dotted_names=False):
         """Registers an instance to respond to XML-RPC requests.
 
         Only one instance can be installed at a time.
@@ -174,9 +182,23 @@ class SimpleXMLRPCDispatcher:
 
         If a registered function matches a XML-RPC request, then it
         will be called instead of the registered instance.
+
+        If the optional allow_dotted_names argument is true and the
+        instance does not have a _dispatch method, method names
+        containing dots are supported and resolved, as long as none of
+        the name segments start with an '_'.
+
+            *** SECURITY WARNING: ***
+
+            Enabling the allow_dotted_names options allows intruders
+            to access your module's global variables and may allow
+            intruders to execute arbitrary code on your machine.  Only
+            use this option on a secure, closed network.
+
         """
 
         self.instance = instance
+        self.allow_dotted_names = allow_dotted_names
 
     def register_function(self, function, name = None):
         """Registers a function to respond to XML-RPC requests.
@@ -295,7 +317,8 @@ class SimpleXMLRPCDispatcher:
                 try:
                     method = resolve_dotted_attribute(
                                 self.instance,
-                                method_name
+                                method_name,
+                                self.allow_dotted_names
                                 )
                 except AttributeError:
                     pass
@@ -374,7 +397,8 @@ class SimpleXMLRPCDispatcher:
                     try:
                         func = resolve_dotted_attribute(
                             self.instance,
-                            method
+                            method,
+                            self.allow_dotted_names
                             )
                     except AttributeError:
                         pass
index 24af10ae47026375ca1014bd049e7950d45314e7..d320877fb59b4d5a82217fe6718e95417f1b3dfb 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -11,8 +11,17 @@ What's New in Python 2.3.5?
 
 Core and builtins
 -----------------
+
 - Partially revert the fix for #1074011; don't try to fflush stdin anymore.
 
+Library
+-------
+
+- Applied a security fix to SimpleXMLRPCserver (PSF-2005-001).  This
+  disables recursive traversal through instance attributes, which can
+  be exploited in various ways.
+
+
 What's New in Python 2.3.5rc1?
 ==============================