<p>requests[security] / PyOpenSSL 不会使请求更安全但更脆弱</p>

创建于 2019-11-18  ·  3评论  ·  资料来源: psf/requests

许多年前,请求添加了requests[security]依赖项,因为 Python 的 stdlib 中的 ssl 模块缺少某些功能。 由于 PEP 466 已在 Python 2.7.9 中实现,ssl 模块支持主机名验证和 SNI。 2.7.9 于 2014 年发布。Python 3.7.0 通过将主机名验证委托给 OpenSSL 进一步改善了这种情况。 urllib3 中的 PyOpenSSL 兼容层使用已弃用的ssl.match_hostname函数或向后移植。

使用urllib3.contrib.pyopenssl.inject_into_urllib3对 urllib3 进行无条件猴子修补也会导致问题。

PyOpenSSL 使用动态 libffi 回调(也称为 cffi 旧式回调)。 回调是通过蹦床和本地机器代码的动态创建来实现的。 这要么使用可执行和可写的内存页面,要么使用共享 mmap() 区域的一些技巧。 动态回调是一种安全风险,有充分的理由 (deny_execmem) 被 SELinux 等安全框架阻止。 Armin Rigo 和我探索了各种方法来解决这些问题,但有一个简单的解决方案。 最终,Armin 为 cffi 实现了一个新的回调系统。 旧回调的一些问题记录在https://cffi.readthedocs.io/en/latest/using.html#callbacks -old-style 。

PyOpenSSL 目前引入了一个密码学版本,它本身依赖于 asn1crypto。 asn1crypto 和 ctypes 的问题导致 Python 在最近的 macOS、 https://github.com/pyca/pyopenssl/issues/874https://github.com/wbond/asn1crypto/issues/158 上出现段错误

由于像https://bugzilla.redhat.com/show_bug.cgi?id=1535689这样的错误,我说服 Fedora 和 RHEL 维护者修补请求并在不久前删除inject_into_urllib3 。 发行版已使用补丁https://src.fedoraproject.org/rpms/python-requests/blob/master/f/Don-t-inject-pyopenssl-into-urllib3.patch运行一年多,没有任何报告问题.

我建议:

1) 删除requests[security]额外要求。
2) 从请求中无条件删除 urllib3 的猴子补丁。

最有用的评论

看起来这在合并 #5443 后没有关闭。 我认为唯一未完成的项目是requests[security] 。 我倾向于暂时将它留给仍在使用 < Python 2.7.9 的人。 鉴于我们可能会在本周发布一个带有 urllib3 的新次要版本,我们可以为下一个次要版本添加额外的弃用通知。

除非有人有更多反馈,否则我明天会继续解决这个问题。 我认为最初的请求现已解决。

所有3条评论

支持请求和 urllib3 方向的数据点:91% (7,298,352 / 7,993,356) 的 urllib3 的 Python 2.7.X 下载在 Python 2.7.9+ 上。 取自今天的公共下载数据集。

比例还要大。 RHEL 7 机器上的 Python 2.7.5 也有 PEP 466 的反向移植。

$ rpm -qa python
python-2.7.5-88.el7.x86_64
$ python
Python 2.7.5 (default, Sep 26 2019, 13:23:47) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> ssl.SSLContext(ssl.PROTOCOL_SSLv23).check_hostname
False

看起来这在合并 #5443 后没有关闭。 我认为唯一未完成的项目是requests[security] 。 我倾向于暂时将它留给仍在使用 < Python 2.7.9 的人。 鉴于我们可能会在本周发布一个带有 urllib3 的新次要版本,我们可以为下一个次要版本添加额外的弃用通知。

除非有人有更多反馈,否则我明天会继续解决这个问题。 我认为最初的请求现已解决。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

ReimarBauer picture ReimarBauer  ·  4评论

justlurking picture justlurking  ·  3评论

remram44 picture remram44  ·  4评论

mitar picture mitar  ·  4评论

JimHokanson picture JimHokanson  ·  3评论