Ringkasan Utama
Laporan GitGuardian 2026 menghitung sekitar 29 juta secret baru di GitHub publik pada 2025 dan menyebut commit yang di-co-author Claude Code bocor sekitar dua kali baseline, tanpa membuktikan sebab-akibat. Respons praktisnya adalah scan mesin developer, bukan hanya repository: konfigurasi MCP, log agent, dan shell history, lalu ganti token inline dengan environment reference atau OAuth.
Saya membaca State of Secrets Sprawl 2026 dari GitGuardian dengan harapan menemukan satu headline yang bersih, tetapi malah menemukan tiga dokumen yang tidak sepenuhnya selaras. Halaman laporan menyebut commit yang di-co-author Claude Code membocorkan secret sekitar dua kali baseline. Artikel pendamping dari perusahaan yang sama menulis 3,2 persen berbanding 1,5 persen. Satu posting lain menyebut 64 persen secret 2022 belum di-revoke pada 2026, sementara grafik laporan menyebut 64 persen masih valid.
Post ini membaca tiga halaman GitGuardian tersebut, dokumentasi MCP Claude Code, serta README gitleaks dan ggshield, dan tidak ada yang lain. Setiap angka saya atribusikan ke halaman tempat saya membacanya, lengkap dengan metode dan batas yang dinyatakan halaman itu. Kalau saya menghitung sendiri, saya katakan begitu. Tujuannya adalah rencana yang bisa dijalankan di laptop developer minggu ini, dan catatan jujur tentang apa yang dibuktikan angka-angka itu dan apa yang tidak.
Apa yang diukur GitGuardian, dan apa yang tidak mereka katakan
Laporan ini adalah edisi kelima studi tahunan GitGuardian, terbit 17 Maret 2026 dan mencakup tahun kalender 2025, dengan tren sejak 2021. Sumber datanya, menurut pengumuman mereka, adalah commit GitHub publik, repository internal, tool kolaborasi dan produktivitas, serta file konfigurasi MCP. Tabel berikut mendaftar angka yang saya pakai, tempat saya membacanya, dan batas yang menyertainya.
| Angka | Nilai seperti dipublikasikan | Tempat saya membaca | Batas |
|---|---|---|---|
| Secret baru di GitHub publik, 2025 | Sekitar 29 juta, naik 34 persen year on year | Post pengumuman | Perkiraan; tidak ada ukuran sampel atau daftar detector |
| Pertumbuhan commit publik | Naik 43 persen year on year | Post pengumuman | Penyebut berbeda dari jumlah secret |
| Kredensial layanan AI yang terekspos | 1.275.105, naik 81 persen | Halaman laporan dan pengumuman | Menghitung deteksi untuk detector penyedia AI |
| Commit co-authored Claude Code | Sekitar 2x baseline (halaman laporan); 3,2 persen vs 1,5 persen (artikel agent) | Halaman laporan dan artikel agent | Tidak ada metode mengenali commit AI; tidak ada klaim sebab-akibat |
| Secret di file konfigurasi MCP | 24.008 unik; 2.117 valid | Halaman laporan dan artikel agent | Hanya repository publik; metode validasi tidak dijelaskan |
| Secret valid 2022 yang masih valid | 64 persen (kohort 2023 66, 2024 70, 2025 77) | Grafik halaman laporan | Kohort per tahun deteksi; kohort baru punya waktu lebih sedikit untuk diperbaiki |
Dua batas penting sebelum angka mana pun dikutip. GitGuardian menjual produk keamanan secret, dan pengumumannya sendiri menyebut bahwa secret yang bocor bisa mencerminkan kesalahan manusia, bukan hanya kegagalan AI. Halaman laporan juga tidak memuat bagian metodologi: setiap grafik hanya dikreditkan sebagai analisis data oleh GitGuardian, jadi bagaimana commit berbantuan AI dikenali atau baseline didefinisikan tidak bisa saya jelaskan.
Angka Claude Code sebenarnya dua angka
Halaman laporan menyajikannya sebagai rasio: commit yang di-co-author Claude Code membocorkan secret sekitar dua kali baseline seluruh commit GitHub publik. Saya mencari 3,2 persen di halaman itu dan tidak ada. Pasangan 3,2 persen berbanding 1,5 persen muncul di artikel GitGuardian yang lebih baru tentang kredensial agent, yang mengutip laporan. Keduanya mengatakan hal serupa, tetapi hanya rasio yang ada di halaman laporan, jadi rasio saya kutip lebih dulu dan pasangan angka sebagai pembacaan artikel.
Artikel itu menyatakan batasnya dengan jelas: perbandingan tersebut tidak menetapkan bahwa tool itu sendiri penyebab tingkat yang lebih tinggi. Saya menambahkan dua bacaan sendiri. Commit dengan trailer co-author adalah kelompok yang memilih sendiri, karena orang yang membiarkan agent melakukan commit langsung mungkin juga lebih banyak meng-commit config dan scaffolding, tempat secret biasanya berada. Dan tingkat 3,2 persen berarti 96,8 persen commit itu bersih, yang bukan argumen untuk berhenti memakai tool.
Ada pula pemeriksaan skala yang layak dilakukan. Secret tumbuh 34 persen dan commit publik tumbuh 43 persen. Jika kedua hitungan menggambarkan populasi publik yang sama, tingkat per commit turun sekitar 6 persen (1,34 dibagi 1,43), meski halaman tidak menyebut keduanya satu populasi. Angka 29 juta adalah rekor volume, dan saya tidak akan membacanya sebagai rekor tingkat.
File konfigurasi MCP adalah .env yang baru
GitGuardian menemukan 24.008 secret unik di file konfigurasi MCP pada repository publik. Halaman laporan tidak memberi total yang valid, tetapi mencantumkan tipe valid terbanyak: Google API key 19,2 persen, PostgreSQL connection string 14 persen, Firecrawl 11,9 persen, Perplexity 11,2 persen, dan Brave Search 11 persen. Artikel agent menyebut 2.117 valid, dan pembagian saya sendiri menghasilkan sekitar 8,8 persen dari 24.008. Mekanismenya mudah terlihat pada kode berikut.
// Wrong: a literal token in a file that .mcp.json scope shares via git.
// This is the shape GitGuardian counted 24,008 times in public repos.
{
"mcpServers": {
"search": {
"type": "http",
"url": "https://mcp.example.com/mcp",
"headers": { "Authorization": "Bearer sk-live-REDACTED-EXAMPLE" }
}
}
}
// Right: the file holds only a reference. The value comes from the
// environment of whoever runs Claude Code, so nothing secret is committed.
// Docs: ${VAR} expands in command, args, env, url and headers.
{
"mcpServers": {
"search": {
"type": "http",
"url": "${SEARCH_MCP_URL:-https://mcp.example.com}/mcp",
"headers": { "Authorization": "Bearer ${SEARCH_MCP_TOKEN}" }
}
}
}
// Check what is unset BEFORE you trust it: an unset variable with no
// default still loads and sends the literal text "${SEARCH_MCP_TOKEN}".
// claude mcp listDokumentasi Claude Code menyebut server dengan scope project disimpan di .mcp.json pada root project dan dibagikan lewat version control. Itu memang desainnya, dan itulah sebabnya token inline di file tersebut adalah commit yang menunggu terjadi. Dokumentasi yang sama mendukung sintaks expansion, sehingga file bisa di-commit tanpa secret di dalamnya.
Expansion punya dua jebakan di dokumentasi Claude Code. Variabel yang tidak diset dan tanpa default tidak menggagalkan load: Claude Code memberi peringatan di claude mcp list lalu memakai teks literal placeholder-nya. Dan pada url atau headers server remote, variabel kredensial seperti ANTHROPIC_API_KEY, NPM_TOKEN, dan HTTPS_PROXY terbaca kosong, jadi Anda harus menyalin nilainya ke variabel bernama sendiri.
Di mana kredensial agent berada di laptop
Artikel agent GitGuardian adalah komentar dan bukan studi. Artikel itu meninjau path yang didokumentasikan tiap vendor per September 2026 dan tidak memetakan lokasi file temp. Meski begitu, ia memberi inventaris berguna tentang tempat yang tidak pernah dilihat scanner repository.
| Tool | Path yang disebut artikel | Apa yang bisa ada di dalamnya |
|---|---|---|
| Claude Code | Project .mcp.json; state user di ~/.claude/ dan ~/.claude.json | Token MCP inline; login token ada di keychain OS pada macOS, tetapi berupa file berproteksi permission di Linux dan Windows, juga di macOS saat keychain tidak tersedia seperti lewat SSH |
| Cursor | .cursor/mcp.json di project; ~/.cursor/mcp.json untuk user | Token inline sebagai nilai env atau request header; OAuth dan variable reference didokumentasikan tetapi tidak diwajibkan |
| GitHub Copilot CLI | ~/.copilot/ termasuk mcp-config.json | log, riwayat command dan sesi, session-state, penyimpanan SQLite session-store.db, mcp-oauth-config, serta fallback config.json plaintext bila tidak ada keychain |
| MCP server apa pun | Di mana pun client menyimpan config-nya | Tiap server bisa menambah non-human identity dan kredensialnya sendiri |
Artikel itu menambahkan bahwa kredensial disalin ke file lokal untuk debugging dan bahwa log atau prompt bisa merekamnya. Itulah bagian yang tidak terlihat oleh scan repository, dan sebab itu rekomendasi laporan sendiri mencakup memetakan mesin developer mana yang menyimpan secret apa.
Di mana rencana ini bisa gagal
Kegagalan pertama adalah menganggap hitungan sebagai eksposur. Halaman GitGuardian sendiri menyebut secret yang terdeteksi tidak sama dengan risiko yang bisa dieksploitasi, dan prioritas butuh lokasi, penggunaan, dan konsumen downstream. Temuan scanner di laptop pada file dengan mode 600 adalah masalah yang berbeda dari string sama di repository publik.
Kedua, scanner menjadi tempat baru penyimpanan secret. README gitleaks menggambarkan opsi redaction sebagai penyembunyi secret di log dan stdout. Saya tidak menemukan keterangan bahwa file report ikut di-redact, jadi anggap report JSON berisi secret dan simpan di tempat privat. Ketiga adalah drift: artikel agent sendiri menyarankan memeriksa dokumentasi vendor sebelum menulis aturan kebijakan, karena path ini sering berubah.
Keempat adalah yang paling saya khawatirkan. Revocation tertinggal. Grafik laporan menunjukkan 64 persen secret valid 2022 masih valid empat tahun kemudian. Scanner yang menemukan secret dan tiket yang tidak ditutup menghasilkan akhir yang sama dengan tanpa scanner. Laporan merekomendasikan jalur remediation yang berulang justru karena alasan ini.
Scan endpoint yang bisa dijalankan hari ini
gitleaks mendokumentasikan command dir yang memindai direktori atau satu file tanpa repository git, jadi bisa dipakai pada ~/.claude dan file shell history. Script di bawah hanya memakai flag yang saya baca di README-nya. Saya yang menulisnya dan tidak menjalankannya pada korpus, dan saya tidak bisa memastikan apakah ia membaca file SQLite Copilot, jadi periksa sendiri di mesin Anda.
#!/usr/bin/env bash
# endpoint-secrets-scan.sh - scan where agents keep credentials, not just git.
# Uses only flags documented in the gitleaks README (dir, -c, --redact,
# --report-path, --report-format). Exit code 1 means findings by default.
set -u
umask 077 # reports may contain the secret itself
OUT="$HOME/.secret-scan-reports"; mkdir -p "$OUT"
CONFIG="$HOME/.gitleaks-endpoint.toml" # the rule file below
TARGETS=(
"$HOME/.claude.json" # Claude Code user state and local-scope MCP servers
"$HOME/.claude" # Claude Code state
"$HOME/.cursor/mcp.json" # Cursor user-level MCP config
"$HOME/.copilot" # Copilot CLI: logs, session history, mcp-config.json
"$HOME/.zsh_history" # tokens pasted into commands
"$HOME/.bash_history"
)
status=0
for target in "${TARGETS[@]}"; do
[ -e "$target" ] || continue
gitleaks dir -c "$CONFIG" --redact \
--report-format json \
--report-path "$OUT/$(basename "$target").json" \
"$target" || status=1
done
exit $status# ~/.gitleaks-endpoint.toml
# Extends the default ruleset (same pattern as the gitleaks README example),
# then adds one rule of my own. The pattern is untested against a real corpus.
[extend]
useDefault = true
[[rules]]
id = "postgres-connection-string"
description = "PostgreSQL URL with an inline password"
regex = '''postgres(?:ql)?://[^:\s/@]+:([^@\s]+)@'''
secretGroup = 1
keywords = ["postgres"]
tags = ["mcp", "database"]README menyebut gitleaks keluar dengan kode 1 saat menemukan leak, dan ini bisa diubah dengan flag exit-code. README yang sama menyebut proyek ini feature complete, hanya menerima security patch, dan mengarahkan pekerjaan baru ke Betterleaks, jadi pilih tool dengan mempertimbangkan itu. Rule kustom di atas memperluas default config seperti contoh README sendiri, dan pola PostgreSQL adalah buatan saya, ditulis karena connection string adalah tipe valid terbanyak kedua di file MCP.
Jika sudah memakai GitGuardian, ggshield juga bisa scan tanpa git: ggshield secret scan path dengan flag recursive, diautentikasi lewat ggshield auth login atau variabel GITGUARDIAN_API_KEY. Perhatikan biayanya: ia terautentikasi ke layanan GitGuardian, seperti terlihat dari setup login dan API key, jadi baca ketentuan penanganan datanya sebelum diarahkan ke direktori home.
Perbaiki sumbernya: empat cara menjauhkan token dari file MCP
Scanning menemukan leak tetapi tidak menghentikan leak berikutnya. Dokumentasi Claude Code menawarkan empat cara menjalankan MCP server tanpa secret literal di file yang di-commit. Perbedaannya ada pada tempat akhir secret.
| Pendekatan | Tempat secret berada | Trade-off |
|---|---|---|
| Literal inline di .mcp.json | Di file, dan di git bila file di-commit | Paling sederhana; ini pola di balik 24.008 tadi |
| Variable reference di .mcp.json | Di environment shell atau secret manager Anda | Variabel yang tidak diset diam-diam menjadi teks literal; beberapa nama kredensial terbaca kosong pada url dan headers remote |
| Command headersHelper | Dari mana pun script Anda mengambilnya | Dijalankan ulang tiap koneksi dengan timeout 10 detik tanpa cache; dialog trust project harus diterima |
| OAuth lewat command mcp | Disimpan Claude Code, bukan di config Anda | Butuh server yang mendukungnya; logout dan remove ikut menghapus token tersimpan |
Saya akan memilih OAuth bila server menyediakannya, dan headersHelper yang membaca dari secret manager bila tidak. Variable reference adalah langkah termurah tetapi nilainya masih ada di shell profile, yang nanti akan ditemukan scan endpoint.
Commit .mcp.json hanya setelah Anda grep isinya untuk literal yang bukan URL atau variable reference. Hook pre-commit yang menjalankan scanner sama pada staged file menangkap kasus ketika file kemarin masih aman.
Yang dikerjakan hari Senin
Lima langkah, diurutkan dari yang paling banyak menurunkan risiko per jam kerja.
- Inventarisasi agent dan MCP server di tiap mesin developer, yang merupakan rekomendasi pertama di artikel agent.
- Jalankan script scan di laptop Anda sendiri lebih dulu dan baca temuannya sebelum rollout, supaya tahu tingkat false positive.
- Ganti token inline di .mcp.json project dengan variable reference, headersHelper, atau OAuth, lalu rotasi setiap token yang ditemukan scan.
- Tulis siapa yang me-revoke kredensial bocor dan paling lambat kapan, karena revocation lag adalah angka yang di grafik laporan mencapai 64 persen untuk 2022.
- Perlakukan perbandingan leak rate sebagai alasan untuk memeriksa, bukan alasan melarang tool, dan baca ulang sumbernya saat GitGuardian memperbaruinya.
Apa pun yang Anda pakai, ulangi pemeriksaan setelah tiap rilis vendor, karena path dan default di artikel bertanggal September 2026.
Pembacaan laporan GitGuardian yang bisa dipertahankan lebih sempit dari headline-nya. Secret mencapai rekor volume, kredensial layanan AI tumbuh paling cepat, file konfigurasi MCP adalah tempat baru yang umum untuk token, dan sebagian besar secret valid lama tidak pernah di-revoke. Apakah agent menyebabkan leak tidak terbukti. Yang terbukti adalah kredensialnya hidup di luar repository, sehingga scanner harus berjalan di tempat agent berjalan.
Sumber yang saya baca
- GitGuardian: pengumuman laporan State of Secrets Sprawl 2026
- GitGuardian: AI coding agent dan keamanan kredensial di endpoint
- GitGuardian: halaman lengkap State of Secrets Sprawl Report 2026
- Dokumentasi Claude Code: menghubungkan tool lewat MCP
- Gitleaks di GitHub: README dengan command dir dan referensi config
- ggshield di GitHub: CLI GitGuardian untuk secret scanning

