Skip to main content
BlogSecurity

GitGuardian Secrets Sprawl 2026: AI Agent Commits, MCP Configs

GitGuardian menghitung sekitar 29 juta secret publik baru pada 2025 dan 24.008 di dalam konfigurasi MCP. Apa arti angkanya, plus rencana scan endpoint developer.

Matthews Wong

Software Engineer

Oktober 202612 menit baca
GitGuardian Secrets Sprawl 2026: AI Agent Commits, MCP Configs

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.

AngkaNilai seperti dipublikasikanTempat saya membacaBatas
Secret baru di GitHub publik, 2025Sekitar 29 juta, naik 34 persen year on yearPost pengumumanPerkiraan; tidak ada ukuran sampel atau daftar detector
Pertumbuhan commit publikNaik 43 persen year on yearPost pengumumanPenyebut berbeda dari jumlah secret
Kredensial layanan AI yang terekspos1.275.105, naik 81 persenHalaman laporan dan pengumumanMenghitung deteksi untuk detector penyedia AI
Commit co-authored Claude CodeSekitar 2x baseline (halaman laporan); 3,2 persen vs 1,5 persen (artikel agent)Halaman laporan dan artikel agentTidak ada metode mengenali commit AI; tidak ada klaim sebab-akibat
Secret di file konfigurasi MCP24.008 unik; 2.117 validHalaman laporan dan artikel agentHanya repository publik; metode validasi tidak dijelaskan
Secret valid 2022 yang masih valid64 persen (kohort 2023 66, 2024 70, 2025 77)Grafik halaman laporanKohort 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 list

Dokumentasi 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.

ToolPath yang disebut artikelApa yang bisa ada di dalamnya
Claude CodeProject .mcp.json; state user di ~/.claude/ dan ~/.claude.jsonToken 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 userToken inline sebagai nilai env atau request header; OAuth dan variable reference didokumentasikan tetapi tidak diwajibkan
GitHub Copilot CLI~/.copilot/ termasuk mcp-config.jsonlog, 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 punDi mana pun client menyimpan config-nyaTiap 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.

PendekatanTempat secret beradaTrade-off
Literal inline di .mcp.jsonDi file, dan di git bila file di-commitPaling sederhana; ini pola di balik 24.008 tadi
Variable reference di .mcp.jsonDi environment shell atau secret manager AndaVariabel yang tidak diset diam-diam menjadi teks literal; beberapa nama kredensial terbaca kosong pada url dan headers remote
Command headersHelperDari mana pun script Anda mengambilnyaDijalankan ulang tiap koneksi dengan timeout 10 detik tanpa cache; dialog trust project harus diterima
OAuth lewat command mcpDisimpan Claude Code, bukan di config AndaButuh 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.

  1. Inventarisasi agent dan MCP server di tiap mesin developer, yang merupakan rekomendasi pertama di artikel agent.
  2. Jalankan script scan di laptop Anda sendiri lebih dulu dan baca temuannya sebelum rollout, supaya tahu tingkat false positive.
  3. Ganti token inline di .mcp.json project dengan variable reference, headersHelper, atau OAuth, lalu rotasi setiap token yang ditemukan scan.
  4. 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.
  5. 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.

FAQ

Pertanyaan Umum

Jawaban singkat untuk pertanyaan yang paling sering diajukan pembaca tentang topik ini.

Berapa banyak secret yang ditemukan GitGuardian di GitHub publik pada 2025?

Pengumuman laporan 2026 GitGuardian menyebut sekitar 29 juta secret terdeteksi baru, naik 34 persen year on year. Angkanya perkiraan dan halamannya tidak memberi ukuran sampel atau daftar detector. Angka itu juga hanya untuk 2025, karena laporan terbit 17 Maret 2026.

Apakah commit Claude Code membocorkan lebih banyak secret daripada commit biasa?

Halaman laporan GitGuardian menyebut commit yang di-co-author Claude Code bocor sekitar dua kali baseline di GitHub publik. Artikel GitGuardian yang lebih baru memberi 3,2 persen berbanding 1,5 persen. Keduanya menyatakan ini tidak membuktikan tool menjadi penyebab, dan tidak menjelaskan bagaimana commit berbantuan AI dikenali.

Mengapa file konfigurasi MCP berisiko untuk secret?

MCP server dengan scope project disimpan di file .mcp.json yang dibagikan lewat version control, sehingga token inline di sana ikut ter-commit. GitGuardian melaporkan 24.008 secret unik di file konfigurasi MCP publik. Solusinya memakai environment variable reference, command headersHelper, atau OAuth, bukan token literal.

Bisakah gitleaks memindai folder yang bukan repository git?

Bisa. README gitleaks mendokumentasikan command dir yang memindai direktori atau satu file tanpa riwayat git, misalnya gitleaks dir -v path/to/dir. Ia keluar dengan kode 1 saat menemukan leak kecuali Anda mengubah flag exit code.

Apa yang terjadi jika environment variable di .mcp.json tidak diset?

Menurut dokumentasi Claude Code, config tetap dimuat dan Claude Code menampilkan peringatan variabel hilang di claude mcp list dan /mcp. Setelah itu ia memakai teks placeholder literal. Periksa output tersebut, jangan berasumsi server sudah terautentikasi.