Rủi ro gốc: nội dung PR từ fork là code do người lạ viết. Nếu pipeline vừa chạy code đó vừa có secret và quyền ghi, người gửi PR có thể sửa script build để in secret hoặc push artifact độc hại.
Mô hình an toàn mặc định: với PR từ fork, workflow chạy ở ngữ cảnh chỉ đọc, không secret — đủ để lint/test, không đủ để deploy.
Cái bẫy kinh điển là dùng trigger loại chạy trong ngữ cảnh của repo đích (GitHub: pull_request_target; tương tự ở CI khác) rồi checkout code của PR:
yaml
on: pull_request_target # có secret + quyền ghi
jobs:
build:
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }} # nguy hiểm
- run: pnpm install && pnpm build # chạy script của người lạ, có secretMột postinstall trong package.json của PR là đủ để lấy toàn bộ secret.
Cách xử lý:
- Việc cần secret không được chạy chung job với code chưa tin cậy. Tách hai pha: job không đặc quyền build ra artifact → job đặc quyền chỉ tiêu thụ dữ liệu, không chạy script từ PR.
- Với
pull_request_target, chỉ dùng cho tác vụ không đụng code (dán nhãn, comment) và không checkout ref của PR. - Yêu cầu phê duyệt thủ công trước khi chạy workflow cho contributor lần đầu.
- Pin action theo commit SHA thay vì tag, và đặt
permissionstối thiểu cho từng job.