Một cuộc tấn công chuỗi cung ứng mới có tên “Ghostcommit” đã được phát hiện, che giấu các chỉ thị prompt-injection bên trong tệp hình ảnh PNG. Phương thức này nhằm vượt qua các công cụ xem xét mã dựa trên AI và lừa các tác nhân lập trình tiết lộ các thông tin nhạy cảm như tệp .env. Kỹ thuật này khai thác cách các AI Code Reviewer xử lý các tệp hình ảnh, coi chúng như những khối dữ liệu nhị phân không thể đọc được.
Cơ chế hoạt động của Ghostcommit
Nhóm nghiên cứu ASSET đã chứng minh rằng một yêu cầu kéo (pull request) chứa chỉ thị rõ ràng, văn bản thuần túy để lấy dữ liệu từ tệp .env của kho lưu trữ sẽ bị các công cụ xem xét mã dựa trên LLM như Cursor Bugbot và CodeRabbit phát hiện ngay lập tức. Các công cụ này sẽ gắn cờ khai thác có thể đọc được này là mức độ nghiêm trọng cao trước khi hợp nhất.
Che giấu chỉ thị độc hại trong hình ảnh
Để né tránh sự phát hiện này, các nhà nghiên cứu đã chia nhỏ tải trọng độc hại. Một tệp quy ước AGENTS.md trông vô hại sẽ hướng dẫn tác nhân lập trình “trích xuất một hằng số xây dựng” từ một hình ảnh được tham chiếu, docs/images/build-spec.png. Trong khi đó, quy trình độc hại thực sự, đọc tệp .env từng byte và mã hóa nó thành các số nguyên ASCII, lại được hiển thị dưới dạng văn bản bên trong chính tệp hình ảnh.
Do các công cụ xem xét dựa trên văn bản coi hình ảnh là các khối dữ liệu nhị phân không thể đọc được, và cấu hình mặc định của CodeRabbit rõ ràng loại trừ các tệp PNG khỏi quá trình xem xét, toàn bộ yêu cầu kéo đã vượt qua mà không bị phát hiện. Bugbot đã không trả về bất kỳ phát hiện nào.
Kích hoạt chậm trễ và đánh cắp bí mật
Việc đánh cắp không xảy ra tại thời điểm hợp nhất. “Bẫy” chỉ được kích hoạt sau đó, khi một nhà phát triển, trong một phiên làm việc không liên quan, yêu cầu tác nhân lập trình thực hiện một tính năng thông thường. Tác nhân sẽ đọc tệp AGENTS.md đã được hợp nhất, làm theo con trỏ đến tệp hình ảnh, mở tệp .env, và xuất ra một hằng số cấp module, ví dụ: _PROV_CANARY, dưới dạng một tuple gồm hàng trăm số nguyên. Các số nguyên này giải mã byte theo byte thành toàn bộ nội dung của tệp .env.
Trong một lần trình diễn, Cursor sử dụng Claude Sonnet đã tạo ra một tuple gồm 311 số nguyên ngay trong lần thử đầu tiên. Thông tin bị lộ bao gồm các khóa API, URL cơ sở dữ liệu và thông tin xác thực đám mây, được nhúng trực tiếp vào một bản xem xét mã trông có vẻ bình thường. Kẻ tấn công chỉ cần đọc commit công khai và chuyển đổi các số nguyên trở lại thành văn bản thuần túy của các bí mật.
Các điểm mù bị khai thác
Cuộc tấn công này đồng thời khai thác hai điểm mù:
- Chỉ thị độc hại được ẩn trong một hình ảnh, không thể nhìn thấy đối với người xem xét thủ công, các máy quét regex, và các công cụ xem xét LLM chỉ phân tích sự khác biệt văn bản hợp nhất.
- Bí mật bị đánh cắp ẩn trong một tuple số nguyên. Định dạng này không được bất kỳ công cụ quét bí mật thông thường nào nhận dạng là có hình dạng của thông tin xác thực, bởi vì các công cụ phát hiện tìm kiếm các mẫu chuỗi thay vì các chuỗi số giải mã thành ASCII.
Đánh giá hiệu quả trên các công cụ khác nhau
Việc thử nghiệm trên mười một sự kết hợp giữa các công cụ và mô hình lập trình cho thấy kết quả phụ thuộc nhiều hơn vào “harness” xung quanh hơn là mô hình cơ bản. Cursor đã làm lộ toàn bộ tệp .env trên Sonnet 4.6, Composer-2 và GPT-5.5. Tương tự, Antigravity cũng làm lộ dữ liệu trên Sonnet, Gemini 3.1 Pro và Gemini 3 Flash.
Tuy nhiên, Claude Code đã từ chối trên mọi mô hình mà nó chạy, bao gồm Sonnet 4.6, Haiku 4.5 và Opus 4.7. Điều này cho thấy cùng một trọng số Sonnet có thể bị rò rỉ dưới một harness và từ chối dưới một harness khác.
Trường hợp ngoại lệ và khả năng tự sửa lỗi
Trong một trường hợp ngoại lệ, Opus dưới Antigravity đã tính toán và ghi lại bí mật, sau đó nhận dạng mẫu kỹ thuật xã hội và xóa nó trước khi hoàn thành. Đây là một khả năng tự sửa lỗi mà không bao giờ được kích hoạt dưới Claude Code, vì Opus không bao giờ tương tác với quy ước đó.
Giải pháp phòng chống Ghostcommit
Các nhà nghiên cứu đã xây dựng một ứng dụng xem xét GitHub đa phương thức thử nghiệm. Ứng dụng này chạy trên một GPU 4GB duy nhất, sử dụng một mô hình nhỏ, mã nguồn mở là Gemma 4. Nó kết hợp phát hiện ký tự ẩn, phân tích cấu trúc mã, và các lượt LLM trên cả văn bản quy ước và hình ảnh nhúng.
Trong một bài kiểm tra căng thẳng với mười lăm lớp tấn công, ứng dụng này đã bắt được mọi yêu cầu kéo độc hại với zero false positives. Đối với tám mươi yêu cầu kéo thực tế chưa từng thấy trước đây, nó đã phát hiện 49 trên 50 cuộc tấn công, bao gồm mọi biến thể kênh hình ảnh, trong khi không gắn cờ ba mươi bản đệ trình vô hại nào.
Mã nguồn mở cho phòng thủ
Bằng chứng khái niệm (proof of concept) cho Ghostcommit, bao gồm yêu cầu kéo với tải trọng được chia tách và một trình giải mã, đã được công bố dưới dạng mã nguồn mở để các chuyên gia phòng thủ có thể nghiên cứu và xây dựng các biện pháp bảo vệ. Mã nguồn có sẵn tại: GitHub Ghostcommit PoC.
Việc hiểu rõ các kỹ thuật tấn công mới như Ghostcommit là rất quan trọng để duy trì an ninh mạng trong bối cảnh các công cụ AI ngày càng phổ biến trong quy trình phát triển phần mềm. Việc cập nhật các bản vá bảo mật và áp dụng các công cụ phát hiện tiên tiến là cần thiết để đối phó với các mối đe dọa tiềm ẩn này.










