Rust 供应链攻击波及广泛使用的 crate,Solana 生态系统或受潜在影响
要点速览
- •安全研究人员报告称,Rust 生态系统中出现 arrayref@0.3.10、internment@0.8.7 和 append-only-vec@0.1.9 的恶意版本。
- •被入侵的程序包使用了一个仿冒 proc-macro1 的相似依赖,其构建脚本可在编译期间下载并执行远程载荷。
- •由于 Cargo 会自动运行构建脚本,开发者和 CI 环境只要编译受影响版本就可能面临暴露风险。
- •Rust 安全团队已移除恶意版本,并锁定与这些程序包相关联的维护者账户。
- •受影响的 crate 出现在一些与 Solana 相关的依赖链中,但报告并未表明 Solana 或下游项目已被攻陷。

一场协同策划的供应链攻击波及多个被广泛使用的 Rust 程序包,令依赖链中包含 Solana 生态系统相关组件的开发者与项目感到担忧。SlowMist、Socket 和 StepSecurity 的安全研究人员报告称,恶意版本涉及 arrayref@0.3.10、internment@0.8.7 和 append-only-vec@0.1.9。
被入侵的版本引入了一个仿冒合法程序包 proc-macro1 的拼写抢注式依赖(typosquatting),其构建脚本会在 Cargo 构建期间下载并执行远程载荷。因此,开发者和持续集成(CI)系统只要编译依赖受影响版本的项目,就可能面临暴露风险。根据 @WuBlockchain 在 X 上分享的信息,Rust 安全团队已移除恶意版本,并锁定了受影响的维护者账户。
恶意程序包通过依赖链植入
该事件的核心在于 Rust 的程序包生态系统,开发者通常依赖第三方 crate 来为应用程序和软件项目提供功能。在本次事件中,研究人员确认了三个 crate 的恶意版本:arrayref@0.3.10、internment@0.8.7 和 append-only-vec@0.1.9。
这些恶意版本包含一个刻意仿冒合法程序包 proc-macro1 的依赖。这种被称为 typosquatting(拼写抢注)的技术,试图让恶意程序包看起来与合法依赖相似。在 npm 和 Python 的 PyPI 等开源软件仓库中,这是一种反复出现的攻击手法,仿冒名称屡屡被用于借助常规依赖更新传播恶意代码。
此次攻击之所以尤为严重,是因为该恶意依赖包含一个构建脚本,能够在受影响的程序包被编译时下载并执行远程载荷。因此,安全风险并不一定局限于手动安装或运行明显可疑程序的用户:开发者工作站或 CI 环境在正常的软件编译过程中也可能受到影响。
构建过程形成潜在安全风险
Cargo 是 Rust 的包管理器和构建系统,开发者日常使用它来获取依赖并编译项目。此次报告的攻击正是利用了这一工作流程。由于 Cargo 会在编译过程中自动运行 crate 的构建脚本,此类脚本将以执行构建的用户或 CI 账户的权限运行。
当受影响的依赖被编译时,恶意构建脚本便可下载并执行远程载荷。这为攻击者在开发者机器或 CI 主机上执行代码创造了潜在途径。
CI 系统在现代软件开发中尤为重要,因为它们会自动构建、测试和部署代码。因此,被攻陷的构建环境带来的风险可能超出单一开发者工作站的范畴——构建机器和开发者工作站上通常存有 API 令牌、部署密钥和签名材料等凭据。正因如此,安全团队通常将构建期代码执行视为在受影响系统上轮换全部机密信息的理由。
该事件凸显了软件供应链面临的更广泛安全挑战:恶意代码可以通过开发者自己可能并未编写或审查过的依赖,间接进入项目。
涉及 Solana 的依赖链引发关注
arrayref crate 在整个 Rust 生态系统中被广泛使用,并出现在与 Solana 相关组件有关的依赖链中。Solana 的验证者软件及其大量周边工具均以 Rust 编写,这也是 arrayref 这类通用 crate 会出现在 Solana 相关依赖树中的原因,尽管这些 crate 本身并非区块链专用。然而,依赖链中出现受影响的 crate,并不意味着下游 Solana 相关项目已被攻陷。
这一区别非常重要,因为开源软件经常依赖多层依赖。存在漏洞或被攻陷的程序包可能出现在项目依赖树的某个位置,但不一定会导致最终应用程序或网络被成功攻陷。
因此,安全研究人员会区分“暴露于恶意依赖”与“恶意代码确实在特定下游项目或环境中被执行”这两种情况。此次报告的事件证实受影响版本包含恶意代码,但并未证实每个使用相关依赖的项目都已被攻陷。
Rust 安全团队移除恶意版本
Rust 安全团队的应对措施是移除恶意版本,并锁定与这些程序包相关联的维护者账户。根据已披露的信息,该维护者的机器或发布凭据很可能已被攻陷。
在开源生态系统中,被攻陷的发布账户可能构成重大风险,因为攻击者可能以合法维护者的身份分发恶意软件。移除受影响版本可限制其在程序包生态系统中的进一步传播,而锁定账户则可防止他人再通过被窃取的凭据发布新版本。针对被攻陷 Rust crate 的安全公告由社区维护的 RustSec 公告数据库跟踪,这是开发者可以与 crates.io 注册表一同监控的渠道之一。
该事件也表明了监控依赖、审查异常程序包更新的重要性,尤其是当项目依赖庞大而复杂的依赖树时。
对 Rust 开发者的更广泛影响
供应链攻击已成为整个软件开发领域的重大安全隐患,因为其攻击目标是构建应用所使用的基础设施和依赖,而非直接攻击最终应用。在本次事件中,恶意代码被嵌入程序包发布版本中,并在构建过程中被激活。此类手法有充分记录的先例,包括 2024 年 3 月披露的 XZ Utils 后门事件(攻击者利用了其在基础开源压缩库中的维护者身份),以及 2024 年 12 月 npm 上 @solana/web3.js 程序包被攻陷的事件(该 JavaScript 库被 Solana 开发者广泛使用)。这两起事件与本次事件一样,都说明对维护者账户或程序包身份的信任可能成为攻击面。
使用 Rust 项目的开发者可以通过监控依赖版本、审查异常变更,以及使用能够识别可疑程序包或依赖行为的安全工具,来降低遭遇类似事件的风险。针对本次事件,具体做法包括:在 Cargo.lock 等锁定文件中搜索三个受影响版本、检查 CI 和构建日志中是否存在异常的对外网络活动,并在编译过受影响版本的机器上轮换凭据。依赖自动化 CI 环境的组织还需要考虑其构建基础设施的安全性,因为恶意依赖有可能在应用部署之前执行代码。
Rust 生态系统的应对表明了协同安全监控与快速移除被攻陷程序包的重要性。虽然受影响的 crate 与涉及 Solana 相关组件的依赖链存在关联,但现有信息并不能证实 Solana 本身或特定下游项目已被攻陷。这一事件反而提醒人们:当发布凭据或维护者环境被攻陷时,被广泛使用的开源依赖可能成为潜在攻击向量。
来源:Hokanews