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.
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.
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:
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:
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àmarray_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).Bypass TLS và Tải Stage-2: Script gọi cURL để tải xuống payload từ địa chỉ
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 = 0vàCURLOPT_SSL_VERIFYHOST = 0).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ượngWScript.Shelltrê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.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.
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/tokenvà các tệp cấu hình localkubeconfig.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.keyvà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
.envchứ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
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ờ)
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óilaravel-langvới danh sách commit độc hại đã liệt kê ở phần IOC.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.jsonvề 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).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)
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).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.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
Á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,packagist.org).Khoá cứng Lockfile: Nghiêm cấm việc chạy trực tiếp lệnh
composer updatetrên môi trường production. Môi trường production chỉ được phép chạycomposer installdựa trên tệpcomposer.lockđã được rà soát và phê duyệt tại môi trường staging.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
Laravel Lang Compromised with RCE Backdoor Across 700+ Versi...





