summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/python/python3/CVE-2016-1000110.patch
blob: 659dcb2f0cb2f862f2f596b54067260755e8450e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
From 5e0700418dc27b645edbe33c744daff93cd66618 Mon Sep 17 00:00:00 2001
From: Senthil Kumaran <senthil@uthcode.com>
Date: Sat, 30 Jul 2016 23:24:16 -0700
Subject: [PATCH] Prevent HTTPoxy attack (CVE-2016-1000110)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Ignore the HTTP_PROXY variable when REQUEST_METHOD environment is set, which
indicates that the script is in CGI mode.

Issue #27568 Reported and patch contributed by Rémi Rampin.

Upstream-Status: Backport
CVE: CVE-2016-1000110

Signed-off-by: Armin Kuster <akuster@mvista.com>

---
 Doc/howto/urllib2.rst          |  5 +++++
 Doc/library/urllib.request.rst | 13 +++++++++++++
 Lib/test/test_urllib.py        | 13 +++++++++++++
 Lib/urllib/request.py          |  7 +++++++
 Misc/NEWS                      |  4 ++++
 5 files changed, 42 insertions(+)

Index: Python-3.5.1/Doc/howto/urllib2.rst
===================================================================
--- Python-3.5.1.orig/Doc/howto/urllib2.rst
+++ Python-3.5.1/Doc/howto/urllib2.rst
@@ -538,6 +538,11 @@ setting up a `Basic Authentication`_ han
     through a proxy.  However, this can be enabled by extending urllib.request as
     shown in the recipe [#]_.
 
+.. note::
+
+   `HTTP_PROXY`` will be ignored if a variable ``REQUEST_METHOD`` is set; see
+   the documentation on :func:`~urllib.request.getproxies`.
+
 
 Sockets and Layers
 ==================
Index: Python-3.5.1/Doc/library/urllib.request.rst
===================================================================
--- Python-3.5.1.orig/Doc/library/urllib.request.rst
+++ Python-3.5.1/Doc/library/urllib.request.rst
@@ -166,6 +166,14 @@ The :mod:`urllib.request` module defines
    cannot find it, looks for proxy information from Mac OSX System
    Configuration for Mac OS X and Windows Systems Registry for Windows.
 
+   .. note::
+
+      If the environment variable ``REQUEST_METHOD`` is set, which usually
+      indicates your script is running in a CGI environment, the environment
+      variable ``HTTP_PROXY`` (uppercase ``_PROXY``) will be ignored. This is
+      because that variable can be injected by a client using the "Proxy:" HTTP
+      header. If you need to use an HTTP proxy in a CGI environment use
+      ``ProxyHandler`` explicitly.
 
 The following classes are provided:
 
@@ -275,6 +283,11 @@ The following classes are provided:
 
    To disable autodetected proxy pass an empty dictionary.
 
+   .. note::
+
+      ``HTTP_PROXY`` will be ignored if a variable ``REQUEST_METHOD`` is set;
+      see the documentation on :func:`~urllib.request.getproxies`.
+
 
 .. class:: HTTPPasswordMgr()
 
Index: Python-3.5.1/Lib/urllib/request.py
===================================================================
--- Python-3.5.1.orig/Lib/urllib/request.py
+++ Python-3.5.1/Lib/urllib/request.py
@@ -2394,6 +2394,13 @@ def getproxies_environment():
         name = name.lower()
         if value and name[-6:] == '_proxy':
             proxies[name[:-6]] = value
+
+    # CVE-2016-1000110 - If we are running as CGI script, forget HTTP_PROXY
+    # (non-all-lowercase) as it may be set from the web server by a "Proxy:"
+    # header from the client
+    if 'REQUEST_METHOD' in os.environ:
+        proxies.pop('http', None)
+
     return proxies
 
 def proxy_bypass_environment(host):
Index: Python-3.5.1/Misc/NEWS
===================================================================
--- Python-3.5.1.orig/Misc/NEWS
+++ Python-3.5.1/Misc/NEWS
@@ -1266,6 +1266,10 @@ Library
   lines from the code object, fixing an issue when a lambda function is used as
   decorator argument. Patch by Thomas Ballinger and Allison Kaptur.
 
+- Issue #27568: Prevent HTTPoxy attack (CVE-2016-1000110). Ignore the
+  HTTP_PROXY variable when REQUEST_METHOD environment is set, which indicates
+  that the script is in CGI mode.
+
 - Issue #24521: Fix possible integer overflows in the pickle module.
 
 - Issue #22931: Allow '[' and ']' in cookie values.
Index: Python-3.5.1/Lib/test/test_urllib.py
===================================================================
--- Python-3.5.1.orig/Lib/test/test_urllib.py
+++ Python-3.5.1/Lib/test/test_urllib.py
@@ -224,6 +224,18 @@ class ProxyTests(unittest.TestCase):
         # List of no_proxies with space.
         self.env.set('NO_PROXY', 'localhost, anotherdomain.com, newdomain.com')
         self.assertTrue(urllib.request.proxy_bypass_environment('anotherdomain.com'))
+    def test_proxy_cgi_ignore(self):
+        try:
+            self.env.set('HTTP_PROXY', 'http://somewhere:3128')
+            proxies = urllib.request.getproxies_environment()
+            self.assertEqual('http://somewhere:3128', proxies['http'])
+            self.env.set('REQUEST_METHOD', 'GET')
+            proxies = urllib.request.getproxies_environment()
+            self.assertNotIn('http', proxies)
+        finally:
+            self.env.unset('REQUEST_METHOD')
+            self.env.unset('HTTP_PROXY')
+
 
 class urlopen_HttpTests(unittest.TestCase, FakeHTTPMixin, FakeFTPMixin):
     """Test urlopen() opening a fake http connection."""