An interpreted, interactive, object-oriented programming language
CentOS Sources
2017-08-01 71084d584ff953f5463757ec6536406320560b4d
commit | author | age
854cc6 1 From 3a184cc875709d4324d234a4b939d614a2c9bb0f Mon Sep 17 00:00:00 2001
CS 2 From: Charalampos Stratakis <cstratak@redhat.com>
3 Date: Mon, 1 Aug 2016 11:20:11 +0200
4 Subject: [PATCH] =?UTF-8?q?Fix=20for=20CVE-2016-1000110=20http://bugs.pyth?=
5  =?UTF-8?q?on.org/issue27568=20Based=20on=20the=20patch=20by=20R=C3=A9mi?=
6  =?UTF-8?q?=20Rampin?=
7 MIME-Version: 1.0
8 Content-Type: text/plain; charset=UTF-8
9 Content-Transfer-Encoding: 8bit
10
11 ---
12  Doc/howto/urllib2.rst   |  5 +++++
13  Doc/library/urllib.rst  | 10 ++++++++++
14  Doc/library/urllib2.rst |  4 ++++
15  Lib/test/test_urllib.py | 12 ++++++++++++
16  Lib/urllib.py           |  9 +++++++++
17  5 files changed, 40 insertions(+)
18
19 diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst
20 index f84bf08..6542846 100644
21 --- a/Doc/howto/urllib2.rst
22 +++ b/Doc/howto/urllib2.rst
23 @@ -523,6 +523,11 @@ setting up a `Basic Authentication`_ handler : ::
24      through a proxy.  However, this can be enabled by extending urllib2 as
25      shown in the recipe [#]_.
26  
27 +.. note::
28 +
29 +    ``HTTP_PROXY`` will be ignored if a variable ``REQUEST_METHOD`` is set; see
30 +    the documentation on :func:`~urllib.getproxies`.
31 +
32  
33  Sockets and Layers
34  ==================
35 diff --git a/Doc/library/urllib.rst b/Doc/library/urllib.rst
36 index c7d200d..3b9876e 100644
37 --- a/Doc/library/urllib.rst
38 +++ b/Doc/library/urllib.rst
39 @@ -280,6 +280,16 @@ Utility functions
40     find it, looks for proxy information from Mac OSX System Configuration for
41     Mac OS X and Windows Systems Registry for Windows.
42  
43 +    .. note::
44 +
45 +        If the environment variable ``REQUEST_METHOD`` is set, which usually
46 +        indicates your script is running in a CGI environment, the environment
47 +        variable ``HTTP_PROXY`` (uppercase ``_PROXY``) will be ignored. This is
48 +        because that variable can be injected by a client using the "Proxy:"
49 +        HTTP header. If you need to use an HTTP proxy in a CGI environment,
50 +        either use ``ProxyHandler`` explicitly, or make sure the variable name
51 +        is in lowercase (or at least the ``_proxy`` suffix).
52 +
53  .. note::
54      urllib also exposes certain utility functions like splittype, splithost and
55      others parsing url into various components. But it is recommended to use
56 diff --git a/Doc/library/urllib2.rst b/Doc/library/urllib2.rst
57 index 24deeb4..46fce59 100644
58 --- a/Doc/library/urllib2.rst
59 +++ b/Doc/library/urllib2.rst
60 @@ -224,6 +224,10 @@ The following classes are provided:
61  
62     To disable autodetected proxy pass an empty dictionary.
63  
64 +    .. note::
65 +
66 +       ``HTTP_PROXY`` will be ignored if a variable ``REQUEST_METHOD`` is set;
67 +       see the documentation on :func:`~urllib.getproxies`.
68  
69  .. class:: HTTPPasswordMgr()
70  
71 diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py
72 index 3a273f8..3845012 100644
73 --- a/Lib/test/test_urllib.py
74 +++ b/Lib/test/test_urllib.py
75 @@ -161,6 +161,18 @@ class ProxyTests(unittest.TestCase):
76          self.env.set('NO_PROXY', 'localhost, anotherdomain.com, newdomain.com')
77          self.assertTrue(urllib.proxy_bypass_environment('anotherdomain.com'))
78  
79 +    def test_proxy_cgi_ignore(self):
80 +        try:
81 +            self.env.set('HTTP_PROXY', 'http://somewhere:3128')
82 +            proxies = urllib.getproxies_environment()
83 +            self.assertEqual('http://somewhere:3128', proxies['http'])
84 +            self.env.set('REQUEST_METHOD', 'GET')
85 +            proxies = urllib.getproxies_environment()
86 +            self.assertNotIn('http', proxies)
87 +        finally:
88 +            self.env.unset('REQUEST_METHOD')
89 +            self.env.unset('HTTP_PROXY')
90 +
91  
92  class urlopen_HttpTests(unittest.TestCase, FakeHTTPMixin):
93      """Test urlopen() opening a fake http connection."""
94 diff --git a/Lib/urllib.py b/Lib/urllib.py
95 index f9655f9..9b31df1 100644
96 --- a/Lib/urllib.py
97 +++ b/Lib/urllib.py
98 @@ -1361,11 +1361,20 @@ def getproxies_environment():
99      [Fancy]URLopener constructor.
100  
101      """
102 +    # Get all variables
103      proxies = {}
104      for name, value in os.environ.items():
105          name = name.lower()
106          if value and name[-6:] == '_proxy':
107              proxies[name[:-6]] = value
108 +
109 +    # CVE-2016-1000110 - If we are running as CGI script, forget HTTP_PROXY
110 +    # (non-all-lowercase) as it may be set from the web server by a "Proxy:"
111 +    # header from the client
112 +    # If "proxy" is lowercase, it will still be used thanks to the next block
113 +    if 'REQUEST_METHOD' in os.environ:
114 +        proxies.pop('http', None)
115 +
116      return proxies
117  
118  def proxy_bypass_environment(host):
119 -- 
120 2.7.4
121