A comment on it from Christian Helms adds: Just to stress one point: users must update pip to >= 26.2.2.
pip always loads the CA certificates from its vendored certifi in addition to the system trust store, and there is no supported way to disable this. REQUESTSCABUNDLE / --cert only add CAs; truststore is used “in addition to certifi” by design. As a result, any pip < 26.2.2 will keep trusting the compromised intermediate CAs regardless of the system trust store, so distrusting them at the OS level is not enough. The discuss.python.org conversation on that issue has long since moved on, so asking here:
The macOS remediation advice on the official vuln page at https://emudhra.we-have-a-problem.com/#macos-curl lists remediation instructions which it is claimed address this, with instructions to set a PIPCERT environment variable in a sitecustomize.py file. The built-in pip3, and the pip in virtual environments created from the built-in python3, use their own outdated copy of the roots instead. To make them use the fixed system file, run:
F="$(/usr/bin/python3 -c 'import sysconfig; print(sysconfig.getpath("stdlib"))')/sitecustomize.py" && echo 'import os; os.environ.setdefault("PIPCERT", "/etc/ssl/cert.pem")' | sudo tee -a "$F" > /dev/null && sudo chmod 644 "$F"
I'm finding it a bit tricky to figure out a reproducible test case which would exercise this, so I haven't done more testing myself, but—does this actually work? Or is upgrading pip to >= 26.2.2 the only solution? (Or, now that pip > 26.2.2 is out, is upgrading the better solution, and I should go file a PR against the site to update its guidance.)
(Incidentally, the latest macOS updates do NOT include an updated /etc/ssl/cert.pem, and do clobber any manual changes you or your IT department may have made to /etc/ssl/cert.pem, so any manual mitigations you have applied to remove the AAA Certificate Services and emSign ECC Root CA - G3 certs DO need to be reapplied.)
Best, - Kevin
On Thu, Oct 22, 2026 at 4:43 PM Alan Coopersmith <alan.coopersmith () oracle com> wrote: https://discuss.python.org/t/information-for-python-users-regarding-emudhra-emsign-ca-certificate-security-incident/109576 has this statement from Seth Michael Larson: A security incident affecting eMudhra intermediate certificates has required removing the emSign root CA certificate from CA bundles such as “certifi”. It’s important to immediately upgrade the software packages below to at least the versions specified and rebuild container images with layer caching disabled to fetch the latest system certificates. Failure to do so could result in monster-in-the-middle (MITM) attacks against TLS clients, including python.org and pypi.org .
certifi 2026.10.19 (1) pip 26.2.2 uv 0.13.4 sigstore 4.5.1 conda 26.9.4 pixi 0.82.1
(1): Advisory mentions 2026.10.18, but 2026.10.19 is recommended for compatibility with unaffected emSign root certificates.
For all existing virtual environments on your system, please upgrade pip and uv to the latest versions. You can update pip securely by running the following command and then use this secure pip installation to upgrade certifi and uv:
python -m pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70";
Note that the certifi CA bundle is included in the macOS installation of Python from python.org. To upgrade certificates for this installation and pip itself, run the command below like so:
/Library/Frameworks/Python.framework/Versions/3.15/bin/python3.15 -m pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70"; /Library/Frameworks/Python.framework/Versions/3.15/bin/python3.15 -m pip install --upgrade certifi /Library/Frameworks/PythonT.framework/Versions/3.15/bin/python3.15t -m pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70";
This topic will be updated as more information is made available. A comment on it from Christian Helms adds: Just to stress one point: users must update pip to >= 26.2.2.
pip always loads the CA certificates from its vendored certifi in addition to the system trust store, and there is no supported way to disable this. REQUESTSCABUNDLE / --cert only add CAs; truststore is used “in addition to certifi” by design. As a result, any pip < 26.2.2 will keep trusting the compromised intermediate CAs regardless of the system trust store, so distrusting them at the OS level is not enough.
uv users can block the bad certs in their system trust store and UVSYSTEMCERTS=true. That does not work with pip. Updating pip is the only reliable fix. See Switch to using truststore only by default (currently mixed certifi + truststore) · Issue #14374 · pypa/pip · GitHub
PS: The ‘security incident’ is a bad private key. An elliptic key with private key value d=4 is not secure… All 8 eMudhra CAs had private keys with d < 256.
-- Kevin Riggle - Principal, Complex Systems Group LLC he/him • Brooklyn, NY, USA • Eastern Time https://complexsystems.group • https://calendly.com/kevinriggle/coffee
The Python ecosystem is pushing towards using https://pypi.org/project/truststore/ rather than solutions like certifi. This incident will likely help increase the priority of that transition.
On Fri, 2026-10-23 at 00:07 +0300, Valtteri Vuorikoski wrote: Having spent the day whacking this particular molehill, my strong opinion is that these packages (minus certifi) should stop vendoring roots immediately.
Users should install their distro's ca-certificates package or similar. If that is completely impossible for whatever reason, offer an option to use certifi (which should be a dependency, not vendored) - but the system trust store should be the default source of truth.
This sort of easter egg hiding to serve users with broken installations reduces the security of everyone else.
(Missing from the quoted list: botocore also includes a vendored copy. I haven't checked how it's used.)
-valtteri
On Thu, Oct 22, 2026 at 01:43:08PM -0700, Alan Coopersmith wrote: https://discuss.python.org/t/information-for-python-users-regarding-emudhra-emsign-ca-certificate-security-incident/109576 has this statement from Seth Michael Larson: A security incident affecting eMudhra intermediate certificates has required removing the emSign root CA certificate from CA bundles such as “certifi”. It’s important to immediately upgrade the software packages below to at least the versions specified and rebuild container images with layer caching disabled to fetch the latest system certificates. Failure to do so could result in monster-in-the-middle (MITM) attacks against TLS clients, including python.org and pypi.org .
certifi 2026.10.19 (1) pip 26.2.2 uv 0.13.4 sigstore 4.5.1 conda 26.9.4 pixi 0.82.1
On 10/22/26 5:07 PM, Valtteri Vuorikoski wrote: Having spent the day whacking this particular molehill, my strong opinion is that these packages (minus certifi) should stop vendoring roots immediately.
Users should install their distro's ca-certificates package or similar. If that is completely impossible for whatever reason, offer an option to use certifi (which should be a dependency, not vendored) - but the system trust store should be the default source of truth.
This sort of easter egg hiding to serve users with broken installations reduces the security of everyone else.
(Missing from the quoted list: botocore also includes a vendored copy. I haven't checked how it's used.) This is why using packages from a Linux distro is good: linux distro provided "certifi" packages typically are patched or outright build from https://github.com/projg2/certifi-system-store, to use, well, the system store.
And pip is unbundled to use the system certifi. Well ok, technically it is unbundled to use the system requests, and the system requests uses the system certifi.
sigstore's "update" was updating a lockfile to lock newer certifi, they didn't even actually add a >= dependency on "new enough to have the eMudhra fix" so the whole thing is actually ludicrous. If you had sigstore installed before a couple days ago, upgrading sigstore won't upgrade your certs, and if you actually updated all packages then certifi would be updated regardless of whether sigstore tagged a new version.
conda actually responded by adding a dependency constraint to >= the suitable version of certifi.
uv / pixi are rust software, which means a) infinite vendoring, b) cargo build will usually error out if you try to patch anything to unvendor it, so, "good luck" (and also stick to pip IMO).
...
This is why vendoring is always fundamentally treated with such suspicion. We have had ample proof over the decades that issues like this will just continue to crop up again and again, in so many various ways, despite what the
"AcKshUAlLY sTaTIc LinkING iS MORE efFiCIEnt"
crowd says.
Python vendored packages is just static linking with the additional possibility of trivial monkeypatching.
-- Eli Schwartz
https://discuss.python.org/t/python-3-15-1-3-14-9-and-3-13-17-are-out/109595 announces: Here are expedited security releases of Python 3.15 and 3.14, and a special security release of 3.13.
Python 3.15.1 Python 3.14.9 Python 3.13.17
They all upgrade the bundled pip to version 26.2.2, which includes certifi 2026.10.19 to address the eMudhra / emSign CA certificate security incident.
We don’t normally update pip for security releases like Python 3.13 because of backward compatibility concerns, but since 3.13 only just entered security-only mode, doing a special release with installers seemed prudent.
See the Discourse announcement for more information.
For all existing virtual environments on your system, please upgrade pip and uv to the latest versions.
To upgrade pip securely within a virtualenv:
python -m pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70";
If you cannot immediately upgrade to this release, you can upgrade certificates for a Python 3.15 macOS installation and pip itself via:
/Library/Frameworks/Python.framework/Versions/3.15/bin/python3.15 -m pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70"; /Library/Frameworks/Python.framework/Versions/3.15/bin/python3.15 -m pip install --upgrade certifi /Library/Frameworks/PythonT.framework/Versions/3.15/bin/python3.15t -m pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70";
For 3.14:
/Library/Frameworks/Python.framework/Versions/3.14/bin/python3.14 -m pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70"; /Library/Frameworks/Python.framework/Versions/3.14/bin/python3.14 -m pip install --upgrade certifi /Library/Frameworks/PythonT.framework/Versions/3.14/bin/python3.14t -m pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70";
For 3.13:
/Library/Frameworks/Python.framework/Versions/3.13/bin/python3.13 -m pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70"; /Library/Frameworks/Python.framework/Versions/3.13/bin/python3.13 -m pip install --upgrade certifi /Library/Frameworks/PythonT.framework/Versions/3.13/bin/python3.13t -m pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70";
macOS 27.0 IDLE and tkinter
Additionally, the macOS installer for this release is built with a pre-release of Tk, fixing a possible hang on macOS 27.0 in applications using tkinter, like IDLE, in older releases.
Enjoy the new release
Thanks to all of the many volunteers who help make Python development and these releases possible! Please consider supporting our efforts by volunteering yourself or through organisation contributions to the Python Software Foundation.
Your certified release team, Hugo van Kemenade Thomas Wouters Ned Deily Steve Dower
Having spent the day whacking this particular molehill, my strong opinion is that these packages (minus certifi) should stop vendoring roots immediately.
Users should install their distro's ca-certificates package or similar. If that is completely impossible for whatever reason, offer an option to use certifi (which should be a dependency, not vendored) - but the system trust store should be the default source of truth.
This sort of easter egg hiding to serve users with broken installations reduces the security of everyone else.
(Missing from the quoted list: botocore also includes a vendored copy. I haven't checked how it's used.)
-valtteri
On Thu, Oct 22, 2026 at 01:43:08PM -0700, Alan Coopersmith wrote: https://discuss.python.org/t/information-for-python-users-regarding-emudhra-emsign-ca-certificate-security-incident/109576 has this statement from Seth Michael Larson: A security incident affecting eMudhra intermediate certificates has required removing the emSign root CA certificate from CA bundles such as “certifi”. It’s important to immediately upgrade the software packages below to at least the versions specified and rebuild container images with layer caching disabled to fetch the latest system certificates. Failure to do so could result in monster-in-the-middle (MITM) attacks against TLS clients, including python.org and pypi.org .
certifi 2026.10.19 (1) pip 26.2.2 uv 0.13.4 sigstore 4.5.1 conda 26.9.4 pixi 0.82.1
https://discuss.python.org/t/information-for-python-users-regarding-emudhra-emsign-ca-certificate-security-incident/109576 has this statement from Seth Michael Larson: A security incident affecting eMudhra intermediate certificates has required removing the emSign root CA certificate from CA bundles such as “certifi”. It’s important to immediately upgrade the software packages below to at least the versions specified and rebuild container images with layer caching disabled to fetch the latest system certificates. Failure to do so could result in monster-in-the-middle (MITM) attacks against TLS clients, including python.org and pypi.org .
certifi 2026.10.19 (1) pip 26.2.2 uv 0.13.4 sigstore 4.5.1 conda 26.9.4 pixi 0.82.1
(1): Advisory mentions 2026.10.18, but 2026.10.19 is recommended for compatibility with unaffected emSign root certificates.
For all existing virtual environments on your system, please upgrade pip and uv to the latest versions. You can update pip securely by running the following command and then use this secure pip installation to upgrade certifi and uv:
python -m pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70";
Note that the certifi CA bundle is included in the macOS installation of Python from python.org. To upgrade certificates for this installation and pip itself, run the command below like so:
/Library/Frameworks/Python.framework/Versions/3.15/bin/python3.15 -m pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70"; /Library/Frameworks/Python.framework/Versions/3.15/bin/python3.15 -m pip install --upgrade certifi /Library/Frameworks/PythonT.framework/Versions/3.15/bin/python3.15t -m pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70";
This topic will be updated as more information is made available. A comment on it from Christian Helms adds: Just to stress one point: users must update pip to >= 26.2.2.
pip always loads the CA certificates from its vendored certifi in addition to the system trust store, and there is no supported way to disable this. REQUESTSCABUNDLE / --cert only add CAs; truststore is used “in addition to certifi” by design. As a result, any pip < 26.2.2 will keep trusting the compromised intermediate CAs regardless of the system trust store, so distrusting them at the OS level is not enough.
uv users can block the bad certs in their system trust store and UVSYSTEMCERTS=true. That does not work with pip. Updating pip is the only reliable fix. See Switch to using truststore only by default (currently mixed certifi + truststore) · Issue #14374 · pypa/pip · GitHub
PS: The ‘security incident’ is a bad private key. An elliptic key with private key value d=4 is not secure… All 8 eMudhra CAs had private keys with d < 256.
https://www.cve.org/CVERecord?id=CVE-2026-8643 currently lists the affected versions as "affected from 0 before 26.1.2".
-------- Forwarded Message -------- Date: Mon, 1 Jun 2026 15:03:45 +0000 From: Seth Larson <seth () python org> Reply-To: security-sig () python org To: security-announce () python org
There is a MEDIUM severity vulnerability affecting pip. Please see the linked CVE ID for the latest information on affected versions:
https://www.cve.org/CVERecord?id=CVE-2026-8643 https://github.com/pypa/pip/pull/14000
Security-announce mailing list -- security-announce () python org https://mail.python.org/mailman3//lists/security-announce.python.org
-------- Forwarded Message -------- Date: Mon, 27 Apr 2026 14:20:59 +0000 From: Seth Larson <seth () python org> Reply-To: security-sig () python org To: security-announce () python org
There is a MEDIUM severity vulnerability affecting the pip project. Please see the linked CVE ID for the latest information on affected versions:
https://www.cve.org/CVERecord?id=CVE-2026-6357 https://github.com/pypa/pip/pull/13923
Security-announce mailing list -- security-announce () python org To unsubscribe send an email to security-announce-leave () python org https://mail.python.org/mailman3//lists/security-announce.python.org
pip prior to version 26.1 would run self-update check functionality after installing wheel files which required importing well-known Python modules names. These module imports were intentionally deferred to increase startup time of the pip CLI. The patch changes self-update functionality to run before wheels are installed to prevent newly-installed modules from being imported shortly after the installation of a wheel package. Users should still review package contents prior to installation.
-------- Forwarded Message -------- Date: Mon, 20 Apr 2026 15:02:13 +0000 From: Seth Larson <seth () python org> Reply-To: security-sig () python org To: security-announce () python org
There is a MEDIUM severity vulnerability affecting pip. Please see the linked CVE ID for the latest information on affected versions:
https://www.cve.org/CVERecord?id=CVE-2026-3219 https://github.com/pypa/pip/pull/13870
Security-announce mailing list -- security-announce () python org To unsubscribe send an email to security-announce-leave () python org https://mail.python.org/mailman3//lists/security-announce.python.org
pip doesn't reject concatenated ZIP and tar archives
Limited path traversal when installing wheel archives