- GitHub Actions memiliki struktur untuk mendeklarasikan dan menjalankan dependensi paket melalui sintaks
uses:di file workflow, yang pada praktiknya berperan sebagai package manager - Namun, fitur dasar yang biasanya disediakan package manager lain seperti lockfile, hash integritas, pinning dependensi transitif, dan visibilitas pohon dependensi sama sekali tidak ada
- Hasil riset menunjukkan bahwa sebagian besar pengguna GitHub Actions menjalankan kode eksternal yang tidak terverifikasi, dan kerentanan injeksi kode ditemukan di ribuan workflow
- Meski GitHub telah memperkenalkan beberapa mitigasi (rilis immutable, kebijakan pinning SHA, dll.), masalah dependensi transitif dan reproduksibilitas masih belum terselesaikan
- Cacat struktural ini berdampak pada keamanan supply chain perangkat lunak secara luas, dan masalah yang sama juga menyebar ke sistem CI lain yang berbasis GitHub Actions
Struktur manajemen paket GitHub Actions dan masalahnya
- Sintaks seperti
uses: actions/checkout@v4adalah deklarasi dependensi, lalu GitHub menafsirkannya untuk mengunduh dan menjalankannya- Ini sama dengan perilaku package manager pada umumnya, tetapi tanpa lockfile, versi yang dipilih bisa berbeda di setiap eksekusi
- Dibandingkan dengan package manager lain (npm, Cargo, NuGet, dll.), Actions tidak memiliki lockfile, pinning transitif, verifikasi integritas, visibilitas pohon dependensi, maupun spesifikasi resolusi
- Ketiadaan lockfile adalah masalah inti, karena resolusi dependensi dapat berubah setiap kali dijalankan sehingga menghasilkan build yang non-deterministik
Hasil riset keamanan dan kerentanan
- Menurut riset USENIX Security 2022, 99,7% repository menjalankan Actions dari developer eksternal, 97% menggunakan pembuat yang tidak terverifikasi, dan 18% melewatkan pembaruan keamanan
- Riset lanjutan menemukan kerentanan injeksi kode di lebih dari 4.300 dari 2,7 juta workflow
- GitHub Actions tidak cukup menyediakan properti keamanan penting CI/CD seperti admittance control, execution control, code control, dan kontrol akses secrets
Cacat teknis utama
- Masalah versi yang dapat berubah: tag seperti
@v4bisa di-tag ulang oleh maintainer ke commit baru, sehingga kode bisa berubah diam-diam- Jika ada lockfile, tag tersebut bisa dicatat saat di-resolve ke SHA tertentu
- Ketidaktransparanan dependensi transitif: Action lain yang dipanggil di dalam Composite Action tidak terlihat dan tidak bisa dikendalikan
- Menurut riset, 54% JavaScript Actions mengandung kelemahan keamanan, dan sebagian besar berasal dari dependensi tidak langsung
- Dalam insiden
tj-actions/changed-files, serangan kebocoran secret terjadi melalui pembaruan dependensi transitif
- Tidak ada verifikasi integritas: npm atau Cargo mencatat hash untuk memverifikasi unduhan, sedangkan Actions hanya bergantung pada kepercayaan berbasis SHA
- Re-run tidak reproduktif: GitHub menyatakan bahwa “jika versi di-force push, maka versi terbaru akan diambil”, sehingga workflow yang sama pun bisa menjalankan kode berbeda
- Pohon dependensi tidak terlihat: tidak ada fitur seperti
npm lsataucargo tree, sehingga tidak ada cara untuk memeriksa keseluruhan struktur dependensi - Aturan resolusi tidak dibuka: resolusi dependensi di Actions tidak terdokumentasi, dan hanya ada logika unduh rekursif sederhana di kode
ActionManager.cs
Keterbatasan struktural tambahan
- Tidak ada registry terpusat: Actions berada di repository Git, sehingga tidak ada fitur pemindaian keamanan, deteksi malware, atau pencegahan typosquatting
- Masalah lingkungan bersama: beberapa Action memodifikasi
$PATHyang sama, sehingga hasil bisa berbeda tergantung urutan eksekusi - Tidak bisa dijalankan offline: harus diunduh dari GitHub setiap kali, sehingga tidak bisa dieksekusi tanpa jaringan
- Kerentanan namespace: username GitHub sekaligus menjadi namespace, sehingga rentan terhadap pengambilalihan akun atau serangan typo
- Jika ada lockfile dan hash integritas, perubahan kode bisa terdeteksi lewat kegagalan build
Latar belakang desain dan efek rambatnya
- Runner Actions awalnya berbasis Azure DevOps dan dirancang dengan asumsi lingkungan internal yang tepercaya
- Ketika GitHub memperluasnya menjadi marketplace publik, model kepercayaannya tidak didesain ulang
- Akibatnya, fitur dasar seperti lockfile, verifikasi integritas, pinning transitif, dan visibilitas dependensi tidak ikut tersedia
- Seiring meluasnya fitur deployment paket otomatis berbasis OIDC, celah keamanan di Actions mulai memengaruhi keamanan supply chain seluruh registry paket
- GitLab CI memperkenalkan keyword
integrityuntuk mendukung verifikasi hash, tetapi GitHub menutup permintaan serupa dengan status “tidak direncanakan” - Sistem CI yang kompatibel dengan GitHub seperti Forgejo Actions juga harus mempertahankan struktur yang sama, sehingga cacat ini menyebar ke seluruh ekosistem
Usulan perbaikan dan kondisi saat ini
- Komunitas meminta dukungan lockfile (issue #2195), tetapi GitHub menutupnya pada 2022 dengan status “tidak direncanakan”
- Riset Palo Alto membuktikan bahwa pinning SHA saja tidak cukup untuk melindungi dependensi transitif
- Beberapa tim menambal kekurangan ini dengan pembaruan Dependabot, vendoring repository sendiri, dan scanner keamanan zizmor
- Solusi mendasar adalah menghadirkan lockfile yang mencatat SHA dan hash integritas untuk semua Action serta dependensi transitifnya
- Selama GitHub tidak mengadopsinya, keandalan supply chain CI/CD tidak mungkin dijamin
2 komentar
Mungkin baru sadar setelah kena retas.
Opini Hacker News
Saya tidak ingin membela GHA (GitHub Actions), tetapi dokumentasinya memang menyatakan bahwa untuk stabilitas dan keamanan disarankan mengunci commit SHA
Ini bisa diterapkan sendiri seperti file lock, tetapi tidak sepenuhnya memadai karena transitive dependency tidak bisa dikendalikan
Pada akhirnya muncul beban untuk melacak patch keamanan dan memperbarui hash, dan tampaknya karena alasan ini penguncian berbasis hash tidak banyak dipakai
Sebagian besar pengguna tidak menyadari masalah ini, dan bahkan yang sadar pun hampir tidak pernah memakai SHA
Saya pribadi menyukai Actions dan memelihara beberapa di antaranya, tetapi jika melihat repositori publik, 90% memakai
@v1, 9% memakai@v1.2, dan hanya 1% yang memakai commit SHADengan sedikit investasi saja, GitHub seharusnya bisa membuat solusi file lock
Sering kali ada ketergantungan pada versi Node atau versi API tertentu, sehingga saya justru pernah merasa memakai @main lebih baik
Orang merasa mendapat “versi yang terkunci”, padahal sebenarnya tidak
Setelah dua kali mengalami masalah, saya sadar — file lock itu entah ada atau tidak ada
GitHub hampir tidak memelihara Actions buatannya sendiri, dan bahkan fungsi dasar pun akhirnya bergantung pada fork tidak resmi
Seluruh ekosistemnya terasa seperti dipertahankan dengan solusi sementara
Karena GitHub telah mengumumkan bahwa mereka memprioritaskan migrasi ke Azure dibanding pengembangan fitur
Artikel terkait
Perusahaan kecil kami pun membayar lebih dari 200 dolar per bulan
Ini tampaknya dianggap sebagai sumber pendapatan baru yang lebih penting daripada Windows
Mungkin para penulis aslinya sudah keluar dari perusahaan
Saya penasaran apakah ada yang pernah memakai ArgoCD sebagai pipeline CI
Saya rasa GHA adalah contoh kegagalan filosofi 'less is more'
Masalah terbesarnya adalah bahwa ini telah menjadi standar industri
Dengan sedikit investasi saja mereka bisa membuat CI yang jauh lebih baik, tetapi rasanya MS mengulangi kesalahan era IE6
Sekarang ada generasi engineer muda yang tidak punya pengalaman pembanding sehingga tidak menyadari keterbatasannya
Saya sedang berpikir menjalankan laptop pensiun sebagai server Woodpecker. Saya penasaran seperti apa CI yang benar-benar tidak dibenci orang
Dibanding itu, GHA terasa tidak memberi banyak nilai
Saya menentang ketika perusahaan hendak berpindah dari Jenkins/Ansible ke GHA, dan sekarang tampaknya itu keputusan yang tepat
CI selalu membawa beban pemeliharaan yang besar, dan lingkungan Mac khususnya masih sulit ditangani
Untuk pertanyaan, “Apakah Anda percaya GitHub memberikan kode SHA yang benar?”,
melihat kenyataan bahwa kebanyakan orang memakai GitHub-hosted runner, kalau Anda tidak bisa mempercayai itu maka sebenarnya sudah ada masalah yang lebih besar
Saya sempat berpikir bagaimana jika GitHub Actions memiliki arsitektur local-first, dengan dukungan locking berbasis Nix
cachix/cloud.devenv.sh
Banyak Actions pihak ketiga di dokumentasi atau contoh langsung merujuk ke branch master
Satu push berbahaya saja bisa memungkinkan kebocoran data di banyak repositori
Memakai tag pun bukan pertahanan sempurna karena tag bisa dipindahkan
Melihat empat properti keamanan inti CI/CD yang disebut para peneliti (autentikasi, eksekusi, kode, akses ke rahasia), saya jadi bertanya-tanya
Apakah CI/CD benar-benar perlu mengakses secrets?
Menurut saya cukup jika hanya punya izin untuk memanggil API
Sistem ideal seharusnya tidak menangani secrets secara langsung, melainkan memprosesnya secara tidak langsung melalui adaptor seperti secure enclave
Dalam kenyataannya, sebagian besar pelanggan tetap membutuhkan secrets
Platform setidaknya harus menyediakan mekanisme pengelolaan secrets yang aman
Terutama karena proyek open source ingin melakukan deploy langsung dari CI
Saya penasaran seperti apa tepatnya perbedaan dari “pendekatan secure enclave”
tetapi dalam kenyataan tiap lingkungan berbeda dan biaya implementasinya besar, sehingga kebanyakan akhirnya menetap pada pendekatan container + environment variable
Untuk mengotomatisasi pengujian seperti ini, secrets tidak terhindarkan
Jika file lock harus di-commit ke repositori, maka muncul masalah bootstrap pada saat pertama kali membuatnya
Untuk menyelesaikan ini, dibutuhkan kemampuan menjalankan Actions secara lokal
Ada alat seperti nektos/act, tetapi ini terutama untuk debugging
Mungkin diperlukan mekanisme terpisah berbasis analisis statis