# Khi Git Tag trở thành vũ khí: Cuộc tấn công khiến cộng đồng Laravel chấn động

## Tổng quan chiến dịch

Vào tối ngày 22/05/2026, tổ chức GitHub Laravel-Lang (dự án dịch thuật cộng đồng phổ biến trong hệ sinh thái PHP/Laravel) bị xâm nhập hạ tầng phát hành, dẫn đến chiến dịch đầu độc chuỗi cung ứng diện rộng. Kẻ tấn công đã thực hiện force-push ghi đè hơn 700 Git tag lịch sử thuộc 4 gói Composer phổ biến: `laravel-lang/lang`, `laravel-lang/http-statuses`, `laravel-lang/attributes` và `laravel-lang/actions`.

![](https://cdn.hashnode.com/uploads/covers/6777abffdb647396c7d71de4/51527d6f-b39e-4e08-87f0-b0f128b3eb01.png align="center")

Thay vì phát hành phiên bản mới, kẻ tấn công trỏ toàn bộ các thẻ phiên bản cũ về các commit độc hại nằm ở một kho lưu trữ fork (phân nhánh) riêng biệt. Khi lập trình viên hoặc hệ thống CI/CD chạy lệnh cập nhật thư viện, trình quản lý gói Composer tự động kéo về mã nguồn đã bị cài cắm mã độc PHP thu thập thông tin (InfoStealer). Độc tố này có khả năng vét sạch mọi cấu hình nhạy cảm gồm chìa khoá tài khoản đám mây (AWS, Azure, GCP), mã thông tin K8s, kho khoá HashiCorp Vault và mã bí mật CI/CD, sau đó mã hoá exfiltrate về máy chủ C2.

Do mức độ phổ biến cực kỳ cao của Laravel tại Việt Nam trong cả lĩnh vực gia công phần mềm (outsourcing) lẫn sản phẩm tự chủ (product), các doanh nghiệp sử dụng PHP cần lập tức kiểm tra tệp tin `composer.lock`, huỷ bỏ các phiên bản bị nhiễm độc và thực hiện xoay vòng toàn bộ các khoá bí mật trên môi trường phát triển lẫn production.

## **Timeline Sự kiện**

| **Thời gian (UTC)** | **Sự kiện** | **Chi tiết kỹ thuật** |
| --- | --- | --- |
| **22/05/2026 22:32** | Bắt đầu chiến dịch đầu độc | Kẻ tấn công chiếm quyền push-access của tổ chức Laravel-Lang và bắt đầu force-push tag độc hại đầu tiên nhắm vào gói `laravel-lang/lang`. |
| **22/05/2026 23:24** | Hoàn thành gói flagship | Tất cả 502 tag lịch sử của gói dịch thuật cốt lõi `laravel-lang/lang` bị chuyển hướng hoàn toàn sang các commit nhiễm độc. |
| **22/05/2026 23:25 - 00:00** | Mở rộng quy mô tấn công | Tiếp tục ghi đè tag hàng loạt trên 3 gói thư viện bổ sung: `http-statuses`, `attributes`, và `actions`. |
| **23/05/2026 00:00** | Kết thúc quá trình đầu độc | Hoàn thành việc force-push tag của gói `laravel-lang/actions`. Tất cả 4 kho lưu trữ đều trỏ tag cũ về fork độc hại. |
| **23/05/2026 00:17** | Detonation & Phân tích độc lập | StepSecurity kích hoạt thử nghiệm thành công mã độc trên runner Actions độc lập, ghi nhận toàn bộ luồng mạng và file hệ thống tạm. |
| **23/05/2026 08:00** | Cảnh báo cộng đồng | Socket và Aikido Security đồng loạt công bố báo cáo phân tích, chính thức cảnh báo cộng đồng phát triển Laravel toàn cầu. |

## Các phiên bản bị ảnh hưởng

| **Tên Gói (Package)** | **Quy Mô Ảnh Hưởng (Total Tags)** | **Phiên Bản / Ví Dụ Bị Đầu Độc** | **Mô Tả & Khoảng Thời Gian Đổi Tag (UTC)** |
| --- | --- | --- | --- |
| `laravel-lang/lang` | Tất cả 502 tags | `15.29.5`, `15.29.1`, `2.0.4`, `1.0.2`,... (bao gồm toàn bộ các dòng `12.x`, `13.x`, `14.x`, `15.x`) | Gói dịch thuật chính và lớn nhất của Laravel. Bị tấn công force-push từ **22:32 đến 23:24 UTC**. |
| `laravel-lang/http-statuses` | Toàn bộ từ `v1.0.0` đến `v3.4.5` | `v3.4.5`, `v3.4.0`, `v3.0.0`, `v2.0.0`, `v1.0.0`,... | Gói hỗ trợ hiển thị/dịch trạng thái mã HTTP. Bị force-push từ khoảng **23:25 đến 00:00 UTC**. |
| `laravel-lang/actions` | Tất cả 46 tags | `1.12.2`, `1.10.0`, `1.0.0`,... (từ `1.0.0` đến `1.12.2`) | Gói dịch thuật nút hành động. Bị force-push từ **23:25 đến 00:00 UTC** (kết thúc lúc 00:00 ngày 23/05). |
| `laravel-lang/attributes` | Tất cả 86 tags | `v2.4.1`, `2.6.0`, `2.5.0`,... | Gói dịch thuật thuộc tính validation của Laravel. Bị force-push từ khoảng **23:25 đến 23:50 UTC**. |

## **Phân tích Kỹ thuật Chi tiết**

### **Kỹ thuật Git Tag Poisoning (Đầu độc thẻ Git)**

Thông thường, các nhà phát triển tin tưởng rằng các phiên bản cũ đã được phát hành ổn định sẽ không bao giờ thay đổi mã nguồn. Tuy nhiên, Git cho phép force-push để cập nhật tag trỏ sang commit mới.

![](https://cdn.hashnode.com/uploads/covers/6777abffdb647396c7d71de4/91f72965-0630-4e23-b4e7-9f974181a8a5.png align="center")

Trong chiến dịch này, kẻ tấn công đã tinh vi khai thác một cơ chế đặc thù của GitHub: **cho phép một Git tag của repository chính trỏ thẳng tới một commit nằm trong repository fork của bên thứ ba**. Bằng cách trỏ các thẻ phiên bản (ví dụ: `v3.4.5`, `v1.0.2`, v.v.) về commit độc hại thuộc fork do kẻ tấn công kiểm soát, chúng hoàn toàn không cần thực hiện bất kỳ pull request hay sửa đổi trực tiếp nào trên các nhánh chính (`main`/`developer`) của Laravel-Lang.

Đối với trình quản lý gói Composer của PHP, khi lập trình viên yêu cầu một tag cụ thể, Composer sẽ tải gói zip tương ứng với commit được tag đó trỏ tới. Kết quả là ứng dụng của nạn nhân tải xuống mã nguồn độc hại mà hệ thống kiểm tra Git thông thường không hề báo động sự thay đổi trên nhánh chính.

### **Cơ chế Tự động Kích hoạt qua Autoloader**

Kẻ tấn công chèn tệp tin độc hại tại đường dẫn `src/helpers.php` và đăng ký nó trong tệp tin `composer.json` dưới khoá `autoload.files`:

![](https://cdn.hashnode.com/uploads/covers/6777abffdb647396c7d71de4/32e41a9a-2f10-465e-9034-156370815dcb.png align="center")

Trình quản lý Composer hỗ trợ ba cơ chế nạp tự động (autoload). Hai cơ chế nạp lớp (`psr-4` và `classmap`) hoạt động theo nguyên tắc lười biếng (lazy loading) – chỉ nạp tệp tin khi lớp đó được khởi tạo trong code. Ngược lại, cơ chế nạp tệp tin (`files`) hoạt động theo nguyên tắc nạp chủ động (eager loading) – tất cả các tệp tin khai báo trong danh sách sẽ được nạp thông qua lệnh `require` ngay khi tệp tin `vendor/autoload.php` được gọi.

Do mọi dự án Laravel hoặc Symfony đều khởi chạy bằng việc import `vendor/autoload.php` ngay tại điểm đầu vào (tệp `public/index.php` hoặc script khởi chạy CLI), mã độc chèn trong `helpers.php` sẽ tự động thực thi ngay lập tức khi ứng dụng boot mà không đòi hỏi bất kỳ sự tương tác nào từ lập trình viên.

### **Phân tích Payload Stage-1 (Dropper)**

Mã độc nằm trong `src/helpers.php` hoạt động rất tinh vi với các bước thực thi tuần tự nhằm trốn tránh hệ thống kiểm soát:

1.  **Giải mã C2 động:** Tên miền máy chủ điều khiển `flipboxstudio[.]info` được dựng động trong bộ nhớ bằng cách sử dụng mảng mã ASCII qua hàm `array_map('chr', [...])`. Kỹ thuật này giúp vượt qua các bộ quét tĩnh dựa trên từ khoá (YARA hoặc regex tĩnh).
    
2.  **Bypass TLS và Tải Stage-2:** Script gọi cURL để tải xuống payload từ địa chỉ [`https://flipboxstudio[.]info/payload`](https://flipboxstudio[.]info/payload). Để đảm bảo payload tải xuống thành công trong mọi môi trường (kể cả môi trường mạng nội bộ đang thực hiện giám sát hoặc giải mã SSL/TLS), kẻ tấn công cấu hình cURL bỏ qua xác thực chứng chỉ TLS (`CURLOPT_SSL_VERIFYPEER = 0` và `CURLOPT_SSL_VERIFYHOST = 0`).
    
3.  **Chạy ngầm (Background Detachment):** Payload tải về được ghi vào thư mục tạm của hệ thống dưới dạng tệp tin ẩn (ví dụ: `/tmp/.laravel_locale/<12_hex_chars>.php`). Dropper kích hoạt tệp tin này bằng cách chạy lệnh hệ thống ngầm tách biệt (`php /tmp/.laravel_locale/xxx.php > /dev/null 2>&1 &` trên Linux, hoặc sử dụng đối tượng [`WScript.Shell`](http://WScript.Shell) trên Windows). Kỹ thuật này đảm bảo tiến trình độc hại tồn tại độc lập ngay cả khi luồng xử lý web chính của PHP kết thúc.
    
4.  **Tự xoá dấu vết (Anti-Forensics):** Chỉ trong vòng 3 giây kể từ khi chạy, mã độc tự phát lệnh xóa tệp tin loader vừa tạo và tệp tin thực thi ELF liên quan để không để lại dấu vết vật lý trên ổ đĩa cứng, gây khó khăn lớn cho công tác phân tích sau sự cố.
    

### **Phân tích Payload Stage-2 (Stealer Framework "DebugElevator")**

Khi được nạp vào bộ nhớ dưới dạng tiến trình độc lập reparent về `init` (ppid=1), payload thứ hai khởi tạo lớp `Stealer` chứa cấu trúc cực kỳ quy mô với 17 mô-đun thu thập dữ liệu ("Collectors"). Dữ liệu sau khi thu thập được mã hóa XOR bằng khoá cứng `k9X2mP7vL4nQ8wR1` trước khi gửi về [`https://flipboxstudio[.]info/exfil`](https://flipboxstudio[.]info/exfil).

Hành vi chi tiết của các Collectors nổi bật bao gồm:

*   **Cloud & AWS Collector:** Truy vấn trực tiếp địa chỉ Cloud Metadata Service (EC2 IMDS tại `169.254.169.254`) để đánh cắp IAM roles và instance identity. Nó cũng quét các tệp tin cấu hình cục bộ của Azure, Google Cloud (`gcloud`), DigitalOcean, Heroku, Netlify và Vercel.
    
*   **Kubernetes Collector:** Tìm kiếm và lấy cắp các token dịch vụ Kubernetes (`Kubernetes Service Account tokens`) tại `/var/run/secrets/kubernetes.io/serviceaccount/token` và các tệp cấu hình local `kubeconfig`.
    
*   **HashiCorp Vault Collector:** Quét tìm Vault token trong môi trường hệ thống, tự động thực hiện truy vấn đệ quy đến API của Vault để kết xuất toàn bộ kho khoá Key-Value.
    
*   **CI/CD Collector:** Đọc toàn bộ tệp cấu hình máy chủ build Jenkins (gồm cả khoá mã hoá `master.key` và `credentials.xml`), GitLab Runners, GitHub Actions, CircleCI và TravisCI.
    
*   **Browser Collector & Windows Decryptor:** Lấy cắp cookies, lịch sử và thông tin đăng nhập của Chrome, Edge, Firefox, Brave, Opera. Để đối phó với cơ chế bảo vệ App-Bound Encryption mới được Google áp dụng từ Chrome v127+, mã độc giải phóng một tệp Windows PE nhúng sẵn tên là `DebugChromium.exe`. Tệp này sẽ chạy dưới quyền của người dùng để tương tác với dịch vụ hệ thống của Windows, trích xuất khoá giải mã Master Key và giải mã toàn bộ mật khẩu. Firefox được giải mã trực tiếp thông qua thư viện NSS.
    
*   **VPN & Credentials Collector:** Thu thập tệp cấu hình VPN (`.ovpn`, `.conf`) của OpenVPN, WireGuard và các dịch vụ thương mại như NordVPN, ExpressVPN. Quét toàn bộ máy tìm tệp `.env`, SSH private keys, và tệp cấu hình Git để lấy thông tin xác thực GitHub/GitLab.
    

## Tóm tắt ảnh hưởng

### Đối với lập trình viên

Các máy tính của lập trình viên là mục tiêu ưu tiên hàng đầu vì thường chứa nhiều thông tin xác thực quan trọng. Malware có khả năng tìm kiếm và đánh cắp:

*   SSH Private Keys
    
*   GitHub Personal Access Tokens
    
*   GitLab Access Tokens
    
*   Docker Credentials
    
*   AWS CLI Credentials
    
*   Azure Credentials
    
*   Google Cloud Credentials
    
*   File `.env` chứa secrets của dự án
    

### Đối với hệ thống CI/CD

Các máy chủ CI/CD thường chứa nhiều secrets có quyền cao hơn cả tài khoản lập trình viên. Payload được phát hiện có khả năng thu thập:

*   GitHub Actions Secrets
    
*   GitLab CI/CD Variables
    
*   Jenkins Credentials
    
*   Container Registry Credentials
    
*   Deployment Tokens
    

Điều này cho phép attacker mở rộng phạm vi xâm nhập từ một package bị nhiễm sang toàn bộ quy trình phát triển phần mềm của doanh nghiệp.

### Đối với môi trường Cloud và Kubernetes

Một trong những hành vi đáng chú ý nhất là malware cố gắng truy cập địa chỉ metadata service: 169.254.169.254 - Đây là địa chỉ được sử dụng bởi AWS, Azure và nhiều nền tảng cloud khác để cung cấp thông tin xác thực tạm thời cho máy chủ.

Ngoài ra malware còn tìm kiếm:

*   Kubernetes Service Account Tokens
    
*   kubeconfig files
    
*   Kubernetes Secrets
    
*   Cluster Credentials
    

Nếu các thông tin này bị đánh cắp, attacker có thể chiếm quyền kiểm soát toàn bộ cluster Kubernetes hoặc tài nguyên cloud liên quan.

### Đối với người dùng cuối

Trong trường hợp mã độc được thực thi trên máy trạm hoặc môi trường desktop, payload có khả năng truy cập:

*   Browser Cookies
    
*   Session Tokens
    
*   Saved Passwords
    
*   Cryptocurrency Wallets
    
*   Application Authentication Tokens
    

Điều này có thể dẫn đến việc chiếm quyền tài khoản hoặc đánh cắp dữ liệu cá nhân.

## IOCs

### **Network Indicators**

*   https://flipboxstudio\[.\]info/payload
    
*   https://flipboxstudio\[.\]info/exfil
    
*   169.254.169.254
    

### **Host-based Indicators**

*   /tmp/.laravel\_locale/
    
*   /tmp/.laravel\_locale/\[12\_hex\_characters\].php
    
*   /tmp/.\[8\_hex\_characters\]
    
*   DebugChromium.exe
    

## **MITRE ATT&CK (MITRE ATT&CK Mapping)**

| **Tactic** | **Technique ID** | **Technique Name** | **Mô tả trong Chiến dịch** |
| --- | --- | --- | --- |
| **Initial Access** | T1195.002 | Supply Chain Compromise: Compromise Software Dependencies | Đầu độc Git tag trỏ sang commit fork của 4 gói Laravel-Lang trên Packagist. |
| **Execution** | T1059.008 | Command and Scripting Interpreter: Network Shell / Scripting | Thực thi mã độc tự động thông qua Composer Eager Autoloader (`autoload.files`). |
| **Defense Evasion** | T1027 | Obfuscated Files or Information | Dựng ngược tên miền C2 trong bộ nhớ bằng mảng ASCII để tránh chữ ký quét tĩnh. |
|  | T1070.004 | Indicator Removal: File Deletion | Tự động xoá tệp tin loader php và binary ELF trong `/tmp` sau 3 giây. |
| **Credential Access** | T1555 | Credentials from Password Stores | Thu thập mật khẩu từ các trình duyệt Chromium và Firefox. |
|  | T1552.001 | Unsecured Credentials: Credentials In Files | Quét ổ đĩa để tìm kiếm SSH private keys, file `.env`, tệp tin cấu hình Kubernetes. |
| **Command & Control** | T1071.001 | Application Layer Protocol: Web Protocols | Sử dụng cURL gửi yêu cầu HTTP/HTTPS vượt tường lửa để tải payload và đẩy dữ liệu. |
| **Exfiltration** | T1048.003 | Exfiltration Over Alternative Protocol: Exfiltration Over Unencrypted/Encrypted Non-Attribution Channel | Mã hoá XOR dữ liệu nhạy cảm thu thập được và đẩy về địa chỉ `/exfil` của C2. |

## **Nhận định Chuyên môn**

Từ góc nhìn vận hành Trung tâm Giám sát An ninh mạng (SOC), chúng tôi đánh giá chiến dịch này có độ tinh vi kỹ thuật rất cao. Kẻ tấn công không lựa chọn cách thức truyền thống là chèn code trực tiếp vào nhánh chính (vốn dễ bị phát hiện bởi cơ chế kiểm soát mã nguồn và kiểm thử tự động của dự án). Việc sử dụng Git Tag Poisoning trỏ chéo commit sang repository fork cho thấy kẻ tấn công hiểu rất rõ cách hoạt động của hạ tầng GitHub và Composer Packagist.

Tại thị trường Việt Nam, PHP nói chung và Laravel nói riêng chiếm thị phần áp đảo trong phát triển ứng dụng Web, đặc biệt là các dự án outsource cho thị trường Nhật Bản, Hàn Quốc và Châu Âu. Việc sử dụng các gói ngôn ngữ bản địa như `laravel-lang` là bắt buộc đối với hầu hết hệ thống.

Thói quen lưu trữ trực tiếp các khoá API đám mây (AWS, GCP), mật khẩu database có quyền hạn quản trị tối cao (`root`/`admin`) bên trong tệp tin `.env` trên máy tính cá nhân của lập trình viên là cực kỳ phổ biến. Do đó, một khi máy phát triển hoặc server staging chạy lệnh `composer update` trúng phải tag nhiễm độc trong khung giờ từ đêm 22/05 đến ngày 23/05/2026, toàn bộ tài nguyên số của doanh nghiệp xem như đã mở toang cho kẻ tấn công.

## Khuyến nghị

### **Khẩn cấp (Mục tiêu 0 - 24 giờ)**

1.  **Kiểm tra khóa phiên bản:** Rà soát ngay lập tức tệp tin `composer.lock`. Nếu tệp tin này được cập nhật hoặc khởi tạo lại trong khoảng thời gian từ **22:32 UTC ngày 22/05/2026** trở đi, hãy đối chiếu mã hash commit của các gói `laravel-lang` với danh sách commit độc hại đã liệt kê ở phần IOC.
    
2.  **Cố định commit an toàn:** Nếu bắt buộc phải dùng gói dịch thuật, hãy trỏ cấu hình trong `composer.json` về mã hash commit cụ thể từ trước ngày 22/05/2026 (ví dụ dùng Git commit SHA thay vì thẻ phiên bản động).
    
3.  **Xoay vòng thông tin xác thực:** Nếu phát hiện hệ thống đã cài đặt phiên bản độc hại, hãy lập tức coi như môi trường đã bị thoả hiệp hoàn toàn. Thực hiện xoay vòng (revoke và sinh mới):
    
    *   Chìa khóa truy cập Cloud (AWS Access Key ID/Secret, Azure Service Principal, GCP Service Account).
        
    *   Mật khẩu database cấu hình trong `.env`.
        
    *   Token GitHub/GitLab dùng trong CI/CD.
        
    *   Khoá SSH dùng để truy cập máy chủ.
        

### **Ngắn hạn (Mục tiêu 1 - 7 ngày)**

1.  **Quét tìm dấu vết tiến trình:** Kích hoạt các tập lệnh giám sát tiến trình trên máy chủ production và máy phát triển. Quét tìm các tiến trình PHP hoặc tiến trình không tên có ID cha là `1` (`ppid=1`).
    
2.  **Cấu hình chặn mạng:** Tạo luật chặn trên tường lửa (Firewall) hoặc DNS Sinkhole toàn hệ thống đối với tên miền `flipboxstudio[.]info`.
    
3.  **Rà soát log CI/CD:** Kiểm tra log thực thi của các máy chủ chạy build (GitHub Actions runner, GitLab runner) để tìm kiếm các yêu cầu DNS lạ đi ra ngoài mạng internet.
    

### **Dài hạn**

1.  **Áp dụng Egress Filtering cho Runner:** Sử dụng các giải pháp kiểm soát lưu lượng đi ra cho CI/CD runner (ví dụ: StepSecurity Harden-Runner ở chế độ Block). Chỉ cho phép runner kết nối tới các địa chỉ tin cậy được định nghĩa trước (như [`github.com`](http://github.com), [`packagist.org`](http://packagist.org)).
    
2.  **Khoá cứng Lockfile:** Nghiêm cấm việc chạy trực tiếp lệnh `composer update` trên môi trường production. Môi trường production chỉ được phép chạy `composer install` dựa trên tệp `composer.lock` đã được rà soát và phê duyệt tại môi trường staging.
    
3.  **Cấu hình bảo vệ kho mã nguồn:** Đối với các nhà quản trị thư viện mở, bắt buộc kích hoạt xác thực 2 yếu tố (2FA), cấu hình luật bảo vệ tag (Tag protection rules) trên GitHub để ngăn chặn hành vi force-push ghi đè tag lịch sử.
    

## Tham khảo

[Malware Found in Laravel-Lang Composer Packages After Git Tag Poisoning Attack](https://securityaffairs.com/192697/security/malware-found-in-laravel-lang-composer-packages-after-git-tag-poisoning-attack.html)

[Laravel Lang Compromised with RCE Backdoor Across 700+ Versi...](https://socket.dev/blog/laravel-lang-compromise)

[Laravel-Lang Supply Chain Attack: Every Tag Across Multiple Composer Packages Rewritten to Steal CI Secrets - StepSecurity](https://www.stepsecurity.io/blog/laravel-lang-supply-chain-attack)
