# GhostAction: Khi GitHub trở thành vũ khí tấn công chuỗi cung ứng phần mềm

---

## Tóm tắt tổng quan

Từ 31/08 đến 21/10/2026, chiến dịch GhostAction đã dùng gần 2.000 tài khoản GitHub bị chiếm để cài workflow độc vào hàng chục nghìn repo (riêng đợt 8–12/10 là hơn 30.000 repo, theo GitGuardian). Kẻ tấn công không khai thác lỗ hổng của GitHub. Chúng dùng token hợp lệ để cài workflow độc nhằm trích xuất secret CI/CD, khóa đám mây và lịch sử git. GitHub bắt đầu chặn workflow độc từ 09/10/2026; từ 14/10, nhóm tấn công cài thêm font giả kèm tác vụ VS Code để chạy mã trên máy lập trình viên, nơi cơ chế chặn này không với tới.

Rủi ro lớn nhất là lộ toàn diện bí mật truy cập AWS, Kubernetes, registry npm, PyPI và token API của các công cụ AI. Kẻ tấn công có thể chiếm đoạt hạ tầng đám mây hoặc thực hiện tấn công chuỗi cung ứng vào sản phẩm phần mềm. Hành động khẩn cấp quan trọng nhất là lập tức thu hồi token GitHub từ thiết bị sạch và xoay vòng toàn diện mọi secret, thay vì chỉ xóa workflow độc hại.

## Bản chất chiến dịch GhostAction

GhostAction hoàn toàn không khai thác bất kỳ lỗ hổng nào của nền tảng GitHub. Kẻ tấn công sử dụng các token cá nhân và tài khoản hợp lệ của nạn nhân bị lộ từ trước. Nguồn gốc token nhiều khả năng (theo StepSecurity) bắt nguồn từ log infostealer hoặc credential dump chưa được xử lý. Kẻ tấn công commit workflow độc hại vào mọi repo mà tài khoản nạn nhân có quyền ghi. Toàn bộ commit mang danh tính thật của nạn nhân, khiến hệ thống kiểm toán thông thường rất khó phát hiện.

Nhiều đội ngũ chỉ xóa tệp tin workflow độc hại khi phát hiện sự cố. Hành động này không giải quyết được gốc rễ vấn đề. Token chưa bị thu hồi cho phép kẻ tấn công tiếp tục đẩy lại workflow độc hại mới. Theo GitGuardian, 1.382 trên 1.792 tài khoản bị lạm dụng đợt 13–21/10 từng bị dùng trong đợt 08/10.

GhostAction chưa từng thật sự dừng lại kể từ tháng 09/2025. Kẻ tấn công liên tục thay đổi hạ tầng máy chủ tiếp nhận qua từng giai đoạn:

| Giai đoạn thời gian | Địa chỉ máy chủ C2 tiếp nhận | Hình thức triển khai | Quy mô ghi nhận |
| --- | --- | --- | --- |
| 09/2025 | bold-dhawan.45-139-104-115.plesk\[.\]page, carte-avantage\[.\]com | Workflow trích xuất secret | 817 repo, 327 tài khoản, lấy ≥3.325 secret |
| 10–12/2025 & 03/2026 | 170.39.218\[.\]2 | Workflow trích xuất secret | Khoảng 75 kho lưu trữ |
| 11/2025 & 03–04/2026 | \*.oast\[.\]fun (Interactsh) | Workflow trích xuất secret | Khoảng 250 kho lưu trữ |
| 31/08–30/09/2026 | 193.32.204\[.\]199 (cổng 80; bản 07/09 dùng cổng 3000) | `github_actions_security.yml` | 772 repo, 373 tài khoản, nhắm 2.577 secret |
| 08–12/10/2026 | 193.32.204\[.\]199 | `security-audit.yml` | \>30.000 repo, ~1.900 tài khoản bị chiếm |
| 13–21/10/2026 | 193.32.204\[.\]199 (cổng 8080) | 5 họ payload (xem mục 5) | 22.964 repo, 1.792 tài khoản đẩy commit |

## Dòng thời gian và sơ đồ chuỗi tấn công

Chuỗi sự kiện của chiến dịch GhostAction diễn biến liên tục với nhiều lần thay đổi kỹ thuật:

