
资安厂商Socket研究人员揭露一起针对Go生态系的供应链攻击,攻击者透过套件名称冒充攻击(Typosquatting)手法,冒充广受採用的BoltDB资料库套件,并利用Go模组代理(Module Proxy)的快取机制,使恶意套件长期存在且未被侦测。此事件凸显Go模组快取机制存在风险,即便原始储存库内容已被修改或移除,但恶意版本仍可由快取继续发布。
这起攻击涉及的恶意套件名为github.com/boltdb-go/bolt,其命名方式与合法的BoltDB套件github.com/boltdb/bolt极为相似,容易让开发者因输入错误或疏忽而误用。恶意版本内建远端控制后门,攻击者可透过命令与控制服务器执行远端指令,取得受感染系统的存取权限。
由于Go模组代理会自动快取其首次撷取的模组版本,并依设计禁止修改已发布的版本,因此即使攻击者在GitHub上重新标记相同版本的标籤,使原始程序码看似无害,代理仍会继续提供首次快取的版本。当快取版本包含恶意程序码,则在未来的下载请求中仍可能被开发者取得,导致潜在的安全风险。
该套件最早于2021年11月上传至GitHub,并经由Go模组代理快取。研究人员发现,攻击者在恶意版本被快取后,修改Git标籤指向乾净版本,使得手动审查GitHub原始码时无法发现异常。但透过Go CLI下载模组时,依然会取得快取的恶意版本,导致恶意程序长期潜伏,直到最近才被发现。由于BoltDB本身已停止维护,许多开发者选择改用不同的Fork版本,这使得冒充套件更容易混入开发环境。
该恶意套件的后门机制透过隐藏的IP地址与远端服务器建立连线,一旦安装并执行,攻击者便可透过TCP连线发送指令,在受害系统上执行任意壳层命令,并回传执行结果。此外,该程序内建持续运作机制,即使连线中断或过程发生错误,仍会自动重新启动,确保后门长时间维持运作。研究人员进一步分析其原始码,发现攻击者透过变数运算与字串取代等技术混淆命令与控制服务器地址,使得静态分析工具较难辨识其异常行为。
Go模组代理的快取机制原本是为了提升软件开发效率,确保开发者获取一致且可重现的模组版本,避免因上游变更导致相依性破坏。而这个事件突显了快取机制存在安全风险,由于Go模组机制不允许移除或修改已发布的版本,因此这类供应链攻击也难以透过现有机制修复,开发者需要藉额外的安全工具来检测出恶意套件。