# RePointing: 17.610 repo GitHub giả không bị xóa, chỉ bị trỏ lại chỗ khác

## Tóm tắt

**17.610 repo GitHub giả** đang phát tán SmartLoader, và Apiiro đã xác minh có ZIP chứa mã độc đằng sau từng repo một. Con số này gần gấp đôi danh sách lớn nhất từng được công bố trước đó.

Điều đáng nói không phải quy mô mà là cách chiến dịch này tự làm mới. Khoảng 06:30 UTC ngày 04/10/2026, một script bắt đầu sửa README hàng loạt. Trong 34 giờ tiếp theo, **hơn 13.000 repo được push lại**, đỉnh điểm 2.999 repo mỗi giờ. Trong các commit được lấy mẫu, **97% chỉ chạm vào README** và **88% trỏ nút Download sang một ZIP cài SmartLoader**.

Không một repo mới nào được tạo. Đội hình đã có sẵn, chỉ được chỉnh lại hướng. Apiiro gọi kỹ thuật này là **RePointing**.

**Hành động ưu tiên:**

*   Coi mọi lây nhiễm infostealer trên máy lập trình viên là **tài khoản GitHub của tổ chức đã bị xâm nhập**: thu hồi session và token ngay, không chỉ đổi mật khẩu.
    
*   Khi hunting, phải match **cả hai dạng URL** của GitHub. Dạng `github.com/<owner>/<repo>/raw/...zip` chính là phần mà hầu hết blocklist đang bỏ sót.
    

## RePointing: giữ repo, chỉ đổi link

Ý tưởng rất đơn giản: giữ lại một repo đã tồn tại nhiều tháng, mang tên một dự án thật và có lịch sử thật, rồi chỉ đổi chỗ mà nút Download trỏ tới.

Một repo như vậy có uy tín mà một fork mới tinh không có được. Giữ repo và chỉ đổi link nghĩa là giữ nguyên uy tín đó, với chi phí đúng một commit.

Apiiro có kiểm tra xem đây có phải thủ thuật nâng hạng tìm kiếm không. Trong 120 lượt tìm kiếm trên GitHub theo tên lure, **repo vừa được push lại không xếp hạng cao hơn repo bị bỏ yên**. Kết luận: không phải SEO, chỉ đơn giản là rẻ hơn. Phần lớn đội hình vẫn sống, nên chẳng có gì phải dựng lại.

Các đợt push cũng không ngẫu nhiên. Hai đợt đầu là cùng một chương trình chạy hai lần, với profile theo từng phút gần như trùng khớp, và đều duyệt qua danh sách lure **theo đúng thứ tự chúng được trang bị lần đầu** (hệ số tương quan hạng 0,96), tốc độ khoảng 1,6 push mỗi giây, mỗi push từ một tài khoản khác nhau. Đây là một pool worker chạy qua một bản kiểm kê đã sắp xếp sẵn.

Thêm một chi tiết: họ push **đúng một lure trên mỗi tài khoản**. Trong 1.101 tài khoản giữ từ hai lure trở lên, tất cả trừ 2 chỉ có nhiều nhất một lure được push lại. Các lure cũ trên cùng tài khoản vẫn nằm đó, vẫn tải được.

## Chuỗi tấn công

**Lure.** Repo lấy tên một dự án thật, README được viết lại thành hướng dẫn cài đặt thân thiện, kèm badge Download trỏ tới một ZIP nằm ngay trong cây thư mục của repo.

Chi tiết đáng chú ý nhất trong hướng dẫn: bước 3 ghi rõ *"Windows may show a security screen. If it appears, click More info, then click Run anyway."* Hướng dẫn dạy nạn nhân bấm qua cảnh báo SmartScreen.

**Chỗ giấu ZIP.** Trong `src/`, `assets/`, `docs/`, và với khoảng 375 repo là những thư mục mà người review được dạy bỏ qua hoàn toàn: `node_modules/`, `.github/`, `__pycache__/`, `dist/`, `vendor/`. 5.474 lure khác giấu ZIP trong thư mục cấp cao đặt tên bằng một từ tiếng Anh hiếm (`ophthalmoscopic/`, `Arverni/`); 99,6% số từ đó xuất hiện nguyên văn trong file từ điển Webster 1934 đi kèm macOS và BSD tại `/usr/share/dict/words`.

