HTTP Header Injection (follow-up of CVE-2016-5699)¶
Warning
This resource is maintained for historical reference and does not contain the latest vulnerability info for Python.
The canonical database for vulnerabilities affecting Python is available on GitHub in the Open Source Vulnerability (OSV) format. This database can be viewed online at the Open Source Vulnerability Database.
HTTP Header Injection, follow-up of CVE-2016-5699.
The fix disallows control chars in HTTP URLs.
This change broke applications sending invalid HTTP requests on purpose:
bpo-36274 added private methods
to the http.client.HTTPConnection class (_encode_request() and
_validate_path()) which can be overriden in a subclass for that.
Note: Python 2 urllib.urlopen(url) always quotes the URL and so is not
vulnerable to HTTP Header Injection.
Dates:
Disclosure date: 2017-05-24 (Python issue bpo-30458 reported)
Fixed In¶
Python 2.7.17 (2019-10-19) fixed by commit bb8071a (branch 2.7) (2019-05-21)
Python 3.5.8 (2019-10-29) fixed by commit afe3a49 (branch 3.5) (2019-07-14)
Python 3.6.9 (2019-07-02) fixed by commit c50d437 (branch 3.6) (2019-05-08)
Python 3.7.4 (2019-07-08) fixed by commit 7e200e0 (branch 3.7) (2019-05-07)
Python 3.8.0 (2019-10-14) fixed by commit c4e671e (branch 3.8) (2019-05-01)
Python issue¶
[security][CVE-2019-9740][CVE-2019-9947] HTTP Header Injection (follow-up of CVE-2016-5699).
Python issue: bpo-30458
Creation date: 2017-05-24
Reporter: Orange
CVE-2019-9740¶
An issue was discovered in urllib2 in Python 2.x through 2.7.16 and urllib in Python 3.x through 3.7.3. CRLF injection is possible if the attacker controls a url parameter, as demonstrated by the first argument to urllib.request.urlopen with rn (specifically in the query string after a ? character) followed by an HTTP header or a Redis command. This is fixed in: v2.7.17, v2.7.17rc1, v2.7.18, v2.7.18rc1; v3.5.10, v3.5.10rc1, v3.5.8, v3.5.8rc1, v3.5.8rc2, v3.5.9; v3.6.10, v3.6.10rc1, v3.6.11, v3.6.11rc1, v3.6.12, v3.6.9, v3.6.9rc1; v3.7.4, v3.7.4rc1, v3.7.4rc2, v3.7.5, v3.7.5rc1, v3.7.6, v3.7.6rc1, v3.7.7, v3.7.7rc1, v3.7.8, v3.7.8rc1, v3.7.9.
CVE ID: CVE-2019-9740
Published: 2019-03-13
CVSS Score: 4.3
CVE-2019-9947¶
An issue was discovered in urllib2 in Python 2.x through 2.7.16 and urllib in Python 3.x through 3.7.3. CRLF injection is possible if the attacker controls a url parameter, as demonstrated by the first argument to urllib.request.urlopen with rn (specifically in the path component of a URL that lacks a ? character) followed by an HTTP header or a Redis command. This is similar to the CVE-2019-9740 query string issue. This is fixed in: v2.7.17, v2.7.17rc1, v2.7.18, v2.7.18rc1; v3.5.10, v3.5.10rc1, v3.5.8, v3.5.8rc1, v3.5.8rc2, v3.5.9; v3.6.10, v3.6.10rc1, v3.6.11, v3.6.11rc1, v3.6.12, v3.6.9, v3.6.9rc1; v3.7.4, v3.7.4rc1, v3.7.4rc2, v3.7.5, v3.7.5rc1, v3.7.6, v3.7.6rc1, v3.7.7, v3.7.7rc1, v3.7.8, v3.7.8rc1, v3.7.9.
CVE ID: CVE-2019-9947
Published: 2019-03-23
CVSS Score: 4.3
Timeline¶
Timeline using the disclosure date 2017-05-24 as reference:
2017-05-24: Python issue bpo-30458 reported by Orange
2019-03-13 (+658 days): CVE-2019-9740 published
2019-03-23 (+668 days): CVE-2019-9947 published
2019-05-01 (+707 days): commit c4e671e (branch 3.8)
2019-05-07 (+713 days): commit 7e200e0 (branch 3.7)
2019-05-08 (+714 days): commit c50d437 (branch 3.6)
2019-05-21 (+727 days): commit bb8071a (branch 2.7)
2019-07-02 (+769 days): Python 3.6.9 released
2019-07-08 (+775 days): Python 3.7.4 released
2019-07-14 (+781 days): commit afe3a49 (branch 3.5)
2019-10-14: Python 3.8.0 released
2019-10-19 (+878 days): Python 2.7.17 released
2019-10-29 (+888 days): Python 3.5.8 released