# Gradle 仓库响应失败漏洞
## 概述
Gradle 在版本 9.3.0 之前,处理依赖解析时对某些异常未视为致命错误,导致在遇到如 `NoHttpResponseException` 等异常后不会禁用当前仓库,而是继续尝试下一个仓库。
## 影响版本
版本低于 9.3.0 的 Gradle。
## 细节
当依赖解析过程中发生 `NoHttpResponseException` 等异常时,Gradle 未将其标记为仓库不可用,即使重试次数已达上限,仍会继续尝试后续仓库。该机制在持久性异常情况下仍继续搜索其他仓库,造成依赖可能从后续仓库中被解析。
## 影响
攻击者可利用此行为,在控制位置靠后的仓库前提下,通过干扰前序仓库服务(如引发持续网络异常),诱使 Gradle 切换至恶意仓库并下载恶意构件,导致供应链攻击。
是否为 Web 类漏洞: 未知
判断理由:
| # | POC 描述 | 源链接 | 神龙链接 |
|---|
标题: Failure to disable repositories failing to answer can expose builds to malicious artifacts · Advisory · gradle/gradle · GitHub -- 🔗来源链接
标签:x_refsource_CONFIRM
神龙速读:
### 关键漏洞信息
#### 漏洞描述
当解析依赖项时,Gradle 会按声明顺序搜索仓库。如果遇到连接错误,Gradle 会禁用该仓库并导致依赖项解析失败。这在可重复制性和安全性方面是必要的,以防止依赖项从其他仓库解析而没有警告。
在以前的版本中,Gradle 未能将某些异常作为致命错误处理,因此在遇到这些异常时,不会禁用仓库。如果构建遇到了这些异常之一,Gradle 会继续去下一个仓库,并可能从不同的仓库解析依赖项。
#### 影响
如果在达到最大重试次数后,Gradle 仍继续尝试从下一个仓库解析依赖项,可能会导致服务被攻击者破坏,并利用另一个仓库提供恶意工件。
#### 漏洞修复
Gradle 在 9.3.0 和 8.14.4 版本中引入了行为更改,以在遇到错误时停止搜索其他仓库。
#### 修复方案
升级到 9.3.0 或 8.14.4 可以保护您免受上述漏洞的影响。
#### 工作区绕过
如果你无法更新 Gradle 版本,配置 `dependency verification` 是确保构建仅解析预期依赖项的最佳方法。
#### 引用
- [安全功能在失败仓库上快速失败似乎未实现](https://github.com/gradle/gradle/issues/6805)
- [仓库禁用](https://github.com/gradle/gradle/blob/6b939fa58b908570ce5b4eb8e998800e6c502fde/subprojects/core/src/main/java/org/gradle/api/artifacts/ResolvedRepository.java#L31)
- [有关未知主机的仓库的建议](https://docs.gradle.org/current/userguide/artifact_dependencies_tutorial.html#sec:dependency_verification)
#### 相关漏洞类型
- [CWE-494](https://cwe.mitre.org/data/definitions/494.html)
- [CWE-829](https://cwe.mitre.org/data/definitions/829.html)
暂无评论