**Bên trong ZIP** là ba hoặc bốn file, tên đổi theo từng repo nhưng vai trò luôn giống nhau:

| File | Trông như | Thực chất là |
| --- | --- | --- |
| `Launcher.cmd` / `App.bat` | script setup | một dòng lệnh: khởi động runtime, đưa cho nó "file text" |
| `luajit.exe` / `luau.exe` / `gcc.exe` | file binary của tool | interpreter LuaJIT, đổi tên |
| `lua51.dll` | thư viện phụ thuộc | thư viện của interpreter, thường là cùng một file giữa các repo |
| `userdata.txt` / `ico64.txt` / `tcp.log` | icon, log hoặc licence | chương trình Lua ~300 KB bị làm rối, nén trên **một dòng** |

**Sau cú double-click.** Launcher ẩn cửa sổ, lấy thông tin máy (gồm một truy vấn tới `ip-api.com`), đọc địa chỉ C2 hiện tại từ smart contract trên Polygon, rồi tải stage tiếp theo từ các repo GitHub khác. Chuỗi kết thúc bằng **StealC** được inject vào một tiến trình trông hợp lệ.

StealC lấy mật khẩu đã lưu, nhưng phần nguy hiểm với lập trình viên là **phiên đăng nhập còn sống**: một cookie GitHub, console cloud hay cổng SSO bị lấy sẽ bỏ qua cả bước đăng nhập lẫn bước MFA.

## Khoảng trống giữa "đã liệt kê" và "đã bị gỡ"

Đây là phần có giá trị vận hành cao nhất của báo cáo.

**GitHub phục vụ cùng một file qua hai dạng URL, và blocklist phủ rất lệch:**

| Dạng link trong README | Repo đang sống | Có trên URLhaus |
| --- | --- | --- |
| `raw.githubusercontent.com/<owner>/<repo>/…zip` | 9.455 | 4.807 (51%) |
| `github.com/<owner>/<repo>/raw/…zip` | 7.939 | 121 (2%) |

Lý do: pipeline thu thập tìm `raw.githubusercontent.com` vì đó là nơi file raw được phục vụ. Dạng `github.com/.../raw/` có redirect sang đó nhưng không khớp pattern. Chính Apiiro lúc đầu cũng mắc đúng lỗi này; sửa một regex là ra thêm hàng nghìn lure trong dữ liệu họ đã tải về từ trước.

**Nằm trong blocklist không có nghĩa là đã bị gỡ.** Trong phần đội hình đã được URLhaus liệt kê, 97% các lần push lại hồi tháng 10 trỏ README về đúng ZIP mà URLhaus đã liệt kê từ tháng 6, và **99,96% ZIP đã liệt kê vẫn tải được**.

**Và blocklist DNS không giúp được gì ở đây.** Không thể chặn một file trên `github.com` mà không chặn cả GitHub. Phần còn lại là kiểm tra ở mức URL và file, mà cái đó chỉ biết những gì đã được liệt kê: trong một mẫu, cả 38 URL đã có trên URLhaus đều bị ít nhất một engine VirusTotal gắn cờ, trong khi VirusTotal mới chỉ thấy **6 trên 38** URL dạng `github.com/.../raw/` chưa được liệt kê.

**Xóa file được link tới cũng chưa đủ**, vì luôn còn bản dự phòng:

*   **444 fork** giữ bản sao kit đã được xác minh của riêng chúng
    
*   **913 repo** còn giữ một ZIP kit cũ hơn, chưa bị liệt kê, nằm ngay cạnh bản mà README đang trỏ tới
    
*   **322 release asset** trong 199 repo, đã nằm trên URLhaus dưới nhãn SmartLoader, vẫn tải được, có cái từ tháng 3/2025
    
*   **File đính kèm trong issue** vẫn tải được kể cả khi không tìm thấy issue nào nhắc tới chúng
    
*   **841 lure** trỏ tới ZIP đặt ở một repo khác, phần lớn là `<user>.github.io` của chính chủ tài khoản
    

