Jika Anda memakai Claude Code atau AI coding agent lainnya, luangkan sepuluh menit untuk memeriksa repositori Anda terlebih dahulu. Cari file pengaturan agent yang ikut ter-commit, rotasi semua kredensial yang tersimpan di dalamnya, dan aktifkan secret scanning dari GitHub. Kunci curian cepat sekali dijual kembali (Unit 42 menggambarkan satu kasus yang hanya butuh hitungan menit), jadi pengecekan didahulukan sebelum ceritanya.
Periksa repo Anda dengan langkah-langkah ini terlebih dahulu
Mulailah dari file yang menjadi pusat kasus Claude Code: .claude/settings.local.json. Firma keamanan Apiiro menemukan 104.185 salinannya di 103.617 repositori publik, dan 1.122 di antaranya menyimpan setidaknya satu rahasia (The Hacker News). Begini cara mencari milik Anda.
- Cari file tersebut berdasarkan namanya di seluruh organisasi GitHub Anda (ganti dengan nama organisasi Anda sendiri; memerlukan GitHub CLI).
- Periksa apakah file tersebut pernah ter-commit di setiap repo yang Anda kerjakan, termasuk branch lama. Riwayat git menyimpan apa yang sudah dihapus di commit terbaru.
- Baca persetujuan yang tersimpan, cari apa pun yang menyerupai password, token, atau connection string.
- Pindai seluruh riwayat, dan tambahkan aturan untuk password yang diketik di dalam perintah, yang biasanya terlewat oleh rule set bawaan.
# 1. Find the files across an organization
gh search code --owner YOUR-ORG --filename settings.local.json
# The same search in the GitHub web search box
# org:YOUR-ORG path:.claude/settings.local.json
# 2. Was it ever committed, on any branch?
git log --all --oneline -- .claude/settings.local.json .claude/settings.json
# 3. List what you have approved with "don't ask again"
jq -r '.permissions.allow[]' .claude/settings.local.json
# 4. Grep the folder and its history for the usual suspects
grep -rEn 'PGPASSWORD=|sshpass -p|mysql -p|AKIA[0-9A-Z]{16}|ghp_[A-Za-z0-9]{20,}' .claude/
git log --all -p -- .claude | grep -E 'PGPASSWORD=|sshpass -p|mysql -p|AKIA[0-9A-Z]{16}'Semua ini adalah perintah git, jq, dan grep standar, tetapi anggap hasilnya sebagai petunjuk, bukan vonis. Pencarian kode GitHub hanya melihat isi branch saat ini, itulah sebabnya langkah 2 ada.
Untuk pemindaian, Gitleaks dan TruffleHog adalah dua tool yang dipakai Apiiro. Jalankan keduanya pada riwayat, lalu tambahkan aturan kustom, karena rule bawaan menangkap kunci tetapi tidak menangkap password yang muncul setelah sebuah flag.
gitleaks git --redact -v .
trufflehog git file://.# .gitleaks.toml
[extend]
useDefault = true
[[rules]]
id = "password-inside-command"
description = "Password passed on a command line"
regex = '''(PGPASSWORD=|sshpass -p |mysql -p)\S+'''Aturan kustom itu memang berguna. Apiiro menjalankan kedua tool pada setiap file yang ditemukan: gitleaks menandai 564 dari 1.122 file yang berisi rahasia, TruffleHog menandai 643, dan 215 tidak tertangkap oleh keduanya, kebanyakan password yang diketik setelah PGPASSWORD=, sshpass -p, atau mysql -p (The Hacker News).
Apiiro juga menyarankan tim keamanan memperlakukan .claude/, .cursor/, .gemini/, .specstory/, dan file memori agent sebagai tempat penyimpanan rahasia, sama seperti .env. Kami akan menjalankan pencarian serupa untuk setiap agent yang terpasang di tim Anda: transkrip yang disimpan oleh Cursor, GitHub Copilot, atau Codex juga bisa memuat kunci yang pernah di-paste.
Bagaimana satu klik persetujuan menaruh password di repo Anda
Claude Code meminta izin sebelum menjalankan sebagian besar perintah shell. Pilih "Yes, and don't ask again" dan ia menulis aturan allow ke .claude/settings.local.json. Dokumentasi Anthropic menyebutkan bahwa persetujuan Bash yang dibuat dengan cara ini berlaku "permanently per repository and command" (Claude Code docs). Masalahnya ada pada bentuk aturannya. Bisa berupa pola seperti npm test *, atau bisa berupa perintah persis, dan ketika perintah persis itu mengandung password, password tersebut kini tersimpan sebagai teks biasa.

