验证PyPI Python包的完整性

时间:2017-09-18 01:47:11

标签: python python-2.7 python-3.x security pypi

最近有一些关于上传到Python Package Index(PyPI)的恶意库的消息,请参阅:

  1. Malicious libraries on PyPI
  2. Malicious modules found into official Python repository(此链接包含恶意软件包列表)
  3. Developers using malicious Python Modules
  4. 我不是试图转发这些消息,但我试图阻止自己和其他队友确定来自PyPI的包裹是否未被外部方改变。

    问题:

    1. 从PyPI下载软件包后,我应该使用哪些安全检查? MD5还是任何额外的步骤?
    2. MD5签名是否足以验证Python包的完整性?

2 个答案:

答案 0 :(得分:2)

首先,您担心使用PyPIpip下载时获取恶意文件是有效的。实际上,截至2020年,pip has no way to cryptographically validate the authenticity and integrity所下载的软件(但自2013年以来一直是TODO项目)

第二,md5可以验证文件的完整性,但是不能安全地进行验证。检查完整性也不够。要安全安全地验证从pip下载的文件是否是您期望的文件,您必须:

  1. 通过确认文件是发布者实际生产的文件(使用密码签名)对文件进行身份验证,并且
  2. 下载后验证文件的完整性

尽管pip不对此提供内置支持,但是您可以通过手动从PyPI下载所需的文件及其分离的签名文件来手动完成此操作,然后使用gpg

例如,可以在PyPI的网站上查看borgbackup项目:

点击“下载文件”按钮,您可以选择从以下URL下载最新的tarball:

或者,您也可以针对PyPI "simple" API

使用cURL获取此URL。
user@disp5066:~$ curl -s https://pypi.org/simple/borgbackup/ | grep -i borgbackup-1.1.13.tar.gz
    <a href="https://files.pythonhosted.org/packages/97/68/27d96a12f54894223ad6676ce4d215ad61771e3e723580f3ee6e609e17b7/borgbackup-1.1.13.tar.gz#sha256=164a8666a61071ce2fa6c60627c7646f12e3a8e74cd38f046be72f5ea91b3821">borgbackup-1.1.13.tar.gz</a><br/>
user@disp5066:~$ 

要获取此文件的签名,只需将.asc附加到URL:

user@disp5066:~$ wget https://files.pythonhosted.org/packages/97/68/27d96a12f54894223ad6676ce4d215ad61771e3e723580f3ee6e609e17b7/borgbackup-1.1.13.tar.gz.asc
--2020-07-02 07:51:12--  https://files.pythonhosted.org/packages/97/68/27d96a12f54894223ad6676ce4d215ad61771e3e723580f3ee6e609e17b7/borgbackup-1.1.13.tar.gz.asc
Resolving files.pythonhosted.org (files.pythonhosted.org)... 151.101.37.63, 2a04:4e42:9::319
Connecting to files.pythonhosted.org (files.pythonhosted.org)|151.101.37.63|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 862 [application/octet-stream]
Saving to: ‘borgbackup-1.1.13.tar.gz.asc’

borgbackup-1.1.13.t 100%[===================>]     862  --.-KB/s    in 0s      

2020-07-02 07:51:14 (37.2 MB/s) - ‘borgbackup-1.1.13.tar.gz.asc’ saved [862/862]

user@disp5066:~$ cat borgbackup-1.1.13.tar.gz.asc 
-----BEGIN PGP SIGNATURE-----

iQJHBAABCgAxFiEEL4Gv+6sE4R/o7mXUJDrPqVH3jgEFAl7cGqwTHHR3QHdhbGRt
YW5uLWVkdi5kZQAKCRAkOs+pUfeOAd9ND/4nm2O7CK5a4aK41jAI1NisbgEtEJup
SiD6bvMKpo3VU0P/3Y6pUibKOGzaRImBTB04qS3LlgjB0mCp1RSVsj/Hn+yCNw+k
hfUH7E7JgAkq96Vkv1dcYgaJ9nhzuIAkEf0aDyzSo8HkBvGGN0/tfCQ7Nr7hI21u
v5qupIyu7KZrBwY389l7+6yJ9G5qCtHU0fDALRYyjsX+WphrAaizrhFZJO7Km8VZ
gZhAz3WUDPFwgNMb1mToUxpI2ZpnYnRxVBwjnX0Ps77ua4F5OsYM+hYwH5eX9bS9
gmb+W3NjUNjVVj4z+OgN8FGbCTeFVQ6E+IVdm55D4ZRU8KarvFoKOI7HS4GP/3iv
4iWqDaYBMRShnUTk1FKFCKjTb5tXewUGPwio+4bpgUyfJj0OWj1ecMqeF5VAslWz
6pZnsUqLpTFuHUA6dr18TKX4U+c6rdXVM7BhNZe2XtjaQwau6Wz9nC1xhZyFNl1q
CHY7jmLhsfP8GXkh31X9bJrKSZMyYRYat2e7kOroIJczRcHG9T708T+KzsfAb+6w
pWZbfWNfCbCmVQehyhDvNepB3IB5w6ijrZwKTamHAnYBVkAUD/aYwDQJf4nAL4YI
7JXBRpLlCVQGRUQdClqy8QjzpSZs5/Dbetvy5of753JbVjFQtGO2gLLp0wL0HB0v
vIZv3dfBDvfcXQ==
=F4gj
-----END PGP SIGNATURE-----
user@disp5066:~$ 

Pip也无法将用于对软件包进行签名的gpg密钥标记为“正式”密钥,因此您必须希望作者在几个不同的域中发布了他们的密钥,以便您可以从中获取该密钥。 -用几种方法确认它正确,然后导入并信任它。之后,您可以使用gpg来验证从PyPI下载的文件的签名。

gpg --verify borgbackup-1.1.13.tar.gz.asc 

另请参阅:

  1. https://github.com/borgbackup/borg/issues/4213
  2. https://security.stackexchange.com/questions/232855/does-pythons-pip-provide-cryptographic-authentication-and-integrity-validation

答案 1 :(得分:1)

首先,文章描述了域外抢注的危险,这是由开发人员盲目地按名称安装软件包而不检查它是否是正确的上游软件包引起的。您可以通过转到作者的GitHub存储库并正确复制安装说明来避免这种情况。

除此之外,包裹可能被篡改但不太可能。由于PyPI文件是通过HTTPS传输的,因此从服务器获取哈希并验证它并没有多大意义。 (如果作者的帐户或PyPI服务器被黑客入侵,哈希不会阻止您安装恶意软件包。)

如果您需要针对服务器泄露的额外安全措施,请使用固定版本/哈希值。有关详细信息,请参阅document