保护项目完整性

我们最近的 安全报告 显示,针对通过 Gradle Wrapper 的构建过程的 供应链攻击 已经存在。这篇博文解释了如何保护您的项目或您(作为开发人员)免受类似攻击。

构建过程的设计目的是执行代码。构建过程的组件都存在自己的风险

  1. 运行构建工具的引导脚本可能被破坏。(参见 如何确保 Gradle Wrapper 的完整性?
  2. 构建工具本身可能被破坏。(参见 如何确保 Gradle 分发的完整性?
  3. 构建工具可能会下载本身已被破坏的第三方依赖项。(参见 如何确保第三方依赖项的完整性?
  4. 恶意代码可能隐藏在项目代码、测试或构建配置中。(参见 如何确保项目完整性?

由于所有这些可能的攻击媒介,当您对更改的来源没有完全信心时,您应该谨慎行事。在针对 MinecraftOnline 的攻击案例中,如 我们的报告 中所分析的那样,Gradle 包装器更新是由一位新贡献者完成的。

同样,为开源项目贡献代码可能会使您面临此类攻击。最好验证您正在研究的新项目。

关键点是,您应该只在信任项目或更改集的情况下运行构建

以下建议可以帮助建立对本地 Gradle 构建的信任。

如何确保 Gradle 包装器完整性?

首先,确保每次更改包装器 JAR 时,尤其是来自外部贡献者的更改,都要确保 Gradle 包装器的完整性。Gradle 发布了每个 Gradle 版本的 gradle-wrapper.jar 的校验和

维护者的包装器完整性

  • 在存储库中更新 Gradle 包装器 JAR 时,应始终对其进行验证
    • 对于使用 GitHub Actions 的用户,Gradle 发布了一个 专用操作,它将验证包装器校验和
    • 对于任何其他设置,可以通过扩展我们的 验证说明 来实现自动验证。
  • 建议您自己更新包装器,而不是合并来自外部贡献者的 PR。从已知的良好 Gradle 发行版中重新生成 gradlewgradle-wrapper.propertiesgradle-wrapper.jar。使用 gradle wrapper 调用本地 Gradle 不会运行项目的 gradle-wrapper.jar,*但它会配置构建*。

贡献者的包装器完整性

  • 如果您不信任您正在构建的项目,建议使用已知的良好本地 Gradle 发行版,而不是包装器。

如何确保 Gradle 发行版完整性?

其次,确保 Gradle 发行版本身的完整性。除了包装器校验和之外,您还可以找到 发行版校验和

维护者的发行版完整性

贡献者的发行版完整性

  • 再次,依赖已知的良好本地 Gradle 发行版可能更安全。

如何确保第三方依赖项的完整性?

确保第三方依赖项的完整性涉及评估多个因素,例如所用依赖项或插件的熟悉度和可靠性,以及它们来源的存储库的可信度。综合考虑所有这些因素对于正确验证其完整性至关重要。

维护者的依赖项完整性

  • Gradle 允许您启用 依赖项验证。此功能确保第三方依赖项(包括构建插件和项目依赖项)与配置的受信任签名或校验和匹配。
  • 注意使用不寻常的存储库、插件或依赖项的构建脚本的任何更改。

贡献者的依赖项完整性

  • 注意使用不寻常的存储库、插件或依赖项的任何构建脚本。依赖项验证不能保证可信度,它只能确保构建使用的内容与预期匹配。

如何确保项目完整性?

这可能是一项重大工作,审查的程度将取决于许多因素。但是,重要的是要了解,任何时候您运行他人的代码,您都面临着潜在的安全风险。

维护者和贡献者的项目完整性

  • 在运行任何任务或将项目导入 IDE 之前,检查构建脚本和任何贡献的代码。即使运行 gradle help 也可能执行恶意操作。
  • 在本地和持续集成环境中运行不受信任的代码时,请考虑使用一次性环境。

结论

供应链攻击是一个令人痛心的现实,正如我们最近的安全报告中所展示的那样。

Gradle 团队将继续寻找方法来提高 Gradle 构建工具及其社区的安全性。请将任何可疑的项目、包装器或分发版报告给我们。但是,最终,安全是每个项目和开发人员的责任。您应该评估您的风险和需求。然后采取相应的行动。

如果您对我们的论坛Gradle 社区 Slack有任何疑问,请告诉我们,或在下面开始讨论。

讨论