Beyond Takedown: Measuring Malicious Go Module Persistence in the Wild
本文揭示了一场大规模的 Go 供应链攻击,其中攻击者将经过混淆处理的恶意软件重新封装进合法的模块中,这表明仅依赖 GitHub 搜索无法检测到受损的全貌,因为超过 99% 被移除的恶意人工制品仍可通过 Go 代理进行检索。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一下,软件开发的世界就像一座巨大且繁忙的图书馆,程序员在这里“借阅”各种“模块”(预先写好的代码块)来构建他们自己的应用程序。在 Go 语言的世界里,这座图书馆有一位非常严格的管理员:Go Proxy(Go 代理)。
以下是关于这座图书馆近期发生的一场劫案的简单故事。
劫案:“虚假的读书会”
攻击者决定从图书馆中窃取东西,但他们并没有破门而入,而是玩了一场冒充的游戏。
- 准备阶段: 他们找到了大家都在使用的、正当且受信任的流行书籍(合法的代码模块)。
- 伪造阶段: 他们以自己的名义创建了这些书的假副本。在这些假书中,他们隐藏了一个微小的、隐形的陷阱。
- 陷阱: 在 Go 的世界里,当你“导入”(借阅)一本书时,图书馆会自动运行一些设置任务。攻击者将一条恶意指令隐藏在了这些设置任务中。这就像是一本书,你一打开它,它就会偷偷向你的电脑发出指令,下载并运行病毒。
- 造势: 为了让这些假书看起来真实可靠,攻击者使用“机器人军队”为它们在 GitHub 上骗取了数千个“星标”(点赞),从而误导开发者认为:“噢,这一定很受欢迎且安全。”
调查:两种观察方式
研究人员(Minjae Bae 和 Carter Yagemann)想要看看这个问题到底有多严重。他们使用了两把不同的手电筒来寻找窃贼。
手电筒 1:GitHub 搜索(“书架”视图)
他们手动搜索了主要的托管网站(GitHub),寻找可疑的模式,并追踪账号之间的“星标”关联。
- 发现: 他们发现了 2,113 个虚假仓库。
- 问题: 这种手电筒只有在假书还摆在书架上时才有效。如果图书馆工作人员移走了这本书,或者窃贼压根没把书放到主书架上,这把手电筒就什么也看不见。
手电筒 2:Proxy 扫描(“流通”视图)
他们构建了一个名为 GOAST 的特殊扫描器(一个只读代码而不运行代码的机器人)来扫描 Go Proxy。这是图书馆的备份系统。它保存着每一个被借阅过的模块的完美、不可更改的副本,即使原始书籍已从书架上移除,它依然存在。
- 发现: 他们发现了 2,289 个恶意版本。
- 惊喜: Proxy 手电筒发现的恶意书籍比 GitHub 手电筒多出了 83%。许多这些假书甚至从未出现在主书架上,或者已经被移除了,但 Proxy 依然保留着它们。
重大发现:“下架”并不意味着“修复”
这是故事中最重要的部分。
通常,当安全团队发现一本坏书时,他们会要求图书馆将其下架(Takedown)。他们删除 GitHub 上的仓库,并认为:“太好了,威胁已经消失了。”
研究人员证明这是错误的。
因为 Go Proxy 保留了每个模块永久且不可更改的副本,在 GitHub 上删除源文件并不会从生态系统中删除病毒。
- 研究人员发现,即使在攻击者的仓库被删除或停用(导致它们在 GitHub 上“隐身”)之后,99.4% 的恶意模块仍然可以通过 Go Proxy 进行获取和下载。
- 这就像图书馆工作人员把一本假书扔进了垃圾桶,但图书馆的自动化配送无人机(Proxy)仓库里依然存有一份完美的副本,并且会继续向索要它的客户进行派送。
结果
研究人员将这个问题告知了图书馆的管理方(GitHub 和 Google)。
- GitHub 删除了 684 个恶意仓库。
- Google(Proxy 团队)从其永久存储中清理了 1,377 个恶意模块版本。
教训
你不能仅仅通过清理“托管层”(GitHub)来解决软件供应链问题。如果“分发层”(Proxy)保留了坏代码,威胁就会持续存在。要真正解决问题,你必须同时清理“书架”和“仓库”。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。