跳转至

GlassWASM: WebAssembly Malware Found in Trojanized Open VSX Extensions

Ch12.067 GlassWASM: WebAssembly Malware Found in Trojanized Open VSX Extensions

📊 Level ⭐⭐ | 6.8KB | entities/glasswasm-webassembly-malware-open-vsx.md

GlassWASM: WebAssembly Malware Found in Trojanized Open VSX Extensions

来源: socket.dev 发布日期: 2026-06-15 发现者: Socket Threat Research Team

摘要

Socket 威胁研究团队在 Open VSX 扩展市场中发现编译后的 WebAssembly 恶意软件,嵌入在木马化的 VS Code 扩展中。攻击者利用跨注册表信任差距(cross-registry trust gap),将合法扩展克隆后在 Open VSX 上以相同名称重新发布,附加 ChaCha20 加密的 WASM 载荷。恶意 WASM 模块使用 Solana 区块链作为抗审查的 C2 dead-drop,通过 SPL Memo 字段接收攻击者指令并执行 OS 特定的 download-and-execute 命令。该攻击族被命名为 GlassWASM,与此前的 GlassWorm 攻击存在关联。

核心要点

1. 受影响的扩展

扩展 版本 伪装身份 上传时间
exargd/vsblack 0.0.1 黑色主题变体 (原版 2019 年发布) 2026-06-09
noellee-doc/flint-debug 0.1.1 Ethereum/Flint 智能合约调试器 (原版 2020 年发布) 2026-06-10

两个扩展均通过单一 Open VSX 账户 zaitoona43(GitHub UID 291961103)上传,该 GitHub 账户在发布时仅 3 天历史。

2. 攻击链

合法扩展克隆 → 附加 ChaCha20 加密 WASM → onStartupFinished 激活钩子
    → go.run() 自动执行 → 解密字符串 → 连接 Solana RPC
    → 读取 SPL Memo 字段中的攻击者指令 → child_process 执行下载的载荷

3. WASM 载荷技术分析

属性 详情
SHA-256 558b4f1d9a263c13756ab0126c09dd080c85ba405b29488e1c4e6aa68b554f1f
大小 824,552 bytes
格式 WebAssembly MVP (v1)
工具链 TinyGo → js/wasm target
函数数 478
数据段 45 (uses bulk-memory DataCount)
混淆 ChaCha20 字符串加密; debug/name section 已剥离
宿主要求 JavaScript runtime (Node.js / browser) via syscall/js bridge

关键行为特征: WASM 模块无法自行执行任何 I/O——没有网络或文件系统 syscall。所有操作通过 valueCall / valueInvoke / valueNew 委托给 JavaScript 宿主。.wasm 是混淆后的逻辑核心,loader script(TinyGo wasm_exec.js glue + invocation shim)是必需的另一半。

4. 混淆策略

  • 无明文网络指标: 所有关键字符串使用 ChaCha20 加密,仅在运行时解密到内存
  • WASI import 最小化: 仅 proc_exitfd_writerandom_get
  • GoJS bridge: 通过 gojs.syscall/js.* imports 委托所有 I/O 给 JS 宿主
  • TinyGo asyncify: 使用 asyncify-based goroutine scheduler 导出
  • 签名检测困难: 无明文 URL、域名或 C2 地址

5. 身份冒充而非 Typosquatting

这不是 typosquatting——publisher 和 extension 名称与原版完全相同。VS Code Marketplace 将 publisher ID 绑定到 verified owner,攻击者无法在那里重用 noellee-docExarGD。但 Open VSX 作为 VSCodium、Gitpod、Cursor、Windsurf 等 VS Code forks 的默认注册表,没有相同的 publisher verification 机制。

开发者看到的是名称、版本、描述和 repo link 全部匹配 Marketplace listing 的扩展——cross-registry trust gap 被利用。

6. Solana 区块链 C2

使用 Solana mainnet JSON-RPC API 作为 C2 dead-drop: - 无硬编码服务器: 没有可被 seizure 或 sinkhole 的 C2 域名 - 抗审查: 运营者只需发布新 transaction 即可轮换 second-stage infrastructure - SPL Memo 字段: 存储攻击者指令 - 针对性: Flint 调试器的 blockchain/"transaction hash" 框架与 payload 的 crypto-developer focus 一致

深度分析

跨注册表信任差距:供应链攻击的新前沿

GlassWASM 攻击揭示了一个系统性问题:Open VSX 与 VS Code Marketplace 之间的信任不对称

VS Code Marketplace 有 publisher verification,但 Open VSX 作为众多 IDE forks 的默认注册表缺乏同等保护。攻击者利用的是: 1. 合法扩展长期不更新(2019/2020 年发布) 2. 原作者不太可能监控 Open VSX 3. 用户信任名称/版本匹配的扩展

这与 LLM 安全红队测试 中的常见模式一致:攻击者找到信任链中最薄弱的环节。

WebAssembly 作为恶意软件载体

GlassWASM 标志着恶意软件向 WASM 作为混淆层 的转型: - TinyGo → js/wasm: 编译为 WebAssembly,由 JS 宿主执行 - 无自主 I/O: 所有网络/进程操作通过 JS bridge,使纯 WASM 静态分析几乎无法发现网络指标 - ChaCha20 字符串加密: 运行时解密,绕过签名检测 - 工具链指纹: TinyGo gojs bridge + asyncify scheduler 是独特的,可用于检测

这对安全工具提出了新挑战:传统的字符串扫描和网络指标提取对 WASM 载荷无效。

从 GlassWorm 到 GlassWASM 的演进

Socket 以中等信心将此攻击归因于 GlassWorm 开发者,但指出 WASM/TinyGo 作为 stager 的使用代表了向二进制加载的混淆新转向。这种演进模式——从已知技术到更深层混淆——是恶意软件开发的典型路径。

实践启示

  1. 扩展来源验证: 仅从官方 VS Code Marketplace 安装扩展,避免使用 Open VSX 等替代注册表(除非有额外验证)
  2. 扩展活跃度检查: 对长期未更新的扩展(如 2019/2020 年)保持警惕,特别是重新出现在不同注册表时
  3. WASM 安全审计: 对包含 .wasm 文件的扩展进行额外审查——检查 import table 是否包含 gojs.syscall/js.* 等异常 bridge
  4. 注册表安全: Open VSX 等注册表需要加强 publisher verification 和新账户限制
  5. C2 检测: 区块链 C2 的检测需要新的方法论——传统的域名/IP 封禁无效

相关实体

原文存档