阅读我们的文章

.

了解您所面临的风险的指南,以及一些防范风险的小贴士。.
最近出现了一种新型网络威胁:软件供应链攻击。这种攻击虽然罕见,但影响巨大,如何防范这种攻击成为人们日益关注的问题。由于使用情况多种多样,因此并没有一个适用于 python 项目的安全规则,这始终取决于您的具体情况。.

导言

在传统行业中,供应链是指使公司向客户交付产品的任何环节。例如,当你在面包店购买羊角面包时,所有的配料、包装和运输都是供应链的一部分。.

在软件领域,供应链是指在将软件部署到生产环境之前对其产生影响的任何因素。它涵盖了从开发阶段到发布过程的所有内容,包括您编写的代码、您的依赖关系、您的构建环境、您的集成开发环境、您的映像注册表--您的软件在任何时候与之交互的所有组件!

最近,“供应链 ”一词因影响广泛的网络攻击而广为人知。在所有攻击中,Solarwinds 可能是最著名的。事实上,美国政府、微软和英特尔等大型科技公司以及医院、电力公司和金融机构都受到了影响。.

具有讽刺意味的是,根本原因是网络安全监视器 Solarwinds Orion 受到感染。构建系统遭到入侵,在 2020 年 3 月至 6 月期间发布的所有新版本都感染了恶意软件。结果是,在此期间更新软件的所有客户都受到了威胁。.

尽管媒体对 Solarwinds 攻击事件进行了大量报道,但我们从未听说过的类似攻击事件还有数十起。幸运的是,云本地计算基金会将所有这些攻击记录在一个 公共存储库. .您可能会对过去几年这些攻击的加速感到惊讶。.

要在一篇博文中涵盖与供应链安全有关的所有内容是不可能的,因此我们将在本文中特别关注使用 Python 作为主要语言的项目。.

如何在 Python 中管理依赖关系

尽管 Python 奉行 “包含电池 ”的理念,但您仍经常需要从 PyPI(官方软件包索引)下载外部库,此时您需要非常小心。.

Python 生态系统已经成为攻击目标,特别是通过使用两种技术:

  • 打错字
  • 依赖性混乱

第一种技术会影响到每个 Python 开发人员在其职业生涯中至少执行过一次的命令:

pip install 

黑客会发布与现有软件包名称几乎相同的软件包,希望你会因为打错字而安装他们的软件包,而不是官方软件包。例如,一个名为 python3-dateutil 而不是官方的 dateutil 一直以来 最近侦测到.

蟒蛇社区是 劳心劳力 以降低风险,但风险仍然很高。.

第二种技术,即依赖性混淆,比第一种技术更复杂,与如何 核心 在引擎盖下工作。.

这一次,这个命令会让你面临风险:

pip install --extra-index-url 

当您键入该命令时,会发生以下情况:

Image

让我们举个例子:

Image

在本例中,恶意黑客的软件包将被安装到机器上。事实上,公开软件包索引中的版本号更高。.

你可能已经了解了这个过程中可能出现的问题。一些居心不良的人可能会在公共仓库中发布与内部软件包索引中的软件包名称相同的软件包,并用高得离谱的版本号来标记它们。此外,查找相关软件包名称并不难,因为 这位安全研究员展示了.

该命令可被称为 “设计上的不安全”。这种攻击利用了 Python 软件包管理器的一项功能,只有少数开发人员知道这种行为。.

Image

如何抵御这些供应链攻击

要防御错字抢注攻击,可以使用 锁定文件. .A 好锁档 具有以下属性

  • 版本引脚:它们能使你的构建具有可预测性和确定性。.

  • 哈希值 它们是验证软件包完整性的一种方法。.

  • 完整的依赖关系图: 这样,您还可以控制依赖项的依赖关系。.

好消息是,有一个软件包可以为您创建锁文件: pip-tools. .只需几条命令,您就可以生成一个具有我们之前描述的所有属性的锁文件。.

$ python3 -m venv my-env # 创建新的虚拟环境
$ source my-env/bin/activate # 激活它
$ pip install pip-tools==6.3.0 # 安装能让你正确管理依赖关系的软件包。
正确管理依赖关系的软件包
$ echo “sacremoses==0.0.46” >> requirements.in # 在 requirements.in 中添加你选择的软件包。
在 requirements.in
$ pip-compile --generate-hashes # 根据你在 requirements.in 中输入的哈希值,用
哈希值的基础上编译 requirements.txt

您的 requirements.txt 文件应如下所示:

Image

有了这个包含所有依赖项及其相关版本和哈希值的文件,下次部署时就可以执行以下命令了:

pip install --require-hashes -r requirements.txt

这样,您就可以确保您在生产中使用的软件包没有被修改过。假定您在编写您的 要求 文件👀,您还可以放心地下载您真正想要的软件包,因为一切都是自动化的。没有错字风险!

这种最佳做法可以抵御错字抢注攻击,但依赖关系混乱怎么办?

如果你看看 核心 文档,你会看到有两个选项可以用来从内部软件仓库下载软件包:

  • --ext-index-url
  • --索引URL

文件说

Image

正如您所看到的,两者之间存在细微差别,而且乍一看并不明显。区别在于,如果您指定 --索引URL 选择、, 核心 只会从您提供的 URL 版本库中调用软件包,而不会从公共版本库中调用软件包。因此,如果想避免我们前面描述的行为,请使用 --索引URL 而不是 --ext-index-url 你就会安全!

最后,为了跟踪依赖项中发现的最新漏洞,您可以选择定期检查 GitHub 咨询 database 或更好地利用以下工具 依赖机器人 将自动在您的软件仓库中提交拉取请求,以更新最近发现存在关键漏洞的依赖关系。.

摘要

在本文中,我们介绍了软件世界供应链的概念。我们特别研究了这一概念如何应用于 Python 生态系统。我们解释了错字抢占和依赖关系混乱,并提出了降低风险的解决方案。.

以上对供应链安全的简要介绍只是冰山一角,我们还没有机会讨论如何确保供应链安全。 构建系统 甚至你的 集成开发环境 但这一点我将留待下一篇文章讨论!

感谢您读到这里!我很高兴听到您的反馈意见。如果您喜欢阅读,请随时查看我们的 空缺职位 在 Artefact 🙂

中号 Blog by Artefact。.

本文最初发表于 Medium.com.
在我们的 Medium Blog 上关注我们!