安全的PyPI——信任开放源代码库的问题

310 阅读6分钟

如果你使用开源的Python软件包,你的业务一般都依赖于Python生态系统的完整性,特别是绝大多数Python软件包所在的PyPI(Python Package Index)。但这种信任是有必要的吗?

明确地说,我们热爱Python,并依赖PyPI作为我们业务的重要资源,就像许多其他企业一样。为我们所有人开发和维护公共资源的人做了很好的工作,但 PyPI并不是App Store。也许现在是时候提出它应该是的理由了。

ActiveState最近发布了我们的 供应链安全调查 ,其中包括来自全球大大小小的组织的1500多名编码员、安全人员和开源领导的结果。调查结果表明,有太多的组织(无论其规模如何)继续隐性地信任像PyPI这样的开源语言库。

Implicit Trust in Public Repos

尽管事实是这样的。

  • PyPI包含由数万名作者和维护者创建的数十万个软件包,所有这些人都必须被信任。鉴于任何人都可以向PyPI上传软件包,这似乎是一个愚蠢的假设,如果不是彻头彻尾的危险。
  • PyPI没有看门人,只有一套有限的保障措施(即,你不能上传一个名字已经被占用的包)。由于PyPI的代码没有经过审计、独立审查,甚至没有经过深度扫描,所以根本没有办法阻止开发者上传恶意软件。

信息很明确-- 用户要当心,这就把检查每个软件包的安全性和完整性的开销推给了每个使用它们的组织--在全球范围内是对计算资源的巨大浪费。虽然为PyPI创建更好的安全的计划已经存在多年,但实际执行仍然落后于需求。这篇文章探讨了一些组织在这段时间内可能要考虑的替代方案。

软件供应链面临的PyPI威胁不断上升

多年来,软件供应链的攻击一直在上升,但 自从大流行开始以来 ,攻击成倍增加 。大多数供应链攻击利用开放源码库的宽松安全,上传一些不同的漏洞,包括:

  • Pytosquatting,也就是Python生态系统的typosquatting。在网络上,当坏人注册了几乎不存在的域名,希望你不会发现拼写上的差异(如amazan.com),或者希望你打错网站名称(即amazin.com)时,就会发生typosquatting。在PyPI中,pytosquatters注册了热门软件包的近似名称,或以其他方式创建可信的软件包名称,希望你能误下载和安装。
  • 依赖关系混乱 最近变得比tynosquatting更流行。它的出现是因为PyPI没有提供对命名间距的支持。因此,坏人可以猜测你的组织可能在内部创建的包的名字(例如,amazon_requests),然后把它的一个较新的版本上传到PyPI,你的工具可能无意中把它拉出来。地球上一些最大的企业都受到了这种漏洞的影响,包括 苹果、微软和特斯拉
  • 身份劫持 - 发生在一个坏的行为者猜测/破解一个作者的密码,或者提出接管一个被遗弃的或被忽视的项目,而原来的所有者不再有时间来照顾。

不幸的是,这种攻击经常发生。虽然运行PyPI的人在发现漏洞后会迅速删除,但一个被破坏的软件包即使只存在几天,也会对成千上万的用户产生负面影响。例如,一位 研究人员 通过消除PyPI上前10,000个软件包名称中的_或-等分隔符,注册了1,000多个软件包名称。其结果是。

"在两年多一点的时间里,总共有530,950个pip安装命令运行在1,131个软件包上。"

更令人不安的是,在2020年7月,request包(注意错别字:request而不是requests)被下载了超过10,000次。它包含 恶意软件 ,在.bashrc中安装了一个守护程序,为攻击者提供了机器上的远程外壳。

实现安全PyPI的进展

PyPI是由一些非常聪明、敬业的人运营的,他们认真对待安全问题,但受限于资金限制。尽管如此,他们最近还是推进了一些项目,包括:

  • 为PyPI登录增加了双因素认证。
  • 在向PyPI上传软件包时能够要求一个API令牌。
  • 一个即将推出的 项目 ,将引入 "组织账户",作者可以据此创建一个组织,邀请其他用户加入,将这些用户组织成团队,以及管理多个项目的所有权和权限。
    • 还有人提议,这个项目将提供命名空间支持,以对抗依赖性混乱等漏洞。

不幸的是,这类项目可能需要几年的时间来实现。在此期间,你可以采取一些措施来减少从开源仓库导入代码的风险。例如,我们的 供应链安全调查 表明,受访者目前在可能的情况下实施了一些 "最佳实践 "的进口检查。

Best Practice Import Controls

根据你对风险的承受能力和你所拥有的时间/资源,你可能还想实施。

  • 一个 可以标记出可疑的排版包的 程序
  • 一个静态代码分析工具
  • 一个隔离区,用于停放可疑的软件包,以便进一步调查。

结论开发人员需要安全的Python包,这些包从头到尾都是可信的

虽然实施最佳实践以减少与进口开放源代码相关的风险总是一个好主意,但在恶意软件包出现时处理它们似乎是一场无休止的打地鼠游戏。但是,考虑到现代应用程序的复杂性,回到开放源代码包使编码变得如此简单和快速之前的时代似乎是不可能的。

作为替代方案,33%的供应链调查受访者表示,他们更愿意与一个值得信赖的供应商合作。不幸的是,供应商的软件包需要时间来策划、验证许可证、扫描代码、构建和提供分发。这也是企业更愿意与旧版本的Python合作的原因之一。但是旧版本可能包含一些漏洞,这就造成了安全方面的权衡。

为了帮助解决这种权衡,ActiveState已经开始使用我们的ActiveState平台发布一套安全的Python软件包,该平台可以在几分钟内为最新版本的Python构建并提供软件包。每个包都已经过: