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 本身和两个第三方库 - 根据 Shadow 插件配置,将注入的代码重新定位到
org.mariadb.jdbc.internal.cachevalidator
包中
- 添加两个仓库,列表中的第一个:一个基于文件的仓库和
- 修改项目特定的源文件,以便软件执行恶意代码
- 从注入的依赖项中添加代码的初始化
除了上述内容,该漏洞还会修改任何以 wrapper
开头的 Gradle 调用,将其改为调用 cleanEclipse
。我们认为这是一种使恶意 Wrapper JAR 更难被移除的尝试。
Wrapper JAR 中被修改的文件 #
为了完整性,以下是受感染的 Wrapper JAR 中发现的修改文件
- 第一个受感染的 Wrapper
org/gradle/cli/SystemPropertiesCommandLineConverter.class
- 文件在 VirusTotal 上
org/gradle/wrapper/Download.class
- 文件在 VirusTotal 上
org/gradle/wrapper/PathAssembler.class
- 文件在 VirusTotal 上
- 第二个受感染的 Wrapper
org/gradle/cli/CommandLineParser.class
- 文件在 VirusTotal 上
org/gradle/cli/SystemPropertiesCommandLineConverter.class
- 与第一个 Wrapper 中相同
org/gradle/wrapper/Download.class
- 文件在 VirusTotal 上
org/gradle/wrapper/PathAssembler.class
- 与第一个 Wrapper 中相同
结论 #
尽管 Gradle 团队意识到注入恶意 Wrapper JAR 潜在的攻击向量,但这是我们收到的第一份关于其被积极利用为供应链攻击的报告。
总的来说,我们建议在集成任何可能影响您构建过程的来自不受信任来源的更改时要谨慎。请向我们报告任何可疑的项目、Wrapper 或发行版。请参阅关于如何保护您的项目或您作为开发者免受类似攻击的配套博客文章。
如果您有任何问题,请通过我们的论坛或Gradle 社区 Slack 联系我们,或在下方发起讨论。