- Peneliti membagikan pengalamannya menemukan kerentanan di Nixpkgs yang memungkinkan penyuntikan kode berbahaya ke seluruh ekosistem Nix
- Menjelaskan risiko struktural pada GitHub Actions melalui trigger
pull_request_target, yang dapat mengekspos hak akses sensitif dan secret bahkan pada PR dari kontributor eksternal
- Membuktikan bahwa pemeriksaan editorconfig dan tugas verifikasi code owners benar-benar dapat dieksploitasi untuk eskalasi hak akses melalui penyisipan perintah dan pemanfaatan symbolic link
- Segera setelah temuan, tim pengelola Nixpkgs dengan cepat memperbaiki kerentanan, menonaktifkan workflow yang rentan, dan meninjau ulang pengelolaan izin
- Menekankan pentingnya memisahkan data tak tepercaya dari operasi sensitif dalam infrastruktur CI/CD, menerapkan hak akses minimum, dan memperkuat kebijakan
Meretas seluruh ekosistem Nix
Pengantar dan latar belakang
- Pada NixCon tahun lalu, peneliti dan rekannya Lexi mempresentasikan kerentanan di Nixpkgs
- Kerentanan yang ditemukan ini membuka kemungkinan penyisipan kode berbahaya ke seluruh ekosistem Nix melalui serangan rantai pasok
- Ini adalah pengalaman respons cepat, dari deteksi kerentanan hingga pelaporan dan penanganan, yang selesai hanya dalam satu hari
- Karena peneliti tidak bisa menghadiri NixCon tahun ini, proses tersebut dirangkum secara rinci melalui tulisan ini
GitHub Actions: target yang rentan
- GitHub Actions adalah sistem yang mendukung berbagai tugas otomatisasi (CI/CD) di repositori kode
- Jika memiliki akses untuk mengubah file workflow, penyisipan kode menjadi mudah, sehingga ia menjadi target utama serangan rantai pasok
- File workflow ditulis dalam YAML, dan karena format ini tidak dirancang khusus untuk eksekusi, ada kerentanan keamanan tak terduga yang bisa muncul
- Sebagai contoh sederhana, ada workflow yang menjalankan perintah saat kode di-push
Trigger pull_request_target yang berbahaya
- GitHub Actions memiliki beberapa trigger, dan pull_request_target sangat berbeda dari pull_request biasa
pull_request_target secara bawaan memiliki hak akses read/write dan akses ke secret bahkan dari fork (PR)
- Jika trigger ini digunakan secara keliru, data eksternal yang tidak tepercaya akan digabungkan dengan izin sensitif
- Dokumentasi resmi GitHub juga memperingatkan risiko ini secara jelas
- Peneliti memeriksa 14 workflow di repositori Nixpkgs yang menggunakan
pull_request_target
Kerentanan editorconfig-checker
- Workflow rentan pertama yang ditemukan bertujuan untuk memeriksa aturan editorconfig
- Setelah menghitung daftar file yang berubah, workflow meneruskannya ke editorconfig-checker menggunakan xargs
- Jika peringatan keamanan pada perintah xargs diabaikan, muncul kerentanan yang memungkinkan penyisipan nama file yang dirancang secara jahat (misalnya
--help)
- Dengan cara ini, editorconfig-checker dapat dimanipulasi secara sewenang-wenang atau membuka kemungkinan eksekusi perintah tambahan (analisis rinci masih memerlukan peninjauan lebih lanjut)
Kerentanan codeowners-validator: menyertakan file lokal
- Kerentanan kedua yang lebih serius ditemukan pada workflow validasi file CODEOWNERS
- Proses ini melakukan checkout pada kode PR lalu memeriksa file dengan codeowners-validator
- Pengirim PR dapat mengganti file OWNERS dengan symbolic link, sehingga bisa merujuk ke file arbitrer di dalam runner (misalnya kredensial action)
- Akibatnya, isi file tersebut tercetak ke log saat validasi sehingga token GitHub dengan hak read/write terekspos
- Jika token ini diperoleh, penyerang dapat langsung melakukan push ke repositori Nixpkgs
Tindakan dan pelajaran
- Setelah laporan kerentanan disampaikan, maintainer Nixpkgs infinisil segera merespons
- Menonaktifkan sementara workflow yang rentan
- Memperbaiki dan memisahkan bagian yang menghubungkan data tak tepercaya dengan izin
- Setelah perbaikan keamanan, mengganti nama workflow untuk mengurangi masalah branch targeting
- Pelajaran utama
- Data yang tidak tepercaya tidak boleh digabungkan dengan secret dan operasi sensitif, atau setidaknya harus ditangani dengan sangat hati-hati
- Mematuhi prinsip hak akses minimum
- Wajib memahami panduan resmi terkait izin GitHub Actions
- Jika kerentanan serupa muncul, admin organisasi dapat menonaktifkan Actions secara massal lewat kebijakan (tersedia petunjuk pengaturannya)
Kesimpulan
- Dalam satu hari, peneliti menemukan kerentanan yang bisa membahayakan seluruh ekosistem Nix, melaporkannya, dan ikut membantu perbaikannya
- Hal ini menunjukkan perlunya kehati-hatian ekstra saat menggunakan GitHub Actions, khususnya pull_request_target
- Peneliti menyampaikan terima kasih kepada Intrigus dari KITCTF yang membantu riset serta infinisil yang merespons dengan cepat
- Pembaca yang tertarik disarankan melihat video presentasi dan materi tambahan
- Secara keseluruhan, tulisan ini menekankan pentingnya pengelolaan keamanan GitHub Actions dan pelajaran praktis di lapangan
1 komentar
Opini Hacker News
Saya rasa
pull_request_targetpada dasarnya rentan secara keamanan, dan GitHub seharusnya menghapus fitur ini sama sekali. Biasanya orang bilangpull_request_targetbisa dipakai dengan aman selama Anda tidak menjalankan kode yang dikendalikan dari branch saat proses berjalan, tetapi dalam praktiknya permukaan serangannya jauh lebih luas karena injeksi argumen, local file inclusion, dan sebagainya. Saat ini use case yang benar-benar sah paling hanya pelabelan otomatis atau menambahkan komentar otomatis pada PR pihak ketiga. Saya rasa tugas seperti ini tidak perlu diberi izin tulis ke repositori secara default. GitHub seharusnya bisa menerbitkan token yang dibatasi hanya untuk tugas tersebut. Karena itu, di zizmor saya menandai semua penggunaan trigger berbahaya sepertipull_request_target; lihat zizmor dangerous triggerspull_requesttidak terpicu. Dalam situasi inipull_request_targetpraktis menjadi satu-satunya opsi. Akan lebih baik kalau github menyediakan pengaturan untuk menjalankan workflow pada PR dengan merge yang tidak bersih, dinonaktifkan secara default, dan dipakai hanya untuk hal seperti linter. Sebelum itu ada, sangat disayangkan bahwa karena keterbatasan ini kita terpaksa hanya bisa memakaipull_request_target. Sebagai catatan, kalau memakai tool eksternal seperti ini lalu melakukan merge manual di github, seluruh alurnya akan rusak, jadi merge manual benar-benar tidak boleh dilakukanpull_request_targetkarena dua alasan. Pertama, workflow selalu dijalankan berdasarkan main sehingga kode test yang belum diverifikasi bisa diblokir. Kedua, dalam sub-claim JWT di workflow,job_workflow_refdisediakan secara krusial sehingga sistem berbasis OIDC bisa melakukan kontrol akses yang rincipull_request_targetberjalan dalam konteks base PR sehingga kode berbahaya tidak bisa mencuri repo atau secret. Tapi sebenarnya kalau tahu betapa mudahnya membocorkan secret dalam praktik, situasinya agak menggelikanJika tim Nix telah mengadopsi signed commit/review dan reproducible build yang ditandatangani secara independen seperti RFC yang saya usulkan, serangan supply chain last-mile seperti ini tidak akan mungkin terjadi. Pada akhirnya NixPkgs ingin siapa pun bisa mengedit dengan mudah dan takut bahwa upaya yang terlalu peduli keamanan akan mengusir para relawan; fokusnya adalah distro untuk hobi. Itu tidak masalah, tetapi jika ingin menjelaskan karakteristik ini dengan jelas kepada orang-orang dan melindungi hal yang benar-benar berharga, kita harus berhenti menggunakan atau merekomendasikan Nix untuk lingkungan yang kritis terhadap keamanan. OS yang bertujuan melindungi sesuatu harus mewajibkan tanda tangan hardware dua pihak yang ketat untuk semua perubahan, dan tidak boleh mempercayakan kepercayaan pada satu komputer atau satu orang. Itulah sebabnya saya membuat Stagex tautan Stagex tautan Codeberg
Saya telah lama merancang sistem komputer, jadi saya sangat heran bahwa workflow modern masih menerbitkan bearer token—bahkan token berumur pendek—kepada program yang dipercayainya. Jika framework GitHub Actions hanya memberi akses ke unix socket istimewa atau ssh-agent, kerentanan seperti ini akan jauh lebih sulit dieksploitasi
Aksi CI/CD untuk pull/merge request benar-benar mimpi buruk. Saat developer menulis langkah test atau validasi, mereka biasanya berpikir dalam konteks "kode saya berjalan dalam konteks akun github/gitlab saya". Itu benar untuk commit mereka sendiri atau commit rekan satu tim, tetapi pada PR, pipeline CI/CD menjalankan kode yang tidak tepercaya. Sulit untuk selalu menyadari perbedaan ini dengan tepat, dan meski aman untuk sekadar menjalankan test atau linter, begitu tugas mulai perlu integrasi infrastruktur dan izin lebih besar, situasinya cepat menjadi berbahaya
pull_requestdanpull_request_target). Salah satunya (misalnyapull_request) hampir selalu aman kecuali sengaja disalahgunakan, sedangkan yang lain (misalnyapull_request_target) nyaris tidak bisa dipakai dengan aman. Masalah yang lebih besar adalah GitHub membuat tugas biasa seperti memberi label pada PR atau meninggalkan komentar otomatis hanya bisa dilakukan lewat trigger berbahaya (pull_request_target), sehingga semua orang terpaksa mengambil pilihan yang rapuh. Fitur yang disediakan GitHub Actions mendorong struktur yang mudah menimbulkan kesalahanSeiring waktu saya semakin khawatir soal serangan supply chain. Ini bukan cuma kekhawatiran seperti "apakah saya akan kehilangan pekerjaan karenanya" atau "muncul vektor serangan baru di NixOS, CI/CD, Node, dll.", melainkan kekhawatiran yang lebih filosofis. Semakin banyak kita bergantung padanya, semakin banyak pula masalah yang harus ditangani. Bahkan untuk memakainya dengan tenang pun semuanya sudah terlalu kusut—VSCode, Emacs, Nix, Vim, Firefox, JS, Node, semua plugin dan paket dependensinya saling terbelit. Karena itu, dengan agak memalukan saya makin mendekati kesimpulan aneh bahwa hanya dengan kertas dan teknologi yang minimal, benar-benar sederhana, saya baru bisa mendapat sedikit rasa kontrol atau keamanan. Saya tahu ini tidak rasional, tapi saya semakin muak dengan kompleksitas ini. Sekarang saya bahkan merasa sudah mencapai batas kompleksitas saya
Di halaman manual xargs ada peringatan berbunyi “xargs tidak bisa digunakan dengan aman”. Namun isu keamanan ini berbeda dari kasus yang diterapkan di sini. Dalam kasus ini, cukup tambahkan
--di akhir untuk menghindarinyaKalimat “xargs tidak bisa digunakan dengan aman” sering disalahpahami. Misalnya, jika dijalankan sebagai
cat "$HOME/changed_files" | xargs -r editorconfig-checker --, masalah spesifik yang dibicarakan di sini bisa diatasi<div>{escapeHtml(value)}</div>satu per satu pada setiap nilai HTML. Jika Anda harus menerapkan cara aman secara manual di semua tempat, berarti pendekatannya memang salah sejak awal--, dan sebagian besar penggunaan xargs rentan terhadap injeksi argumen. Bisa dibilang ini sama seperti semua eksekusi command yang pada dasarnya berisiko. Ini bukan salah xargs sendiri, melainkan masalah realitas bahwa tool dipakai berulang dalam berbagai konteks izinArtikel itu punya celah fatal yang berdampak jauh lebih luas: dalam kode PR, file OWNERS bisa diubah menjadi symlink untuk mengekspos file arbitrer seperti file kredensial github actions. Karena git mendukung commit softlink, hampir workflow apa pun bisa terkena risiko seperti ini
pull_request_targetdijalankan, kredensialnya berasal dari repo target, yaitu repo yang menjadi tujuan merge. Jika dijalankan padapull_request, kredensialnya berasal dari repo sumber yang dikendalikan penyerangSatu-satunya kabar yang “baik” adalah OpenBSD dan NetBSD masih memakai CVS untuk manajemen paket sehingga tidak terdampak kerentanan ini. Saya tidak yakin dengan FreeBSD. Keamanan, dalam arti tertentu, adalah efek dari penyamaran. Namun tampaknya proyek-proyek itu juga sedang mempertimbangkan migrasi ke git, dan OpenBSD sepertinya akan menuju got(1)