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_exit、fd_write、random_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-doc 或 ExarGD。但 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 的使用代表了向二进制加载的混淆新转向。这种演进模式——从已知技术到更深层混淆——是恶意软件开发的典型路径。
实践启示¶
- 扩展来源验证: 仅从官方 VS Code Marketplace 安装扩展,避免使用 Open VSX 等替代注册表(除非有额外验证)
- 扩展活跃度检查: 对长期未更新的扩展(如 2019/2020 年)保持警惕,特别是重新出现在不同注册表时
- WASM 安全审计: 对包含
.wasm文件的扩展进行额外审查——检查 import table 是否包含gojs.syscall/js.*等异常 bridge - 注册表安全: Open VSX 等注册表需要加强 publisher verification 和新账户限制
- C2 检测: 区块链 C2 的检测需要新的方法论——传统的域名/IP 封禁无效
相关实体¶
- DeepMind AI Agent 安全 — Agent 生态安全框架
- CVE 实践 — 安全漏洞发现与披露
- LLM 安全红队测试 — 软件供应链安全概念
- Agent 安全威胁模型 — Agent 安全概念框架
→ 原文存档