Tấn công độc hại vào Extension, lỗ hổng hệ sinh thái Node và Infrastructure thiếu an toàn đã tạo điều kiện GitHub Repository bị xâm nhập
Một sự cố bảo mật lớn trên GitHub cho thấy các cuộc tấn công thông qua extension độc hại, lỗ hổng trong hệ sinh thái Node.js và máy trạm của lập trình viên không được bảo mật có thể vượt qua các cơ chế phòng vệ truyền thống.
Giai đoạn 1: Khai thác Root (Node/NPM và chuỗi cung ứng TanStack)
Chuỗi tấn công không bắt đầu từ GitHub mà xuất phát từ hệ sinh thái công cụ phát triển JavaScript, cụ thể là Node.js và NPM. Nhóm tấn công TeamPCP đã thực hiện một cuộc tấn công chuỗi cung ứng (supply chain attack) có chủ đích, nhắm vào các thư viện mã nguồn mở ở tầng thượng nguồn, đặc biệt là các nhà phát triển đóng góp cho các gói TanStack trên NPM — một bộ thư viện phổ biến được sử dụng cho quản lý trạng thái và định tuyến trong các ứng dụng JavaScript.
Bằng cách chèn mã độc vào các dependency có độ trust cao này, kẻ tấn công đã thực hiện việc thu thập thông tin đăng nhập (credential harvesting) trên máy của nạn nhân có chủ đích. Mục tiêu chính không phải là application code đang được sử dụng trong production, mà là môi trường development của chính các nhân sự bảo trì dự án.
Cuộc tấn công đã đánh cắp thành công các GitHub CLI (gh) authentication token có thời hạn dài từ một developer nòng cốt trong team, người duy trì cả hệ sinh thái TanStack và Nx Console. Vì các access token dành cho developer này thiếu các giới hạn chi tiết, chúng cung cấp cho kẻ tấn công quyền ghi ở cấp quản trị vào các quy trình phát hành (release pipelines) của nhiều kho lưu trữ liên quan.
Giai đoạn 2: Tấn công VS Code Extension Poisoning (Phân loại Nx Console (CVE-2026–48027))
Với các token gh bị đánh cắp, TeamPCP đã vượt qua hệ thống bảo mật vòng ngoài khi chuyển hướng sang Visual Studio Marketplace. Vào ngày 18 tháng 5, phiên bản độc hại 18.95.0 của Nx Console (một orchestration extension Monorepo được sử dụng rộng rãi với hơn 2,2 triệu lượt cài đặt) đã được phát hành thành công.
Việc triển khai đã bộc lộ hai lỗ hổng nghiêm trọng trong quy trình làm việc của developer hiện nay.
1. Quy trình phát hành Single-Factor
Phiên bản chứa mã độc đã được tải trực tiếp lên cả Visual Studio Marketplace và kho open-source OpenVSX registry. Do pipeline phát hành không yêu cầu xác nhận thủ công từ hai quản trị viên, hệ thống chấp nhận token và phát hành extension mà không có bước kiểm tra thứ hai.
2. "Kẻ sát nhân thầm lặng": Marketplace Metrics vs. Background Sync
Ban đầu, các log công khai trên marketplace của Microsoft chỉ ghi nhận con số không đáng kể là 28 lượt tải xuống thủ công trước khi package này bị phát hiện và gỡ bỏ chỉ 18 phút sau đó. Tuy nhiên, dữ liệu đo lường nội bộ của Nx lại cho thấy có tới khoảng 6.000 lượt kích hoạt extension diễn ra cùng lúc.
Sự chênh lệch lớn này cho thấy rõ mối nguy hiểm từ cơ chế tự đồng bộ và cập nhật extension trong nền của VS Code. Hàng nghìn máy phát triển đã tự động tải, giải nén và thực thi extension độc hại ngay cả khi người dùng không chủ động cài đặt hay mở Marketplace.
JSON
/ Example of the target parameters within compromised developer workspaces
{
"extensions.autoUpdate": true,
// The default vulnerability exploited by TeamPCP
"terminal.integrated.profiles.osx":
{
"malicious-hook":
{
"path": "/bin/bash",
"args": ["-c", "python3 ~/.local/share/kitty/cat.py &"]
}
}
}
Node Execution Layer
Ngay khi tiện ích mở rộng được kích hoạt, mã độc đã triển khai một đoạn mã hook Node.js chạy sau khi cài đặt (post-install hook) đã được làm rối (obfuscated). Hoạt động hoàn toàn trong không gian người dùng (user space) để né tránh các cơ chế giám sát hành vi cơ bản của hệ thống EDR (Endpoint Detection and Response), mã độc này thiết lập một biến môi trường (`__DAEMONIZED=1`) và khởi chạy một tiến trình Python chạy ngầm (`cat.py`).
Mã độc thực hiện quét có hệ thống các local path để tìm kiếm:
Cấu hình cơ sở hạ tầng: Các token HashiCorp Vault dạng văn bản thuần (`~/.vault-token`), tệp kubeconfig cục bộ của Kubernetes, và các mã băm (hash) điểm cuối siêu dữ liệu IAM của AWS/Azure.
Thông tin định danh trong hệ sinh thái: Các token registry .npmrc dạng văn bản thuần và các token GitHub đang hoạt động (có tiền tố `ghp_`, `gho_`, `ghs_`).
Dữ liệu trong bộ nhớ đang hoạt động: Nội dung các kho dữ liệu 1Password thông qua công cụ dòng lệnh `op` bằng cách chiếm quyền kiểm soát các phiên terminal đang mở và đã được mở khóa.
Giai đoạn 3: Xâm nhập GitHub nội bộ
Mục tiêu cuối cùng của cuộc tấn công đạt được khi một kỹ sư GitHub sử dụng Nx Console trên máy làm việc và vô tình nhận bản cập nhật độc hại.
Mã độc chạy trên máy tính của kỹ sư, thu thập các token phiên đăng nhập GitHub Enterprise và đánh cắp chúng rồi chuyển về máy chủ điều khiển (C2) từ xa. Sau đó, TeamPCP đã sử dụng các thông tin xác thực có đặc quyền cao này để vượt qua hoàn toàn các lớp bảo vệ corporate identity của GitHub.
Sau khi chiếm được một endpoint đã được xác thực, kẻ tấn công lợi dụng quyền truy cập để sao chép và đánh cắp khoảng 3.800 repository mã nguồn nội bộ trước khi thiết bị bị phát hiện và cô lập.
Giai đoạn 4: “Chiến thuật che mờ” – Sự bất ổn của hạ tầng GitHub
Tốc độ và mức độ che giấu của cuộc tấn công được khuếch đại bởi giai đoạn hạ tầng GitHub liên tục gặp sự cố. Trong khoảng thời gian 12 tháng xoay quanh vụ xâm nhập, GitHub đã ghi nhận sự gia tăng đột biến về tình trạng chất lượng dịch vụ bị suy giảm.
Tổng số sự cố được ghi nhận: 257 sự cố kỹ thuật riêng biệt.
Các sự cố gián đoạn nghiêm trọng: 48 lần ngừng dịch vụ quy mô lớn, với tổng thời gian gián đoạn là 112 giờ 18 phút.
Nguyên nhân gây lỗi chính: GitHub Actions gặp phải 57 sự cố gián đoạn, cao gấp 3 lần so với tần suất xảy ra sự cố đối với Git storage.
Thời điểm | Sự cố | Tác động bảo mật |
29/10 | Azure Compute gặp lỗi | Codespaces & Actions có tỷ lệ lỗi 90%, tạo khoảng trống telemetry và làm mất khả năng theo dõi việc sao chép API token. |
02/02 | Lỗi cấu hình cache | Git HTTPS Proxy phát sinh lượng lớn lỗi mạng, che giấu các lệnh Git Clone bất thường. |
12/02 | Thay đổi cơ chế xác thực mạng | 90% Codespaces không thể khởi tạo, cảnh báo bảo mật bị phân loại sai mức độ và chậm phát hiện trong nhiều giờ. |
Lỗ hổng “Alert Fatigue” (Mệt mỏi vì quá nhiều cảnh báo)
Sự rối loạn do hạ tầng liên tục gặp sự cố đã vô tình tạo ra môi trường lý tưởng cho kẻ tấn công. Các nhóm SecOps và DevSecOps gặp phải trạng thái mệt mỏi do cảnh báo liên tục, phải đối phó với các pipeline GitHub Actions bị lỗi, Elasticsearch cluster hiệu năng thấp và lỗi timeout cơ sở dữ liệu.
Khi TeamPCP sử dụng token của kỹ sư bị xâm nhập để thực hiện hàng loạt API query và sao chép số lượng lớn repository, lưu lượng bất thường này đã hòa lẫn vào “nhiễu” của hạ tầng, khiến hoạt động đánh cắp dữ liệu khó bị phát hiện kịp thời.
Bài học quan trọng: Cách bảo vệ môi trường develop
Nếu môi trường làm việc của bạn đang sử dụng các công cụ tự động trong khoảng thời gian này, bạn cần chuyển đổi máy trạm phát triển của mình từ mô hình “mặc định tin cậy" (implied trust) sang môi trường Zero-trust.
1. Tắt hoàn toàn tính năng IDE Auto-Updates
Tuyệt đối không cho phép IDE tự động tải về code chưa qua kiểm duyệt khi đang chạy trong nền. Hãy cấu hình editor để yêu cầu xác nhận thủ công trước khi cập nhật bất kỳ extension nào từ bên thứ ba.
Trong tệp settings.json của VS Code, thiết lập:
"extensions.autoUpdate": false,
"extensions.autoCheckUpdates": false
2. Cô lập môi trường Development Runtimes
Không nên chạy trực tiếp trình biên dịch, trình quản lý gói (package manager) hoặc các IDE extension trên hệ điều hành chính.
Thay vào đó, hãy sử dụng các môi trường phát triển được cô lập và có tính tạm thời (ví dụ: Dev container hoặc các môi trường ảo được giới hạn phạm vi chặt chẽ), ở đó tách biệt hoàn toàn quyền truy cập hệ thống tệp khỏi các thư mục cấu hình quan trọng như `~/.ssh/`, `~/.aws/` hoặc `.npmrc`.
3. Áp dụng cơ chế thay đổi token thường xuyên và nghiêm ngặt
Loại bỏ hoàn toàn các Personal Access Token tồn tại lâu dài (ghp_). Chuyển sang sử dụng các Fine-grained PAT có phạm vi quyền hạn chi tiết (fine-grained), được cấu hình với các giới hạn nghiêm ngặt (chỉ áp dụng cho một repository duy nhất) và thời hạn tối đa là 7 ngày.
Ngoài ra, cấu hình trình quản lý mật khẩu và công cụ xác thực để yêu cầu Touch ID/Face ID hoặc timeout ngắn cho mỗi lần xác thực khi thực hiện lệnh trong terminal (ví dụ: `op signin timeout`).






