RePointing hoạt động được vì **luôn có thứ gì đó để trỏ tới**.

## Danh sách nào được gỡ, danh sách nào không

Apiiro đối chiếu với ba danh sách đã công bố trước:

| Danh sách | Thời điểm | Tình trạng hiện tại |
| --- | --- | --- |
| Orchid, 9.330 repo | 06/2026 | mất 99,3%, gần như toàn bộ do khóa tài khoản |
| Island, 7.600 repo | 07/2026 | sau 77 ngày vẫn còn 85% |
| Hexastrike, 109 repo | 04/2026 | sau 24 tuần còn khoảng một nửa |

Repo nằm trong **cả hai** danh sách Island và Orchid bị gỡ 71%, so với 14% cho phần còn lại. Kết luận rất thẳng: **nằm trong danh sách thì bị gỡ, không nằm thì sống tiếp**.

Nhưng việc gỡ gần như không chạm tới đội hình hiện tại: chỉ **49 repo** trong danh sách của Orchid còn nằm trong số đang chạy hôm nay.

Có dấu hiệu cho thấy kẻ tấn công theo dõi các công bố. Orchid công bố ngày 18/06. Ngày build hàng loạt cuối cùng trước đó là **17/06**, tức một ngày trước, và lần build hàng loạt tiếp theo cách **64 ngày**, trong khi khoảng cách thông thường là 3 ngày. Trong thời gian tạm nghỉ đó, tài khoản mới vẫn tiếp tục được đăng ký và được trang bị lure vào tháng 9.

## Tài khoản bị chiếm và những nạn nhân liên đới

15.225 tài khoản giữ 17.624 repo, nghĩa là khóa một tài khoản chỉ gỡ được hơn một lure một chút.

93% trong số đó trông như tài khoản rác: 9.197 tài khoản tạo từ 07/2024 trở đi, và 5.022 tài khoản cũ hơn nhưng không có gì thật trước khi lure xuất hiện. Có dấu hiệu nuôi tài khoản theo lô: **750 tài khoản đăng ký riêng trong ngày 09/04/2026** rồi để già trước khi được gắn lure.

**Nhưng khoảng 700 tài khoản là của lập trình viên thật.** Apiiro gắn cờ 965 tài khoản nghi bị chiếm, rồi kiểm chứng bằng loại bằng chứng không thể làm giả ngược thời gian: pull request được người khác merge, quyền ghi được cấp vào repo của người khác, comment, fork và issue do người khác tạo, tất cả đều mang timestamp của GitHub. **219 tài khoản có loại lịch sử đó**, thường là nhiều năm, so với 4 trên 200 tài khoản rác. Kiểm tra thủ công 180 mẫu cho thấy khoảng hai phần ba là người thật, nên ước tính tổng là khoảng 700.

Dấu vết của việc bị chiếm nằm ngay trong commit. Không một commit nào trong 951 commit cài mã độc được ký hoặc tạo qua web editor của GitHub, dù 348 trên 490 chủ tài khoản có lịch sử thật đã từng ký commit trước đó. Và chúng được tạo tập trung, trên một lịch trình: phần lớn ZIP xuất hiện trong **19–23/02/2026**, gồm 1.741 commit trên 783 tài khoản, cách nhau trung vị 23 giây, và **không có commit nào từ nửa đêm tới 5 giờ sáng UTC**, kể cả trên những tài khoản mà khung giờ đó là giữa buổi sáng.

**Kẻ tấn công vẫn còn quyền truy cập.** Tài khoản bị chiếm từ tháng 2 lại bị push tiếp vào tháng 10: từ ngày 04/10, 40% lure trên tài khoản lập trình viên có uy tín và 51% trên nhóm được gắn cờ theo lịch sử đã bị push lại. Bảy tháng trôi qua, các chủ tài khoản không có dấu hiệu công khai nào cho thấy họ đã nhận ra; chỉ 2 người từng xóa ZIP, và Apiiro không tìm thấy bài đăng "tôi bị hack" nào.