File ini seharusnya tetap lokal. Menurut dokumentasi pengaturan Anthropic, saat pertama kali menulis file tersebut di repo yang belum mengabaikannya, Claude Code menambahkan **/.claude/settings.local.json ke git excludes global Anda, dan file yang Anda buat sendiri memerlukan baris .gitignore buatan Anda (Claude Code docs). Itu hanya melindungi satu komputer, bukan clone baru, file buatan tangan, atau file yang sudah ter-commit sebelum aturan ignore ada.
Lebih dari sepertiga rahasia yang ditemukan Apiiro membuka akses langsung ke database, termasuk 379 password database. Sisanya mencakup 43 login SSH ke server publik, 42 token untuk GitHub, GitLab, dan npm, serta 23 kunci AWS. Enam puluh tiga organisasi memiliki file yang terdampak, dan pada separuh repo yang berisi rahasia, file tersebut sudah tergeletak setidaknya 217 hari. Apiiro tidak menguji apakah semuanya masih berfungsi, meski satu perusahaan yang mereka beri tahu mengonfirmasi bahwa kuncinya memang masih aktif.
Jawaban Anthropic sejauh ini hanyalah satu komentar di Hacker News
Laporan bug yang diajukan pada 2025 ditutup oleh bot otomatis sebagai "not planned" setelah 60 hari tanpa aktivitas, dan peneliti Apiiro mengatakan tidak ada laporan terkait yang mereka kutip yang mendapat balasan dari Anthropic (The Hacker News). Jawaban publiknya muncul di Hacker News, dari seorang komentator yang memperkenalkan diri sebagai "Boris from the Claude Code team." Ia menulis bahwa "Historically Claude Code has not done secret scrubbing," bahwa tim sedang "looking into what we can do to prevent this," dan bahwa dalam kasus ini "the files were manually created and checked in." Ia menambahkan bahwa "Permission rules are old hat. Everyone should be using auto mode instead."
Data Apiiro tidak cocok dengan penjelasan "dibuat manual". Pada 539 dari 1.105 repositori yang mereka telusuri, sebuah commit yang mencantumkan Claude sebagai co-author mengubah file tersebut. Baris co-author memang tidak membuktikan siapa yang menjalankan git, tetapi sulit dirangkai dengan file yang dibuat manual. Menurut kami data commit lebih sulit disangkal daripada komentarnya, dan kami akan menganggap file itu sebagai sesuatu yang bisa di-commit oleh Claude Code sampai Anthropic menyatakan sebaliknya.
Grok Build bocor dua kali, dengan cara berbeda
Dua cerita tentang Grok Build sedang tercampur aduk, padahal keduanya butuh perbaikan yang berbeda. (Pemberitaan menyebut perusahaannya SpaceXSI atau SpaceXAI.)
Yang pertama terjadi lebih awal di 2026. Seorang peneliti yang menerbitkan dengan nama cereblab menganalisis Grok Build 0.2.93 dan melaporkan bahwa tool ini mengunggah seluruh repositori Git yang dilacak, lengkap dengan riwayat commit, rahasia yang ter-commit, dan API key, ke penyimpanan cloud (The Next Web). Menurut analisis itu, unggahannya sekitar 27.800 kali lebih besar dari yang dibutuhkan tugasnya, dan toggle privasi dilaporkan tidak berfungsi. xAI memasarkan tool ini dengan klaim "nothing from your codebase transmitted to xAI servers during a session." Elon Musk mengakui adanya transfer tersebut dan mengatakan data pengguna sebelumnya akan dihapus. TNW menambahkan bahwa belum ada audit independen yang mengonfirmasi penghapusan itu.
Yang kedua adalah yang sedang ramai diberitakan sekarang, dan tidak ada hubungannya dengan repositori. Firma keamanan Claroc menemukan bahwa link berbagi Grok Build bisa ditemukan oleh orang yang tidak pernah dikirimi link tersebut (Claroc). Engadget melaporkan setiap link memakai frasa acak empat kata dengan entropi hingga 38 bit, yang diletakkan "to the left of the domain" (Engadget). Artinya frasa itu berada di hostname, dan Claroc menjelaskan bahwa layanan passive DNS mengumpulkan lookup tersebut. Chat ChatGPT dan Gemini yang dibagikan menyimpan rahasianya di path URL, yang tidak pernah terlihat oleh DNS. "Nobody would guess one," tulis Claroc, "and nobody needs to, because the dataset lists them."
Aplikasi yang terekspos memuat materi sungguhan. Claroc mencantumkan peta wilayah penjualan berisi 594 akun strategis, delapan proposal iklan X, empat board akun pengiklan yang masih aktif, aplikasi staf milik sebuah grup rumah sakit dengan daftar lebih dari 3.500 karyawan, dan board shift langsung milik dinas pemadam kebakaran lengkap dengan nama dan nomor lencana setiap petugas. Dari alamat yang diuji, 94,7% terbuka tanpa login. Claroc memperkirakan sekitar 2% aplikasi memuat materi yang cukup serius untuk masuk kategori tinggi atau kritis.
Claroc mengatakan SpaceXSI menurunkan 24 aplikasi yang dibuat stafnya sendiri, "but not the apps of other Grok users and organizations." Engadget menambahkan bahwa perusahaan itu dilaporkan baru merespons setelah Claroc menandai Musk dan seorang pejabat perusahaan lain di X. Postingan Claroc menyebut SpaceXSI menjawab pertanyaan seorang reporter, dengan mengatakan aplikasi Grok bersifat privat sampai pembuatnya memilih untuk membagikannya, tetapi belum membalas laporan itu sendiri. Kami tidak menemukan pernyataan bahwa aplikasi lainnya akan diturunkan.
Perbaikan bagi pengguna sederhana saja. Anggap semua yang dibuat atau dibagikan lewat Grok Build sebagai publik, hapus link yang tidak Anda perlukan, dan rotasi kredensial apa pun yang pernah tersentuh aplikasi yang Anda bagikan. Baris .gitignore tidak membantu di sini.
Kunci curian dijual kembali dalam hitungan menit
Unit 42 dari Palo Alto Networks menjelaskan "token jacking", yaitu API key AI curian yang dijual kembali lewat "transfer station" pasar abu-abu yang menawarkan akses diskon ke model frontier (Unit 42). Sumber kunci yang mereka sebutkan mencakup repositori kode yang terekspos, infostealer, dan paket npm beracun. Dalam satu kasus, penyerang mengintegrasikan kredensial yang terekspos ke sebuah transfer station dalam hitungan menit, dan "nearly a million dollars in charges" menyusul sebelum ketahuan. Unit 42 mengatakan korban memiliki "very little recourse to recover funds." Pertahanannya yang disarankan terbilang membosankan: batas pengeluaran dengan alert, token jangka pendek sebagai pengganti kunci jangka panjang, dan peninjauan setiap akun berprivilese yang bisa mengubah batas.
Perbaiki kebocoran: abaikan, lepas dari tracking, lalu rotasi
Rotasi dulu, bersih-bersih belakangan. Kunci yang sudah dicabut tidak berguna di setiap fork dan salinan cache, sedangkan kunci yang hanya Anda hapus dari commit terbaru tetap aktif di riwayat. GitHub menyarankan untuk segera merotasi kredensial yang terekspos, dan menyebut pembersihan riwayat "time-intensive and often unnecessary if you've already revoked the credential" (GitHub docs).
# Rotate the exposed credentials first (table below), then:
# Stop tracking the local file (keeps your copy on disk)
git rm --cached .claude/settings.local.json
# Add to the repo's OWN .gitignore, not just your global excludes
printf '%s\n' '.claude/settings.local.json' '.specstory/' >> .gitignore
git add .gitignore
git commit -m "Stop tracking agent local settings"
# Drop any allow rule that looks like it holds a secret, even if never committed
jq '.permissions.allow |= map(select(test("PGPASSWORD|password|token|secret|key"; "i") | not))' \
.claude/settings.local.json > .claude/settings.local.json.new \
&& mv .claude/settings.local.json.new .claude/settings.local.jsonPikirkan dulu sebelum mengabaikan .cursor/ atau .gemini/ secara menyeluruh, karena sebagian tim sengaja meng-commit aturan bersama di sana.
Merotasi kunci di provider-provider utama
Setiap provider punya tombol di konsol untuk ini, dan urutan yang aman adalah buat penggantinya, deploy, baru matikan kunci lama. Menghapus lebih dulu bisa menjatuhkan production.
| Provider | Cara rotasi | Catatan |
|---|---|---|
| AWS | Buat access key IAM kedua, perbarui aplikasi Anda, periksa last-used, nonaktifkan kunci lama, lalu hapus | aws iam create-access-key, get-access-key-last-used, update-access-key --status Inactive, delete-access-key (AWS docs) |
| GitHub | Hapus token dan buat yang baru dengan tanggal kedaluwarsa | GitHub otomatis mencabut token yang di-push ke repositori atau gist publik; untuk kebocoran di tempat lain Anda bisa mengirim permintaan pencabutan lewat REST API (GitHub docs) |
| Stripe | Roll kunci di Dashboard, dan gunakan restricted key ke depannya | Rotasi meski Anda tidak yakin ada yang melihatnya; Stripe dapat menonaktifkan kunci yang terdeteksi (Stripe docs) |
| OpenAI | Buat pengganti, perbarui aplikasi Anda, cabut kunci lama setelah yang baru berfungsi | Setel masa berlaku pada project key dan gunakan project service account untuk aplikasi (OpenAI docs) |
Untuk provider yang tidak ada di tabel, termasuk Anthropic dan xAI, kami belum memverifikasi langkah rotasinya, jadi ikuti dokumentasi masing-masing. Untuk password database dan login SSH, yang merupakan sebagian besar temuan Apiiro, ganti password, akhiri sesi yang masih terbuka, lalu periksa access log sejak hari file tersebut pertama kali ter-commit.
Aktifkan scanner GitHub dan pahami batasannya
Secret scanning memeriksa seluruh riwayat setiap branch, ditambah issue, pull request, discussion, dan wiki. Fitur ini gratis dan otomatis di repositori publik; untuk repo privat dan internal di dalam organisasi, diperlukan GitHub Secret Protection (GitHub docs). Ketika format kunci milik mitra terdeteksi, GitHub memberi tahu provider tersebut, yang mungkin mencabut kunci tanpa ada alert apa pun di repositori Anda.
Push protection adalah lapisan yang bisa menghentikan banyak file ini sebelum menjadi publik. Fitur ini memblokir push yang berisi rahasia terdeteksi. Menurut dokumentasi GitHub, pengaturan tingkat pengguna aktif secara default untuk push ke repositori publik di GitHub.com, sedangkan pengaturan tingkat repositori nonaktif secara default dan harus diaktifkan oleh admin repo, owner organisasi, atau security manager (GitHub docs). Fitur ini memindai pola provider, pola generik seperti private key dan connection string, pola kustom Anda, serta kategori berbasis deteksi AI untuk rahasia tak terstruktur seperti password, yang masih dalam public preview. Kategori terakhir itu tampaknya ditujukan untuk celah yang ditemukan Apiiro. Push lewat REST API tidak tercakup; push lewat command line, commit dari web UI, dan unggahan file tercakup.
Ketahui juga celah daruratnya. Secara default, siapa pun dengan akses tulis bisa melewati blokir dengan memilih sebuah alasan, termasuk "I'll fix it later," yang akan membuka alert dan mengirim email ke para owner. Jika agent Anda melakukan commit atas nama Anda, siapkan delegated bypass agar hanya orang tertentu yang bisa meloloskan rahasia.
Pengaturan izin agent yang perlu diubah hari ini
Tiga kebiasaan akan menjaga password tetap di luar file. Setujui pola, jangan pernah perintah literal yang berisi kredensial. Taruh rahasia di environment variable agar perintah membawa nama, bukan nilai. Dan sejak awal, tolak akses agent ke file yang menyimpan rahasia. Dokumentasi pengaturan Anthropic menunjukkan bentuknya:
{
"permissions": {
"allow": [
"Bash(npm run lint)",
"Bash(npm run test *)"
],
"deny": [
"Read(./.env)",
"Read(./.env.*)"
]
}
}Perintah yang seharusnya dijalankan agent Anda berbentuk psql "$DATABASE_URL", sehingga aturan persetujuan hanya menyimpan nama variabel dan tidak ada yang lain. Muat variabel itu dari secrets manager atau shell profile Anda, bukan dari file yang bisa dibaca agent.
Dua detail dari dokumentasi penting bagi tim: aturan allow di .claude/settings.json yang ter-commit baru berlaku setelah tiap anggota tim mempercayai foldernya, sedangkan aturan deny dan ask berlaku langsung, dan mode auto serta bypassPermissions tidak berlaku dari pengaturan project atau lokal. Organisasi bisa mengunci aturan allow dengan allowManagedPermissionRulesOnly. Anggota tim Claude Code yang dikutip di atas mengatakan auto mode membuat aturan izin tidak diperlukan. Kami tetap akan mempertahankan aturan deny untuk .env: dua baris, berlaku begitu file di-commit.
Untuk tool lain, nama pengaturannya berbeda, tetapi pertanyaannya sama: di mana tool menyimpan persetujuan, riwayat, atau transkrip, dan apakah tempat itu berada di dalam repo? Berdasarkan dokumentasi, Apiiro menemukan Claude Code sebagai satu-satunya dari 16 coding agent yang mereka bandingkan yang terkonfirmasi menyimpan perintah lengkap yang disetujui di file proyek secara default. Lima belas lainnya tetap bisa bocor lewat transkrip, kunci yang di-paste, dan file memori. Perbandingan terminal coding agent dan artikel Cursor vs Copilot vs Windsurf kami membahas apa yang disimpan masing-masing.
Kontrol terkuat tidak bergantung pada prompt. Jalankan agent di dalam container atau sandbox dengan hanya kredensial yang dibutuhkan tugas itu, dengan scope terbatas dan masa berlaku singkat. Mekanismenya sudah kami tulis di How to Contain an AI Agent.
Pengguna memegang rotasi, vendor memegang default
Mengetik password di dalam perintah adalah kesalahan pengguna, dan pengguna yang bertanggung jawab merotasinya. Tetapi tool yang menyimpan perintah lengkap di file proyek, lalu mengandalkan exclude di direktori home Anda agar tetap privat, punya pengaman yang hanya bekerja di satu laptop.

