恶意 Rust Crate Arrayref 运行构建时有效载荷
摘要 2026 年 8 月 20 日,流行的 Rust crate arrayref 的一个被攻击的版本出现在 crates.io 上。版本 0.3.10 添加了对一个叫做 proc-macro1 的拼写欺诈 crate 的依赖,它的构建脚本在项目编译时会下载并运行一个远程二进制文件。代码在构建时运行,因此简单编译一个拉取了这些坏版本的项目就足以触发它。 crates.io 团队随后已移除恶意版本。 相关包 正版的 arrayref 和 append-only-vec crates 由 droundy 维护,其账户似乎已被攻击。相应的 GitHub 仓库不再可用。 github.com/droundy/arrayref 、 github.com/droundy/append-only-vec 以及整个 github.com/droundy 账户都返回 404,所以上游代码不再可供检查。一个单独的账户 dtolney 发布了 proc-macro1 。该用户名与 David Tolnay 的真实 dtolnay 账户非常相似。它的元数据伪造了 authors = ["David Tolnay < [email protected] >"],并指向一个在 dtolnay/proc-macro1 路径下返回 404 的仓库。 Crate 版本 发布者 状态 arrayref 0.3.10 droundy(被攻破) 恶意,已移除 proc-macro1 所有版本 dtolney(冒充) 恶意拼写欺诈,整个 crate 已移除 append-only-vec 0.1.9 droundy(被攻破) 被报道者标记,相同的行为者 arrayref 0.3.9 及更早版本 droundy 干净 请注意,proc-macro1 与 proc-macro2 不同。宏作者依赖的真正 crate 是 proc-macro2 。恶意 proc-macro1 的 src/ 是 proc-macro2 的真实副本,因此构建仍然能够正常工作,而构建脚本在运行。 构建脚本的作用 有效负载隐藏在 proc-macro1 1.0.107 的构建脚本中。它将其服务器地址存储为 base64 片段,并在构建时将其重新组装,引用于公告中: // proc-macro1-1.0.107/build.rs(引用于 rustsec/advisory-db#3161) const SRC_URL_PARTS : & [ & str ] = & [ "aHR0cHM6Ly8=" , "MjMuMjU0Lg==" , "MTY1Lg==" , "MTEyOg==" , "OTA4OS8=" ]; const END_URL_PARTS : & [ & str ] = & [ "MjMuMjU0Lg==" , "MTY1Lg==" , "MTEyOg==" , "NDQz" ]; 解码后,这些片段生成的有效负载主机是 hxxps://23[.]254[.]165[.]112:9089/ 和命令与控制地址 23[.]254[.]165[.]112:443。该脚本通过 TLS 连接获取特定于体系结构的二进制文件,该连接接受任何未验证的证书,然后在与构建脱离的状态下运行它。在 Unix 上,它会放置并运行 /tmp/rust-setup。在 Windows 上,它在 %TEMP% 下写入一个 PowerShell 脚本和一个 VBScript 启动器,并以隐藏的方式启动它们,然后放弃子进程,以便编译器不等待它。 如何传播 拥有者账户撤回了旧版 arrayref 的 0.3.5 到 0.3.9 版本。撤回一个 crate 会让 Cargo 打印“考虑更新到未撤回的版本”警告,这会促使开发者向唯一未撤回的版本,即恶意的 0.3.10 靠拢。提交 RustSec 公告的举报者指出,这就是他们如何遭遇它的。 arrayref 被广泛用作传递依赖。它在常见的 Rust 图中通过 tiny-skia、sctk-adwaita 和 winit 深度嵌入,位于大多数以 egui、eframe 和 iced 构建的 GUI 工作中。该 crate 的下载量约为 2.45 亿次(截至撰写时为 244,989,384 次),而干净的 0.3.9 版本约占 1.52 亿次。这些数字衡量了 crate 的广泛使用程度,而不是受到影响的构建数量。 妨害指示 类型 指示 详细信息 网络 23.254.165.112:9089 有效负载主机(HTTPS) 网络 23.254.165.112:443 C2,作为 argv[1] 传递给有效负载 文件(Unix) /tmp/rust-setup 下载的可执行文件 文件(Windows) %TEMP%\rust-setup.ps1 下载的 PowerShell 脚本 文件(Windows) %TEMP%\rust-setup-launch.vbs VBScript 启动器 第二阶段名称 rust-crate_0.1.0、_0.2.0、_0.3.0、_0.4.0 由操作系统和架构选择 已移除 crate 工件的 SHA256: 工件 SHA256 arrayref 0.3.10 25ad700976873c76af785cb99b33c48db7df8b81f21d1e9e06b3676b9a9373ae proc-macro1 1.0.107 61198155da51b838772eecf5bfaac6cbc4dcc388dccc56658fc28a8e831b34d4 proc-macro1 1.0.106 b5c1b5b0763a8809a644a8f92224653f0aca623a98eecc714d27f74b80fbe436 第二部分:技术分析 我们的技术分析覆盖了此次事件背后的两个 crate,arrayref 0.3.10 和 proc-macro1 1.0.107。 arrayref 0.3.10 引入了一个名为 proc-macro1 的依赖。恶意代码位于 proc-macro1 的构建脚本中,而不在 arrayref 本身中。 arrayref 的注入点是一个小的四个宏的 crate。在 0.3.9 之前它没有构建脚本和运行时依赖。版本 0.3.10 保留了那个宏源并在清单中添加了一行:[ package ] name = "arrayref" version = "0.3.10" build = false [ dependencies . proc-macro1 ] version = "1.0.107" 这个 [dependencies.proc-macro1] 条目足以引入恶意 crate。对 1.0.107 的需求是一个插值范围,而仅发布过 1.0.106 和 1.0.107,所以它解析到恶意的 1.0.107。该 crate 自身的 src/lib.rs 是普通的 m
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