**Rồi quyền truy cập đó được dùng tiếp.** Từ 01/02 tới 19/03, **139 tài khoản này đã push ZIP vào 270 repo mà họ không sở hữu**: đồ án của bạn cùng lớp, capstone của nhóm, repo môn học dưới tổ chức của trường đại học và bootcamp. 313 trên 314 file được cài vào vẫn tải được, giấu trong `node_modules/` của một capstone, `.github/workflows/` của một nhóm, hay `target/classes/` của một build Java.

Chủ những repo đó không làm gì sai. Họ cấp quyền ghi cho một người cùng nhóm, và tài khoản của người đó bị dùng để chống lại họ.

Tự động hóa còn đẩy nó đi xa hơn: một lure giả làm add-on cho router đã bị hai community package feed của OpenWrt tự động đồng bộ về cuối tháng 9, kèm nguyên ZIP.

## Góc AI: từ AgentBaiting tới README do model viết

**Lure nhắm thẳng vào hệ sinh thái AI.** 4.551 lure (26%) trùng tên chính xác với một dự án thật có từ 50 star trở lên, và **46% trong số đó sao chép công cụ AI, MCP, Claude hoặc agent**: `mattpocock/skills` có 26 lure, `anthropics/claude-code` có 12. Chúng mượn uy tín qua cái tên chứ không qua số star, vì hầu hết đều rất ít hoặc không có star nào. Nhiều cái chép luôn cả code: trong mẫu ngẫu nhiên 82 lure trùng tên, 30 cái (37%) giữ ít nhất 90% số file của dự án thật, nguyên vẹn từng byte.

1.169 lure có listing trên các directory AI skill, dẫn đầu là `awesomeskills.dev` với 1.052 và `skills.lc` với 169, mỗi listing kèm sẵn một lệnh cài copy-paste.

**Và đó là chỗ sắc nhất.** Trong **167 lure, ZIP chứa kit nằm cùng thư mục với một file** `SKILL.md` **không hề nhắc tới nó**, 96 trong số đó có listing trên directory. Lệnh `npx skills add` sẽ clone repo và copy nguyên thư mục đó, kèm cả ZIP, vào thư mục skill của agent, mà bản thân skill thì không có gì trông bất thường.

Cần nói rõ hai điều để không phóng đại: các lure **không phụ thuộc vào đường này**, vì README của chúng link thẳng tới ZIP; và việc file nằm trên đĩa chưa phải là thực thi, vì không có gì được giải nén hay chạy cho tới khi ai đó, hoặc agent nào đó, mở ZIP và chạy launcher. Nhưng nó đặt mã độc gần thêm một bước tới cái máy đang giữ key của bạn.

Island gọi hướng này là **AgentBaiting**, và trong thử nghiệm của họ, ChatGPT, Gemini và Claude đều từng đưa ra các repo độc hại khi được hỏi về tác vụ liên quan, đôi khi kèm luôn hướng dẫn cài đặt. Trong thử nghiệm có kiểm soát, Claude Code có clone repo độc hại và tải file về máy test, nhưng sau đó phát hiện dấu hiệu đáng ngờ và dừng trước khi thực thi.

**README do model viết, và không ai đọc lại trước khi publish.** Văn phong thì đã được Trend Micro nêu từ 2025, nên không mới. Cái mới là những gì chính văn bản đó để lộ về cách nó được tạo ra:

