Tin tặc chiếm 1.900 tài khoản, nhắm 30.000 kho GitHub

GhostAction chiếm khoảng 1.900 tài khoản GitHub, chèn quy trình độc hại vào hơn 30.000 kho mã và quét lịch sử Git để đánh cắp bí mật.

Lập trình viên làm việc trước màn hình chứa mã nguồn
Kho mã trở thành mục tiêu của GhostAction.

Chiến dịch GhostAction đã chiếm khoảng 1.900 tài khoản GitHub và chèn quy trình đánh cắp thông tin xác thực vào hơn 30.000 kho mã. Theo The New Stack, những kẻ tấn công dùng thông tin đăng nhập bị đánh cắp để sửa trực tiếp các tệp GitHub Actions. Sau đó, chúng quét cả lịch sử Git để tìm những bí mật đã bị xóa khỏi phiên bản mã hiện tại.

Phát hiện chính

GitGuardian cho biết đợt tấn công lớn nhất diễn ra ngày 8 và 9 tháng 10. Đợt này nhắm tới 3.174 bí mật của khoảng 3.000 người dùng và tổ chức. Mã độc được đưa vào 28.000 kho mã mới trong hai ngày. Tổng số thông tin xác thực thực sự tới tay kẻ tấn công vẫn chưa được xác định.

Lập trình viên kiểm tra mã nguồn trên màn hình
Kho mã bị nhắm tới trong chiến dịch.

Nội dung chiến dịch GhostAction

GhostAction không khai thác lỗ hổng trong GitHub Actions. Chiến dịch dùng thông tin đăng nhập của nhà phát triển để sửa quy trình, kích hoạt mã độc và lấy những bí mật mà quy trình có quyền đọc. Một số biến thể còn tải toàn bộ lịch sử Git để tìm khóa đã bị xóa khỏi nhánh hiện tại.

GhostAction dùng thông tin đăng nhập bị đánh cắp

Những kẻ đứng sau GhostAction dùng thông tin đăng nhập của nhà phát triển để sửa trực tiếp các tệp quy trình trong kho mã. Cách làm này khác với vụ tj-actions/changed-files, nơi một Action dùng chung bị đầu độc và ảnh hưởng tới hàng nghìn kho mã.

Nguồn gốc chính xác của thông tin đăng nhập vẫn chưa được xác nhận. Phân tích ngày 9 tháng 10 của StepSecurity chỉ ra một khả năng đáng chú ý. Đó là các mã truy cập cá nhân được lấy từ những tập dữ liệu thông tin xác thực bị rò rỉ.

Sau khi giành quyền truy cập, tin tặc tạo các tệp có tên giống một tác vụ bảo mật thông thường, chẳng hạn security-audit.yml hoặc github_actions_security.yml. Các tệp này gọi những bí mật vốn được bản dựng hợp lệ sử dụng. Khi tác vụ chạy, mã độc thu thập thông tin xác thực rồi gửi dữ liệu tới máy chủ do kẻ tấn công kiểm soát.

Kiểu xâm nhập này cho thấy quyền ghi vào kho mã cần được xem như quyền truy cập hạ tầng. Vấn đề cũng gần với rủi ro được nêu trong bài về lỗi chưa vá tại các công ty quy mô lớn: một điểm yếu tồn tại đủ lâu có thể gây tác động rộng hơn nhiều so với thành phần ban đầu.

GhostAction quét cả lịch sử Git để tìm bí mật đã xóa

Biến thể xuất hiện trong tháng 10 dùng actions/checkout@v4 với fetch-depth: 0 để tải toàn bộ lịch sử, sau đó quét cây làm việc và các lần ghi trước đó. Vì vậy, khóa đã bị xóa khỏi mã hiện tại vẫn có thể bị lấy nếu còn tồn tại trong lịch sử Git.

Theo GitGuardian, mục tiêu gồm khóa AWS, mã truy cập cá nhân của GitHub và GitLab, cùng khóa Google và Firebase. Danh sách còn có khóa giao diện lập trình ứng dụng của Anthropic, OpenAI và OpenRouter. Các phiên bản về sau thu thập những dòng nằm quanh kết quả tìm kiếm. Dữ liệu này giúp ghép mã định danh khóa AWS với khóa truy cập bí mật tương ứng.

Dữ liệu thu được được gửi qua giao thức HTTP tới địa chỉ 193.32.204.199. Phạm vi quét khiến việc xóa khóa khỏi phiên bản mã hiện tại không đủ để ngăn rò rỉ nếu khóa vẫn còn hiệu lực và xuất hiện trong các lần ghi cũ.

