Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added a new PEP as draft: Enabling certificate verification by default for stdlib mail modules #3537

Closed
wants to merge 8 commits into from
2 changes: 2 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -611,6 +611,8 @@ peps/pep-0730.rst @ned-deily
peps/pep-0731.rst @gvanrossum @encukou @vstinner @zooba @iritkatriel
peps/pep-0732.rst @Mariatta
peps/pep-0733.rst @encukou @vstinner @zooba @iritkatriel
peps/pep-0735.rst @vstinner

# ...
# peps/pep-0754.rst
# ...
Expand Down
105 changes: 105 additions & 0 deletions peps/pep-0735.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
PEP: 735
Title: Enabling certificate verification by default for stdlib mail modules
Author: Martin Schobert <[email protected]>
Sponsor: Victor Stinner <[email protected]>
Comment on lines +3 to +4
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer that you ask me to be a sponsor, and ask me to review the PEP before you go ahead and propose it directly.

Suggested change
Author: Martin Schobert <[email protected]>
Sponsor: Victor Stinner <[email protected]>
Author: Martin Schobert <[email protected]>

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Context: I offered to sponsor a PEP if someone wants to write it: python/cpython#91826 (comment)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the background.

It's great to be proactive and write the PEP, but it's also very important to have a sponsor beforehand who's happy with the text, and also to help with the process. PEP 1 says:

Once the sponsor or the core developer(s) co-authoring the PEP deem the PEP ready for submission, the proposal should be submitted as a draft PEP via a GitHub pull request.

I suggest we close this PR for now, and @nitram2342 contacts @vstinner privately and they decide how to proceed. If they can agree on a text together, then update and re-open this PR, or a fresh one, and we can take it from there.

How does that sound?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If someone wants me to sponsor a PEP, I would prefer to read it and approve it ahead, right.

@nitram2342: If you would like to sponsor your PEP, I suggest you closing this PR, as @hugovk suggests.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, that is fine. I will do it this way.

Status: Draft
Type: Standards Track
Created: 17-Nov-2023

Abstract
=========

The Python mail libraries such as ``smtplib``, ``imaplib`` and ``pop3lib``
do not verify server certificates per default, when a client based on these
mail libraries connects to a server via TLS. Any server certificate is
accepted per default. This means, a client can't ensure that it connects
to the server to which the connection was intended.

This allows an active attacker in a machine-in-the-middle postion to intercept
communication, read mail contents, credentials or may abuse an SMTP server
for spaming.

Motivation
===========

This PEP proposes to enable verification of X509 certificates for Python's
mail clients by default, subject to opt-out on a per-call basis. This change
would be applied to all maintained Python versions.

Rationale
=========

It can be expected that a Python mail client, written in the most simple way, is
secure by default. If progam code wants to insecurely connect to a server, this
action should require and explicit confirmation. Not verifying a server certificate
and accepting it violates PEP 20's principle "errors should never pass silently."

It can also be expected that Python standard libraries behave in a consitent way.
While Python's HTTP stdlib modules verify server certificates per default after
implementing the change request from PEP 476, developers may expect Python mail
libraries to behave similar.

The failure of various applications to note Python's negligence in this matter
is a source of vulnerabilities [#]_ [#]_ [#]_ [#]_.

.. [#] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-39441
.. [#] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-38686
.. [#] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-39441
.. [#] https://www.pentagrid.ch/en/blog/python-mail-libraries-certificate-verification/

Specification
=================

Python would use the system provided certificate database on all platforms.
Failure to locate such a database would be an error, and users would need to
explicitly specify a location to fix it.

Python will change the ``_create_stdlib_context`` as default context in the
mail libraries with ``ssl.create_default_context``.

If a developer wants to disable certificate verification, an explicitly created
SSL/TLS context may be passed that has been created with ``_create_unverified_context``.

Trust database
--------------

This PEP proposes using the system-provided certificate database.

Backwards compatibility
-----------------------

This change may result in failed connections, when servers do not use
valid and trusted certificates. With invalid or untrusted certificates, the Python
TLS library will raise an exception during TLS handshake.

Nevertheless, this will only happen with invalid mail server certificates or
server certificates that do not rely on a trust anchor known to Python's
runtime environment. In these cases it is necessary that the system admin
either installs a valid mail server certificate or the client ensures
there is a trust anchor defined (a valid certificate chain leading from a CA
file to the server certificate). As an unrecommended alternative, the client
code may use an SSL context that does not verify certificates as descibed
in the next section.

Opting out
----------

For users who wish to opt out of certificate verification on a single
connection, they can achieve this by providing the ``ssl_context``
for ``imaplib.IMAP4_SSL`` respectively ``context`` for ``smtplib.SMTP_SSL`` and
``poplib.POP3_SSL``.


Copyright
=========

This document has been placed into the public domain.


..
Local Variables:
mode: indented-text
indent-tabs-mode: nil
sentence-end-double-space: t
fill-column: 70
coding: utf-8