*   **17 README** bắt đầu bằng một dấu ` ```markdown ` thừa, chính là lớp bọc mà một chat model đặt quanh câu trả lời, bị dán nguyên vào
    
*   **13 README** giữ lại lời nhắn của model gửi người dùng, kiểu *"This README paraphrases and expands upon the provided information"*
    
*   **39 README** bảo người dùng chạy một dự án Android, iOS hoặc Linux trên "Windows 10 or Windows 11"
    
*   Trong 157 README do người thật viết của các dự án bị mạo danh, **không cái nào** có những dấu hiệu này
    

Mỗi README lại được sinh mới: trong 2.196 README, Apiiro tìm thấy 2.116 bố cục mục khác nhau và chỉ 4 bản trùng khớp hoàn toàn.

Kết luận của Apiiro đáng trích: đây **không phải một AI agent điều hành chiến dịch**, mà là một pipeline gọi model một lần cho mỗi repo rồi publish thẳng những gì nhận được, không ai proofread.

## C2 ghi trên blockchain

Làm sao mười bảy nghìn ZIP vẫn chạy được khi server C2 liên tục bị đốt? SmartLoader không hardcode C2 mà **hỏi một smart contract trên Polygon** xem phải đi đâu tiếp.

Điều này cho phép kẻ tấn công đổi C2 mà không cần chạm vào bất kỳ repo nào. Nhưng mặt kia, **mỗi lần đổi là một giao dịch công khai và vĩnh viễn**.

Đọc lịch sử của contract cho ra nguyên cuốn nhật ký đổi C2 của kẻ tấn công, mà **không cần gửi một gói tin nào tới hạ tầng của chúng**. Apiiro đếm được **21 lần cập nhật** từ 11/2025 tới 09/2026, trung bình khoảng hai tuần một lần, trong đó có hai địa chỉ chưa từng xuất hiện trong bất kỳ báo cáo công khai nào. Họ cũng lưu ý một block explorer đã bỏ sót 5 trong 24 giao dịch của ví, nên nên tự đếm.

Vài mốc đáng chú ý khi đặt cạnh hoạt động của đội repo:

| Thời điểm | Cập nhật contract | Diễn biến cùng lúc |
| --- | --- | --- |
| 16/11/2025 | `93.123.39[.]74`, địa chỉ đầu tiên |  |
| 08/02/2026 | `89.169.12[.]160` | 11 ngày trước đợt chiếm tài khoản 19–23/02 |
| 13/07/2026 | `83.97.20[.]150` | địa chỉ cuối cùng có trong báo cáo công khai |
| 11/08/2026 | `194.48.248[.]94` | chưa từng được công bố |
| 17/09/2026 | `185.10.68[.]110` | đang dùng, 2,5 tuần trước các đợt push tháng 10 |

Khuyến nghị của Apiiro ở đây rất đáng làm theo: theo dõi contract này, vì một giao dịch `updateData` mới nghĩa là một địa chỉ C2 mới cần chặn. Đây là **nguồn IOC rẻ nhất mà chiến dịch này cung cấp**.

## Nhận định

**Chiến dịch này bền vì nó khai thác khoảng trống quy trình, không phải lỗ hổng kỹ thuật.** Không có CVE nào ở đây. Thứ bị khai thác là việc blocklist và nền tảng lưu trữ mã nguồn không nối với nhau: một URL đã bị liệt kê vẫn sống, và việc liệt kê không ngăn kẻ tấn công trỏ cùng cái nút vào cùng cái file lần nữa. Mọi biện pháp kỹ thuật phía người dùng đều không chạm được vào gốc này.

**Việc công bố báo cáo có tác động đo được, nhưng chỉ lên phần được liệt kê.** Orchid công bố và danh sách của họ mất 99,3%, nhưng chỉ 49 repo trong đó còn nằm trong đội hình hôm nay. Đây là bài học cho cách đo hiệu quả của TI: "danh sách của chúng tôi đã bị gỡ 99%" và "mối đe dọa đã giảm 99%" là hai mệnh đề hoàn toàn khác nhau.

**Bộ kit đang tiến hóa nhanh hơn khả năng phát hiện.** Thế hệ kit cuối tháng 7 dùng obfuscator mới và bỏ hẳn DLL, kéo số engine phát hiện từ **26–33 xuống còn 2–9** trên khoảng 75 engine của VirusTotal. Trong khi đó cách chúng ẩn mình trên GitHub **không đổi chút nào**. Nghĩa là phát hiện dựa trên cấu trúc ZIP và vị trí file sẽ bền hơn nhiều so với phát hiện dựa trên hash payload.

**Tài khoản lập trình viên bị chiếm là phần nghiêm trọng nhất và ít được nói tới nhất.** Khoảng 700 tài khoản thật, 219 được chứng minh từng cái một, và sau bảy tháng vẫn chưa ai nhận ra. Thời gian giữ quyền lâu như vậy gợi ý một credential sống dài, như token hoặc key, chứ không phải một phiên trình duyệt đơn lẻ. Với một tổ chức, điều này nghĩa là rủi ro không nằm ở chỗ nhân viên tải nhầm ZIP, mà ở chỗ tài khoản GitHub của họ có thể đã bị người khác dùng từ nhiều tháng trước.

**Quy mô thật có thể lớn hơn con số đã công bố.** Hai cách ước lượng độc lập, một dựa trên đối chiếu với URLhaus và một dựa trên danh sách của Island, đều cho ra khoảng **21.000–22.000 repo**. Apiiro nói rõ các ước lượng này dựa trên giả định không hoàn toàn đúng, nên con số chắc chắn vẫn là 17.610 repo họ đã xác minh.

## Liên hệ Việt Nam

*   **Đội phát triển Việt Nam đang cài công cụ AI và MCP theo hướng dẫn trên README và directory.** Đây chính là đường mà AgentBaiting nhắm tới. Một lệnh `npx skills add` chạy theo hướng dẫn copy-paste là đủ để kéo cả ZIP về máy.
    
*   **Repo môn học và đồ án nhóm là nạn nhân liên đới có thật trong báo cáo.** Mô hình trường đại học và bootcamp với tổ chức GitHub chung, nhiều sinh viên có quyền ghi chéo vào repo của nhau, rất phổ biến ở Việt Nam. Một tài khoản sinh viên bị chiếm có thể kéo theo hàng chục repo khác.
    
*   **Máy lập trình viên nhiễm infostealer phải được xử lý như sự cố tài khoản, không phải sự cố endpoint.** StealC lấy cookie phiên, nên quét sạch máy rồi đổi mật khẩu là chưa đủ. Phải thu hồi session và token, rà soát các key đã cấp.
    
*   **Repo giả mang đúng tên dự án thật, thường chép luôn cả code.** Việc "tên repo đúng, code nhìn quen" không còn là tín hiệu tin cậy nào cả.
    

## Khuyến nghị

**Cho lập trình viên và người dùng AI agent:**

*   **Không bao giờ chạy file** `.cmd`**,** `.bat` **hay** `.exe` **lấy từ ZIP được link trong README**, kể cả khi repo mang đúng tên dự án bạn cần.
    
*   **Cài skill và MCP server từ registry chính thức hoặc repo của chính nhà cung cấp**, không cài theo lệnh copy-paste trên directory bên thứ ba.
    
*   **Coi mọi lây nhiễm infostealer là sự cố tài khoản GitHub:** thu hồi session và token, rà soát key, và chuyển sang passkey.
    

**Cho đội bảo mật:**

*   **Săn theo cấu trúc file, không theo hash:** tìm archive chứa một file batch, một file thực thi có chứa chuỗi `LuaJIT`, một `lua51.dll`, và một file text lớn nằm trên đúng một dòng. Đây là dấu hiệu bền nhất vì nó không đổi qua các thế hệ kit.
    
*   **Chặn cả hai dạng URL ở proxy**, và khi viết rule hunting thì match cả `raw.githubusercontent.com/<owner>/<repo>/…zip` lẫn `github.com/<owner>/<repo>/(raw|blob)/…zip`. Dạng thứ hai là phần đang bị bỏ sót nhiều nhất.
    
*   **Gắn cờ ZIP nằm trong** `node_modules/`**,** `.github/`**,** `dist/`**,** `vendor/`**,** `__pycache__/` và các thư mục build output trong repo nội bộ. Không có lý do chính đáng nào để một file ZIP nằm ở đó.
    
*   **Theo dõi smart contract Polygon** để lấy địa chỉ C2 mới, khoảng hai tuần một lần, mà không cần chạm vào hạ tầng của kẻ tấn công.
    

## IOC

> Theo báo cáo của Apiiro, số liệu chốt tại 06/10/2026. Apiiro cho biết danh sách đầy đủ repo, URL và hash được cung cấp cho đội phòng thủ theo yêu cầu.

**Cụm payload SmartLoader (SHA-256 của payload Lua bị làm rối)**

```plaintext
8cede35b80b1deaf732c2b178d908f91b3e7a0c114d06dfae9075b8a9bf78b8f   # 1.145 repo, 33 engine VT
f9436ccb986760ca379d6cd2f00726e032a1d9c250a9bd261d40d98b914e7ef9   # 795 repo, 34 engine VT
73f3c4ae76c086f962a06d790be6cc104a47c9d1bfcaebd12eebb3455b090660   # 511 repo, 8 engine VT
```

Apiiro hash được 120 payload khác nhau, trong đó 106 bị gắn cờ trên VirusTotal; những bản mới nhất chỉ bị 2 tới 9 trên khoảng 75 engine phát hiện.

**C2 dead-drop trên Polygon**

```plaintext
Contract: 0x1823A9a0Ec8e0C25dD957D0841e3D41a4474bAdc   (tạo 15/11/2025)

