Skip to main content

Command Palette

Search for a command to run...

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

Updated
16 min read
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/attributeslaravel-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-4classmap) 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. Để đả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 = 0CURLOPT_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 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.

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.keycredentials.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

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, 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

Laravel Lang Compromised with RCE Backdoor Across 700+ Versi...

Laravel-Lang Supply Chain Attack: Every Tag Across Multiple Composer Packages Rewritten to Steal CI Secrets - StepSecurity