Aku Hampir Push Kode Buatan AI yang Tidak Pernah Kubaca Sendiri

Minggu sore, aku minta agent coding menambahkan fitur "undang anggota tim" ke aplikasi kecil yang kubangun sendiri—tracker langganan yang sama yang beberapa waktu lalu kena bug race condition itu. Delapan menit kemudian: endpoint baru, migrasi database, dan halaman undangan sudah jadi. Semua test hijau. Aku coba di browser, alurnya mulus—isi email, klik kirim, anggota baru muncul di daftar tim. Rasanya seperti punya rekan kerja yang tidak pernah capek.

Kursor sudah ada di tombol merge. Aku sudah biasa scroll cepat lewat diff yang dihasilkan agent, baca judul fungsi, cek test lulus, selesai. Tapi malam itu, entah kenapa, aku iseng buka terminal dan coba satu hal yang bukan bagian dari alur normal: aku ganti nilai org_id di request undangan dengan ID organisasi tim lain, punya user fiktif yang kubuat untuk testing. Token login tetap punya, hanya angka organisasinya kuubah manual.

Laptop menampilkan baris-baris kode di layar
Laptop menampilkan baris-baris kode di layar

Endpoint yang percaya begitu saja pada siapa yang mengetik

Undangan itu terkirim. Ke organisasi yang bukan milikku, dengan akun yang tidak seharusnya punya akses ke sana sama sekali. Endpoint baru itu mengecek apakah pengirim sudah login—tapi tidak pernah mengecek apakah pengirim benar-benar admin di organisasi yang disebut di org_id. Siapa pun yang punya akun aktif di aplikasiku, organisasi manapun, bisa menebak atau mencoba angka ID lain dan mengundang dirinya sendiri masuk ke tim orang lain.

Bukan bug eksotis. Ini kesalahan otorisasi paling dasar yang biasanya jadi soal nomor satu di checklist keamanan siapa saja. Tapi test yang ditulis agent—dan yang kuanggap cukup karena "hijau semua"—cuma menguji jalur bahagia: admin sah mengundang anggota ke organisasinya sendiri. Tidak ada satu pun test untuk kasus "bagaimana kalau yang mengirim bukan admin di sana". Agent menulis apa yang secara literal kuminta: bikin fitur undang anggota. Tidak lebih.

Aku duduk diam beberapa menit sambil membayangkan skenario terburuknya. Aplikasi ini masih kecil, belasan tim berbayar, tapi salah satunya menyimpan data pelanggan mereka sendiri di dalam sana—nama, email, riwayat tagihan. Kalau celah ini nyangkut lebih lama dan seseorang menemukannya lebih dulu dariku, ini bukan sekadar bug memalukan yang kutulis di blog. Ini insiden yang harus kulaporkan ke belasan pemilik bisnis kecil, menjelaskan kenapa data mereka bisa diakses orang asing gara-gara satu baris otorisasi yang tidak pernah kutulis maupun kubaca.

Vibe coding tidak salah alat, tapi mengubah kebiasaan curiga

Sebelum ada agent coding, aku menulis endpoint semacam ini baris demi baris, dan proses menulis itu sendiri memaksa aku bertanya "siapa yang boleh manggil ini, dan siapa yang tidak boleh". Pertanyaan itu bukan langkah ekstra, dia menempel otomatis di proses menulis manual. Begitu proses menulis hilang—digantikan menonton kode muncul dalam hitungan detik—pertanyaan itu ikut hilang, bukan karena aku sengaja melewatkannya, tapi karena tidak ada lagi jeda alami tempat pertanyaan itu biasa muncul.

Yang bikin ini berbahaya bukan karena agent-nya bodoh. Justru karena hasilnya rapi, terstruktur, dan test-nya lulus—semua sinyal yang biasa kupakai untuk menilai "kode ini aman" ternyata bisa dipenuhi tanpa kode itu benar-benar aman. Aku sedang mengevaluasi kecepatan dan kerapian, padahal yang harusnya kuevaluasi adalah pertanyaan yang sama sekali berbeda: apa saja yang bisa disalahgunakan orang yang punya niat buruk dan sedikit waktu luang.

Chip komputer dengan tulisan huruf A di atasnya, merepresentasikan AI
Chip komputer dengan tulisan huruf A di atasnya, merepresentasikan AI

Rem kecil yang sekarang wajib kupasang

Aku tidak berhenti pakai agent coding—kecepatannya nyata dan aku solo, tidak ada rekan untuk membagi beban. Tapi tiga kebiasaan berubah sejak malam itu. Pertama, untuk setiap endpoint yang menyentuh data lintas user atau lintas organisasi, aku secara eksplisit minta agent menulis test negatif: "buktikan user A tidak bisa mengakses resource milik user B", bukan cuma jalur sukses. Kedua, aku baca baris demi baris—bukan scroll cepat—khusus untuk file yang menyangkut permission, autentikasi, dan query database yang memfilter berdasarkan kepemilikan data. Ketiga, sebelum merge apa pun yang menyentuh area itu, aku coba sendiri jadi "orang jahat" selama lima menit: ganti ID, hapus header, kirim request yang tidak seharusnya valid, lihat apa yang terjadi.

Lima menit itu terasa seperti pajak kecil di tengah kecepatan yang ditawarkan AI. Tapi dibanding insiden kebocoran data lintas tenant yang baru ketahuan setelah user lain lapor—atau lebih parah, setelah tidak ada yang lapor sama sekali—pajak itu murah sekali.

Takeaway

AI coding agent mempercepat penulisan kode, tapi tidak pernah menggantikan pertimbangan risiko—itu tetap pekerjaan manusia, dan justru makin penting persis di titik ketika kecepatan membuat kita malas berhenti sejenak. Kalau kode yang dihasilkan menyentuh siapa-boleh-akses-apa, satu percobaan "coba jadi orang jahat" sebelum merge jauh lebih murah daripada percaya begitu saja pada test hijau yang cuma menguji jalur bahagia.

---

Sumber gambar: Florian Olivo di Unsplash Sumber gambar: Ales Nesetril di Unsplash Sumber gambar: Igor Omilaev di Unsplash

The conversation 0

No comments yet. Start the conversation.

Comments are reviewed before appearing. Links are masked.