Mengapa Semua Orang Harus Menggunakan Cooldown Dependensi
(blog.yossarian.net)- Cooldown dependensi (dependency cooldown) adalah teknik keamanan yang sederhana dan efektif yang dapat memitigasi sebagian besar serangan rantai pasok open source
- Penyerang biasanya mengambil alih proyek open source populer untuk menyebarkan kode berbahaya, tetapi pada kebanyakan serangan periode paparannya singkat, kurang dari satu minggu
- Dengan menetapkan cooldown yang menunggu selama periode tertentu (misalnya 7 hari) setelah versi baru dirilis, risiko infeksi akibat pembaruan otomatis dapat dikurangi secara signifikan
- Dependabot, Renovate, pnpm, dan lainnya sudah mendukung fitur cooldown secara bawaan, mudah dikonfigurasi, dan tidak memerlukan biaya tambahan
- Jika cooldown disediakan secara default di tingkat package manager, hal ini dapat membantu memperkuat keamanan rantai pasok dan mengurangi alarm yang tidak perlu
Struktur dan masalah serangan rantai pasok
- Sebagian besar serangan rantai pasok (supply chain attack) mengikuti pola yang sama
- Penyerang mendapatkan akses dengan memanfaatkan pencurian kredensial atau kerentanan CI/CD pada proyek open source populer
- Perubahan berbahaya diunggah ke kanal distribusi seperti PyPI, npm, dan lainnya
- Karena pembaruan otomatis atau versi yang tidak dipin dengan baik, pengguna memasang versi yang terinfeksi
- Vendor keamanan mendeteksinya, mengeluarkan peringatan, lalu repositori paket menghapus versi tersebut
- Jarak waktu antara tahap (1)~(2) panjang, tetapi tahap (2)~(5) biasanya selesai dalam hitungan jam hingga beberapa hari, sehingga masa aktivitas penyerang relatif singkat
- Window of opportunity untuk kasus-kasus utama dalam 18 bulan terakhir
- xz-utils: sekitar 5 minggu
- Ultralytics: 12 jam (tahap 1), 1 jam (tahap 2)
- tj-actions: 3 hari
- chalk: kurang dari 12 jam
- Nx: 4 jam
- rspack: 1 jam
- num2words: kurang dari 12 jam
- Kong Ingress Controller: sekitar 10 hari
- web3.js: 5 jam
- Dari kasus-kasus ini, 8 serangan memiliki durasi serangan kurang dari 1 minggu, dan sebagian besar dapat diblokir dengan cooldown
Konsep dan efek cooldown
- Cooldown adalah pendekatan yang menunda penggunaan dependensi baru selama periode tertentu setelah dirilis
- Selama periode ini, vendor keamanan dapat mendeteksi apakah dependensi tersebut berbahaya
- Kelebihan
- Terbukti efektif secara empiris, dan dapat memblokir sebagian besar serangan berskala besar
- Sangat mudah diimplementasikan dan pada sebagian besar alat bisa diatur gratis
- Contoh Dependabot
version: 2 - package-ecosystem: github-actions directory: / schedule: interval: weekly cooldown: default-days: 7 - Mendorong perilaku positif dari vendor keamanan: membuat mereka fokus pada deteksi cepat alih-alih peringatan berlebihan atau promosi
Kesimpulan dan saran
- 8 dari 10 serangan memiliki durasi 1 minggu atau kurang, dan cooldown 7 hari dapat memblokir sebagian besar di antaranya
- Dengan menerapkan cooldown 14 hari, semua kasus selain xz-utils dapat dicegah
- Cooldown bukan solusi sempurna, tetapi merupakan cara sederhana untuk mengurangi risiko paparan hingga 80~90%
- Selain Dependabot dan Renovate, perlu ada perbaikan agar package manager sendiri mendukung cooldown secara default
- Keamanan rantai pasok bukan hanya masalah teknis, tetapi juga soal struktur kepercayaan sosial, dan cooldown adalah langkah mitigasi yang realistis dan berguna
3 komentar
Sebenarnya, kalau tidak ada masalah, sepertinya lebih baik tidak perlu melakukan pembaruan.
Apakah benar perlu menerapkan versi baru yang tidak jauh berbeda dari versi sebelumnya sambil menanggung risikonya?
Komentar Hacker News
Orang khawatir bahwa jika tidak langsung memperbarui, mereka akan terekspos pada kerentanan serius, tetapi dalam kenyataannya sering kali tidak demikian
Banyak perangkat lunak tidak memakai deployment berkelanjutan, melainkan pelanggan sendiri yang memasang versi baru, sehingga pembaruan dilakukan per beberapa minggu atau beberapa bulan
Yang penting adalah pemantauan dependensi dan pemeriksaan kerentanan yang telah dipublikasikan. Nilai dulu apakah produk benar-benar terdampak, lalu hanya saat itulah dependensi terkait perlu segera diperbarui
Ada anggapan luas bahwa begitu versi baru keluar, harus diperbarui hari itu juga
Mendekati hal ini dengan pola “nanti akan lebih sulit, jadi kerjakan sekarang saja” tanpa meninjau perubahan yang sebenarnya itu tidak efisien
Tetap berada di garis terdepan nomor versi justru bisa kontraproduktif bagi keamanan
Di perusahaan kami, jika pemindai menemukan kerentanan kritis, kami harus memperbarui dalam 7 hari
Jika melewati tenggat, proses rumit akan dimulai karena dianggap melanggar aturan, jadi kebanyakan orang akhirnya langsung memperbarui semuanya
Aplikasi seperti browser yang menerima banyak input eksternal harus sering diperbarui, tetapi jika inputnya terbatas seperti aplikasi cuaca, relatif lebih aman
Lebih efisien jika melakukan pembaruan berkala dan sekaligus menerapkan langkah pertahanan terhadap serangan supply chain
Cara distribusi mengelola dependensi bersama seperti model Debian stable dan melakukan upgrade menyeluruh tiap beberapa tahun tampak makin masuk akal
Beberapa ekosistem bergerak terlalu cepat atau sistem pemaketan per distribusinya lemah
Misalnya, memasang library Node.js lewat apt lalu memakainya di proyek masih sulit
Ekosistem yang bergerak cepat tanpa perubahan mendasar bukan ekosistem yang sehat
JS hampir tidak menunjukkan kemajuan nyata dalam 3 tahun terakhir, tetapi untuk membangun ulang proyek yang berumur 3 tahun, rasa sakitnya bisa setingkat rewrite
Di distribusi seperti Arch, kadang malah tidak ada sama sekali
Ada asumsi bahwa untuk mencegah serangan supply chain, memberi masa cooldown pada pembaruan dependensi lebih baik daripada langsung memakai versi terbaru demi mencegah 0-day
Ini adalah perbandingan antara kemungkinan pembaruan memperkenalkan kerentanan baru dan kemungkinan ia memperbaiki kerentanan yang sudah ada
Berdasarkan SemVer, versi patch relatif lebih aman sehingga pendekatan seperti memberi cooldown singkat juga mungkin dilakukan
Misalnya, saat 2.4.0 keluar dari 2.3.4, jika tidak ada fitur mendesak, mungkin lebih baik menunggu sampai 2.4.1 keluar
Sebagian besar kerentanan bukan berasal dari serangan yang disengaja, melainkan dari bug umum
Kebijakan yang membatasi jumlah dan kompleksitas dependensi adalah pendekatan yang lebih kuat
Alih-alih menambahkan “library yang melakukan segalanya”, sebaiknya hanya menambah dependensi kecil dengan tujuan yang jelas
Selain itu, jika library juga menyediakan versi LTS yang hanya memuat patch keamanan, pengelolaannya menjadi lebih mudah
Mengimplementasikan ulang sendiri bisa jadi pemborosan. Saya penasaran contoh spesifik dari “everything library” yang bermasalah
Jika Anda mempercayai pengembang yang sama di banyak library, maka yang lebih penting daripada jumlah paket adalah hubungan kepercayaan
Kompleksitas memang berkorelasi dengan kerentanan, tetapi bukan penyebab langsung
Sekarang pilihan bisa dibuat dengan mempertimbangkan pemeliharaan jangka panjang, bukan hanya kecepatan jangka pendek
Di dunia C++, hal seperti ini bahkan kadang menjadi poin persaingan
Tekanan untuk selalu memperbarui ke versi terbaru setiap saat berasal dari keyakinan keliru bahwa perangkat lunak selalu menjadi lebih baik
Padahal kenyataannya, itu bisa berarti menukar bug yang sudah diketahui dengan bug baru yang belum diketahui
Memantau issue yang dipublikasikan dan menambal hanya saat perlu adalah pendekatan yang masuk akal
Artinya, ada kasus di mana versi lama justru lebih aman
Mungkin juga karena kita sudah memakai perangkat lunak yang cukup stabil
Jika semua orang berkata “mari tunggu sebentar”, pada akhirnya seperti tragedy of the commons dan tidak ada yang lebih dulu memverifikasi
Semakin lama menunggu, semakin banyak utang teknis menumpuk, jadi diperlukan pembaruan bertahap dan mitigasi seperti zero trust dan monitoring
Dalam waktu itu, pemindai keamanan biasanya sudah mendeteksi kerentanannya
Jika penyerang mengunggah rilis tanpa izin, sering kali itu langsung disadari
Ide cooldown itu bagus, tetapi ada risiko penyerang menyalahgunakannya untuk menciptakan rasa urgensi palsu
Dengan dalih “patch keamanan darurat”, mereka bisa mendorong pemasangan lebih awal, padahal versi itu sebenarnya berbahaya
Kita perlu bersiap menghadapi serangan tekanan psikologis semacam ini
Alasan lain untuk cooldown adalah memberi waktu bagi maintainer menyadari sendiri bahwa mereka telah dikompromikan
Penyerang membidik saat maintainer sedang tidak aktif, seperti saat liburan, konferensi, atau hari libur nasional
Banyak proyek dikelola satu atau dua orang, sehingga jeda waktu seperti ini sangat penting
Ini bergantung pada karakteristik proyek dan permukaan serangan
Era sekadar mengikuti “best practice” seharusnya sudah berakhir
Keamanan itu seperti contact sport: detailnya harus dipikirkan secara kritis setiap hari
Ada juga batasan cooldown jika diasumsikan bahwa sekadar berlalunya waktu membuat keadaan jadi aman
Jika tidak ada yang meninjau kodenya, setelah seminggu pun risikonya tetap sama
Sebagai gantinya, pendekatan gradual rollout bisa efektif
Tiap konsumen menetapkan faktor penundaan sendiri, sehingga pihak yang toleransi risikonya lebih tinggi akan lebih dulu terkena masalah,
sementara sisanya terlindungi selama itu
Pembaruan berbahaya akan dihapus dari antrean, sehingga konsumen yang tertunda bahkan tidak akan pernah melihatnya
Akhir-akhir ini saya kadang bingung mana yang lebih bisa ditanggung: usaha sekadar menemukan kembali roda, atau usaha mengelola Tetris dependensi.
Kalau ada yang salah selama ini, saya tinggal memperbaiki kode saya sendiri, tetapi dalam Tetris dependensi, sulit juga melakukan debugging untuk mencari tahu roda mana yang tiba-tiba oleng.