Go 生态系统遭遇软件供应链攻击
近日,网络安全研究人员揭示了一起针对 Go 生态系统的软件供应链攻击,该攻击利用 Go Module Mirror 缓存机制,以确保恶意软件能够长期存活并感染开发者环境。该恶意软件允许攻击者远程访问受感染系统,执行任意命令,进而可能导致严重的数据泄露和系统破坏。
伪造 BoltDB 模块进行攻击
据安全公司 Socket 透露,该恶意软件伪装成合法的 BoltDB 数据库模块,其包名为 github.com/boltdb-go/bolt
,而合法的 BoltDB 模块包名为 github.com/boltdb/bolt
。
这一攻击手法依赖于域名抢注,攻击者注册了与合法软件包名称极为相似的模块,并发布了包含后门的 1.3.1
版本。该恶意版本于 2021 年 11 月上传至 GitHub,并随后被 Go Module Mirror 服务缓存。
滥用 Go Module Mirror 持续传播
网络安全研究员 Kirill Boychenko 解释道:“一旦安装,该带有后门的软件包便会授予攻击者对受感染系统的远程访问权限,使其能够执行任意命令。”
更值得警惕的是,由于 Go Module Mirror 采用了无限期缓存机制,即使攻击者后来将源代码仓库的 Git 标签指向一个良性版本,镜像服务仍然会继续提供最初缓存的恶意版本。这种机制原本是为了保证软件模块的稳定性,但攻击者利用它来长期分发恶意代码。
逃避检测的高明策略
这种攻击方式确保了即便是对 GitHub 存储库的手动审核,也不会轻易发现恶意内容。开发人员在使用 go get
命令安装模块时,仍然可能下载到已被缓存的带有后门的变体。
Boychenko 进一步指出:“一旦模块版本被缓存,即使原始源代码发生变更,它仍然可以通过 Go Module Proxy 访问。虽然这种设计初衷是为了提高稳定性,但也为攻击者提供了一个可利用的媒介,使得恶意代码能够长期存活。”
开发人员和安全团队应对措施
由于不可变模块机制既提供了安全优势,也可能被滥用,开发人员和安全团队应当密切监控此类攻击。以下是一些关键建议:
- 验证软件包来源:在安装任何第三方 Go 模块前,务必确认软件包的真实性,包括检查包名拼写、作者信息和版本历史。
- 使用私有模块代理:企业开发团队可以考虑使用私有 Go 模块代理,而非直接依赖公共 Go Module Proxy,从而减少受到恶意缓存影响的可能性。
- 定期安全审计:安全团队应定期对项目依赖项进行安全审计,及时发现并清除潜在的恶意软件。
- 监控不明网络流量:由于恶意软件可能会尝试连接远程服务器,安全团队应配置网络监控工具,检测可疑的出站流量。
npm 生态系统同样受影响
类似的攻击模式不仅出现在 Go 生态系统中,安全公司 Cycode 还披露了三个恶意 npm 包——serve-static-corell
、openssl-node
和 next-refresh-token
。这些软件包包含混淆代码,可收集系统元数据,并连接到远程服务器(8.152.163[.]60
),执行攻击者发出的命令。
结论
这起针对 Go 生态系统的供应链攻击再次凸显了软件供应链安全的重要性。开发人员在使用开源软件包时,必须时刻警惕可能存在的安全风险,采取适当的防御措施,以减少受到攻击的可能性。与此同时,Go 语言官方社区和其他开源生态系统也应考虑优化其模块管理机制,以防止类似攻击的再次发生。