PEP 466: Network security enhancement exception
This commit is contained in:
parent
b866a0f408
commit
668b05ec6c
|
@ -0,0 +1,283 @@
|
|||
PEP: 466
|
||||
Title: Network Security Enhancement Exception for All Branches
|
||||
Version: $Revision$
|
||||
Last-Modified: $Date$
|
||||
Author: Nick Coghlan <ncoghlan@gmail.com>,
|
||||
Status: Draft
|
||||
Type: Informational
|
||||
Content-Type: text/x-rst
|
||||
Created: 23-Mar-2014
|
||||
Post-History: 23-Mar-2014
|
||||
|
||||
|
||||
Abstract
|
||||
========
|
||||
|
||||
Most CPython tracker issues are classified as errors in behaviour or
|
||||
proposed enhancements. Most patches to fix behavioural errors are
|
||||
applied to all active maintenance branches. Enhancement patches are
|
||||
restricted to the default branch that becomes the next Python version.
|
||||
|
||||
This PEP relaxes the latter restriction allowing enhancements to be applied
|
||||
to maintenance branches for standard library components that have
|
||||
implications for the overall security of the internet. In particular, the
|
||||
exception will apply to:
|
||||
|
||||
* the ``ssl`` module
|
||||
* the ``hashlib`` module
|
||||
* the ``hmac`` module
|
||||
* the ``sha`` module (Python 2 only)
|
||||
* the components of other networking modules that make use of these modules
|
||||
* the components of the ``random`` and ``os`` modules that are relevant to
|
||||
cryptographic applications
|
||||
* the version of OpenSSL bundled with the binary installers
|
||||
|
||||
Changes to these modules will still need to undergo normal backwards
|
||||
compatibility assessments, but new features will be permitted where
|
||||
appropriate, making it easier to implement secure networked software in
|
||||
Python, even for software that needs to remain compatible with older feature
|
||||
releases of Python.
|
||||
|
||||
|
||||
Exemption Policy
|
||||
================
|
||||
|
||||
Under this policy, the following network security related modules are
|
||||
granted a blanket exemption to the restriction against adding new features
|
||||
in maintenance releases:
|
||||
|
||||
* the ``ssl`` module
|
||||
* the ``hashlib`` module
|
||||
* the ``hmac`` module
|
||||
* the ``sha`` module (Python 2 only)
|
||||
|
||||
This exemption applies to *all* proposals to backport backwards compatible
|
||||
features in these modules to active maintenance branches. This choice is
|
||||
made deliberately to ensure that the "feature or fix?" argument isn't simply
|
||||
replaced by a "security related or not?" argument. These particular modules
|
||||
are inherently security related, and all enhancements to them improve
|
||||
Python's capabilities as a platform for development of secure networked
|
||||
software.
|
||||
|
||||
As part of this policy, permission is also granted to upgrade to newer
|
||||
feature releases of OpenSSL when preparing the binary installers
|
||||
for new maintenance releases of CPython.
|
||||
|
||||
In addition to the above blanket exemption, a conditional exemption is
|
||||
granted for these modules that may include some network security related
|
||||
features:
|
||||
|
||||
* the ``os`` module (primarily ``os.urandom``)
|
||||
* the ``random`` module
|
||||
* networking related modules that depend on one or more of the network
|
||||
security related modules listed above
|
||||
|
||||
This more limited exemption for these modules requires that the *specific*
|
||||
enhancement being proposed for backporting needs to be justified as being
|
||||
network security related. If the enhancement under discussion is designed
|
||||
to take advantage of a new feature in one of the network security related
|
||||
modules, then that will be taken as implying that the enhancement is
|
||||
security related.
|
||||
|
||||
|
||||
Backwards Compatibility Considerations
|
||||
======================================
|
||||
|
||||
This PEP does *not* grant any general exemptions to the usual backwards
|
||||
compatibility policy for maintenance releases. Instead, it is designed
|
||||
to make it easier to provide more "secure by default" behaviour in future
|
||||
feature releases, while still limiting the risk of breaking currently
|
||||
working software when upgrading to a new maintenance release.
|
||||
|
||||
In *all* cases where this policy is applied to backport enhancements to
|
||||
maintenance releases, it MUST be possible to write cross-version compatible
|
||||
code that operates by "feature detection" (for example, checking for
|
||||
particular attributes in the module), without needing to explicitly check
|
||||
the Python version.
|
||||
|
||||
It is then up to library and framework code to provide an appropriate error
|
||||
message or fallback behaviour if a desired feature is found to be missing.
|
||||
|
||||
Affected APIs SHOULD be designed to allow library and application code to
|
||||
perform the following actions after detecting the presence of a relevant
|
||||
network security related feature:
|
||||
|
||||
* explicitly opt in to more secure settings (to allow the use of enhanced
|
||||
security features in older versions of Python)
|
||||
* explicitly opt in to less secure settings (to allow the use of newer Python
|
||||
versions in lower security environments)
|
||||
* determine the default setting for the feature (this MAY require explicit
|
||||
Python version checks to determine the Python feature release, but MUST
|
||||
NOT depend on the specific maintenance release)
|
||||
|
||||
|
||||
Documentation Requirements
|
||||
==========================
|
||||
|
||||
All modules that take advantage of this policy to backport network
|
||||
security related enhancements to earlier Python versions MUST include
|
||||
a "Security Considerations" section in their documentation.
|
||||
|
||||
In addition to any other module specific contents, this section MUST
|
||||
enumerate key security enhancements and fixes (with CVE identifiers where
|
||||
applicable), and the
|
||||
|
||||
|
||||
Evolution of this Policy
|
||||
========================
|
||||
|
||||
The key requirement for a module to be considered for inclusion in this
|
||||
policy (whether under a blanket or conditional exemption) is that it must
|
||||
have security implications *beyond* the specific application that is written
|
||||
in Python and the system that application is running on. Thus the focus on
|
||||
network security protocols and related cryptographic infrastructure - Python
|
||||
is a popular choice for the development of web services and clients, and
|
||||
thus the capabilities of widely used Python versions have implications for
|
||||
the security design of other services that may be using newer versions of
|
||||
Python or other development languages.
|
||||
|
||||
The intent behind this requirement is to minimise any impact that the
|
||||
introduction of this policy may have on the stability and compatibility of
|
||||
maintenance releases. It would be thoroughly counterproductive if end
|
||||
users became as cautious about updating to new Python maintenance releases
|
||||
as they are about updating to new feature releases.
|
||||
|
||||
|
||||
Motivation and Rationale
|
||||
========================
|
||||
|
||||
This PEP can be seen as a more targeted version of the "faster standard
|
||||
library release cycle" proposals discussed in PEP 407 and PEP 413,
|
||||
focusing specifically on those areas which have implications beyond the
|
||||
Python community.
|
||||
|
||||
The creation of this PEP was prompted primarily by the aging SSL support in
|
||||
the Python 2 series. As of March 2014, the Python 2.7 SSL module is
|
||||
approaching four years of age, and the SSL support in the still popular
|
||||
Python 2.6 release had its feature set locked six years ago.
|
||||
|
||||
These are simply too old to provide a foundation that can be recommended
|
||||
in good conscience for secure networking software that operates over the
|
||||
public internet, especially in an era where it is becoming quite clearly
|
||||
evident that advanced persistent security threats are even more widespread
|
||||
and more indiscriminate in their targeting than had previously been
|
||||
understood.
|
||||
|
||||
While the use of the system OpenSSL installation addresses many of these
|
||||
concerns on Linux platforms, it doesn't address all of them, and in the
|
||||
case of the binary installers for Windows and Mac OS X that are published
|
||||
on python.org, the version of OpenSSL used is entirely within the control
|
||||
of the Python core development team.
|
||||
|
||||
With increased popularity comes increased responsibility, and this policy
|
||||
is about recognising the fact that Python's popularity and adoption has now
|
||||
reached a level where some of our design and policy decisions have
|
||||
significant implications beyond the Python development community.
|
||||
|
||||
As one example, the Python 2 ``ssl`` module does not support the Server
|
||||
Name Identification standard. While it is possible to obtain SNI support
|
||||
by using the third party ``requests`` client library, actually doing so
|
||||
currently requires using not only ``requests`` and its embedded dependencies,
|
||||
but also half a dozen or more additional libraries. The lack of support
|
||||
in the Python 2 series thus serves as an impediment to making effective
|
||||
use of SNI on servers, as Python 2 clients will frequently fail to handle
|
||||
it correctly.
|
||||
|
||||
Another more critical example is the lack of SSL hostname matching in the
|
||||
Python 2 standard library - it is currently necessary to rely on a third
|
||||
party library, such as ``requests`` or ``backports.ssl_match_hostname`` to
|
||||
obtain that functionality in Python 2.
|
||||
|
||||
The Python 2 series also remains more vulnerable to remote timing attacks
|
||||
on security sensitive comparisons than the Python 3 series, as it lacks a
|
||||
standard library equivalent to the timing attack resistant
|
||||
``hmac.compare_digest()`` function. While appropriate secure comparison
|
||||
functions can be implemented in third party extensions, may users don't
|
||||
even consider the problem and use ordinary equality comparisons instead
|
||||
- while a standard library solution doesn't automatically fix that problem,
|
||||
it *does* make the barrier to resolution much lower once the problem is
|
||||
pointed out.
|
||||
|
||||
My position on the ongoing transition from Python 2 to Python 3 has long
|
||||
been that Python 2 remains a supported platform for the core development
|
||||
team, and that commercial support will remain available well after upstream
|
||||
maintenance ends. However, in the absence of this network security
|
||||
enhancement policy, that position is difficult to justify when it comes to
|
||||
software that operates over the public internet. Just as many developers
|
||||
consider it too difficult to develop truly secure modern networked software
|
||||
in C/C++ (largely due to the challenges associated with manual
|
||||
memory management), I consider it too difficult to develop truly secure
|
||||
modern networked software using the Python 2 series without introducing this
|
||||
network security enhancement policy, as doing so would mean reimplementing
|
||||
substantial portions of the standard library as third party modules to gain
|
||||
access to the newer underlying network security protocols and mechanisms,
|
||||
and then injecting those into the module namespace to override their
|
||||
standard library counterparts.
|
||||
|
||||
Requiring that latent defects in an application's Unicode correctness be
|
||||
addressed in order to migrate to Python 3 is not a reasonable alternative
|
||||
recommendation, especially given the likely existence of legacy code that
|
||||
lacks the kind of automated regression test suite needed to help support
|
||||
a migration from Python 2 to Python 3. The key point of this PEP is that
|
||||
those situations affect more people than just the developers and users of
|
||||
the affected application: their existence becomes something that developers
|
||||
of secure networked services need to take into account as part of their
|
||||
security design. By making it more feasible to enhance the security of the
|
||||
Python 2 series, we can help contribute to the evolution of a more secure
|
||||
internet for all concerned.
|
||||
|
||||
For the Python 2 series, this proposal will most obviously impact the
|
||||
remaining maintenance releases of Python 2.7. However, commercial
|
||||
redistributors that continue to offer full support for Python 2.6, and will
|
||||
also do so for Python 2.7 after upstream maintenance ends, may choose
|
||||
to take this policy into account when deciding what changes to backport to
|
||||
their own maintenance updates. Providing commercial redistributors such
|
||||
as ActiveState, Attachmate, Canonical, Continuum Analytics, Enthought, and
|
||||
Red Hat that option is one of the benefits offered by requiring feature
|
||||
detection based forward compatibility for the modules covered by this policy.
|
||||
|
||||
|
||||
Open Questions
|
||||
==============
|
||||
|
||||
* What are the risks associated with allowing OpenSSL to be updated to
|
||||
new feature versions in the Windows and Mac OS X binary installers for
|
||||
maintenance releases?
|
||||
|
||||
* Are there any other security relevant modules that should be covered
|
||||
by either a blanket or conditional exemption?
|
||||
|
||||
* Should we enumerate a specific list of "other networking modules" rather
|
||||
than leaving it implicit?
|
||||
|
||||
|
||||
Acknowledgement
|
||||
===============
|
||||
|
||||
Thanks to Christian Heimes for his recent efforts on greatly improving
|
||||
Python's SSL support in the Python 3 series, and a variety of members of
|
||||
the Python community for helping me to better understand the implications
|
||||
of the default settings we provide in our SSL modules, and the impact that
|
||||
tolerating the use of SSL infrastructure that was defined in 2010
|
||||
(Python 2.7) or even 2008 (Python 2.6) potentially has for the security
|
||||
of the web as a whole.
|
||||
|
||||
Christian and Donald Stufft also provided valuable feedback on a preliminary
|
||||
draft of this proposal.
|
||||
|
||||
|
||||
Copyright
|
||||
=========
|
||||
|
||||
This document has been placed in the public domain.
|
||||
|
||||
|
||||
|
||||
..
|
||||
Local Variables:
|
||||
mode: indented-text
|
||||
indent-tabs-mode: nil
|
||||
sentence-end-double-space: t
|
||||
fill-column: 70
|
||||
coding: utf-8
|
||||
End:
|
Loading…
Reference in New Issue