flawopen.com/Keamanan GitHub Actions/Injeksi skrip workflow
Bagaimana injeksi skrip GitHub Actions terjadi dan cara mencegahnya?
Workflow dapat mengubah data menjadi sintaks shell jika judul issue atau kolom pull request disisipkan ke skrip sebelum Bash berjalan. Ibarat pencetak tanda nama yang mengira nama sebagai instruksi. Kirim nilai lewat variabel lingkungan dan kutip ekspansinya saat dipakai sebagai data; Bash menerimanya terpisah dari skrip. Dampak bergantung pada token, secret, runner, dan pemicu.
${{ ... }} sebelum shell dimulai. Dalam run:, masukan dapat masuk ke sumber skrip.env: mengirim nilai sebagai data proses. Kutip ekspansi shell, hindari eval dan skrip dinamis.Akar masalah: data disisipkan sebelum shell mengurai skrip
GitHub memperluas ekspresi sebelum menjalankan shell untuk langkah run. Judul tak tepercaya yang disisipkan langsung dapat mengubah program shell. Nilai melalui env: terpisah dari teks skrip; jika dikutip, ia tetap menjadi argumen untuk perintah biasa. Penggunaan berikutnya dengan eval, interpreter lain, atau alat yang menafsirkan argumen sebagai kode tetap berbahaya. GitHub menganggap kolom peristiwa sebagai masukan yang mungkin dikendalikan penyerang.
# TIDAK AMAN: data peristiwa menjadi bagian skrip shell yang dibuat
name: Issue Triage
on:
issues:
types: [opened]
permissions:
contents: read
jobs:
triage:
runs-on: ubuntu-latest
steps:
- name: Print issue title
run: |
printf 'Title: %s\n' "${{ github.event.issue.title }}"
# Lebih aman: kirim nilai peristiwa melalui lingkungan
name: Issue Triage
on:
issues:
types: [opened]
permissions:
contents: read
jobs:
triage:
runs-on: ubuntu-latest
steps:
- name: Print issue title
env:
ISSUE_TITLE: ${{ github.event.issue.title }}
run: |
printf 'Title: %s\n' "$ISSUE_TITLE"
Ringkasan jalur serangan
Pengguna mengendalikan kolom peristiwa
Contohnya judul issue publik, judul pull request, atau nama branch menjadi masukan workflow.
Workflow menyisipkannya ke sumber shell
Ekspresi langsung ${{ github.event... }} di run: dievaluasi sebelum Bash mengurai skrip.
Shell menafsirkan program yang berubah
Jika nilai mengubah sintaks shell, perintah berjalan sebagai proses job. Jika tetap data dalam argumen berkutip, injeksi ini tidak terjadi.
Izin job menentukan dampak
Job yang disusupi hanya menjangkau sumber daya yang tersedia pada run itu: izin GITHUB_TOKEN, secret yang diberikan, dan runner. Tinjau pemicu issue serta pull_request_target.
Daftar periksa penguatan
- ✓Jangan sisipkan nilai
github.eventtak tepercaya langsung kerun:. Lewatkan melaluienv:dan kutip ekspansi seperti"$ISSUE_TITLE". - ✓Jauhkan nilai itu dari
eval, skrip buatan, string perintah shell, serta alat yang menafsirkan argumen sebagai kode atau opsi. - ✓Tetapkan
permissions:ketat pada workflow atau job dan beri hak tulis hanya kepada job yang memerlukannya. - ✓Anggap
pull_request_targetdanworkflow_runsebagai batas berhak tinggi. Jangan checkout, build, atau menjalankan kode maupun artefak PR tak tepercaya dalam konteks itu. - ✓Jangan tulis data multibaris tak tepercaya ke
GITHUB_ENVatauGITHUB_PATH. GitHub melarang penimpaanGITHUB_*danRUNNER_*, tetapi nilai lain dapat memengaruhi langkah lanjutan. - ✓Kunci action pihak ketiga ke SHA lengkap yang ditinjau, gunakan runner terisolasi sementara, dan aktifkan CodeQL untuk workflow Actions.
Sumber primer
- Dokumentasi GitHub — Injeksi skrip
- Dokumentasi GitHub — Referensi penggunaan aman
- Dokumentasi GitHub — Penggunaan pull_request_target yang aman
- Dokumentasi GitHub — Perintah workflow dan GITHUB_ENV
- Dokumentasi GitHub — Izin GITHUB_TOKEN