保护项目完整性
我们最近的 安全报告 显示,针对通过 Gradle Wrapper 的构建过程的 供应链攻击 已经存在。这篇博文解释了如何保护您的项目或您(作为开发人员)免受类似攻击。
构建过程的设计目的是执行代码。构建过程的组件都存在自己的风险
- 运行构建工具的引导脚本可能被破坏。(参见 如何确保 Gradle Wrapper 的完整性?)
- 构建工具本身可能被破坏。(参见 如何确保 Gradle 分发的完整性?)
- 构建工具可能会下载本身已被破坏的第三方依赖项。(参见 如何确保第三方依赖项的完整性?)
- 恶意代码可能隐藏在项目代码、测试或构建配置中。(参见 如何确保项目完整性?)
由于所有这些可能的攻击媒介,当您对更改的来源没有完全信心时,您应该谨慎行事。在针对 MinecraftOnline 的攻击案例中,如 我们的报告 中所分析的那样,Gradle 包装器更新是由一位新贡献者完成的。
同样,为开源项目贡献代码可能会使您面临此类攻击。最好验证您正在研究的新项目。
关键点是,您应该只在信任项目或更改集的情况下运行构建。
以下建议可以帮助建立对本地 Gradle 构建的信任。
如何确保 Gradle 包装器完整性?
首先,确保每次更改包装器 JAR 时,尤其是来自外部贡献者的更改,都要确保 Gradle 包装器的完整性。Gradle 发布了每个 Gradle 版本的 gradle-wrapper.jar
的校验和。
维护者的包装器完整性
- 在存储库中更新 Gradle 包装器 JAR 时,应始终对其进行验证
- 建议您自己更新包装器,而不是合并来自外部贡献者的 PR。从已知的良好 Gradle 发行版中重新生成
gradlew
、gradle-wrapper.properties
和gradle-wrapper.jar
。使用gradle wrapper
调用本地 Gradle 不会运行项目的gradle-wrapper.jar
,*但它会配置构建*。
贡献者的包装器完整性
- 如果您不信任您正在构建的项目,建议使用已知的良好本地 Gradle 发行版,而不是包装器。
如何确保 Gradle 发行版完整性?
其次,确保 Gradle 发行版本身的完整性。除了包装器校验和之外,您还可以找到 发行版校验和。
维护者的发行版完整性
- Gradle 发行版校验和可以 添加到
gradle-wrapper.properties
文件中,以强制下载的内容与预期校验和匹配。
贡献者的发行版完整性
- 再次,依赖已知的良好本地 Gradle 发行版可能更安全。
如何确保第三方依赖项的完整性?
确保第三方依赖项的完整性涉及评估多个因素,例如所用依赖项或插件的熟悉度和可靠性,以及它们来源的存储库的可信度。综合考虑所有这些因素对于正确验证其完整性至关重要。
维护者的依赖项完整性
- Gradle 允许您启用 依赖项验证。此功能确保第三方依赖项(包括构建插件和项目依赖项)与配置的受信任签名或校验和匹配。
- 注意使用不寻常的存储库、插件或依赖项的构建脚本的任何更改。
贡献者的依赖项完整性
- 注意使用不寻常的存储库、插件或依赖项的任何构建脚本。依赖项验证不能保证可信度,它只能确保构建使用的内容与预期匹配。
如何确保项目完整性?
这可能是一项重大工作,审查的程度将取决于许多因素。但是,重要的是要了解,任何时候您运行他人的代码,您都面临着潜在的安全风险。
维护者和贡献者的项目完整性
- 在运行任何任务或将项目导入 IDE 之前,检查构建脚本和任何贡献的代码。即使运行
gradle help
也可能执行恶意操作。 - 在本地和持续集成环境中运行不受信任的代码时,请考虑使用一次性环境。
结论
供应链攻击是一个令人痛心的现实,正如我们最近的安全报告中所展示的那样。
Gradle 团队将继续寻找方法来提高 Gradle 构建工具及其社区的安全性。请将任何可疑的项目、包装器或分发版报告给我们。但是,最终,安全是每个项目和开发人员的责任。您应该评估您的风险和需求。然后采取相应的行动。
如果您对我们的论坛或Gradle 社区 Slack有任何疑问,请告诉我们,或在下面开始讨论。