mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Issue #18709: Fix CVE-2013-4238. The SSL module now handles NULL bytes
inside subjectAltName correctly. Formerly the module has used OpenSSL's GENERAL_NAME_print() function to get the string represention of ASN.1 strings for rfc822Name (email), dNSName (DNS) and uniformResourceIdentifier (URI).
This commit is contained in:
parent
29c3fc5d8f
commit
824f7f366d
4 changed files with 184 additions and 5 deletions
|
@ -55,6 +55,7 @@ BADCERT = data_file("badcert.pem")
|
|||
WRONGCERT = data_file("XXXnonexisting.pem")
|
||||
BADKEY = data_file("badkey.pem")
|
||||
NOKIACERT = data_file("nokia.pem")
|
||||
NULLBYTECERT = data_file("nullbytecert.pem")
|
||||
|
||||
DHFILE = data_file("dh512.pem")
|
||||
BYTES_DHFILE = os.fsencode(DHFILE)
|
||||
|
@ -162,6 +163,27 @@ class BasicSocketTests(unittest.TestCase):
|
|||
('DNS', 'projects.forum.nokia.com'))
|
||||
)
|
||||
|
||||
def test_parse_cert_CVE_2013_4238(self):
|
||||
p = ssl._ssl._test_decode_cert(NULLBYTECERT)
|
||||
if support.verbose:
|
||||
sys.stdout.write("\n" + pprint.pformat(p) + "\n")
|
||||
subject = ((('countryName', 'US'),),
|
||||
(('stateOrProvinceName', 'Oregon'),),
|
||||
(('localityName', 'Beaverton'),),
|
||||
(('organizationName', 'Python Software Foundation'),),
|
||||
(('organizationalUnitName', 'Python Core Development'),),
|
||||
(('commonName', 'null.python.org\x00example.org'),),
|
||||
(('emailAddress', 'python-dev@python.org'),))
|
||||
self.assertEqual(p['subject'], subject)
|
||||
self.assertEqual(p['issuer'], subject)
|
||||
self.assertEqual(p['subjectAltName'],
|
||||
(('DNS', 'altnull.python.org\x00example.com'),
|
||||
('email', 'null@python.org\x00user@example.org'),
|
||||
('URI', 'http://null.python.org\x00http://example.org'),
|
||||
('IP Address', '192.0.2.1'),
|
||||
('IP Address', '2001:DB8:0:0:0:0:0:1\n'))
|
||||
)
|
||||
|
||||
def test_DER_to_PEM(self):
|
||||
with open(SVN_PYTHON_ORG_ROOT_CERT, 'r') as f:
|
||||
pem = f.read()
|
||||
|
@ -294,6 +316,13 @@ class BasicSocketTests(unittest.TestCase):
|
|||
fail(cert, 'foo.a.com')
|
||||
fail(cert, 'bar.foo.com')
|
||||
|
||||
# NULL bytes are bad, CVE-2013-4073
|
||||
cert = {'subject': ((('commonName',
|
||||
'null.python.org\x00example.org'),),)}
|
||||
ok(cert, 'null.python.org\x00example.org') # or raise an error?
|
||||
fail(cert, 'example.org')
|
||||
fail(cert, 'null.python.org')
|
||||
|
||||
# Slightly fake real-world example
|
||||
cert = {'notAfter': 'Jun 26 21:41:46 2011 GMT',
|
||||
'subject': ((('commonName', 'linuxfrz.org'),),),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue