Gerbang Commit Butuh Jalur Resmi, Bukan Hanya Penolak
Hook yang menolak commit langsung baru setengah gerbang; wrapper yang tidak pernah diimplementasi mengubah keamanan menjadi gembok total.
Ringkasan
Jadi gerbangnya nolak commit padahal hook-nya bener, masalahnya cmd_commit nggak pernah ditulis meski usage string ngaku ada. Fix-nya cuma 40 baris: validasi pesan dulu, lolos baru commit dieksekusi, nggak perlu bypass. Selftest kasus 19 mastiin penolakan bersih, commit pas, dan nggak dobel.
Tugas keenam, langkah kelima: perintah pembungkus commit dipanggil untuk pertama kalinya dan dispatcher menjawab exit 2. Padahal hook sudah bekerja dengan benar, git commit langsung dari sesi agen memang tertolak. Yang gagal justru jalur resminya: subcommand yang dijanjikan sejak tugas pertama ternyata tidak pernah ada.
Momen itu menutup satu simulasi dengan kesimpulan yang tidak terduga. Pintu darurat tertutup rapat, pintu utama belum ada. Siapa pun yang terjebak di antara keduanya tidak bisa lewat, dan itu berbahaya bagi sebuah gerbang yang diklaim siap pakai.
Ilusi Fitur dari String Penggunaan
Usage string skrip gerbang sudah mencantumkan subcommand commit sejak tugas pertama. Teks itu menciptakan keyakinan diam-diam bahwa implementasinya lengkap. Kenyataannya, fungsi cmd_commit tidak pernah ditulis; yang ada hanya daftar kemampuan di baris bantuan.
Celah semacam ini tipikal di perkakas buatan sendiri. Dokumentasi melaju lebih cepat dari kode karena dokumentasi ditulis sebagai niat, bukan sebagai kontrak yang diuji. Untuk gerbang keamanan, niat yang diuji sebagian lebih berbahaya daripada fitur yang jujur diakui belum ada: pengguna menekan jalur yang tampilannya ada, lalu kebingungan menjadi alasan pertama orang mencari pintu bypass.
Gerbang Tanpa Jalur Resmi Adalah Gembok Total
Prinsip yang membereskan ini sederhana: gerbang yang memblokir jalur tidak aman wajib menyertakan jalur aman dalam perubahan yang sama. Kalau satu-satunya cara mengeluarkan commit adalah menonaktifkan gerbang, desainnya gagal bukan di penegakan melainkan di ergonominya. Bypass yang dicatat di log memang tersedia untuk keadaan darurat, tapi menjadikannya rutinitas harian berarti gerbang sudah tidak berfungsi.
Perbaikannya 40 baris pada review_gate.sh. Fungsi cmd_commit tidak menulis ulang validasi apa pun; ia menulis pesan ke berkas sementara, memanggil cmd_check yang sama dengan jalur pemeriksaan biasa, lalu mengeksekusi git commit -F hanya jika validasi lolos. Pesan ditolak berhenti sebelum commit dibuat, dengan instruksi eksplisit: perbaiki pesannya, bukan bypass gerbangnya.
OWASP merangkum prinsipnya: penanganan kesalahan adalah bagian dari keamanan aplikasi, dan error yang tidak tertangani memberi informasi lebih pada pihak yang salah [3]. Versi kontrol prosesnya: penolakan yang tidak disertai jalur resmi melatih pengguna mencari celah. Githooks Git mengingatkan sisi lain dari kontrak yang sama: hook tanpa bit eksekusi diabaikan begitu saja [2], artinya setiap komponen gerbang, termasuk yang "hanya" pembungkus, harus benar-benar ada dan terpasang, bukan sekadar disebut.
Detail implementasinya juga menjaga pesan asli tetap utuh. Teks commit yang dikirim pengguna melalui opsi pesan atau berkas ditulis apa adanya ke berkas sementara, divalidasi dalam bentuk itu, lalu dipakai apa adanya saat commit dibuat. Tidak ada penulisan ulang diam-diam di tengah jalan, karena gerbang yang mengubah pesan pengguna tanpa terlihat sama berbahayanya dengan gerbang yang tidak memeriksa.
Bagi tim kecil yang meniru pola ini, urutan pengerjaannya penting: bila hari ini hanya sempat menulis penolak, tulis juga uji untuk jalur resminya, bahkan kalau implementasinya menyusul pekan depan. Kasus uji yang merah di awal jauh lebih jujur daripada usage string yang menghijau tanpa isi.
Selftest Kasus 19: Menolak Tanpa Meninggalkan Jejak
Kasus pengujian ke-19 mengunci tiga jaminan. Pertama, pesan tanpa trailer tinjauan ditolak dan tidak meninggalkan commit sama sekali. Kedua, pesan valid diterima. Ketiga, hasilnya tepat satu commit dengan subjek yang benar, tidak lebih, tidak duplikat. Jaminan ketiga yang paling sering lewat dari pengujian manual: pembungkus yang menjalankan validasi dua kali atau commit dua kali adalah cacat yang baru terasa setelah riwayat repositori kotor.
Tinjauan ganda kode dan keamanan menghasilkan approve tanpa critical maupun major. Probe pada tugas sebelumnya menunjukkan jalur penolakan dieksekusi sungguhan; kasus 19 melengkapi sisi sebaliknya, jalur penerusan, sehingga kedua arah gerbang kini teruji dengan bukti yang sama kuatnya [1].
Commit yang membuka cerita ini ditolak gerbang, dan penolakan itulah yang menemukan bug. Fail-closed memang tidak pernah membuat siapa pun nyaman saat terjadi, tetapi dia satu-satunya pilihan desain yang memaksa jalur resmi benar-benar dibangun.