Default adalah kebijakan, dan di sini default-lah yang menentukan hasilnya. Claude Code yang membersihkan rahasia sebelum menyimpan aturan, atau menulis baris ignore ke .gitignore milik repo itu sendiri, akan menutup celah ini dari sumbernya. Anthropic mengatakan sedang menelitinya (kami ingin ada tanggalnya). Laporan bug yang ditutup oleh bot inaktivitas tidak menenangkan, dan data commit tidak cocok dengan klaim "dibuat manual."
Grok Build adalah kasus yang lebih buruk dalam cerita link berbagi, karena penggunanya tidak melakukan kesalahan apa pun. Link yang bisa ditemukan siapa saja lewat passive DNS tidak privat, apa pun yang diisyaratkan menu berbagi. Dan unggahan sebelumnya bertentangan dengan klaim pemasaran yang menyatakan sebaliknya. Kami tidak akan memasukkan daftar klien, peta wilayah penjualan, atau kredensial production ke Grok Build sampai masalah link berbagi diperbaiki dan audit pihak luar mengonfirmasi penghapusan data. Jika itu berubah, pandangan kami juga akan berubah.
Perlakukan folder agent seperti file .env dan sisihkan satu sore untuk pengaturan di atas. Anda bisa membandingkan tool-nya sendiri di papan AI coding assistant kami, dan sisi keamanan ekosistemnya di papan AI cybersecurity tools.
Checklist untuk seluruh tim
Centang yang sudah benar hari ini dan skornya akan menunjukkan dari mana harus mulai. Item bernilai dua poin adalah yang akan kami kerjakan sebelum makan siang.
Pertanyaan yang sering diajukan
Apakah .claude/settings.local.json aman untuk di-commit?
Tidak. File ini menyimpan persetujuan pribadi Anda dan bisa memuat kredensial. Dokumentasi Anthropic menyebutkan Claude Code menjaganya tetap di luar git saat membuat file tersebut, lewat global exclude, dan bahwa salinan buatan tangan memerlukan baris ignore Anda sendiri. Tambahkan ke .gitignore setiap repo dan lepas dari tracking dengan git rm --cached jika pernah ter-commit.
Apakah saya perlu merotasi kunci jika repo saya privat?
Ya, jika file tersebut pernah memuat kredensial. Repo privat di-clone ke laptop dan CI runner, di-fork ke akun lain, dan kadang diubah menjadi publik. Secret scanning GitHub untuk repo organisasi privat memerlukan paket berbayar, jadi repo Anda mungkin tidak pernah mendapat pengecekan otomatis.
Apakah menghapus file dari repo saya akan menghilangkan rahasianya?
Hanya menghilangkannya dari commit terbaru, tidak lebih. Riwayat, fork, dan cache menyimpan versi lama, dan Apiiro menemukan 734 rahasia yang hanya muncul di versi lama file tersebut. Rotasi kredensial lebih dulu, dan tulis ulang riwayat hanya jika Anda ingin repo yang rapi.
Apakah GitHub Copilot, Cursor, dan Codex punya masalah yang sama?
Apiiro hanya mengonfirmasi perilaku ini, yaitu menyimpan perintah lengkap yang disetujui di file proyek secara default, pada Claude Code di antara 16 agent yang mereka bandingkan. Itu tidak berarti yang lain bebas masalah. Agent apa pun yang menulis transkrip atau memori ke direktori kerja Anda memerlukan aturan ignore yang sama.