GitHub bị lợi dụng phát tán mã độc: Hơn 10.000 repository giả mạo được phát hiện

Tổng quan
Chiến dịch được theo dõi dưới nhiều tên (FakeGit theo BitDefender, SmartLoader/StealC theo Hexastrike) đang lạm dụng chính cơ chế tin cậy của GitHub để phát tán Trojan ở quy mô công nghiệp. Attacker clone các repository mã nguồn mở hợp pháp, giữ nguyên lịch sử commit và danh sách contributor để tạo vẻ đáng tin, rồi sửa file README để chèn link tải về một file ZIP chứa malware. Nạn nhân chính là developer, power user và đặc biệt là các AI coding agent đang ngày càng kéo context trực tiếp từ GitHub.
Hậu quả kinh doanh không nằm ở một CVE hay một con số CVSS. Nó nằm ở chỗ một lập trình viên trong tổ chức tải về một "công cụ" từ một repository trông y hệt dự án thật, chạy nó, và đánh mất credential, session token, ví crypto cùng toàn bộ dữ liệu trình duyệt mà không có gì hiện lên màn hình. Với tổ chức tài chính và doanh nghiệp công nghệ tại Việt Nam, đây là một vector tấn công nhắm thẳng vào đội ngũ kỹ thuật, nhóm thường có quyền truy cập cao nhất vào hệ thống.
Chiến dịch đang active. GitHub chỉ gỡ những repository được report thủ công, và operator liên tục tạo mới để thay thế. Hành động ưu tiên ngay: chặn các endpoint dead drop trên blockchain RPC và truy vết tiến trình LuaJIT chưa ký chạy từ thư mục người dùng.
Bối cảnh: từ 109 repository lên 10.000
Đây không phải một phát hiện đơn lẻ mà là ba lớp của cùng một chiến dịch, được ba nhóm độc lập bóc tách ở ba quy mô khác nhau.
Lớp sớm nhất do derp.ca ghi nhận trong nghiên cứu FakeGit: LuaJIT malware distributed via GitHub at scale. Theo đó, các mẫu ZIP đầu tiên xuất hiện trên VirusTotal từ ngày 16/03/2025, và hoạt động trải dài đến hiện tại với hơn 600 file ZIP độc hại trên ít nhất 47 tài khoản GitHub. BitDefender theo dõi các archive này dưới tên Gen:Heur.FakeGit.1, còn ESET đánh số các payload Lua từ Lua/Agent.Z đến Lua/Agent.BT, tức 16 thế hệ obfuscator khác nhau qua suốt chiến dịch.
Lớp thứ hai là báo cáo của Hexastrike, Cloned, Loaded, and Stolen: How 109 Fake GitHub Repositories Delivered SmartLoader and StealC, công bố ngày 18/04/2026 sau khi chính dự án PyrsistenceSniper của họ bị clone. Hexastrike xác định 109 repository trên 103 tài khoản và mô tả chi tiết chuỗi lây nhiễm. Đây là phân tích kỹ thuật sâu nhất tính đến thời điểm đó.
Lớp thứ ba, và là lý do chiến dịch lên mặt báo tuần này, đến từ một researcher dùng bí danh Orchid. Trong bài I discovered a large-scale malware distribution on GitHub, Orchid kể lại việc tình cờ thấy repository của chính mình bị nhân bản trên kết quả tìm kiếm Bing vào khoảng tháng 2/2026, với một commit sửa README được push chỉ một giờ trước đó. Thay vì report rồi chờ đợi như lần đầu (GitHub support im lặng suốt hai tuần), lần này Orchid viết script phân tích toàn bộ event GitHub.
Điều đáng nói là khoảng cách giữa các con số. Như byteiota tổng hợp, báo cáo của Hexastrike tuy kỹ lưỡng nhưng chỉ nhìn thấy khoảng 1% của chiến dịch thực tế. Khi Orchid hoàn thiện bộ lọc, con số nhảy lên 10.000 repository khớp chính xác pattern, gấp khoảng 91 lần quy mô từng được biết.
Thông tin campaign
| Thuộc tính | Chi tiết |
|---|---|
| Tên theo dõi | FakeGit (BitDefender), SmartLoader + StealC staging (Hexastrike) |
| Attribution | Operator nói tiếng Việt, single actor hoặc cluster được kiểm soát chặt (đánh giá của derp.ca và Hexastrike, dựa trên overlap hạ tầng và đồng bộ cập nhật repo) |
| Thời gian hoạt động | Từ tháng 3/2025 đến hiện tại, vẫn active |
| Loại tấn công | Phát tán malware qua repository giả mạo, lạm dụng tin cậy (trust abuse) |
| Target | Developer, power user, gamer, người dùng crack/cheat, và AI coding agent |
| Công cụ chính | LuaJIT loader (SmartLoader), StealC infostealer, biến thể sớm dùng LummaStealer |
| C2 resolution | Smart contract trên Polygon Mainnet (kỹ thuật EtherHiding) |
| C2 endpoint | IP trần trong cùng một dải /24, ví dụ 158[.]78[.]56[.]52 |
| Quy mô xác nhận | ~10.000 repository (Orchid), 109 (Hexastrike), 600+ ZIP (derp.ca) |
| Nguồn phát hiện | Orchid Files, Hexastrike, derp.ca, Trend Micro |
Timeline
| Thời điểm | Sự kiện |
|---|---|
| 21/02/2025 | Smart contract V1 lưu domain C2 đầu tiên layer1[.]icu |
| 10/03/2025 | Chuyển sang domain thứ hai aproxy[.]app |
| 16/03/2025 | Mẫu FakeGit ZIP đầu tiên xuất hiện trên VirusTotal |
| 17/03/2025 | Operator chuyển vĩnh viễn sang IP trần, bỏ domain |
| Tháng 5/2025 | Thay LuaJIT runtime sạch bằng binary đã trojan hóa (100KB) |
| Tháng 6/2025 | Cadence rotate C2 ổn định ở mức ~15 ngày một lần |
| Tháng 10/2025 | Tăng quy mô phát tán, từ 16 lên 51 ZIP mỗi tháng |
| Tháng 2/2026 | Triển khai binary mới (878KB) và smart contract V2 |
| ~Tháng 2/2026 | Orchid lần đầu phát hiện repo của mình bị clone |
| 04/03/2026 | derp.ca công bố nghiên cứu FakeGit, ghi nhận 25 tài khoản còn active |
| 18/04/2026 | Hexastrike công bố báo cáo 109 repository |
| 18/06/2026 | Orchid công bố phát hiện 10.000 repository |
Chuỗi lây nhiễm
Điểm mạnh của chiến dịch nằm ở chỗ mỗi mắt xích đều đơn giản nhưng được ghép lại để vô hiệu hóa một lớp phòng thủ cụ thể.
Initial access: repository nhân bản, không phải fork
Attacker không fork repository gốc. Họ tạo repository hoàn toàn mới rồi sao chép toàn bộ commit history và profile contributor vào đó. Lựa chọn này có chủ đích. Một fork sẽ liên kết ngược về dự án gốc và dễ bị nhận diện theo cụm. Một bản clone độc lập với commit và contributor được copy lại trông như một dự án tự thân, có lịch sử, có người đóng góp thật. Khi nạn nhân click vào profile contributor, họ thấy tài khoản nhiều năm tuổi thật, không phải account dùng một lần.
Để có visibility, operator nhắm vào các repository mới hoặc ít người biết, gắn thẻ tag phù hợp để chúng nổi lên trong kết quả tìm kiếm cho các từ khóa ít cạnh tranh. Đây là lạm dụng SEO kết hợp social engineering, không phải exploit kỹ thuật.
Pattern cập nhật: commit "Update README.md" lặp đi lặp lại
Đặc điểm vận hành dễ nhận nhất, và cũng là thứ Orchid dùng làm signal chính, là việc mỗi vài giờ repository lại xóa commit cũ và push lại đúng commit đó. Thay đổi duy nhất trong commit là thêm hoặc cập nhật link tới file ZIP trong README. Mọi commit đều mang cùng một message: Update README.md.
Giả thuyết của Orchid là việc overwrite commit liên tục giúp bypass thuật toán bảo mật của GitHub, hoặc đơn giản là quy trình bảo trì tự động của operator để luân chuyển link tải. Dù lý do là gì, pattern này tạo ra một dấu vết hành vi rất đặc trưng trong dữ liệu GH Archive.
Payload: ZIP bốn file đánh lừa scanner
File ZIP thường chứa bốn thành phần: một batch script (Application.cmd hoặc Launcher.cmd), một executable loader (loader.exe, luajit.exe hoặc tên khác), một file tên ngẫu nhiên (đuôi .cso, .txt hoặc .log), và thư viện lua51.dll. Có biến thể ba file trong đó runtime Lua được link tĩnh, bỏ lua51.dll.
Bản thân executable và DLL là LuaJIT 2.1.0-beta3 hợp pháp, không bị flag. Payload thật nằm trong file text đuôi .txt hoặc .log: một script Lua obfuscate. Đây chính là điểm đánh lừa scanner. Submit từng file riêng lẻ lên VirusTotal đều cho kết quả sạch. Submit link tới ZIP cũng cho 0 detection vì scanner không tải nội dung. Chỉ khi upload chính file ZIP, sandbox mới ghép các thành phần lại và trigger cảnh báo Trojan.
Execution: batch khởi chạy LuaJIT ở chế độ GUI
Batch launcher dùng lệnh start của Windows để chạy binary LuaJIT với flag GUI subsystem. Lệnh start tách tiến trình mới ra, còn flag GUI subsystem chặn cửa sổ console hiện lên. Ngay sau đó, script Lua gọi GetConsoleWindow và ShowWindow(SW_HIDE) qua LuaJIT FFI như một lớp ẩn thứ hai. Từ góc nhìn nạn nhân, không có gì xảy ra trên màn hình.
:: Mẫu cấu trúc batch launcher một dòng
start "" luajit.exe userdata.txt
Phân tích kỹ thuật: SmartLoader
Script Lua là một single-line file kích thước khoảng 296 đến 309 KB, obfuscate bằng Prometheus với hằng số bị mask bằng phép toán, chuỗi được mã hóa, định danh ngẫu nhiên và một dispatcher kiểu máy ảo. Thiết kế này nhắm thẳng vào static analysis và làm khó researcher.
Điểm cốt lõi của SmartLoader là việc lạm dụng LuaJIT FFI để gọi trực tiếp Windows API từ Lua. Ngay đầu execution, nó load ffi và khai báo một loạt struct và prototype native, cho phép script truy cập memory management, process control, windowing và graphics API mà không cần component native nào khác trên đĩa. Đây là lý do file trên ổ cứng chỉ là một file text vô hại cho đến khi LuaJIT biên dịch và chạy nó. Antivirus quét đĩa không thấy gì để flag.
Sau khi ẩn cửa sổ, SmartLoader thực hiện anti-debug check bằng native shellcode copy vào vùng nhớ executable, sau đó fingerprint host và chụp screenshot qua pipeline GDI.
EtherHiding: C2 nằm trên blockchain
Thay vì hardcode IP hay domain mà defender có thể block, SmartLoader phân giải C2 hiện hành bằng cách gọi một getter function trên smart contract Polygon Mainnet qua JSON-RPC eth_call tới polygon[.]drpc[.]org. Contract trả về chuỗi encode chứa URL C2 hiện tại, loader decode để lấy IP đích.
Đây là kỹ thuật EtherHiding, dùng blockchain làm dead drop resolver. Hệ quả với defender rất cụ thể: muốn rotate hạ tầng, operator chỉ cần gửi một transaction on-chain để cập nhật IP lưu trong contract. Không cần rebuild loader, không cần đụng đến bất kỳ mẫu đã deploy nào. Takedown theo kiểu seize domain hay sinkhole gần như vô hiệu.
Theo derp.ca, contract V1 ở địa chỉ 0xd68910ED4D4A5A9bAdF9ec95604CAE0f3378479B được funding từ ví 0xF9Bd8BAD6DEB8706f63c16485F7209B8362529eA. Cadence rotate trung bình 5,5 ngày trong giai đoạn iterate ban đầu, sau đó ổn định ở mức 15 ngày từ tháng 6/2025. Một contract V1 thay thế (0x2cbd2464dd749f5c0034fc9cddc6db2d53dea400) trả về cứng 158[.]78[.]56[.]52 và không bao giờ cập nhật.
C2 communication và persistence
Sau khi phân giải được server, SmartLoader gửi request multipart/form-data POST tới /api/<victim_id> trên IP trần, mang theo metadata host và artifact thu thập như screenshot. Server trả về tasking đã mã hóa.
Persistence được thiết lập qua hai scheduled task đặt tên giả dạng thành phần hệ thống, ví dụ AudioManager_ODM3 và OfficeClickToRunTask_7d7757, trỏ tới binary và stage Lua lưu dưới %LOCALAPPDATA%. Hai task này có đường phục hồi độc lập nhau. Một task chạy bản Lua stage đã cache cục bộ để sống sót khi repo GitHub gốc bị gỡ. Task còn lại tải lại stage mã hóa mới từ một repository GitHub khác mỗi lần chạy để phục hồi khi bị dọn cục bộ. Thiết kế song song này đảm bảo malware vẫn tồn tại kể cả khi một đường bị chặn.
StealC: payload cuối, nạp thẳng trong bộ nhớ
SmartLoader chứa sẵn các struct và execution primitive cần thiết để decrypt và load PE payload trực tiếp trong bộ nhớ. Cùng staging repository từng host một mẫu StealC đã mã hóa. Theo tổng hợp của byteiota, chuỗi giải mã gồm bốn lớp: hex, XOR, base64url và AES-ECB, không ghi file nào ra đĩa. Antivirus truyền thống không thấy gì để quét.
StealC thu thập credential, khóa ví crypto, session token trình duyệt, cookie, lịch sử duyệt web, tài khoản email, dữ liệu Steam, Discord, Telegram. Biến thể sớm hơn do Trend Micro phân tích trong AI-Assisted Fake GitHub Repositories Fuel SmartLoader and LummaStealer Distribution dùng LummaStealer thay cho StealC, cho thấy phần loader ổn định còn payload cuối thì có thể hoán đổi.
MITRE ATT&CK Mapping
| Tactic | Technique ID | Technique | Triển khai trong chiến dịch |
|---|---|---|---|
| Resource Development | T1608.001 | Stage Capabilities: Upload Malware | ZIP chứa malware nhúng sâu trong cây thư mục repo |
| Resource Development | T1583.006 | Acquire Infrastructure: Web Services | Lạm dụng GitHub làm kênh phát tán và staging |
| Initial Access | T1195.002 | Supply Chain Compromise: Software Supply Chain | Clone repo mã nguồn mở, chèn link payload |
| Execution | T1204.002 | User Execution: Malicious File | Nạn nhân giải nén ZIP và chạy batch launcher |
| Execution | T1059.003 | Command and Scripting Interpreter: Windows Command Shell | Batch dùng start chạy LuaJIT |
| Defense Evasion | T1027 | Obfuscated Files or Information | Script Lua obfuscate bằng Prometheus |
| Defense Evasion | T1564.003 | Hide Artifacts: Hidden Window | GUI subsystem flag + ShowWindow(SW_HIDE) |
| Defense Evasion | T1497 | Virtualization/Sandbox Evasion | Anti-debug check bằng native shellcode |
| Defense Evasion | T1620 | Reflective Code Loading | Nạp StealC PE thẳng trong bộ nhớ, không ghi đĩa |
| Command and Control | T1102.001 | Web Service: Dead Drop Resolver | Smart contract Polygon trả về IP C2 (EtherHiding) |
| Command and Control | T1102 | Web Service | Tải stage thứ hai từ repo GitHub dead drop |
| Persistence | T1053.005 | Scheduled Task/Job: Scheduled Task | Hai task giả dạng thành phần hệ thống |
| Discovery | T1082 | System Information Discovery | Fingerprint host |
| Collection | T1113 | Screen Capture | Chụp màn hình qua GDI |
| Credential Access | T1555 | Credentials from Password Stores | StealC thu thập credential trình duyệt |
| Credential Access | T1539 | Steal Web Session Cookie | StealC lấy session token và cookie |
| Exfiltration | T1041 | Exfiltration Over C2 Channel | POST multipart tới IP trần |
Detection
Ưu tiên các signal sớm trong kill chain và có false positive thấp. Thứ tự dưới đây đi từ hành vi đặc trưng nhất.
Splunk: LuaJIT chưa ký chạy từ thư mục người dùng
Tín hiệu mạnh nhất là một binary LuaJIT chưa ký được khởi chạy bởi batch hoặc cmd, với tham số là file .txt hoặc .log, từ thư mục có thể ghi như Downloads hay %TEMP%. Yêu cầu dữ liệu process creation có command line (Sysmon EventID 1 hoặc Windows 4688 đã bật command line logging).
index=endpoint (source="*Sysmon*" EventCode=1)
| where (match(ParentImage, "(?i)\\\\(cmd|conhost)\\.exe$") OR match(ParentCommandLine, "(?i)\\bstart\\b"))
| where match(Image, "(?i)\\\\[^\\\\]+\\.exe$")
| where match(CommandLine, "(?i)\\.(txt|log|cso)\\b")
| where match(Image, "(?i)\\\\(Users|Downloads|Temp|AppData)\\\\")
| stats count min(_time) as firstSeen by host, User, ParentImage, Image, CommandLine
| sort - count
Lưu ý false positive: một số phần mềm hợp pháp cũng truyền file .log cho process. Lọc thêm theo việc binary không có chữ ký số và không có version metadata, hai đặc điểm mà mọi mẫu LuaJIT trong chiến dịch đều chia sẻ.
Splunk: JSON-RPC tới Polygon từ tiến trình không phải trình duyệt
Đây là indicator gần như không có nhiễu nếu môi trường của bạn không có developer làm việc với blockchain. Một tiến trình không phải trình duyệt gọi ra polygon[.]drpc[.]org chính là hành vi dead drop resolver.
index=network (sourcetype=*dns* OR sourcetype=*proxy* OR source="*Sysmon*" EventCode=22)
| rex field=QueryName "(?i)(?<rpc_host>polygon\.drpc\.org|.*\.drpc\.org)"
| where isnotnull(rpc_host)
| where NOT match(Image, "(?i)\\\\(chrome|firefox|msedge|brave|opera)\\.exe$")
| stats count values(Image) as proc by host, QueryName
| sort - count
Splunk: scheduled task giả dạng thành phần hệ thống
index=endpoint (source="*Sysmon*" EventCode=1) (Image="*schtasks.exe" OR CommandLine="*schtasks*")
| where match(CommandLine, "(?i)(AudioManager_|OfficeClickToRunTask_)")
| stats count values(CommandLine) as cmd by host, User
Tên task trong chiến dịch có hậu tố ngẫu nhiên, nên nên truy vết theo tiền tố và theo việc task trỏ tới binary dưới %LOCALAPPDATA% thay vì khớp đúng chuỗi.
Carbon Black EDR: chuỗi cha-con và DLL load
Truy vết batch hoặc cmd sinh ra LuaJIT, và lua51.dll được load từ thư mục người dùng.
parent_name:cmd.exe process_name:luajit.exe
modload:lua51.dll -modload:c:\windows\* -modload:c:\program files\*
Truy vết kết nối ra Polygon RPC từ tiến trình không phải trình duyệt, dùng phủ định từng field riêng lẻ:
domain:polygon.drpc.org -process_name:chrome.exe -process_name:firefox.exe -process_name:msedge.exe
Hunting trên GitHub: script của Orchid
Orchid đã public bộ script Git Malware Finder và danh sách đầy đủ repository trên GitHub. Đội bảo mật có thể chạy lại script này để quét repository khớp pattern, hoặc dùng chính search query mà rushter.com chỉ ra: tìm repository có README chứa link tới file ZIP dạng software-v.*.zip. Đây là cách phát hiện ở phía nguồn, trước khi bất kỳ developer nào trong tổ chức kịp tải về.
Nhận định
Điều khiến chiến dịch này đáng chú ý không phải độ tinh vi của malware. SmartLoader dùng các kỹ thuật đã biết: LuaJIT FFI, EtherHiding, in-memory PE loading. Cái đáng chú ý là mô hình vận hành. Đây là malware-as-a-service được công nghiệp hóa, với phần loader ổn định qua 16 thế hệ obfuscator và phần payload cuối hoán đổi được giữa StealC, LummaStealer hay bất kỳ stealer nào operator muốn deploy. Khoảng cách giữa 109 repository mà Hexastrike thấy và 10.000 repository mà Orchid map được cho thấy chúng ta đã đánh giá thấp quy mô thực tế một cách hệ thống.
Có hai điểm liên quan trực tiếp đến bối cảnh Việt Nam và xu hướng hiện tại.
Thứ nhất là attribution. derp.ca đánh giá operator là người nói tiếng Việt, dựa trên dấu vết hạ tầng và pattern vận hành. Đây là đánh giá của một researcher độc lập với confidence ở mức vừa phải, chưa được vendor lớn xác nhận chéo, nên cần đọc với sự thận trọng tương ứng. Nhưng nó là lời nhắc rằng threat actor vận hành ở quy mô này hoàn toàn có thể đến từ khu vực, và các tổ chức trong nước không nên mặc định mình ngoài tầm ngắm.
Thứ hai, và quan trọng hơn về dài hạn, là việc chiến dịch nhắm vào AI coding agent. Như byteiota và Cybernews chỉ ra, các agent như Cursor, GitHub Copilot, Claude Code và Gemini CLI ngày càng kéo context trực tiếp từ repository GitHub công khai. Khi bạn nhờ agent tích hợp một thư viện, nó có thể search GitHub để tìm ví dụ sử dụng. Nếu một bản clone độc hại đang xếp hạng cao hơn dự án gốc trong kết quả tìm kiếm, agent fetch từ bản clone mà không phân biệt được. Hexastrike còn ghi nhận một biến thể SmartLoader nhắm vào bản clone của Oura MCP Server, cho thấy operator đang theo dõi sát không gian MCP và AI tooling.
Đây là một sự dịch chuyển đáng kể của mô hình mối đe dọa. SEO poisoning cổ điển nhắm vào con người, vốn còn có khả năng nghi ngờ một download button quá nổi bật hay một README bị viết lại. Một agent thì không có trực giác đó. Với đội ngũ đang xây dựng workflow agentic, điều cần thay đổi sau khi đọc bài này là: context mà agent kéo về từ nguồn công khai phải được coi là untrusted input, và mọi artifact mà agent đề xuất tải hoặc chạy đều cần một lớp xác minh độc lập trước khi chạm vào endpoint.
Khuyến nghị
Chặn truy cập tới các blockchain RPC endpoint như polygon[.]drpc[.]org từ các hệ thống không phải developer làm việc với blockchain. Truy vết retro các kết nối JSON-RPC tới Polygon từ tiến trình không phải trình duyệt trong 90 ngày. Chặn các IP C2 đã xác nhận tại firewall và proxy.
Triển khai các detection query ở phần trên vào Splunk và Carbon Black. Chặn binary interpreter chưa ký chạy từ thư mục người dùng thông qua application allowlisting. Cảnh báo developer trong tổ chức về pattern repository giả mạo, cụ thể là README mới cập nhật trên codebase cũ, commit chỉ mang message "Update README.md", và link ZIP trong README thay vì GitHub release chính thức. Nhắc nhở rằng submit link ZIP lên VirusTotal là không đủ, phải upload chính file ZIP.
Coi mọi context mà AI coding agent kéo từ GitHub công khai là untrusted, và thêm một bước xác minh nguồn trước khi agent được phép tải hoặc thực thi bất kỳ artifact nào. Siết kiểm soát cài đặt browser extension không quản lý. Với developer endpoint, ưu tiên tải dependency từ release chính thức có ký số thay vì ZIP nằm trong cây thư mục repo. Cập nhật threat model để bao gồm kịch bản agent tự động fetch và chạy code từ nguồn bị poison.
Indicators of Compromise
# Smart contract C2 resolver (Polygon Mainnet) - EtherHiding
0xd68910ED4D4A5A9bAdF9ec95604CAE0f3378479B # contract V1
0x2cbd2464dd749f5c0034fc9cddc6db2d53dea400 # contract V1 thay thế, trả về 158.78.56.52
0xF9Bd8BAD6DEB8706f63c16485F7209B8362529eA # ví funding contract V1
# Blockchain RPC endpoint (defanged)
polygon[.]drpc[.]org # JSON-RPC eth_call dead drop resolver
# C2 / domain lịch sử (defanged)
158[.]78[.]56[.]52 # C2 IP trần
77[.]105[.]164[.]45 # IP từng là A record của aproxy.app
aproxy[.]app # domain C2 giai đoạn đầu (đã bỏ)
layer1[.]icu # domain C2 giai đoạn đầu (đã bỏ)
# File hash - lua51.dll runtime (theo intellibron, single source, cần verify)
4ebd617a3ad9a9619172bd14a902a400 # MD5, lua51.dll
c7a657af5455812fb215a8888b7e3fd8fa1ba27672a3ed9021eb6004eff271ac # SHA256, lua51.dll
# Host artifact - scheduled task
AudioManager_ODM3 # tên có hậu tố ngẫu nhiên, truy vết theo tiền tố
OfficeClickToRunTask_7d7757 # tên có hậu tố ngẫu nhiên, truy vết theo tiền tố
# File trong ZIP payload
Application.cmd / Launcher.cmd # batch launcher
loader.exe / luajit.exe # LuaJIT 2.1.0-beta3, chưa ký, không version metadata
lua51.dll # runtime LuaJIT (biến thể bốn file)
*.cso / *.txt / *.log # script Lua obfuscate Prometheus, ~296-309 KB
# Behavioral IOC
# - Commit lặp lại mỗi vài giờ, chỉ sửa README, message "Update README.md"
# - Repository clone không phải fork, copy commit history và contributor
# - Link ZIP nhúng sâu trong cây thư mục, không phải GitHub release
# - VirusTotal: link sạch nhưng file ZIP bị flag Trojan
# Lưu ý: danh sách hash archive đầy đủ kèm link VirusTotal có trong nghiên cứu derp.ca.
# Danh sách repository đầy đủ có trong repo Git Malware Finder của Orchid.
Nguồn tham khảo:
I discovered a large-scale malware distribution on GitHub — Orchid Files
Massive GitHub Attack Injects Malware into 10,000 Compromised Repositories — GBHackers Security
Cloned, Loaded, and Stolen: How 109 Fake GitHub Repositories Delivered SmartLoader and StealC — Hexastrike Cybersecurity
FakeGit: LuaJIT malware distributed via GitHub at scale — Derp (derp.ca)
10,000 Trojan GitHub Repos Are Targeting AI Agents — Audit Your Dependencies Now — byteiota
One tech pro single-handedly mapped 10K malicious repos campaign on GitHub: AI agents targeted — Cybernews
AI-Assisted Fake GitHub Repositories Fuel SmartLoader and LummaStealer Distribution — Trend Micro





