SecLab
Supply Chain & IntegritywalkthroughĐộ khó 4/527 phút

Làm cứng pipeline CI — nơi có quyền cao nhất

Mục tiêu: Sau bài này bạn nhận ra ba cấu hình workflow cho phép một pull request từ fork lấy được secret của bạn.

A08:2025A03:2025SSDF PO.5SLSA
Bước 1 / 5 · read6 phút

CI là môi trường có quyền cao nhất mà không ai làm cứng

So sánh quyền, và đây là so sánh nên làm một lần rồi không quên:

Môi trườngQuyền điển hình
Tiến trình productionĐọc/ghi một cơ sở dữ liệu, gọi vài API. Least privilege, có người review kỹ
CI runnerToken repo, secret của mọi môi trường, quyền push image, quyền deploy

CI có quyền cao hơn production, và nó chạy code từ nhiều nguồn hơn: code của bạn, mọi action bạn uses, mọi package trong build, và — nếu cấu hình sai — code từ một pull request của người lạ.

Ba cấu hình sai, xếp theo mức nghiêm trọng:

(1) pull_request_target cộng checkout code của PR. Đây là lỗ hổng nghiêm trọng nhất trong CI của GitHub, và nó có tên riêng: pwn request. pull_request_target chạy workflow trong ngữ cảnh của repo gốc, nên nó có secret — khác pull_request chạy trong ngữ cảnh fork và không có secret. Nó tồn tại để một workflow gắn nhãn hay comment lên PR từ fork. Nhưng nếu bạn checkout code của PR trong đó, bạn vừa chạy code của người lạ với secret của mình.

(2) ${{ github.event.* }} nội suy vào một khối run. Tiêu đề PR, tên nhánh, thân comment — tất cả do người ngoài đặt, và tất cả được nội suy vào script shell trước khi shell chạy. Đây là command injection, đúng bài module 3, ở một chỗ có quyền deploy.

(3) permissions không khai, nên GITHUB_TOKEN có quyền mặc định của repo. Với nhiều repo cũ thì mặc định đó là write-all. Một action bị xâm nhập dùng token đó push được commit, tạo được release, sửa được workflow.

Điểm chung của cả ba: chúng đều là cấu hình, không phải code, nên chúng không xuất hiện trong code review thông thường và không có test nào bắt được.

Xem lộ trình

Bình luận

Tham gia thảo luận
Đăng ký để bình luận

Bình luận cần tài khoản đã hoàn thành ít nhất một bài học. Điều kiện đó là thứ giữ cho luồng thảo luận này còn đáng đọc: mỗi ý kiến gắn với một người có thể bị hỏi lại, và reputation tích luỹ theo thời gian.

Đăng kýĐăng nhập

Bạn vẫn đọc được toàn bộ bình luận dưới đây mà không cần tài khoản. Đăng nhập xong bạn sẽ quay lại đúng chỗ này, không phải đầu trang.

Đang tải bình luận…