PyPI 和类似的第三方软件存储库采取哪些安全措施?

信息安全 恶意软件 源代码 编程 异常检测
2021-08-25 23:44:23

PyPI是 Python 包的第三方软件存储库。每个人都可以将包上传到它(请参阅Python 包索引 (PyPI))。

  • PyPI 如何防止人们上传恶意软件?
  • 当我搜索软件时,我如何(更多)确定它不是恶意软件?
  • 作为包的开发者,我可以做些什么来让其他人觉得使用我的包更安全?
  • 存储库中是否存在恶意软件的“历史”示例?他们造成了多大的伤害?

我已经问过 PyPI 的问题,但我也会对类似的存储库感兴趣,例如npm (JavaScript)composer (PHP)

在 tex.SE 聊天中向CTAN (tex)提出了这个问题。答案是没有安全措施。他们相信人们/开发人员不会上传恶意软件。

4个回答

实际上,我最近写了一篇关于这个主题博客文章

回答你的观点:

PyPI 如何防止人们上传恶意软件?

它没有。可以上传任何Python 代码。在包安装期间可以执行任意代码。仔细审核您的依赖关系。

当我搜索软件时,我如何(更多)确定它不是恶意软件?

下载 tarball 并查看代码。

作为包的开发者,我可以做些什么来让其他人觉得使用我的包更省钱?

如果您的用户信任您,那么 PyPI 就可以完美运行。包通过 HTTPS 提供,并且校验和可用于验证。

存储库中是否存在恶意软件的“历史”示例?他们造成了多大的伤害?

我不知道任何历史示例,但我可以轻松上传演示包。PyPI 没有采取任何措施来防止这种情况发生。它充当 Python 包的简单索引,取决于他们信任的开发人员的用户。

这里有两种威胁模型:

  1. 恶意开发者上传恶意包
  2. 恶意攻击者上传属于合法开发者的恶意包

PyPI 不会尝试解决 #1。在安装之前审核代码并仅安装来自信誉良好的开发人员的软件包是您对这些的唯一“保护”。如果你发现了恶意包,你可以将它报告给 PyPI 维护者,这个包可能会被删除。但实际上,没有针对它的保护措施,因为 PyPI 包在可用于安装之前没有经过预先审查。

在第二种威胁模型中,有许多安全措施。较新版本的 PyPI 通过 HTTPS 下载包,并且包可以选择是 GPG 签名的。有一些建议来实施更新框架(tuf),虽然我不知道他们已经走了多远。

安装到您的用户包或 virtualenv 可以限制恶意包可能造成的损害,方法是限制安装程序在安装期间不使用 sudo。但不要过分依赖它。

据我所知,一般来说,在线代码存储库(例如 ruby​​gems、npm、nuget、PyPI 等)提供的代码的保证非常有限。在很多情况下,他们不支持或执行诸如签名代码或其他基于完整性的安全措施之类的事情,并且对要部署的站点的身份验证在某些情况下只是用户名/密码组合,因此您不仅依赖于开发人员不是故意在他们的代码中放置恶意软件,而且这些开发人员具有良好的操作安全实践。

一个更大的问题是,在很多情况下,您安装的库都具有依赖关系,在某些情况下存在大量依赖关系,因此您相信这些依赖关系的开发人员也不是恶意的并且具有良好的安全实践。

正如 Terry 所说,对于许多代码库,安装时(甚至在使用库之前)都有执行任意代码的钩子,因此仅安装行为可能会产生不良后果,尤其是作为特权用户完成时。

就历史上的妥协实例而言,2013 年的Rubygems妥协就是一个存储库被攻击的例子。

在解决问题方面,有更新框架计划来尝试改善这种情况。

自 2020 年起,pip它不会为其从 PyPI 下载的任何软件包提供加密完整性或身份验证。

2013 年,PEP 458被提出作为解决此问题的解决方案。

2019 年,Python 软件基金会宣布 Facebook 捐赠资金来实施它。

截至 2020 年年中,这项工作仍在进行中,可以通过Python Packaging Authority的这个Github Milestone进行跟踪

同时,您能做的最好的事情就是希望 python 模块的开发人员:

  1. 使用类似的工具,twine并且可以选择使用gpg. Pip 没有执行此验证的内置机制,但您可以手动进行。

  2. 发布一个加密签名的文档,包括其发布的校验和,然后您可以将其pip--hash参数一起传递