| Mốc thời gian | Sự kiện kỹ thuật chi tiết |
| --- | --- |
| 09/2025 | Công bố GhostAction: 817 repo công khai của 327 người dùng bị cài workflow độc, lộ ít nhất 3.325 secret. |
| 10/2025 – 04/2026 | Cùng mẫu workflow tiếp tục xuất hiện với endpoint 170.39.218\[.\]2 (~75 repo) và \*.oast\[.\]fun (~250 repo). |
| 31/08 – 30/09/2026 | Workflow `github_actions_security.yml` đẩy vào 772 repo của 373 user/tổ chức. GitHub giữ phần lớn lượt chạy chờ duyệt: trong 3.669 lượt chạy GitGuardian thu thập trên 605 repo, chỉ 499 lượt được thực thi ở 32 repo; 336 lượt thành công, lấy 26 secret từ 13 repo. Đến 05/10/2026, chỉ 124 repo (16%) được dọn sạch. |
| 08/10/2026 | Tài khoản kitao đẩy workflow vào 27 repo từ 13:20 UTC. Sau đó tài khoản henrywoo đẩy vào 318 repo trong 16 phút. Workflow `security-audit.yml` quét toàn bộ lịch sử git. Socket xác nhận exfiltration thành công. |
| 09/10/2026 | GitHub bắt đầu chặn workflow độc và yêu cầu duyệt thủ công. Domain my-github\[.\]com được đăng ký lúc 09:50 UTC, trỏ về IP exfil của GhostAction; cùng ngày có email phishing (theo The Hacker News dẫn OpenSourceMalware). |
| 10 & 12/10/2026 | Kẻ tấn công tiếp tục đẩy workflow nhưngghi nhận không lấy được secret nào nhờ cơ chế chặn của GitHub. |
| 13 – 21/10/2026 | Đợt leo thang lớn: 72.026 commit vào 22.964 repo của 2.875 chủ sở hữu từ 1.792 tài khoản. Đỉnh điểm ngày 15/10 đạt 32.099 commit. Xuất hiện font giả và tác vụ VS Code. Commit cuối lúc 04:37 UTC ngày 21/10. |
| 22 – 26/10/2026 | Ghi nhận 188 commit GhostAction bị sửa đổi kèm loader PolinRider rồi force-push vào kho mã nguồn. |

Sơ đồ dưới đây mô tả luồng tấn công từ lúc rò rỉ token đến khi bị GitHub ngăn chặn và chuyển hướng sang máy trạm:

