BrassCoders menemukan rahasia yang tertanam langsung (hard-coded secrets) pada dua dari lima belas skrip Python yang dihasilkan AI yang mereka periksa, mengungkap risiko nyata bagi pengembang yang menyalin-tempel kode langsung dari output model bahasa besar (LLM). Temuan ini menunjukkan bahwa satu kunci atau kata sandi yang salah tempat dapat mengubah cuplikan kode yang bermanfaat menjadi kebocoran kredensial di seluruh lingkungan kontrol versi dan produksi.
Apa yang diungkapkan oleh pengujian ini
Skrip pertama, token_check.py, dihasilkan dari sebuah prompt yang meminta fungsi untuk menandatangani token sesi dan menyertakan "contoh yang dapat digunakan". Agar kode tersebut dapat dijalankan, model memasukkan kunci penandatanganan HMAC secara harfiah langsung di dalam berkas sumber.
- Masalah: Kunci rahasia berada di dalam basis kode.
- Risiko: Siapa pun yang memiliki akses baca ke repositori dapat melihat kunci tersebut, dan setiap penerapan (deployment) yang menarik berkas tersebut akan mewarisi rahasia tersebut.
- Konsekuensi: Penyerang yang mendapatkan kunci tersebut dapat memalsukan token sesi yang valid, sehingga melewati pemeriksaan autentikasi.
Skrip kedua, email_sender.py, menjawab permintaan untuk fungsi yang mengirim email melalui SMTP. Model tersebut kembali menyertakan kata sandi secara harfiah agar contoh tersebut dapat langsung berfungsi.
- Masalah: Kata sandi muncul sebagai string teks biasa dalam pemanggilan fungsi.
- Risiko: Melakukan rotasi kata sandi memerlukan perubahan kode dan penerapan baru, serta kredensial tersebut menyebar ke setiap lingkungan yang menggunakan berkas tersebut.
- Konsekuensi: Kata sandi dapat diambil dari kontrol sumber, log, atau paket yang dikompilasi, sehingga memberikan akses tidak sah kepada lawan ke server email.
Mengapa AI mengeluarkan rahasia
Model bahasa besar menghasilkan teks dengan melengkapi prompt. Ketika pengguna meminta "contoh yang dapat digunakan", model menafsirkan hal tersebut sebagai "kode yang dapat berjalan tanpa pengaturan tambahan". Oleh karena itu, model mengisi nilai yang hilang—seperti kunci API, kata sandi, token—dengan placeholder yang tampak masuk akal. Model tidak memiliki kesadaran akan praktik terbaik manajemen rahasia kecuali jika prompt menyebutkannya secara eksplisit.
Analisis terbaru dari Veracode terhadap kode yang dihasilkan AI menemukan bahwa 45% dari cuplikan kode mengandung setidaknya satu kerentanan yang terdaftar dalam OWASP Top 10, dengan paparan kredensial mewakili bagian yang cukup besar. Statistik ini menegaskan bahwa masalah ini tidak terisolasi pada beberapa kasus saja; ini adalah produk sampingan sistemik dari cara model-model ini dilatih dan diberi prompt.
Langkah mitigasi yang dapat diambil pengembang sekarang
Pertahanan paling sederhana adalah dengan menjaga agar rahasia apa pun tetap berada di luar berkas kode itu sendiri. Variabel lingkungan (environment variables) adalah metode yang paling umum dan tidak bergantung pada bahasa pemrograman (language-agnostic):
# token_check.py – secure version
import os
import hmac
import hashlib
SECRET_KEY = os.environ["HMAC_SECRET_KEY"]
def sign_token(data: bytes) -> str:
return hmac.new(SECRET_KEY.encode(), data, hashlib.sha256).hexdigest()
# email_sender.py – secure version
import os
import smtplib
smtp_password = os.environ["SMTP_PASSWORD"]
server = smtplib.SMTP("smtp.example.com", 587)
server.starttls()
server.login("noreply@example.com", smtp_password)
Menggunakan os.environ akan mengambil nilai dari lingkungan runtime, menjaganya tetap berada di luar kontrol versi dan memungkinkan rotasi tanpa menyentuh berkas sumber. Pola yang sama dapat diterapkan dengan berkas konfigurasi yang dikecualikan dari commit, layanan manajemen rahasia, atau rahasia yang diorkestrasi melalui kontainer.
Perlindungan tambahan
- Peninjauan kode (code reviews) yang menandai string harfiah yang cocok dengan pola rahasia umum (misalnya, urutan alfanumerik yang panjang).
- Alat analisis statis (static analysis tools) yang disetel untuk mendeteksi kredensial yang tertanam langsung pada berkas yang baru ditambahkan.
- Rekayasa prompt (prompt engineering): secara eksplisit meminta model untuk "menggunakan variabel lingkungan untuk semua rahasia" atau "menghilangkan kredensial asli."
- Linting pasca-generasi: menjalankan skrip cepat yang mencari literal mencurigakan sebelum menyalin kode ke dalam proyek.
Argumen penyeimbang: Apakah ini berarti kode AI tidak aman?
Kehadiran rahasia yang tertanam langsung tidak berarti bahwa kode yang dihasilkan AI tidak aman secara universal. Dalam banyak kasus, model menghasilkan logika yang bersih dan terstruktur dengan baik yang dapat mempercepat pengembangan. Risiko muncul ketika pengembang memperlakukan output tersebut sebagai sesuatu yang siap produksi tanpa audit keamanan. Perlakukan AI sebagai asisten draf, bukan pengganti praktik keamanan yang sudah mapan.
Hal yang perlu diperhatikan selanjutnya
- Pembaruan alat (tooling updates): Platform AI mulai menyertakan filter keamanan yang mengganti rahasia dengan placeholder. Memantau perubahan tersebut dapat mengurangi risiko paparan.
- Pergeseran kebijakan: Organisasi dapat meresmikan pedoman untuk pengodean berbantuan AI, dengan mewajibkan pemeriksaan manajemen rahasia sebagai bagian dari pipeline CI.
- Pola komunitas: Seiring pengembang berbagi lebih banyak "prompt aman," templat praktik terbaik dapat menjadi output standar untuk tugas-tugas umum seperti penandatanganan token atau pengiriman email.
Poin Penting: AI dapat menghasilkan kode fungsional dalam hitungan detik, tetapi jika pengembang tidak menerapkan disiplin manajemen rahasia, kenyamanan tersebut datang dengan biaya tersembunyi—kredensial yang terekspos yang dapat membahayakan seluruh sistem. Perlakukan setiap cuplikan kode sebagai draf, hapus semua rahasia yang tertulis langsung, dan masukkan melalui variabel lingkungan atau vault khusus sebelum melakukan commit.
