Gradle Wrapper 攻击报告
简介
2023 年 1 月 11 日,MinecraftOnline 联系了我们,告知他们在一些代码仓库中发现了两个不寻常且可疑的 Gradle wrapper JAR。这些 wrapper 是由 MinecraftOnline 的一位新贡献者更新的。
我们对这些 JAR 进行了分析,并在下面描述我们的发现。我们已确定,其中一个漏洞是专门为攻击 MinecraftOnline 项目而设计的。
如果您对所有细节不感兴趣,请立即跳转到我们的配套博客,了解如何保护您的项目或您作为开发者免受类似攻击。
分析 #
我们的分析首先确认了两个 JAR 的 SHA256 校验和与已知的良好 Gradle Wrapper 校验和都不匹配
- 第一个 JAR:
8449b6955690ec956c8ecfe1ae01e10a2aa76ddf18969985c070e345605acce1
- 第二个 JAR:
8e129181710bdc045423ddde59244586d7acbc0b2c5e2ddfc098559da559cf85
在反编译这两个 JAR 后,我们发现 wrapper JAR 中已被植入两个漏洞。
Discord 凭据盗窃 #
第一个漏洞存在于两个 JAR 中,它试图通过查找主机计算机上的特定文件来窃取 Discord 凭据。
该代码与在线发现的 Discord 令牌记录非常相似。该漏洞隐藏在不同的 Gradle Wrapper 类中,并通过字符数组查找来混淆 String
常量。
使用正则表达式,某些文件中的行通过在代码中找到的硬编码令牌上传到 Discord Webhook。
本地下载并运行代码 #
第二个 JAR 包含一个额外的漏洞。在某些 Gradle 调用中,它会尝试下载另一个恶意 JAR,然后运行它。
为了触发此代码路径,Gradle 调用需要以 publish
或 magic
开头。publish
是一个 Gradle 任务,用于将所有项目工件推送到存储库。发布工件的构建通常有权访问更高权限的凭据。我们认为 magic
被用作测试漏洞的一种方式。
运行该 JAR 会导致以下操作
- 编辑
build.gradle
文件,通过添加额外的依赖项来修改正在构建的软件- 添加两个仓库,列表中的第一个:一个基于文件的仓库和
mavenCentral()
- 将依赖项添加到
shadow
配置:下载的 JAR 本身和两个第三方库 - 将注入的代码重定位到
org.mariadb.jdbc.internal.cachevalidator
包中,作为 Shadow 插件 配置的一部分
- 添加两个仓库,列表中的第一个:一个基于文件的仓库和
- 修改项目特定的源文件,以便软件执行恶意代码
- 从注入的依赖项添加代码的初始化
除了上述之外,该漏洞还会修改任何以 wrapper
开头的 Gradle 调用,以调用 cleanEclipse
代替。我们认为这是为了使恶意 wrapper JAR 更难被删除。
wrapper JAR 中修改的文件 #
为了完整性,以下是在受感染的 wrapper JAR 中找到的修改文件
- 第一个受感染的 wrapper
org/gradle/cli/SystemPropertiesCommandLineConverter.class
- VirusTotal 上的文件 VirusTotal
org/gradle/wrapper/Download.class
- VirusTotal 上的文件 VirusTotal
org/gradle/wrapper/PathAssembler.class
- VirusTotal 上的文件 VirusTotal
- 第二个受感染的 wrapper
org/gradle/cli/CommandLineParser.class
- VirusTotal 上的文件 VirusTotal
org/gradle/cli/SystemPropertiesCommandLineConverter.class
- 与第一个 wrapper 相同
org/gradle/wrapper/Download.class
- VirusTotal 上的文件 VirusTotal
org/gradle/wrapper/PathAssembler.class
- 与第一个 wrapper 相同
结论 #
虽然 Gradle 团队意识到注入恶意 wrapper JAR 的潜在攻击媒介,但这是我们收到的第一份关于它被积极利用作为供应链攻击的报告。
一般来说,我们建议在集成任何可能影响您的构建过程的来自不受信任来源的更改时要谨慎。请向 我们 报告任何可疑的项目、wrapper 或分发。请参阅关于如何保护您的项目或您作为开发者免受类似攻击的配套博客文章。
如果您对我们的论坛或 Gradle 社区 Slack 有任何疑问,请告知我们,或在下方发起讨论。