Skip to main content
skill CX Codex

secrets-audit — Claude Code skill: what it does, how to install

Finds leaked API keys across source code, Git history, and build artifacts while auditing secrets-management posture.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add briiirussell/cybersecurity-skills --skill secrets-audit -a claude-code
Open on GitHub

What secrets-audit does

The skill runs targeted pattern checks for provider key prefixes, including Stripe, AWS, GitHub, and Slack tokens. It searches tracked files with git ls-files to avoid node_modules. The audit inspects Git history. It also inspects Docker image layers and frontend bundles that expose environment variables.

The second half reviews how the project stores credentials. It audits patterns against a security hierarchy, contrasting unencrypted .env files with managers like Doppler or AWS Secrets Manager. When a leak appears, the agent guides triage. It helps verify live keys, check access permissions, and trace exposure timelines.

Rewriting history with git filter-repo before key rotation is useless. Forks and local clones still keep the secret. Always rotate the credential first. To operate, the skill requires Bash, Read, Grep, and Glob.

What it helps with

  • scan source code and Git history for exposed API keys
  • detect secrets embedded in Docker image layers and CI logs
  • triage leaked credentials and plan zero-downtime rotation
  • audit secrets-management setups against cloud vaults and workload identity

Example prompts for the agent

  • Scan this repo and commit history for exposed Stripe and AWS credentials
  • Run a secrets audit using gitleaks and identify any leaked tokens
  • Review our secrets-management setup and recommend a migration from .env files

How to install secrets-audit

1Skills CLI (Vercel)

npx skills add briiirussell/cybersecurity-skills --skill secrets-audit -a claude-code

2Manually: put the files in place

~/.claude/skills/secrets-audit/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/secrets-audit/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about secrets-audit

How do I install secrets-audit in Claude Code?

Run npx skills add briiirussell/cybersecurity-skills --skill secrets-audit -a claude-code in your terminal.

What does secrets-audit do?

It discovers leaked credentials in code, Git history, and build artifacts, and reviews your overall secrets storage strategy.

Why should credential rotation happen before rewriting Git history?

History rewriting does not protect exposed forks or existing local clones. The leaked secret remains compromised until you generate a replacement and revoke the original key.

Source text

SKILL.md · MIT
---
name: secrets-audit
description: "Find leaked secrets in source code, Git history, build artifacts, and infrastructure — and audit the secrets-management posture preventing future leaks. Use when the user mentions 'secrets audit,' 'secret scanning,' 'leaked credentials,' 'API key in code,' 'gitleaks,' 'trufflehog,' 'git history scan,' 'secrets management,' 'vault audit,' 'rotation policy,' 'AWS Secrets Manager,' 'HashiCorp Vault,' 'Doppler,' '1Password Secrets Automation,' 'sealed-secrets,' 'External Secrets Operator,' or needs to find or prevent credential exposure."
allowed-tools: Bash, Read, Write, Grep, Glob, WebSearch
---

# Secrets Audit — Credential Exposure and Secrets-Management Review

Two halves: (1) find secrets that have already leaked into source, history, or artifacts, and (2) audit the secrets-management posture that determines whether future leaks happen.

Most secret leaks aren't "we forgot to redact" — they're "we never had a system, so every developer made up their own approach." This skill covers both the cleanup and the prevention.

Cross-references: `dependency-audit` (CI-related secrets risk in build-time exposure), `iam-audit` (workload identity federation as the alternative to long-lived keys), `owasp-audit` A02 (in-source secret patterns).

## Part 1 — Find leaked secrets

### Provider key prefixes (high-confidence patterns)

The most useful first sweep is grep against known provider key prefixes. False positives are low and matches are almost always real.

```bash
# Stripe
grep -rE "(sk_live_|sk_test_|rk_live_|whsec_)[A-Za-z0-9]{20,}" . \
  --include="*.{js,ts,jsx,tsx,py,rb,go,java,php,sh,env,yml,yaml,json}"

# AWS access keys
grep -rE "(AKIA|ASIA)[A-Z0-9]{16}" .

# AWS secret keys (40 chars, base64-y) — high FP rate, use with caution
grep -rE "[A-Za-z0-9/+=]{40}" . --include="*.env*" --include="*.json"

# GitHub
grep -rE "gh[pousr]_[A-Za-z0-9]{36}" .

# Google Cloud API key + service-account JSON
grep -rE "AIza[A-Za-z0-9_-]{35}" .
grep -rln '"type": "service_account"' . --include="*.json"

# Slack
grep -rE "xox[baprs]-[A-Za-z0-9-]+" .

# OpenAI / Anthropic
grep -rE "sk-[A-Za-z0-9]{32,}" .
grep -rE "sk-ant-[A-Za-z0-9_-]{90,}" .

# Generic high-entropy strings in env files
grep -rE "^[A-Z_]+=[A-Za-z0-9/+=]{32,}$" . --include="*.env*"
```

