Pendahuluan: Celah Kritis pada Coolify Mengancam Isolasi Tenant
Coolify, platform open-source populer untuk mengelola server, aplikasi, dan database secara self-hosted, baru saja mengumumkan perbaikan untuk kerentanan kritis yang diberi identitas CVE-2026-34037. Dengan skor CVSS v3.1 sebesar 9.9 (Critical), celah ini memungkinkan pengguna yang sudah terautentikasi untuk menyalin (clone) resource milik timnya sendiri ke dalam tim lain, sehingga melanggar batas isolasi multi-tenant. Jika dieksploitasi, penyerang dapat memperoleh akses tidak sah ke data sensitif dan mengganggu integritas lingkungan produksi.
Penjelasan Teknis CVE-2026-34037
Kerentanan ini terletak pada fitur clone yang diimplementasikan melalui Livewire action bernama cloneTo() di file ResourceOperations.php. Secara fungsional, action ini memungkinkan pengguna menduplikasi resource (misalnya aplikasi, database, atau server) ke dalam tim yang berbeda. Sayangnya, logika otorisasi hanya diterapkan pada resource sumber—yaitu memeriksa apakah pengguna memiliki hak untuk meng-clone resource tersebut—tetapi tidak memvalidasi kepemilikan resource tujuan.
Masalah utama muncul saat resolving resource tujuan: Coolify menggunakan unscoped Eloquent lookups seperti Resource::find($destinationId) tanpa menambahkan scope yang membatasi query berdasarkan team_id milik pengguna. Akibatnya, pengguna bisa memasukkan ID resource milik tim lain sebagai tujuan, dan sistem akan memproses cloning ke resource yang seharusnya tidak dapat diakses.
// Kode rentan (sebelum patch) – ResourceOperations.php
public function cloneTo($sourceId, $destinationId)
{
// Hanya memeriksa otorisasi pada sumber
$source = Resource::findOrFail($sourceId);
$this->authorize('clone', $source);
// Tidak ada scope pada pencarian tujuan – bisa menunjuk ke resource tim lain
$destination = Resource::find($destinationId); // unscoped query
// ... proses cloning ...
}
Dampak dan Sistem yang Terpengaruh
Dampak dari eksploitasi CVE-2026-34037 sangat serius dalam konteks multi-tenant:
- Akses cross-tenant: Penyerang dapat meng-clone resource dari timnya sendiri ke tim target, sehingga memperoleh akses ke data dan konfigurasi yang seharusnya terisolasi.
- Eksfiltrasi data: Dengan menyalin aplikasi atau database ke server tujuan yang berada di luar kontrol, penyerang dapat mengambil data sensitif.
- Eskalasi privilege lateral: Jika resource tujuan adalah server atau layanan yang lebih tinggi hak aksesnya, penyerang bisa memperluas kendali.
Semua versi Coolify sebelum 4.0.0-beta.464 yang memiliki fitur cloning antar tim (fitur ini diperkenalkan pada versi beta) terpengaruh. Produksi yang menjalankan versi stabil sebelumnya tidak mengandung fitur ini, namun pengguna yang mengaktifkan beta channel harus segera memperbarui.
Contoh Demonstrasi Eksploitasi
Misalkan seorang pengguna (Alice) adalah anggota Tim A dan ingin meng-clone aplikasi app1 miliknya ke Tim B milik Bob. Alice mengetahui ID resource tujuan di Tim B (misalnya ID = 56).
Dengan mengirimkan request Livewire ke cloneTo:
// Request yang dieksploitasi
$this->emit('cloneTo', [
'sourceId' => 12, // milik Tim A
'destinationId' => 56 // milik Tim B – tidak diverifikasi kepemilikan
]);
Kode lama akan menjalankan Resource::find(56) tanpa mengecek apakah resource 56 berada di tim yang sama dengan Alice. Setelah ditemukan, proses cloning dilanjutkan sehingga app1 disalin ke infrastruktur Tim B, memberikan Alice akses ke data dan konfigurasi Tim B.
Eksploitasi ini hanya memerlukan izin untuk melakukan clone pada resource sumber, sehingga jika Alice memiliki peran yang memungkinkan cloning, ia dapat memicu aksi berbahaya.
Langkah Mitigasi Detail
- Update segera ke versi 4.0.0-beta.464 atau lebih baru. Perbaikan resmi tersedia di repositori Coolify. Jalankan perintah berikut:
git pull origin main php artisan migrate npm run build && php artisan optimize - Verifikasi manual logika clone. Jika Anda masih menggunakan versi lama, Anda bisa menerapkan workaround dengan menambahkan query scope pada pencarian resource tujuan. Contoh perbaikan yang diterapkan di patch:
// Kode setelah patch public function cloneTo($sourceId, $destinationId) { $source = Resource::findOrFail($sourceId); $this->authorize('clone', $source); // Menggunakan scope untuk memastikan tujuan hanya dalam tim yang sama $destination = Resource::where('team_id', auth()->user()->team_id) ->findOrFail($destinationId); // ... } - Batasi akses ke fitur clone. Nonaktifkan peran yang tidak perlu memiliki kemampuan
canCloneatau set permission ketat. Di konfigurasi Coolify, atur agar hanya admin yang bisa melakukan clone antar tim jika diperlukan. - Audit log aktivitas. Periksa log untuk aktivitas cloning yang mencurigakan, terutama jika ada resource dikloning ke tim yang tidak berafiliasi.
Kesimpulan dan Rekomendasi
CVE-2026-34037 adalah contoh klasik kegagalan dalam menerapkan prinsip least privilege dan isolasi multi-tenant. Dengan skor CVSS 9.9, risiko yang ditimbulkan sangat tinggi. Pengguna Coolify yang menjalankan versi beta harus segera memperbarui ke 4.0.0-beta.464 untuk menutup celah ini. Selain itu, pengembang aplikasi yang menggunakan fitur serupa di platform lain harus selalu memastikan bahwa setiap operasi yang melibatkan resource antar pengguna melakukan validasi kepemilikan yang konsisten di kedua sisi (sumber dan tujuan). Keamanan multi-tenant hanya sekuat lapisan otorisasi terkecil.
Langkah pencegahan terbaik adalah mengimplementasikan query scoping yang ketat dan tidak bergantung pada validasi di frontend atau parameter yang bisa dimanipulasi. Dengan menerapkan patch dan kebijakan akses minimal, organisasi dapat melindungi data dan tetap memanfaatkan fleksibilitas Coolify.