CVE-2019-11324
Description
The urllib3 library before 1.24.2 for Python mishandles certain cases where the desired set of CA certificates is different from the OS store of CA certificates, which results in SSL connections succeeding in situations where a verification failure is the correct outcome. This is related to use of the ssl_context, ca_certs, or ca_certs_dir argument.
AI Insight
LLM-synthesized narrative grounded in this CVE's description and references.
urllib3 before 1.24.2 mishandles CA certificate verification when custom certificate parameters are set, potentially allowing false SSL connection success.
What the
Vulnerability Is
CVE-2019-11324 is a flaw in the Python urllib3 library (versions before 1.24.2) that affects SSL/TLS certificate validation. The urllib3 library mishandles situations where the user specifies a custom set of CA certificates via the ca_certs, ca_certs_dir, or ssl_context argument. In such cases, the library could incorrectly fall back to loading system certificates by default, potentially leading to SSL connections succeeding when certificate verification should have failed [1][2][3]. This means that a user's explicit certificate configuration may not be fully honored.
How
It Is Exploited
The vulnerability is triggered when an application uses urllib3 with explicit CA certificate paths or an ssl_context that differs from the system's default certificate store. The bug occurs because the library loads system certificates in addition to the user-specified ones, inadvertently trusting certificates that should not be considered valid for the intended connection. No authentication is required; the attacker does not need special network access beyond being able to present a certificate that the system store trusts but the user's custom store would reject [1][2][4].
Impact
An attacker who can present a certificate signed by a CA in the system's default trust store (but not in the user's specified set) could potentially perform a man-in-the-middle attack, intercepting or tampering with encrypted communications that the application believes are secured against the user's chosen CAs. This weakens the security guarantees provided by the application's custom certificate configuration [1][2][3].
Mitigation
The issue is fixed in urllib3 version 1.24.2. The patch ensures that system certificates are not loaded by default when any of ca_certs, ca_certs_dir, or ssl_context parameters are specified [4]. Red Hat has released updated packages (e.g., python-urllib3-1.24.2-2.el8) for RHEL 8 in advisories RHSA-2019:3335 and RHSA-2019:3590 [1][2]. Users should upgrade to urllib3 1.24.2 or apply vendor-provided patches. This vulnerability is not listed in CISA's Known Exploited Vulnerabilities (KEV) catalog as of this writing.
AI Insight generated on May 22, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
urllib3PyPI | < 1.24.2 | 1.24.2 |
Affected products
161- ghsa-coords160 versionspkg:pypi/urllib3pkg:rpm/almalinux/python2-attrspkg:rpm/almalinux/python2-chardetpkg:rpm/almalinux/python2-coveragepkg:rpm/almalinux/python2-Cythonpkg:rpm/almalinux/python2-dnspkg:rpm/almalinux/python2-docspkg:rpm/almalinux/python2-docs-infopkg:rpm/almalinux/python2-docutilspkg:rpm/almalinux/python2-funcsigspkg:rpm/almalinux/python2-idnapkg:rpm/almalinux/python2-ipaddresspkg:rpm/almalinux/python2-markupsafepkg:rpm/almalinux/python2-mockpkg:rpm/almalinux/python2-pluggypkg:rpm/almalinux/python2-psycopg2pkg:rpm/almalinux/python2-psycopg2-debugpkg:rpm/almalinux/python2-psycopg2-testspkg:rpm/almalinux/python2-pypkg:rpm/almalinux/python2-PyMySQLpkg:rpm/almalinux/python2-pysockspkg:rpm/almalinux/python2-pytestpkg:rpm/almalinux/python2-pytest-mockpkg:rpm/almalinux/python2-pytzpkg:rpm/almalinux/python2-pyyamlpkg:rpm/almalinux/python2-requestspkg:rpm/almalinux/python2-rpm-macrospkg:rpm/almalinux/python2-setuptools_scmpkg:rpm/almalinux/python-psycopg2-docpkg:rpm/opensuse/python-kubernetes&distro=openSUSE%20Tumbleweedpkg:rpm/opensuse/python-urllib3&distro=openSUSE%20Leap%2015.0pkg:rpm/opensuse/python-urllib3&distro=openSUSE%20Leap%2015.1pkg:rpm/opensuse/python-urllib3&distro=openSUSE%20Tumbleweedpkg:rpm/opensuse/python-urllib3-test&distro=openSUSE%20Leap%2015.1pkg:rpm/suse/ardana-ansible&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-barbican&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-cinder&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-cluster&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-cobbler&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-db&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-designate&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-extensions-nsx&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-glance&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-heat&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-horizon&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-input-model&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-installer-ui&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-ironic&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-keystone&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-logging&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-magnum&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-monasca&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-mq&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-neutron&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-nova&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-octavia&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-opsconsole&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-opsconsole-ui&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-osconfig&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-service&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-ses&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-swift&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/ardana-tempest&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/crowbar-core&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/crowbar-ha&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/crowbar-openstack&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/crowbar-ui&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-ceilometer&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-ceilometer&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-cinder&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-cinder&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-designate&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-designate&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-heat&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-heat&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-horizon-plugin-neutron-fwaas-ui&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-horizon-plugin-neutron-fwaas-ui&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-horizon-plugin-neutron-lbaas-ui&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-horizon-plugin-neutron-lbaas-ui&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-horizon-plugin-neutron-vpnaas-ui&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-horizon-plugin-neutron-vpnaas-ui&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-ironic&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-ironic&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-ironic-python-agent&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-ironic-python-agent&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-keystone&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-keystone&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-magnum&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-magnum&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-manila&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-manila&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-monasca-notification&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-monasca-notification&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-monasca-persister&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-monasca-persister&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-monasca-persister-java&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-monasca-persister-java&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-neutron&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-neutron&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-neutron-gbp&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-neutron-gbp&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-neutron-lbaas&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-neutron-lbaas&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-nova&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-nova&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-octavia&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-octavia&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/openstack-tempest&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/openstack-tempest&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/python-ardana-configurationprocessor&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/python-cinder-tempest-plugin&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/python-cinder-tempest-plugin&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/python-ironicclient&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/python-ironicclient&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/python-keystonemiddleware&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/python-keystonemiddleware&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/python-monasca-tempest-plugin&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/python-monasca-tempest-plugin&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/python-openstackclient&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/python-openstackclient&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/python-openstacksdk&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/python-openstacksdk&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/python-proliantutils&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/python-proliantutils&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/python-python-engineio&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/python-swiftlm&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/python-urllib3&distro=HPE%20Helion%20OpenStack%208pkg:rpm/suse/python-urllib3&distro=SUSE%20Enterprise%20Storage%204pkg:rpm/suse/python-urllib3&distro=SUSE%20Enterprise%20Storage%205pkg:rpm/suse/python-urllib3&distro=SUSE%20Linux%20Enterprise%20Module%20for%20Basesystem%2015pkg:rpm/suse/python-urllib3&distro=SUSE%20Linux%20Enterprise%20Module%20for%20Basesystem%2015%20SP1pkg:rpm/suse/python-urllib3&distro=SUSE%20Linux%20Enterprise%20Module%20for%20Public%20Cloud%2012pkg:rpm/suse/python-urllib3&distro=SUSE%20Linux%20Enterprise%20Module%20for%20Python%202%2015%20SP1pkg:rpm/suse/python-urllib3&distro=SUSE%20Manager%20Server%203.2pkg:rpm/suse/python-urllib3&distro=SUSE%20OpenStack%20Cloud%208pkg:rpm/suse/python-urllib3&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/python-urllib3&distro=SUSE%20OpenStack%20Cloud%20Crowbar%208pkg:rpm/suse/python-urllib3&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/python-vmware-nsx&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/python-vmware-nsx&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/python-vmware-nsxlib&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/python-vmware-nsxlib&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209pkg:rpm/suse/venv-openstack-barbican&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-cinder&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-designate&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-glance&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-heat&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-horizon&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-ironic&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-keystone&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-magnum&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-manila&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-monasca-ceilometer&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-monasca&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-neutron&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-nova&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-octavia&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-sahara&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/venv-openstack-swift&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/yast2-crowbar&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209
< 1.24.2+ 159 more
- (no CPE)range: < 1.24.2
- (no CPE)range: < 17.4.0-10.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 3.0.4-10.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 4.5.1-4.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 0.28.1-7.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 1.15.0-10.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 2.7.16-2.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 2.7.16-2.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 0.14-12.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 1.0.2-13.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 2.5-7.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 1.0.18-6.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 0.23-19.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 2.0.0-13.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 0.6.0-8.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 2.7.5-7.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 2.7.5-7.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 2.7.5-7.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 1.5.3-6.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 0.8.0-10.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 1.6.8-6.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 3.4.2-13.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 1.9.0-4.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 2017.2-12.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 3.12-16.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 2.20.0-3.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 3-38.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 1.15.7-6.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 2.7.5-7.module_el8.6.0+2781+fed64c13
- (no CPE)range: < 28.1.0-4.3
- (no CPE)range: < 1.22-lp150.5.3.1
- (no CPE)range: < 1.24-lp151.2.3.1
- (no CPE)range: < 1.26.6-1.2
- (no CPE)range: < 1.24-lp151.2.3.1
- (no CPE)range: < 9.0+git.1566374020.301191f-3.7.2
- (no CPE)range: < 9.0+git.1566251498.be02ca4-3.7.2
- (no CPE)range: < 9.0+git.1565678764.c3a9b9f-3.7.2
- (no CPE)range: < 9.0+git.1559333871.40508f7-3.7.2
- (no CPE)range: < 9.0+git.1566336494.93967dd-3.7.2
- (no CPE)range: < 9.0+git.1564409964.b7e4fc3-3.7.2
- (no CPE)range: < 9.0+git.1565680593.df7a432-3.7.2
- (no CPE)range: < 9.0+git.1566213657.69862ab-8.1
- (no CPE)range: < 9.0+git.1566375806.f0b2333-3.7.2
- (no CPE)range: < 9.0+git.1565721273.f44b8d7-3.7.2
- (no CPE)range: < 9.0+git.1565891518.2a545a1-3.7.2
- (no CPE)range: < 9.0+git.1562848565.91e75b2-3.7.2
- (no CPE)range: < 9.0+git.1566255088.3443670-3.7.2
- (no CPE)range: < 9.0+git.1565721987.ddc59c8-3.7.2
- (no CPE)range: < 9.0+git.1565891593.cad6d1a-3.7.2
- (no CPE)range: < 9.0+git.1565761582.2dc823a-3.7.2
- (no CPE)range: < 9.0+git.1565762005.016032a-3.7.2
- (no CPE)range: < 9.0+git.1566332665.ad894c0-3.7.2
- (no CPE)range: < 9.0+git.1565115025.148d092-3.7.2
- (no CPE)range: < 9.0+git.1566251310.3a1e8f9-3.7.2
- (no CPE)range: < 9.0+git.1566332515.e232568-3.7.2
- (no CPE)range: < 9.0+git.1566206502.6c87b41-3.7.2
- (no CPE)range: < 9.0+git.1566251377.b1caeaa-3.7.2
- (no CPE)range: < 9.0+git.1555530925.206f1a8-4.7.2
- (no CPE)range: < 9.0+git.1565764394.545b573-3.7.2
- (no CPE)range: < 9.0+git.1564706915.edd44c4-3.7.2
- (no CPE)range: < 9.0+git.1565962617.523149b-3.7.2
- (no CPE)range: < 9.0+git.1565891872.73fc3c7-3.7.2
- (no CPE)range: < 9.0+git.1566471752.a3c5c9c-3.7.2
- (no CPE)range: < 6.0+git.1566321308.1de18b9a4-3.7.2
- (no CPE)range: < 6.0+git.1566406179.7549de2-3.7.2
- (no CPE)range: < 6.0+git.1566404979.41279a88e-3.7.2
- (no CPE)range: < 1.3.0+git.1563181545.65360af5-8.1
- (no CPE)range: < 11.0.2~dev14-3.7.2
- (no CPE)range: < 11.0.2~dev14-3.7.2
- (no CPE)range: < 13.0.7~dev3-3.7.2
- (no CPE)range: < 13.0.7~dev3-3.7.2
- (no CPE)range: < 7.0.1~dev21-3.7.2
- (no CPE)range: < 7.0.1~dev21-3.7.2
- (no CPE)range: < 11.0.3~dev19-3.7.2
- (no CPE)range: < 11.0.3~dev19-3.7.2
- (no CPE)range: < 1.5.1~dev6-8.1
- (no CPE)range: < 1.5.1~dev6-8.1
- (no CPE)range: < 5.0.1~dev7-8.1
- (no CPE)range: < 5.0.1~dev7-8.1
- (no CPE)range: < 1.4.1~dev7-8.1
- (no CPE)range: < 1.4.1~dev7-8.1
- (no CPE)range: < 11.1.4~dev9-3.7.2
- (no CPE)range: < 11.1.4~dev9-3.7.2
- (no CPE)range: < 3.3.3~dev4-3.7.2
- (no CPE)range: < 3.3.3~dev4-3.7.2
- (no CPE)range: < 14.1.1~dev8-3.7.2
- (no CPE)range: < 14.1.1~dev8-3.7.2
- (no CPE)range: < 7.1.1~dev28-3.7.2
- (no CPE)range: < 7.1.1~dev28-3.7.2
- (no CPE)range: < 7.3.1~dev3-4.7.2
- (no CPE)range: < 7.3.1~dev3-4.7.2
- (no CPE)range: < 1.14.2~dev1-6.7.2
- (no CPE)range: < 1.14.2~dev1-6.7.2
- (no CPE)range: < 1.12.1~dev9-9.1
- (no CPE)range: < 1.12.1~dev9-9.1
- (no CPE)range: < 1.12.1~dev9-9.1
- (no CPE)range: < 1.12.1~dev9-9.1
- (no CPE)range: < 13.0.5~dev22-3.7.2
- (no CPE)range: < 13.0.5~dev22-3.7.2
- (no CPE)range: < 5.0.1~dev459-3.7.2
- (no CPE)range: < 5.0.1~dev459-3.7.2
- (no CPE)range: < 13.0.1~dev14-3.7.2
- (no CPE)range: < 13.0.1~dev14-3.7.2
- (no CPE)range: < 18.2.2~dev9-3.7.2
- (no CPE)range: < 18.2.2~dev9-3.7.2
- (no CPE)range: < 3.1.2~dev8-3.7.2
- (no CPE)range: < 3.1.2~dev8-3.7.2
- (no CPE)range: < 19.0.0-12.1
- (no CPE)range: < 19.0.0-12.1
- (no CPE)range: < 9.0+git.1566405927.c5c03d4-3.8.2
- (no CPE)range: < 0.1.0-8.1
- (no CPE)range: < 0.1.0-8.1
- (no CPE)range: < 2.5.3-4.7.2
- (no CPE)range: < 2.5.3-4.7.2
- (no CPE)range: < 5.2.0-8.1
- (no CPE)range: < 5.2.0-8.1
- (no CPE)range: < 0.3.0-8.1
- (no CPE)range: < 0.3.0-8.1
- (no CPE)range: < 3.16.2-8.1
- (no CPE)range: < 3.16.2-8.1
- (no CPE)range: < 0.17.3-8.1
- (no CPE)range: < 0.17.3-8.1
- (no CPE)range: < 2.8.4-8.1
- (no CPE)range: < 2.8.4-8.1
- (no CPE)range: < 2.0.2-9.1
- (no CPE)range: < 9.0+git.1541434883.e0ebe69-8.1
- (no CPE)range: < 1.22-5.6.1
- (no CPE)range: < 1.22-3.14.1
- (no CPE)range: < 1.22-3.14.1
- (no CPE)range: < 1.22-6.4.1
- (no CPE)range: < 1.24-9.4.1
- (no CPE)range: < 1.22-3.14.1
- (no CPE)range: < 1.24-9.4.1
- (no CPE)range: < 1.22-3.14.1
- (no CPE)range: < 1.22-5.6.1
- (no CPE)range: < 1.23-3.6.1
- (no CPE)range: < 1.22-5.6.1
- (no CPE)range: < 1.23-3.6.1
- (no CPE)range: < 13.0.1~dev146-9.1
- (no CPE)range: < 13.0.1~dev146-9.1
- (no CPE)range: < 13.0.1~dev24-8.1
- (no CPE)range: < 13.0.1~dev24-8.1
- (no CPE)range: < 7.0.1~dev18-3.7.2
- (no CPE)range: < 13.0.7~dev3-3.7.2
- (no CPE)range: < 7.0.1~dev21-3.7.2
- (no CPE)range: < 17.0.1~dev16-3.7.2
- (no CPE)range: < 11.0.3~dev19-3.7.2
- (no CPE)range: < 14.0.4~dev4-4.7.2
- (no CPE)range: < 11.1.4~dev9-4.7.2
- (no CPE)range: < 14.1.1~dev8-3.7.2
- (no CPE)range: < 7.1.1~dev28-4.7.2
- (no CPE)range: < 7.3.1~dev3-3.7.2
- (no CPE)range: < 1.8.2~dev3-3.7.2
- (no CPE)range: < 2.7.1~dev10-3.7.2
- (no CPE)range: < 13.0.5~dev22-6.7.2
- (no CPE)range: < 18.2.2~dev9-3.7.2
- (no CPE)range: < 3.1.2~dev8-4.7.2
- (no CPE)range: < 9.0.2~dev9-3.7.2
- (no CPE)range: < 2.19.2~dev1-2.4.2
- (no CPE)range: < 3.4.2-8.1
Patches
11efadf43dc63Release 1.24.2 (#1564)
14 files changed · +140 −11
CHANGES.rst+12 −1 modified@@ -1,12 +1,23 @@ Changes ======= +1.24.2 (2019-04-17) +------------------- + +* Don't load system certificates by default when any other ``ca_certs``, ``ca_certs_dir`` or + ``ssl_context`` parameters are specified. + +* Remove Authorization header regardless of case when redirecting to cross-site. (Issue #1510) + +* Add support for IPv6 addresses in subjectAltName section of certificates. (Issue #1269) + + 1.24.1 (2018-11-02) ------------------- * Remove quadratic behavior within ``GzipDecoder.decompress()`` (Issue #1467) -* Restored functionality of `ciphers` parameter for `create_urllib3_context()`. (Issue #1462) +* Restored functionality of ``ciphers`` parameter for ``create_urllib3_context()``. (Issue #1462) 1.24 (2018-10-16)
CONTRIBUTORS.txt+3 −0 modified@@ -272,5 +272,8 @@ In chronological order: * Justin Bramley <https://github.com/jbramleycl> * Add ability to handle multiple Content-Encodings +* Katsuhiko YOSHIDA <https://github.com/kyoshidajp> + * Remove Authorization header regardless of case when redirecting to cross-site + * [Your name or handle] <[email or website]> * [Brief summary of your changes]
dummyserver/certs/server.ipv6_san.crt+16 −0 added@@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICfTCCAeagAwIBAgIJAPcpn3/M5+piMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMTgxMjE5MDUyMjUyWhcNNDgxMjE4MDUyMjUyWjBF +MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB +gQDXe3FqmCWvP8XPxqtT+0bfL1Tvzvebi46k0WIcUV8bP3vyYiSRXG9ALmyzZH4G +HY9UVs4OEDkCMDOBSezB0y9ai/9doTNcaictdEBu8nfdXKoTtzrn+VX4UPrkH5hm +7NQ1fTQuj1MR7yBCmYqN3Q2Q+Efuujyx0FwBzAuy1aKYuwIDAQABo3UwczAdBgNV +HQ4EFgQUG+dK5Uos08QUwAWofDb3a8YcYlIwHwYDVR0jBBgwFoAUG+dK5Uos08QU +wAWofDb3a8YcYlIwDwYDVR0TAQH/BAUwAwEB/zAgBgNVHREEGTAXggM6OjGHEAAA +AAAAAAAAAAAAAAAAAAEwDQYJKoZIhvcNAQELBQADgYEAjT767TDq6q4lOextf3tZ +BjeuYDUy7bb1fDBAN5rBT1ywr7r0JE6/KOnsZx4jbevx3MllxNpx0gOM2bgwJlnG +8tgwRB6pxDyln01WBj9b5ymK60jdkw7gg3yYpqEs5/VBQidFO3BmDqf5cGO8PU7p +0VWdfJBP2UbwblNXdImI1zk= +-----END CERTIFICATE-----
dummyserver/server.py+5 −0 modified@@ -58,11 +58,16 @@ 'certfile': os.path.join(CERTS_PATH, 'server.ipv6addr.crt'), 'keyfile': os.path.join(CERTS_PATH, 'server.ipv6addr.key'), } +IPV6_SAN_CERTS = { + 'certfile': os.path.join(CERTS_PATH, 'server.ipv6_san.crt'), + 'keyfile': DEFAULT_CERTS['keyfile'] +} DEFAULT_CA = os.path.join(CERTS_PATH, 'cacert.pem') DEFAULT_CA_BAD = os.path.join(CERTS_PATH, 'client_bad.pem') NO_SAN_CA = os.path.join(CERTS_PATH, 'cacert.no_san.pem') DEFAULT_CA_DIR = os.path.join(CERTS_PATH, 'ca_path_test') IPV6_ADDR_CA = os.path.join(CERTS_PATH, 'server.ipv6addr.crt') +IPV6_SAN_CA = os.path.join(CERTS_PATH, 'server.ipv6_san.crt') COMBINED_CERT_AND_KEY = os.path.join(CERTS_PATH, 'server.combined.pem')
src/urllib3/contrib/pyopenssl.py+3 −0 modified@@ -184,6 +184,9 @@ def idna_encode(name): except idna.core.IDNAError: return None + if ':' in name: + return name + name = idna_encode(name) if name is None: return None
src/urllib3/__init__.py+1 −1 modified@@ -27,7 +27,7 @@ __author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' __license__ = 'MIT' -__version__ = '1.24.1' +__version__ = '1.24.2' __all__ = ( 'HTTPConnectionPool',
src/urllib3/poolmanager.py+5 −2 modified@@ -7,6 +7,7 @@ from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool from .connectionpool import port_by_scheme from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown +from .packages import six from .packages.six.moves.urllib.parse import urljoin from .request import RequestMethods from .util.url import parse_url @@ -342,8 +343,10 @@ def urlopen(self, method, url, redirect=True, **kw): # conn.is_same_host() which may use socket.gethostbyname() in the future. if (retries.remove_headers_on_redirect and not conn.is_same_host(redirect_location)): - for header in retries.remove_headers_on_redirect: - kw['headers'].pop(header, None) + headers = list(six.iterkeys(kw['headers'])) + for header in headers: + if header.lower() in retries.remove_headers_on_redirect: + kw['headers'].pop(header, None) try: retries = retries.increment(method, url, response=response, _pool=conn)
src/urllib3/util/retry.py+2 −1 modified@@ -179,7 +179,8 @@ def __init__(self, total=10, connect=None, read=None, redirect=None, status=None self.raise_on_status = raise_on_status self.history = history or tuple() self.respect_retry_after_header = respect_retry_after_header - self.remove_headers_on_redirect = remove_headers_on_redirect + self.remove_headers_on_redirect = frozenset([ + h.lower() for h in remove_headers_on_redirect]) def new(self, **kw): params = dict(
src/urllib3/util/ssl_.py+4 −1 modified@@ -327,7 +327,10 @@ def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, if e.errno == errno.ENOENT: raise SSLError(e) raise - elif getattr(context, 'load_default_certs', None) is not None: + + # Don't load system certs unless there were no CA certs or + # SSLContext object specified manually. + elif ssl_context is None and hasattr(context, 'load_default_certs'): # try to load OS default certs; works well on Windows (require Python3.4+) context.load_default_certs()
test/contrib/test_pyopenssl.py+4 −1 modified@@ -31,7 +31,10 @@ def teardown_module(): pass -from ..with_dummyserver.test_https import TestHTTPS, TestHTTPS_TLSv1 # noqa: F401 +from ..with_dummyserver.test_https import ( # noqa: F401 + TestHTTPS, TestHTTPS_TLSv1, TestHTTPS_IPv6Addr, + TestHTTPS_IPSAN, TestHTTPS_NoSAN, TestHTTPS_IPV6SAN +) from ..with_dummyserver.test_socketlevel import ( # noqa: F401 TestSNI, TestSocketClosing, TestClientCerts )
test/test_retry.py+3 −3 modified@@ -253,9 +253,9 @@ def test_retry_method_not_in_whitelist(self): def test_retry_default_remove_headers_on_redirect(self): retry = Retry() - assert list(retry.remove_headers_on_redirect) == ['Authorization'] + assert list(retry.remove_headers_on_redirect) == ['authorization'] def test_retry_set_remove_headers_on_redirect(self): - retry = Retry(remove_headers_on_redirect=['X-API-Secret']) + retry = Retry(remove_headers_on_redirect=['x-api-secret']) - assert list(retry.remove_headers_on_redirect) == ['X-API-Secret'] + assert list(retry.remove_headers_on_redirect) == ['x-api-secret']
test/test_ssl.py+37 −0 modified@@ -88,3 +88,40 @@ def test_create_urllib3_context_set_ciphers(monkeypatch, ciphers, expected_ciphe assert context.set_ciphers.call_count == 1 assert context.set_ciphers.call_args == mock.call(expected_ciphers) + + +def test_wrap_socket_given_context_no_load_default_certs(): + context = mock.create_autospec(ssl_.SSLContext) + context.load_default_certs = mock.Mock() + + sock = mock.Mock() + ssl_.ssl_wrap_socket(sock, ssl_context=context) + + context.load_default_certs.assert_not_called() + + +def test_wrap_socket_given_ca_certs_no_load_default_certs(monkeypatch): + context = mock.create_autospec(ssl_.SSLContext) + context.load_default_certs = mock.Mock() + context.options = 0 + + monkeypatch.setattr(ssl_, "SSLContext", lambda *_, **__: context) + + sock = mock.Mock() + ssl_.ssl_wrap_socket(sock, ca_certs="/tmp/fake-file") + + context.load_default_certs.assert_not_called() + context.load_verify_locations.assert_called_with("/tmp/fake-file", None) + + +def test_wrap_socket_default_loads_default_certs(monkeypatch): + context = mock.create_autospec(ssl_.SSLContext) + context.load_default_certs = mock.Mock() + context.options = 0 + + monkeypatch.setattr(ssl_, "SSLContext", lambda *_, **__: context) + + sock = mock.Mock() + ssl_.ssl_wrap_socket(sock) + + context.load_default_certs.assert_called_with()
test/with_dummyserver/test_https.py+19 −1 modified@@ -17,7 +17,7 @@ DEFAULT_CLIENT_NO_INTERMEDIATE_CERTS, NO_SAN_CERTS, NO_SAN_CA, DEFAULT_CA_DIR, IPV6_ADDR_CERTS, IPV6_ADDR_CA, HAS_IPV6, - IP_SAN_CERTS) + IP_SAN_CERTS, IPV6_SAN_CA, IPV6_SAN_CERTS) from test import ( onlyPy279OrNewer, @@ -625,5 +625,23 @@ def test_strip_square_brackets_before_validating(self): self.assertEqual(r.status, 200) +class TestHTTPS_IPV6SAN(IPV6HTTPSDummyServerTestCase): + certs = IPV6_SAN_CERTS + + def test_can_validate_ipv6_san(self): + """Ensure that urllib3 can validate SANs with IPv6 addresses in them.""" + try: + import ipaddress # noqa: F401 + except ImportError: + pytest.skip("Only runs on systems with an ipaddress module") + + https_pool = HTTPSConnectionPool('[::1]', self.port, + cert_reqs='CERT_REQUIRED', + ca_certs=IPV6_SAN_CA) + self.addCleanup(https_pool.close) + r = https_pool.request('GET', '/') + self.assertEqual(r.status, 200) + + if __name__ == '__main__': unittest.main()
test/with_dummyserver/test_poolmanager.py+26 −0 modified@@ -123,6 +123,17 @@ def test_redirect_cross_host_remove_headers(self): self.assertNotIn('Authorization', data) + r = http.request('GET', '%s/redirect' % self.base_url, + fields={'target': '%s/headers' % self.base_url_alt}, + headers={'authorization': 'foo'}) + + self.assertEqual(r.status, 200) + + data = json.loads(r.data.decode('utf-8')) + + self.assertNotIn('authorization', data) + self.assertNotIn('Authorization', data) + def test_redirect_cross_host_no_remove_headers(self): http = PoolManager() self.addCleanup(http.clear) @@ -155,6 +166,21 @@ def test_redirect_cross_host_set_removed_headers(self): self.assertNotIn('X-API-Secret', data) self.assertEqual(data['Authorization'], 'bar') + r = http.request('GET', '%s/redirect' % self.base_url, + fields={'target': '%s/headers' % self.base_url_alt}, + headers={'x-api-secret': 'foo', + 'authorization': 'bar'}, + retries=Retry(remove_headers_on_redirect=['X-API-Secret'])) + + self.assertEqual(r.status, 200) + + data = json.loads(r.data.decode('utf-8')) + + self.assertNotIn('x-api-secret', data) + self.assertNotIn('X-API-Secret', data) + + self.assertEqual(data['Authorization'], 'bar') + def test_raise_on_redirect(self): http = PoolManager() self.addCleanup(http.clear)
Vulnerability mechanics
Generated on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
19- lists.opensuse.org/opensuse-security-announce/2019-09/msg00039.htmlghsavendor-advisoryWEB
- lists.opensuse.org/opensuse-security-announce/2019-09/msg00041.htmlghsavendor-advisoryWEB
- access.redhat.com/errata/RHSA-2019:3335ghsavendor-advisoryWEB
- access.redhat.com/errata/RHSA-2019:3590ghsavendor-advisoryWEB
- github.com/advisories/GHSA-mh33-7rrq-662wghsaADVISORY
- lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/NKGPJLVLVYCL4L4B4G5TIOTVK4BKPG72/mitrevendor-advisory
- lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/XOSA2NT4DUQDBEIWE6O7KKD24XND7TE2/mitrevendor-advisory
- nvd.nist.gov/vuln/detail/CVE-2019-11324ghsaADVISORY
- usn.ubuntu.com/3990-1/mitrevendor-advisory
- www.openwall.com/lists/oss-security/2019/04/19/1ghsamailing-listWEB
- github.com/pypa/advisory-database/tree/main/vulns/urllib3/PYSEC-2019-133.yamlghsaWEB
- github.com/urllib3/urllib3/commit/1efadf43dc63317cd9eaa3e0fdb9e05ab07254b1ghsaWEB
- github.com/urllib3/urllib3/compare/a6ec68a...1efadf4ghsaWEB
- lists.debian.org/debian-lts-announce/2021/06/msg00015.htmlghsamailing-listWEB
- lists.debian.org/debian-lts-announce/2023/10/msg00012.htmlghsamailing-listWEB
- lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/NKGPJLVLVYCL4L4B4G5TIOTVK4BKPG72ghsaWEB
- lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/XOSA2NT4DUQDBEIWE6O7KKD24XND7TE2ghsaWEB
- pypi.org/project/urllib3/1.24.2ghsaWEB
- usn.ubuntu.com/3990-1ghsaWEB
News mentions
0No linked articles in our index yet.