Nguy cơ này không chỉ liên quan đến thao tác thủ công của lập trình viên. Khi AI làm thay đổi hoạt động rà soát mã, tổ chức vẫn phải kiểm soát nguồn gốc thay đổi, quyền của tài khoản và những bí mật mà mỗi quy trình có thể đọc.

Đợt triển khai diễn ra theo nhiều giai đoạn

GhostAction được triển khai theo từng đợt thay vì đưa mã độc vào mọi kho cùng lúc. Trong báo cáo về GhostAction của GitGuardian, công ty viết: “Tải độc hại này được triển khai theo nhiều giai đoạn”.

Người làm việc với mã nguồn trên máy tính
GhostAction được triển khai qua nhiều đợt.

Đợt đầu nhắm tới khoảng 160 nạn nhân từng bị tấn công. Khoảng 20 phút sau, tin tặc mở rộng chiến dịch và đưa tệp độc hại vào 28.000 kho mã mới trong ngày 8 và 9 tháng 10.

GitGuardian đếm được 3.174 bí mật bị nhắm tới để trích xuất. Công ty cũng xác nhận một phần dữ liệu đã rời khỏi hệ thống trong chiến dịch tháng 10. Tuy nhiên, GitGuardian không xác định được có bao nhiêu thông tin xác thực riêng biệt thực sự tới tay kẻ tấn công. Vì vậy, tổng số thông tin bị đánh cắp vẫn chưa rõ.

GitHub chặn phần lớn quy trình độc hại

Cơ chế phê duyệt của GitHub đã ngăn phần lớn tác vụ độc hại trong các chiến dịch tháng 8 và tháng 9. GitGuardian ghi nhận 3.669 lượt chạy trên 605 kho mã. Chỉ 499 lượt được thực thi. Trong số đó, 336 lượt hoàn tất thành công và làm lộ 26 bí mật từ 13 kho mã.

GitGuardian phát hiện quy trình độc hại trong 772 kho mã công khai thuộc 373 người dùng và tổ chức. Dù phần lớn lượt chạy bị chặn, những kẻ tấn công vẫn tái sử dụng 92 quy trình cũ còn sót lại từ các đợt trước, trong đó có hạ tầng hoạt động từ tháng 9 năm 2025.

Việc dọn dẹp cũng diễn ra chậm. Theo GitGuardian, tính đến ngày 5 tháng 10, chỉ 16% số kho mã bị ảnh hưởng đã được xử lý, tương đương 124 trong tổng số 772 kho mã.

Thu hồi thông tin xác thực ngay cả khi đã xóa quy trình

Xóa tệp độc hại không loại bỏ rủi ro nếu tài khoản bị xâm nhập vẫn có quyền ghi hoặc khóa bị lộ vẫn còn hiệu lực. Các nhóm cần kiểm tra nhật ký kiểm toán, lịch sử chạy GitHub Actions và lịch sử Git, sau đó thu hồi hoặc luân chuyển mọi thông tin xác thực có khả năng đã bị truy cập.

Nhật ký kiểm toán GitHub và hoạt động của mã truy cập cá nhân có thể giúp xác định tài khoản nào đã sửa thư mục .github/workflows/. Lịch sử chạy GitHub Actions cho biết tác vụ nào đã thực thi và những bí mật nào tác vụ đó có thể truy cập.

Bất kỳ tài khoản bị xâm nhập nào vẫn có quyền ghi đều cần được thu hồi thông tin xác thực. Khóa đám mây, thông tin triển khai, mã truy cập kho lưu trữ gói và khóa giao diện lập trình ứng dụng của nhà cung cấp AI có khả năng bị lộ cũng phải được thu hồi hoặc luân chuyển.

Biện pháp này áp dụng cả với khóa đã bị xóa khỏi mã nguồn nhiều tháng trước. Nếu khóa vẫn còn hiệu lực khi GhostAction quét lịch sử Git, kẻ tấn công vẫn có thể thu thập và sử dụng nó. Các nhóm đang vận hành hạ tầng AI và hệ thống triển khai cần kiểm tra cả lịch sử kho mã, thay vì chỉ rà soát nhánh hiện tại.

Hãy rà soát quyền ghi, lịch sử GitHub Actions và vòng đời của mọi khóa còn hiệu lực trước khi coi kho mã đã được làm sạch.