C2 mới nhất:
  194.48.248[.]94    (11/08/2026)
  185.10.68[.]110    (17/09/2026, đang dùng)

C2 trước đó có trong báo cáo công khai:
  93.123.39[.]74     (16/11/2025)
  89.169.12[.]160    (08/02/2026)
  83.97.20[.]150     (13/07/2026)
```

Apiiro lưu ý họ chỉ đọc từ blockchain, không hề liên lạc với các địa chỉ này.

**Malware khác dùng cùng kiểu hướng dẫn cài đặt giả**

```plaintext
18750cfa651271dc086f6806ac01c3c9d621e949b6127ff199a174cb774d8064   # Release.exe, nexe loader, 7 repo
33bba47346c03968977688bddbdd245210c06fb7686b4dfc78789c70e2a95219   # kidkadi.node, map PE trong bo nho
77e46759791c9230afc29baeb6cb048a9a05196db1a48705dd94aa2e74b93e0e   # libcurl.dll, sideload qua WinGup co chu ky
```

**Hai dạng URL cần match khi hunting**

```plaintext
raw.githubusercontent.com/<owner>/<repo>/…zip      # URLhaus phu 51%
github.com/<owner>/<repo>/(raw|blob)/…zip          # URLhaus phu 2%  <- phan bi bo sot
```

**Cấu trúc ZIP cần tìm**

```plaintext
*.cmd hoac *.bat          # mot dong, khoi dong runtime
*.exe                     # chua chuoi "LuaJIT", doi ten thanh luajit/luau/gcc
lua51.dll                 # thuong giong het nhau giua cac repo
*.txt hoac *.log          # ~300 KB, Lua bi lam roi, nam tren mot dong
```

**Thư mục hay được dùng để giấu ZIP**

```plaintext
node_modules/   .github/   __pycache__/   dist/   vendor/
src/   assets/   docs/
<mot tu tieng Anh hiem>/     # lay tu /usr/share/dict/words (Webster 1934)
```

**Dấu hiệu nhận diện khác**

```plaintext
Ten ZIP:         Software-v<1.0 den 3.9>.zip   (khong bao gio 4.x, khong co so patch)
Commit:          khong ky, message mac dinh "Update README.md", timezone +0000
Email tai khoan: <first><last><bon chu cai>@hotmail.com hoac @outlook.com
Truy van mang:   ip-api.com   (buoc profiling cua launcher)
```

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

*   Apiiro — *Never Deleted, Only Re-Pointed: Inside the 17,600-Repo FakeGit Fleet That Re-Arms Overnight* (10/2026): https://apiiro.com/blog/never-deleted-only-re-pointed
    
*   BleepingComputer (Bill Toulas) — *FakeGit malware campaign returns with 17,610 malicious GitHub repos* (08/10/2026): https://www.bleepingcomputer.com/news/security/fakegit-malware-campaign-returns-with-17-610-malicious-github-repos/
    
*   BleepingComputer (Bill Toulas) — *FakeGit campaign uses 7,600 GitHub repos to push SmartLoader malware* (21/07/2026): https://www.bleepingcomputer.com/news/security/fakegit-campaign-uses-7-600-github-repos-to-push-smartloader-malware/
    
*   Island — báo cáo 7.600 repo và kỹ thuật AgentBaiting (07/2026)
    
*   Orchid — danh sách 9.330 repo và phân tích re-push chỉ sửa README (06/2026)
    
*   Hexastrike — 109 repo và chuỗi lây nhiễm đầy đủ tới StealC (04/2026)
    
*   Trend Micro — SmartLoader trong repo GitHub giả, và chiến dịch tiền nhiệm Water Kurita (2025)
