在之前的文章“C 和 C++ 语言是否已准备好应对 NPM 灾难”中,我们描述了 Conan 包管理器的安全方法,它基于以下几点:

  • 命名空间。包是在用户账户的命名空间中创建的,因此,即使它们被作者删除(就像在 NPM 中发生的那样),其他用户也无法在同一个命名空间下替换它们。
  • 轻松分叉/复制包。包可以像 git 仓库一样分叉或复制,并放在您自己的账户命名空间下,因此您无需依赖他人,并且他们对包的更改不会影响您的依赖项。
  • Conan 的分布式特性。实际上,大多数在生产环境中使用 Conan 的用户都在运行自己的 Conan 服务器,并在必要时从 conan.io 远程复制 OSS 库的包,甚至仅从 GitHub 获取的包配方生成二进制包。
  • 清单:每个包配方和包二进制文件都有一个文件和校验和清单,并且可以选择进行一些完整性检查。

捕获和验证清单

即使 Conan 已经有了清单,它们实际上也几乎没有被使用。从 Conan 0.13 开始,添加了一个新的请求功能来实现对项目、机器或用户账户依赖项的安全检查。它被实现为一个选项,因为一些针对自身服务器运行的用户已经拥有自己的安全措施,不需要它。

第一步是捕获项目依赖项的所有配方和包二进制文件的清单

$ conan install . --manifests

这将捕获当前文件夹 conanfile 的依赖项到默认名为 .conan_manifests 的文件夹中

此文件夹可以(也可能应该)添加到版本控制中,以便以后进行检查,而不管运行的机器是什么。不同的包二进制文件可以添加到 conan_manifests 文件夹中,在同一个项目中捕获针对不同操作系统、架构和编译器的清单。在版本控制下,可以知道哪些开发人员检查并提取了针对不同设置的不同依赖项(和清单)。

此外,可以使用一个特定的文件夹,既可以使用相对路径也可以使用绝对路径

$ conan install . --manifests=/path/to/myfolder

这将是一个很好的解决方案,可以在 CI 服务器或想要在单个清单存储中检查所有项目的开发人员机器上,在机器范围内而不是项目范围内运行检查。

之后,可以非常轻松地检查捕获的清单与已安装的依赖项是否一致

$ conan install . --verify

这将根据存储的清单检查当前 conanfile 的完整依赖项树。如果配方或包二进制文件清单相对于存储的清单发生了更改,它将显示错误并中止安装。

如上所述,可以指定一个特定的文件夹作为清单存储

$ conan install . --verify=/path/to/myfolder

实施方法的抵抗力

在实施安全措施时,有必要分析其他可能的攻击媒介,以及此类安全措施如何应对它们。

在对清单检查在堆栈的不同点(例如,在下载包时)进行了一些迭代后,我们决定将其放在堆栈的最新位置。通过这种方式,用户免受任何篡改、黑客攻击、替换,甚至用户在本地缓存中安装不受信任的包的错误的影响。所有清单都从本地缓存中检查,而不管其来源是本地还是远程。在验证过程中,还会根据清单检查当前磁盘文件的内容,以确保其校验和匹配。

Conan 当前的清单基于 MD5 校验和。一些用户可能会担心,说 MD5 已损坏。并非如此。众所周知,它的“抗碰撞性”已损坏,并且可以使用相同的哈希生成两个不同的内容。但是,它的**第二原像抵抗性**,即给定一个具有计算哈希的内容,获取一个具有相同哈希的新内容,仍然是完全安全的。在我们的案例中,潜在的攻击者不仅必须找到另一个具有相同哈希的随机内容,而且他们必须找到一个具有相同哈希的非常相似的内容,其中包含他们注入的恶意软件。这完全是不可能的,因此 Conan 在其清单中使用 MD5 校验和是完全安全的。

结论

这只是最近发布的 Conan 0.13 版本改进之一。还发布了其他重要内容,例如执行所有上传和下载传输从磁盘到磁盘的流传输,而不是内存,这将比以前的 Conan 版本使用更少的内存资源。阅读更改日志以获取 Conan 0.13 中所有更改的完整列表。

我们非常重视 Conan 的安全性。这就是决定采用完全分布式方法的主要原因,在这种方法中,用户,尤其是公司,可以运行自己的内部 Conan 服务器,并完全控制其基础设施和安全性。现在,通过检查 Conan 清单,使用其他远程受信任来源也变得非常安全,而不会暴露于此类远程服务器上的黑客攻击、劫持和其他问题。对于非常庞大的团队和复杂的项目,它对于自我保护也非常有用,以确保依赖项的绝对可重复性。

您是否有任何进一步的建议来提高 Conan 的安全性?请在github中提供您的贡献