![](https://cdn.hashnode.com/uploads/covers/669e2c7992d73f3fd8335153/b4de1600-924f-4006-8121-79723e49b361.png align="center")

*Hình 1: Chuỗi tấn công GhostAction từ rò rỉ token tới đánh cắp secret trên CI/CD và máy trạm lập trình viên.*

Cường độ commit của nhóm tấn công biến động dữ dội trong đợt leo thang tháng 10/2026:

[![Biểu đồ commit và repo mục tiêu theo ngày](https://storage.ghost.io/c/42/5d/425d266f-cf99-406e-9436-597a19bed011/content/images/2026/10/data-src-image-b17e446e-b2b5-4ce7-8424-5d12fc9c85c5.png align="center")](https://storage.ghost.io/c/42/5d/425d266f-cf99-406e-9436-597a19bed011/content/images/2026/10/data-src-image-b17e446e-b2b5-4ce7-8424-5d12fc9c85c5.png)

*Hình 2: Biểu đồ số lượng commit và repository mục tiêu theo ngày từ 13/10 đến 21/10/2026, ghi nhận đỉnh điểm vào ngày 15/10.*

## Đợt bùng phát ngày 8/10: duy trì commit dưới danh tính nạn nhân

Ngày 08/10/2026 chứng kiến đợt bùng phát mạnh khi kẻ tấn công chiếm quyền hai tài khoản nhà phát triển uy tín. Lúc 13:20 UTC, tài khoản kitao (tác giả game engine pyxel với khoảng 18.400 sao) đẩy workflow độc vào 27 repo. Khoảng 8 giờ sau, tài khoản henrywoo (tác giả gốc uber/athenadriver) đẩy mã độc vào 318 repo chỉ trong 16 phút (21:10–21:26 UTC). Danh sách này gồm 39 repo gốc, 279 fork và chính uber/athenadriver. Tổng cộng 346 repo bị ảnh hưởng theo StepSecurity, Socket và OpenSourceMalware.

Workflow mới `security-audit.yml` (tên hiển thị "Security Audit", commit message "Add security audit workflow") quét cả cây mã và toàn bộ lịch sử git. Về số lượng mẫu nhận diện credential, StepSecurity ghi nhận 13 mẫu regex, còn GitGuardian xác định bản v1 dùng 11 regex. Cơ chế này trích xuất được cả những secret từng bị xóa trong lịch sử commit.

Socket và StepSecurity xác nhận quá trình exfiltration thành công trong đợt 08/10, điển hình là dữ liệu từ uber/athenadriver. Commit thực hiện bằng API với token hợp lệ và không dùng chữ ký số. Hệ thống audit log chỉ ghi nhận đây là hoạt động bình thường của chính nạn nhân. Theo Socket (qua The Hacker News), hơn 500 tài khoản GitHub đã bị dùng để commit workflow độc vào hàng chục nghìn repo kể từ 07/10. GitGuardian cập nhật ngày 13/10 cho biết đợt 8–12/10 nhắm vào hơn 30.000 repo của khoảng 3.000 người dùng và tổ chức, từ gần 1.900 tài khoản bị chiếm, cố lấy 3.174 secret.

## GitHub can thiệp và năm họ payload đợt 13–21/10

Từ ngày 09/10/2026, GitHub chính thức kích hoạt cơ chế tự động ngăn chặn workflow độc hại. Khi phát hiện workflow bất thường, hệ thống giữ trạng thái chờ duyệt và yêu cầu người có quyền ghi phê duyệt thủ công. Các đợt tấn công ngày 10/10 và 12/10 hoàn toàn không thu được secret nào:

[![Ảnh chụp màn hình GitHub chặn workflow security-audit.yml](https://storage.ghost.io/c/42/5d/425d266f-cf99-406e-9436-597a19bed011/content/images/2026/10/Payloads_oct_Ghostaction.png align="center")](https://storage.ghost.io/c/42/5d/425d266f-cf99-406e-9436-597a19bed011/content/images/2026/10/Payloads_oct_Ghostaction.png)

*Hình 3: Giao diện GitHub Actions cảnh báo và giữ workflow độc hại security-audit.yml ở trạng thái chờ duyệt.*

Từ 13/10, nhóm tấn công tung ra 5 họ payload khác nhau (thống kê của GitGuardian). OpenSourceMalware lưu ý không thể khẳng định việc GitHub chặn là nguyên nhân của thay đổi này:

| Họ payload | Tệp tin nhận diện | Môi trường mục tiêu | Số commit | Số repo |
| --- | --- | --- | --- | --- |
| Security-audit re-point | `security-audit.yml` (đổi endpoint sang cổng 8080) | Runner GitHub | 6.988 | 6.902 |
| Seven workflows | `audit.yml`, `build-check.yml`, `repo-health.yml`, `lint.yml`, `ci-check.yml`, `test-suite.yml`, `code-review.yml` | Runner GitHub | 33.411 | 19.153 |
| Font stealer | `public/fonts/fa-solid-400.woff2` kèm `.vscode/tasks.json` | Máy lập trình viên | 30.804 | 17.667 |
| Self-hosted | `maintenance.yml`, `cache-cleanup.yml`, `runner-maintenance.yml`, `cleanup-job.yml`, `cleanup_cache.yml` | Self-hosted runner | 257 | 172 |
| Legacy OIDC | `github_actions_security.yml` | Runner GitHub + AWS | 568 | 418 |

Trong họ Seven workflows, kẻ tấn công bổ sung thêm mẫu tìm kiếm khóa API dịch vụ AI. Khi gửi về C2 thất bại, script tạo một GitHub Gist riêng tư tên "build cache" chứa tệp `c.dat` để làm kênh dự phòng. Cơ chế phòng vệ của GitHub tiếp tục chặn đứng các workflow này:

[![Ảnh chụp màn hình GitHub chặn workflow build-check.yml](https://storage.ghost.io/c/42/5d/425d266f-cf99-406e-9436-597a19bed011/content/images/2026/10/Screenshot-from-2026-10-27-17-38-45.png align="center")](https://storage.ghost.io/c/42/5d/425d266f-cf99-406e-9436-597a19bed011/content/images/2026/10/Screenshot-from-2026-10-27-17-38-45.png)

*Hình 4: Cơ chế phòng vệ của GitHub chặn thực thi đối với workflow build-check.yml thuộc họ Seven workflows.*

GitGuardian kết luận trong đợt 13–21/10 không ghi nhận lượt chạy CI thành công nào của các payload này. Trong dữ liệu của GitGuardian, cơ chế giữ workflow của GitHub đã chặn được nhánh tấn công qua CI của đợt này.

## Mở rộng ra ngoài CI: font stealer, cron bám trụ và OIDC

Song song với các workflow, kẻ tấn công nhắm vào máy trạm lập trình viên bằng font stealer (bắt đầu 14/10). Tệp `public/fonts/fa-solid-400.woff2` thực chất là mã nguồn Node.js. Đi kèm là `.vscode/tasks.json` khai báo tác vụ ẩn tự chạy khi mở thư mục (`folderOpen`), sau khi người dùng chọn tin cậy (trust) workspace.

Khi lập trình viên mở dự án bằng VS Code, mã độc chạy trên máy trạm và đọc trộm hàng loạt secret: `~/.aws/credentials`, `.pypirc`, `.npmrc`, `.git-credentials`, `.netrc`, khóa AI `~/.claude/.credentials.json`, `~/.gemini/oauth_creds.json`, `.kube/config`, SSH key và biến môi trường. Dữ liệu được gửi về 193.32.204\[.\]199:8080. Cơ chế chặn workflow của GitHub không áp dụng cho máy trạm cá nhân.

Về số lượng repo chứa font stealer, nguồn tin có sự lệch số liệu: OpenSourceMalware (qua The Hacker News ngày 26/10) đếm được 1.230 repo của 391 tài khoản có đủ cặp file (và 1.279 repo của 411 tài khoản có một phần); còn GitGuardian đếm 17.667 repo mang cặp file font và tasks.json. Hai số liệu phản ánh phạm vi khảo sát khác nhau giữa các đơn vị.

Để duy trì quyền kiểm soát, 3 họ payload (font stealer, self-hosted, biến thể full1) cài crontab chạy mỗi 5 phút tải script từ C2 theo hostname, mang thẻ `#ghc2`. Dọn dẹp repo không thể gỡ bỏ cron này.

Trên self-hosted runner, mã độc truy vấn IMDS lấy role đám mây, đọc credential local và SSH key. GitGuardian cảnh báo runner tự quản nằm trong mạng nội bộ dễ trở thành bàn đạp tấn công. Với họ Legacy OIDC, script cố xin GitHub OIDC token để AssumeRole sang AWS. Jenn Gile (OpenSourceMalware, qua The Hacker News) nhận định mã này có vẻ không chạy được như đang viết, và cho biết không thể nói nó đã thành công ở đâu hay chưa.

Từ 22 đến 26/10/2026, 188 commit GhostAction bị sửa đổi kèm loader PolinRider rồi force-push. PolinRider là chiến dịch khác, ban đầu từng quy cho DPRK. GitGuardian cho biết không có dấu hiệu rõ ràng hai nhóm liên quan. Giả thuyết làm việc của GitGuardian là GhostAction sao chép launcher công khai của PolinRider và hai bên có tập nạn nhân chồng lấn.

## Chiến dịch lừa đảo my-github và thu hoạch OAuth token

Tên miền `my-github[.]com` đăng ký ngày 09/10/2026 lúc 09:50 UTC, trỏ về 193.32.204\[.\]199 (IP exfil của GhostAction) với wildcard DNS `*.my-github[.]com`. OpenSourceMalware ban đầu xếp domain này là hạ tầng đáng ngờ liên kết qua IP, chưa xác định người vận hành. Theo The Hacker News dẫn OpenSourceMalware, domain sau đó được dùng trong một email giả cảnh báo bảo mật GitHub, gửi từ `noreply@my-github[.]com` tới một maintainer mã nguồn mở, báo có đăng nhập lạ từ Moscow và yêu cầu bấm link để bảo vệ tài khoản.

Trang giả mạo là reverse proxy thu mật khẩu và mã 2FA. Mã JavaScript chèn ngầm tự động phê duyệt GitHub OAuth device flow với các quyền `repo`, `workflow`, `read:org`. Token OAuth được chuyển về `my-github[.]com` cổng 8443. Nạn nhân không cần tự nhập device code.

Token OAuth gắn với repo là credential API dùng lại được; các quyền `repo` và `workflow` khớp với khả năng liệt kê repo và cài workflow vào `.github/workflows/` của GhostAction (theo The Hacker News dẫn OpenSourceMalware). Tên miền `my-gitlab[.]com` (đăng ký 22/09/2026) chưa chứng minh độc hại và chưa liên kết hạ tầng với GhostAction, nên chỉ đưa vào diện theo dõi.

## IOCs (Indicators of Compromise)

### Hạ tầng GhostAction hiện tại

```text
193.32.204[.]199 (HTTP cổng 80; 3000 /api/workflow/receive?inj=<id>; 8080 /?c=<tag> và /c2/<hostname>)
my-github[.]com, *.my-github[.]com (ghassets., github., api., gh.)
```

### Hạ tầng GhostAction cũ

```text
170.39.218[.]2
45.139.104[.]115
bold-dhawan.45-139-104-115.plesk[.]page
objective-hopper.45-139-104-115.plesk[.]page
carte-avantage[.]com
```

### Dấu hiệu nhận diện và Gist

```text
Crontab marker: #ghc2
Gist riêng tư: "build cache" chứa file c.dat
```

### Đường dẫn tệp tin trong kho lưu trữ

> \[!NOTE\] Tên tệp tin đơn lẻ không phải IOC; cần đối chiếu nội dung thực thi và hạ tầng liên quan.

```text
.github/workflows/github_actions_security.yml
.github/workflows/security-check.yml
.github/workflows/security-audit.yml
.github/workflows/audit.yml
.github/workflows/build-check.yml
.github/workflows/repo-health.yml
.github/workflows/lint.yml
.github/workflows/ci-check.yml
.github/workflows/test-suite.yml
.github/workflows/code-review.yml
.github/workflows/maintenance.yml
.github/workflows/cache-cleanup.yml
.github/workflows/runner-maintenance.yml
.github/workflows/cleanup-job.yml
.github/workflows/cleanup_cache.yml
public/fonts/fa-solid-400.woff2
.vscode/tasks.json
```

### PolinRider trong repo đồng nhiễm

```text
Địa chỉ Ethereum: 0x1eef0849eda15d87f64e51c73c8442cf3c8bcef3
C2 dự phòng: hxxp://95.135.181[.]151:443
SHA-256 api.js: b59e598ded824c7318ca9fae4e9a6d98c9600873677ece7d9896870e3e7ced8e
SHA-256 fa-solid-300.ttf: 7ba0a30eabfa46008d6417532533199bbf351b27f3841477e9133f43fb404d24
SHA-256 tasks.json: 284d167f51c93b90100b7faeaec971959c1f8bb642e7ea0de50190a5a306f3d8
Persistence: ~/.node_modules/.npm-ws-runner.js, .npm-ws.json, .npm-ws.pid
```

## Detection & Hunting

Đội ngũ an ninh có thể áp dụng ngay các cú pháp câu lệnh và quy tắc dưới đây để săn lùng dấu vết GhostAction:

### Truy vấn trên GitHub Code Search

Sử dụng cú pháp tìm kiếm chính xác theo OpenSourceMalware để phát hiện workflow độc hại:

```text
"193.32.204.199" path:.github/workflows
```

Tìm kiếm các commit message đặc trưng của chiến dịch:

```text
"Add Github Actions Security workflow"
"Add security audit workflow"
```

### Quét kho lưu trữ mã nguồn cục bộ

Kiểm tra cấu hình tác vụ tự động mở thư mục trong Visual Studio Code:

```bash
grep -rl --include=tasks.json 'folderOpen' .
```

Xác định font giả mạo (font thật có định dạng "Web Open Font Format", font giả là text script):

```bash
find . -path '*/fonts/*' -name '*.woff2' -exec file {} \;
```

Kiểm tra workflow bất thường và lịch sử commit trong thư mục cấu hình:

```bash
ls -la .github/workflows/
git log --all --format='%h %an %ad %s' -- .github/workflows/
```

### Kiểm tra máy lập trình viên và runner Linux/macOS

Tìm kiếm tác vụ cron độc hại mang marker `#ghc2`:

```bash
crontab -l | grep -n 'ghc2'
```

### Kiểm toán GitHub Gist và Audit Log

Kiểm tra danh sách Gist riêng tư tìm tiêu đề "build cache":

```bash
gh gist list --secret | grep -i "build cache"
```

Trên audit log của GitHub Organization, rà soát các lần push thay đổi `.github/workflows/` từ tài khoản hoặc thời điểm bất thường, và các OAuth app hoặc token mới được cấp quyền `repo`, `workflow`. Tên sự kiện cụ thể phụ thuộc gói GitHub đang dùng; đối chiếu tài liệu audit log của GitHub.

### Giám sát AWS CloudTrail

Truy vết các yêu cầu xác thực OIDC giả mạo danh tính gửi tới dịch vụ AWS STS:

```json
{
  "eventSource": "sts.amazonaws.com",
  "eventName": "AssumeRoleWithWebIdentity",
  "requestParameters": {
    "roleArn": "arn:aws:iam::123456789012:role/<TargetRolePlaceholder>"
  }
}
```

> \[!NOTE\] Quản trị viên cần kiểm tra trường `sub` trong token OIDC để xác định kho lưu trữ (`repo:<org>/<repo>:ref:refs/heads/<branch>`) có hợp lệ hay không.

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

Dưới đây là tài liệu Sigma đa phần (multi-doc YAML) gồm 2 quy tắc với UUID v4 chuẩn:

```yaml
title: Suspicious Execution of Script Files Disguised as Fonts via Node.js
id: 787f69d6-d0ee-41f4-a16c-d965170a1caf
status: experimental
description: Phát hiện Node.js chạy một tệp mang đuôi font (.woff2, .woff, .ttf) làm script, chỉ dấu của font stealer trong GhostAction và loader PolinRider.
references:
    - https://blog.gitguardian.com/ghostaction-x-polinrider/
author: FPT IS CSC - Threat Intelligence
date: 2026-11-04
tags:
    - attack.execution
    - attack.t1059.007
logsource:
    category: process_creation
    product: linux
detection:
    selection_image:
        Image|endswith: '/node'
    selection_cli:
        CommandLine|endswith:
            - '.woff2'
            - '.woff'
            - '.ttf'
    condition: selection_image and selection_cli
falsepositives:
    - Hiếm; script build front-end nhận đường dẫn font làm tham số cuối (cần loại trừ theo baseline).
level: high
---
title: GhostAction Campaign Indicators in Process Command Line
id: 94704fd6-5095-4c8c-ac1c-2c0922eba670
status: experimental
description: Phát hiện tham số dòng lệnh chứa IP C2, domain lừa đảo hoặc marker crontab của GhostAction.
references:
    - https://blog.gitguardian.com/ghostaction-x-polinrider/
author: FPT IS CSC - Threat Intelligence
date: 2026-11-04
tags:
    - attack.exfiltration
    - attack.t1041
    - attack.persistence
    - attack.t1053.003
logsource:
    category: process_creation
    product: linux
detection:
    selection:
        CommandLine|contains:
            - '193.32.204.199'
            - 'my-github.com'
            - '#ghc2'
    condition: selection
falsepositives:
    - Hoạt động kiểm thử an ninh hoặc rà soát hunting nội bộ.
level: high
```

### Truy vấn săn lùng trên SIEM và EDR

Truy vấn Splunk SPL rà soát lưu lượng proxy, tường lửa và DNS:

```spl
(index=proxy OR index=firewall OR index=dns) 
(dest_ip="193.32.204.199" OR dest_ip="170.39.218.2" OR dest_ip="45.139.104.115" 
 OR query="*my-github.com*" OR url="*my-github.com*")
| eval query_target=coalesce(url, query, dest_ip)
| stats earliest(_time) as first_seen latest(_time) as last_seen count by src_ip, dest_ip, query_target
| convert ctime(first_seen) ctime(last_seen)
```

> \[!NOTE\] Các trường `index`, `dest_ip`, `query`, `url` là placeholder cần thay thế theo lược đồ dữ liệu của từng đơn vị.

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

```kql
// Phát hiện kết nối tới hạ tầng C2 GhostAction
DeviceNetworkEvents
| where RemoteIP in ("193.32.204.199", "170.39.218.2", "45.139.104.115") 
     or RemoteUrl contains "my-github.com"
| project Timestamp, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteIP, RemotePort, RemoteUrl

// Phát hiện Node.js chạy tệp font đáng ngờ
DeviceProcessEvents
| where FileName =~ "node" or InitiatingProcessFileName =~ "node"
| where ProcessCommandLine contains ".woff2" or ProcessCommandLine contains "/fonts/" or ProcessCommandLine contains @"\fonts\"
| project Timestamp, DeviceName, AccountName, FileName, ProcessCommandLine, InitiatingProcessCommandLine
```

> \[!NOTE\] Các trường trong truy vấn KQL trên là placeholder tuân thủ schema Microsoft Defender for Endpoint, cần kiểm thử trên môi trường thực tế.

## Nhận định

Qua phân tích kỹ thuật, chúng tôi nhận thấy nguyên nhân gốc rễ của GhostAction là các token chưa từng được thu hồi. Việc chỉ xóa tệp tin workflow độc hại không đem lại sự an toàn thực sự. Chiếc chìa khóa hợp lệ vẫn nằm trong tay kẻ tấn công, khiến việc "xóa file" hoàn toàn không đồng nghĩa với "an toàn".

Cơ chế chặn workflow của GitHub phát huy hiệu quả cao trên hạ tầng CI. Tuy nhiên, chỉ vài ngày sau, nhóm tấn công đã có thêm nhánh chạy trên máy trạm lập trình viên qua font stealer. Theo chúng tôi, điều này cho thấy task tự chạy của VS Code là bề mặt tấn công dễ bị bỏ qua \[Inference\].

Về trình độ kỹ thuật, chiến dịch bộc lộ sự hạn chế qua các lỗi cú pháp YAML cơ bản và mã OIDC chưa hoàn thiện. Dù vậy, quy mô bùng phát vẫn rất lớn nhờ tự động hóa việc lạm dụng kho token cũ. Việc đưa thêm mẫu tìm credential của công cụ AI (Claude, Gemini, OpenAI) cho thấy loại khóa này đã thành mục tiêu đáng giá \[Inference\].

Các nguồn không có số liệu riêng cho Việt Nam. Theo đánh giá của chúng tôi, tổ chức nào dùng GitHub cùng self-hosted runner trong mạng nội bộ, hoặc dùng OIDC sang AWS mà chưa giới hạn theo repo và nhánh, nên coi GhostAction là rủi ro trực tiếp \[Inference\]. Một token lộ hoặc một repo dính font stealer có thể mở đường từ máy dev hay runner vào mạng nội bộ \[Inference\].

## Khuyến nghị phòng thủ theo giai đoạn

### Hành động khẩn cấp (Immediate)

1. **Thu hồi toàn bộ token từ máy sạch**: Đăng nhập GitHub từ thiết bị an toàn để hủy toàn bộ PAT, gỡ OAuth app lạ và kiểm tra lại SSH key.
2. **Xóa IOC trên mọi nhánh, không revert commit Update**: Xóa tệp độc hại trên tất cả các nhánh và fork. Tuyệt đối không revert commit "Update" vì thao tác này sẽ khôi phục lại mã độc trước đó.
3. **Xoay vòng toàn diện secret**: Đổi mới toàn bộ secret trong repo, trong lịch sử git và trên wiki nội bộ (AWS, registry, token AI).
4. **Dọn dẹp cron** `#ghc2`: Kiểm tra và xóa dòng cron `#ghc2` trên máy dev và runner, đồng thời xoay vòng credential local (`~/.aws`, SSH key).
5. **Kiểm toán Gist và CloudTrail**: Xóa Gist riêng tư "build cache" và rà soát sự kiện `AssumeRoleWithWebIdentity` trên AWS CloudTrail.

### Biện pháp trung hạn (Short-term)

1. **Siết chặt Trust Policy OIDC AWS**: Giới hạn claim `sub` theo đúng repo và nhánh cụ thể, loại bỏ cấu hình wildcard.
2. **Bật duyệt lượt chạy workflow**: Theo StepSecurity, yêu cầu duyệt lượt chạy workflow là biện pháp duy nhất được ghi nhận đã chặn exfil trong đợt 08/10 (repo typecho-fans/plugins). Lưu ý: tùy chọn chỉ áp dụng cho fork hoặc người ngoài sẽ không chặn được commit đẩy bằng chính tài khoản bị chiếm \[Inference\].
3. **Bảo vệ nhánh và phân quyền CODEOWNERS**: Thiết lập quy tắc bắt buộc code review đối với mọi thay đổi trong thư mục `.github/workflows/**`.
4. **Cấu hình egress allowlist cho runner**: Chặn runner kết nối trực tiếp ra các IP thô không qua phân giải DNS.
5. **Vô hiệu hóa tự chạy task VS Code**: Đặt `"task.allowAutomaticTasks": "off"` trong cài đặt VS Code, giữ Workspace Trust bật và không chọn trust cho repo lạ.

### Chiến lược dài hạn (Long-term)

1. **Chuẩn hóa Fine-grained PAT**: Bắt buộc dùng Fine-grained PAT với phạm vi tối thiểu theo repo và thời hạn dưới 30 ngày.
2. **Bắt buộc 2FA bằng khóa phần cứng (FIDO2/passkey)**: Khóa gắn với tên miền giúp chống kiểu phishing reverse proxy như `my-github[.]com`, nơi mã 2FA dạng OTP bị thu lại \[Inference\].
3. **Quét secret ở pre-commit hooks**: Tích hợp công cụ quét bí mật tự động nhằm ngăn chặn credential lọt vào lịch sử git.
4. **Triển khai Ephemeral Runner**: Dùng runner tự hủy sau mỗi lượt chạy để hạn chế persistence kiểu cron `#ghc2` trên self-hosted runner.

## 13\. Tài liệu tham khảo và kết luận

### Tài liệu tham khảo

1. GitGuardian (07/10/2026, cập nhật 13/10): [GhostAction Returns: 772 Repos Hit, 30k More in Oct](https://blog.gitguardian.com/ghostaction-github-actions-supply-chain-attack-returns/)
2. GitGuardian (27/10/2026): [GhostAction Crosses Paths With PolinRider: Inside the October Escalation](https://blog.gitguardian.com/ghostaction-x-polinrider/)
3. OpenSourceMalware (09/10/2026): [GhostAction Attack Escalates By Targeting GitHub Users](https://opensourcemalware.com/blog/ghostaction-attack-escalates)
4. StepSecurity (10/2026): [GhostAction Returns: Malicious "Security Audit" Workflows Now Mine Credentials from Entire Git Histories](https://www.stepsecurity.io/blog/ghostaction-returns)
5. The Hacker News (09/10/2026, cập nhật 15/10): [Credential-Stealing GitHub Actions Workflows Planted in Tens of Thousands of Repositories](https://thehackernews.com/2026/10/credential-stealing-github-actions.html)
6. The Hacker News (19/10/2026, cập nhật 28/10): [GhostAction Attackers Target Nearly 23,000 GitHub Repos with Credential-Stealing Malware](https://thehackernews.com/2026/10/ghostaction-attackers-plant-credential.html)
7. OpenSourceMalware (10/2026): [GhostAction Copycats PolinRider by Hiding a Stealer in a Fake Font File](https://opensourcemalware.com/blog/ghostaction-copycats-polinrider-by-hiding-a-stealer-in-a-fake-font-file)
8. MITRE ATT&CK Framework: [MITRE ATT&CK Enterprise Matrix](https://attack.mitre.org/)

---
