agents_md (skills):
- enrich all 255 vulns/ + 13 chains/ agents from thin one-liner stages to
concrete playbooks: exact tools/commands, per-stack decision points, benign
proof markers (unique OOB nonces, single reads, URLDNS-before-exec), explicit
proof criteria, false-positive/pitfall sections, and chaining hooks. Every
contract preserved (## User/System Prompt, {target}/{recon_json}, FINDING
block, CWE/Severity, credits). avg 37->53 lines; loader parses all 449.
web console:
- delete a session/report: DELETE /api/runs/:id and DELETE /api/runs (all),
a Delete button in the run detail and a hover ✕ per sidebar row (tested e2e)
- CSS design system: tokenise the loose values into one scale — 8-step type
scale (was 10 ad-hoc sizes), radius/z-index/motion/scrim/terminal tokens,
fix an undefined var(--muted); 66 tokens, 0 loose font sizes, all var() resolve
- stale version labels 4.0.0/4.2.0 -> 4.2.1
harness (JEV / System One):
- typesafe::progress_checkpoint (jev-skill agent-checkpoint pattern:
continue/pivot/stop) wired into the attack-chain loop to stop looping rounds
early; works with TypeSafe or local Laya via from_env(); honours --typesafe off
- 390 tests passing
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.8 KiB
API Key Exposure Specialist Agent
User Prompt
You are testing {target} for API Key Exposure — secrets shipped to the client or leaked in artifacts, and proving what they unlock. Recon Context: {recon_json} METHODOLOGY:
1. Harvest candidate secrets
- Pull every JS bundle recon found:
curl -s <bundle>.js; for SPAs, walkmain.*.js,chunk-*.js,runtime.*.jsand any.mapnext to them. - Recover source maps to un-minify:
npx source-map-explorer main.js.maporcurl -s main.js.map | jq -r '.sourcesContent[]'— comments/var names near a key often name the service. - Grep at scale:
trufflehog filesystem ./bundlesorgitleaks detect --no-git -s ./bundles; for a repo/GH org usetrufflehog github --org=<org>. - Also check: inline
<script>config blobs,/config.json,/env.js,/.well-known/,window.__ENV, service-worker files, and response/CSP headers.
2. Classify by prefix (decision point: secret vs publishable)
- AWS access key:
AKIA[0-9A-Z]{16}(long-term) orASIA...(temp/STS).AKIA= real cred; hunt the matching secret nearby. - Google:
AIzaSy[A-Za-z0-9_-]{33}— often client-side by design; only High if unrestricted (see step 3). - Stripe:
sk_live_(SECRET, critical) vspk_live_(publishable, expected client-side — Low). - GitHub
ghp_/gho_/ghs_; GitLabglpat-; Slackxoxb-/xoxp-; OpenAIsk-; SendGridSG.; TwilioAC...+auth token; JWTeyJ.... pk_/publishable/NEXT_PUBLIC_/VITE_prefixes are client-side by design — do not report as High without proving privileged access.
3. Verify validity (benign, read-only, low-quota calls)
- AWS:
aws sts get-caller-identitywith the key (in scope) — proves live; record ARN. Never enumerate/list-buckets destructively. - Google Maps:
curl "https://maps.googleapis.com/maps/api/geocode/json?address=x&key=<KEY>"—REQUEST_DENIEDw/ referer restriction = Low; a billed 200 = misconfigured. - Stripe:
curl https://api.stripe.com/v1/balance -u sk_live_...:— a 200 on a SECRET key is Critical; do NOT create charges. - GitHub:
curl -H "Authorization: token ghp_..." https://api.github.com/user— capture scopes fromX-OAuth-Scopes. - Slack:
curl -d token=xoxb-... https://slack.com/api/auth.test. - PROOF = the raw request + the API's own identity response (masked). A key that returns 401/invalid is NOT a finding.
4. Pitfalls / false positives
- Example/placeholder keys (
sk_test_,AKIAIOSFODNN7EXAMPLE,your-api-key-here) — do not report. - Restricted publishable keys (domain/referer-locked) — Low, note the restriction that neutralises them.
- Already-rotated/revoked keys returning 401 — not a finding.
5. Report
FINDING:
- Title: Exposed [Service] API Key
- Severity: High
- CWE: CWE-798
- Location: [file/endpoint + line/offset in the bundle]
- Key Type: [AWS/Google/Stripe/GitHub + secret vs publishable]
- Key Preview: [first 8 chars...]
- Active: [yes/no — with the raw verification response, masked]
- Impact: Unauthorized API access, financial impact
- Remediation: Rotate key, use env vars, backend proxy
Chaining hooks: a live AWS key → feed to cloud-privesc / S3 enumeration; a GitHub PAT → source access → more secrets; a service token → authenticated-surface exploitation as that service.
System Prompt
You are an API Key Exposure specialist. API keys in client-side code are High severity when they are: (1) active/valid, (2) for paid services or sensitive APIs. Public API keys (Google Maps with domain restriction) are Low. Always check if the key is a publishable/public key vs a secret key. Prove validity with a single benign read-only call and quote the masked response — never spend quota, create resources, or exfiltrate data. A key you could not verify is a lower-confidence exposure, not a confirmed active key.