For full repo coverage, use `git ls-files` to scope to tracked files and avoid `node_modules`:

```bash
git ls-files | xargs grep -lE 'sk_live_|ghp_|AKIA[A-Z0-9]{16}|sk-ant-|AIza[A-Za-z0-9_-]{35}' 2>/dev/null
```

### Tooling

| Tool | Use |
|---|---|
| `gitleaks detect` | Fast, low FP, run as pre-commit and in CI; supports custom rules |
| `trufflehog git file://.` | Verifies findings against the real API (high confidence) |
| `detect-secrets scan` | Yelp's tool; good baseline file workflow |
| GitHub Secret Scanning | Free for public repos; covers most providers automatically; pushes get blocked at push time when enabled with push protection |
| GitLab Secret Detection | Similar, built-in to CI |
| GitGuardian / Doppler / Spectral | Commercial; add organizational dashboards and historical analysis |

### Git history (the part people forget)

A secret deleted in the latest commit is still in history — `git log -p`, `git log -S<secret>`, and any fork or local clone all have it.

```bash
# Search every commit for a pattern
git log -p -S "sk_live_" --all

# Search only deleted lines
git log -p --all | grep -E "^-.*sk_live_"

# Trufflehog historical scan
trufflehog git file://. --since-commit=<first-commit>

# Git history rewrite — destructive, coordinate first
git filter-repo --invert-paths --path config/secrets.yml
# or
bfg --delete-files secrets.yml
```

**Critical caveat:** rewriting history requires every developer to re-clone, every fork is still exposed, and the secret should be considered compromised regardless. Always rotate first, history-rewrite second.

### Build artifacts and other forgotten places

Secrets leak in places that aren't `.env` files:

- **Docker images** — `docker history <image>` shows every `ENV` line; `--build-arg SECRET=...` ends up in layers
- **CI environment** — secrets logged by `set -x`, `console.log(process.env)`, error stack traces, debug output
- **Frontend bundles** — `NEXT_PUBLIC_*` / `VITE_*` / `REACT_APP_*` env vars are shipped to the browser; grep the bundled JS
- **Crash reports** — Sentry / Datadog / Bugsnag capturing `process.env` snapshots
- **Logs** — application logs shipped to a SIEM that has weaker access controls than the app
- **Backups** — `pg_dump` of a table that includes user-stored API keys
- **Public S3 / blob storage** — `.env` accidentally uploaded
- **Documentation** — README.md examples with real keys instead of placeholders
- **Slack / Notion / Linear** — pasted in a DM "to test," never rotated
- **Browser localStorage / cookies** — captured in shared screenshots or session replays

### Triaging a found secret

When you find a leaked secret:

1. **Verify it's live** — use the provider's verification (`aws sts get-caller-identity`, `stripe balance retrieve`, `curl -H "Authorization: Bearer $TOKEN" ...`) — don't assume; some leaked keys are already revoked or were sandbox-only
2. **Determine exposure window** — first commit it appeared in, when the repo went public, when CI logs were retained from
3. **Determine blast radius** — what does this key access? What can be done with it? IAM permissions, Stripe live vs test, GitHub `repo` vs `admin:org`
4. **Rotate immediately** — generate a new key, deploy it, then revoke the old one (revoke-first breaks prod)
5. **Audit for use** — provider audit logs (CloudTrail, GitHub audit log, Stripe events) for any activity from the leaked credential
6. **Then clean** — remove from current code, then optionally history-rewrite (low priority once rotated)
7. **Document** — incident report, even if rotation was clean; recurrence patterns surface trends

## Part 2 — Audit secrets-management posture

### The hierarchy of secret storage (worst → best)

| Tier | Pattern | When acceptable |
|---|---|---|
| ❌ | Hardcoded in source | Never |
| ❌ | Hardcoded in image / build artifact | Never |
| ❌ | Plaintext in shared docs / Slack | Never |
| ⚠️ | `.env` file in repo (even with .gitignore — easy to leak via push, backup, archive) | Bootstrap only; flagged in audit |
| ⚠️ | Environment variables (only) | Acceptable for ephemeral dev; weak for prod (visible in /proc, crash dumps, logs) |
| 🟢 | Secrets manager pulled at deploy time | Standard for most apps |
| 🟢 | Workload identity federation (no stored secret at all) | Best where supported |

### Cloud-provider secrets managers

- **AWS Secrets Manager / Parameter Store (SecureString)** — integrate via IAM-scoped IRSA / task role / Lambda role
- **GCP Secret Manager** — bind via Workload Identity to GSA, GSA pulls secret
- **Azure Key Vault** — pull via managed identity
- **Doppler / Infisical / 1Password Secrets Automation** — cross-cloud, developer-friendly

### Audit checklist

- **No secrets in Git history** (run gitleaks --all)
- **No `.env` committed** — `.gitignore` covers `.env*` (with care for `.env.example`)
- **Secrets fetched at runtime, not embedded at build** — image rebuild is not required to rotate
- **IAM scoped to the secret** — service A can read secret A, not secret B
- **Rotation cadence** — defined per secret class (admin: 30d, service: 90d, customer-shared: per breach response)
- **Rotation is automated** — if a human runs a script every 90 days, rotation will eventually drift
- **Access logged** — every Get / Decrypt call is in an audit trail
- **No long-lived cloud keys for workloads** — workload identity federation everywhere it's supported (see `iam-audit`)
- **Break-glass procedure** — when the secrets manager is down, how do critical services come up? (Usually: cached on disk encrypted, with strict re-fetch on restart)
- **Cross-environment isolation** — staging cannot read prod secrets, ever (different KMS keys, different IAM)

### Common findings

- **Rotation never tested** — secret stores configured, never actually rotated; first attempt breaks prod
- **`.env.local` shipped to staging** — environment-specific dev secrets cross the boundary
- **CI secrets accessible from PRs from forks** — GitHub's default behavior was previously dangerous; verify `pull_request_target` and secret accessibility
- **Build args used for secrets** — `--build-arg AWS_SECRET=...` ends up in image history (use `--secret`/BuildKit instead)
- **Logging frameworks dump `process.env`** on unhandled exception — Sentry / Datadog / Bugsnag scrub config required
- **Secret stored in K8s as plain Secret** without etcd encryption — base64 is encoding, not encryption (see `container-audit`)
- **OAuth client secrets in mobile apps** — public clients can't hold secrets; PKCE is the answer

## Output Format

```markdown
# Secrets Audit Report
## Scope: [repos / environments / managers covered]
## Date: [date]

### Live leaked secrets found
| Provider | Location | First seen (commit / date) | Verified live? | Rotation status |
|---|---|---|---|---|

### Secrets-management posture
| Category | Status | Notes |
|---|---|---|

### Recommendations
| Priority | Item | Owner | Deadline |
|---|---|---|---|
```

Disposition rule (Fixed / Deferred / Accepted Risk) per `owasp-audit`.

## Boundaries

- Only audit repositories, CI systems, and infrastructure the user has authorization for
- Never use a found secret to access the provider — verify it's live with a minimal API call (account info, not data extraction); do not pivot
- For history rewrite operations: never proceed without explicit confirmation and a coordinated developer-notification plan
- Refuse to help collect or weaponize leaked secrets found in other people's repos
- If the audit surfaces credentials belonging to a third party (vendor, employee personal accounts), notify and rotate; don't quietly fix

## References

- OWASP Cheat Sheet: Secrets Management
- NIST SP 800-57 (Recommendation for Key Management)
- GitGuardian "State of Secrets Sprawl" annual reports — useful for industry context
- `gitleaks`, `trufflehog`, `detect-secrets` documentation
- GitHub Secret Scanning + Push Protection documentation
- HashiCorp Vault Architecture / Best Practices
- AWS Secrets Manager Best Practices
- "Twelve-Factor App" — Config principles

© briiirussell · MIT · briiirussell/cybersecurity-skills

Similar skills

Everything for Security →

From the same set25

web-pentest A skill that walks the agent through testing a live web app: config, auth, authorization, input handling. Built for targets you have written permission to test. CX Codex +1 545installs api-audit Walks your REST, GraphQL and RPC endpoints against the OWASP API Security Top 10 (2023). Useful when you want a pass over the API contract, not the whole codebase. CX Codex +1 482installs threat-modeling Runs a structured threat-modeling session over a new feature or architecture using STRIDE, attack trees and abuse cases — before any code exists. CX Codex +1 412installs recon A skill for structured reconnaissance of an authorized target: passive gathering, port scanning, and a prioritized attack surface map. CX Codex +1 405installs mobile-audit Audits iOS and Android mobile apps against OWASP MASVS and MASTG standards. Use it to review sensitive storage, weak crypto, network pinning, and platform IPC issues. CX Codex +1 389installs osint-recon Gathers and correlates public intelligence across domains, organizations, and metadata. Helps map attack surfaces and document open-source findings. CX Codex +1 386installs prompt-injection This skill audits apps with AI features for prompt injection, permission bypass and system prompt leaks. Useful once an LLM or agent lands in your codebase. CX Codex +1 372installs incident-triage Guides rapid security incident triage and containment using the NIST SP 800-61 methodology. Useful when handling breaches, malware, or suspicious activity. CX Codex +1 361installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor