name: bounty-hunting-methodology description: Bug bounty white-box hunting methodology. Load when the target is an open-source project with a security advisory program, bug bounty, or responsible disclosure policy. metadata: subdomain: analyst when_to_use: "bug bounty white-box methodology open source security advisory program responsible disclosure policy h1 bugcrowd"
Bug Bounty Hunting Methodology
You are not scanning. You are reading code, mapping architecture, and proving exploitability. Volume is the enemy — signal is the metric. Every report must survive triage by an experienced security engineer.
Target Assessment
Before committing iteration budget, evaluate the target:
- Impact surface: downloads/week, GitHub stars, dependency depth. A vuln in lodash or React Router has 10-100x the impact of a vuln in a 200-star project.
- Trust boundary complexity: Does the app load config from untrusted sources? Handle plugins? Parse user-controlled serialized data? Multi-tenant auth? Complex trust boundaries = more attack surface.
- Security advisory history: Check
github.com/advisories?query=<package>. Projects that accept and credit researchers will work with you. Projects with zero advisories are either very secure or don't have a disclosure process. - Reward program: HackerOne, Bugcrowd, Immunefi, GitHub Security Advisories, Google VRP. Check scope, excluded vuln classes, and reward tiers.
Record the assessment as a node:
kg_add_node("repo", "<name>", props={"stars": N, "downloads_weekly": N,
"has_security_policy": true, "advisory_count": N, "bounty_program": "hackerone"})
White-Box Methodology
This is the core loop. Fork. Read. Trace. Prove.
Step 1 — Map the project
find /workspace/target -name 'package.json' -o -name 'pyproject.toml' \
-o -name 'go.mod' -o -name 'Cargo.toml' -o -name 'composer.json' | head -20
Identify: language, framework, entry points, config loading, auth middleware.
Step 2 — Map trust boundaries
Where does untrusted input enter the system? Trace these sources:
- HTTP request params, headers, body
- Environment variables and
.envfiles - Config files from current directory (
.gemini/settings.json,.vscode/settings.json) - Plugin/extension loading paths
- Deserialization of user-controlled data (pickle, YAML, JSON with class hints)
- IPC channels, WebSocket messages, MCP tool inputs
For each source, add an ENTRYPOINT node:
kg_add_node("entrypoint", "POST /api/upload body", props={"type": "http",
"file": "routes/upload.py", "line": 42})
Step 3 — Identify crown jewels
What is the most valuable thing an attacker could reach?
- Admin access / account takeover
- RCE / command execution
- Database contents / PII
- Secret keys / credentials
- File system read/write
Add CROWN_JEWEL nodes for each.
Step 4 — Trace source → sink
For each entrypoint, trace the data flow to dangerous sinks:
exec(),eval(),spawn(),subprocess.run(),os.system()db.query()with string interpolationrender()/innerHTMLwith unescaped inputopen()/readFile()with user-controlled pathspickle.loads(),yaml.unsafe_load(),JSON.parse()with reviverredirect()with unvalidated URLs
Use semgrep, grep, or bash to find sinks, then manually trace backwards
to see if untrusted input reaches them without sanitization.
Step 5 — Prove or discard
Every finding MUST go through validate_finding with:
- A working
poc_command success_patternsthat uniquely match the exploit signal- A
negative_command(same request without payload) negative_patternsmatching the baseline response- Full
cvss_vectorstring
If you cannot reproduce it, it is NOT a finding. Record the failure and move on.
High-Value Vulnerability Classes
Prioritize by typical bounty payout and acceptance rate:
- Remote Code Execution — deserialization, template injection, command injection,
unsafe
eval/exec,shell: truewith user input. Highest payouts. - Access Control Bypass — IDOR, BOLA, missing ownership validation, broken function-level authorization. Most common accepted finding class.
- Authentication Bypass — token leakage, session fixation, OAuth state confusion,
JWT
alg=none, password reset flaws. - Path Traversal / File Write — directory escape in upload/download handlers, session file storage with crafted IDs, zip slip.
- Server-Side Request Forgery — redirect bypass, DNS rebinding, cloud metadata access via internal URL parameters.
- Injection — SQLi, XSS (stored > reflected), LDAP injection, GraphQL injection.
- Information Disclosure — API key leakage, user enumeration via error codes, schema/debug endpoint exposure, directory listing.
Report Title Convention
Every report title MUST follow: [Impact] via [Mechanism] in [Component]
Good:
- "Path traversal in plugin file upload enables arbitrary directory deletion and file write"
- "Cloud function validator bypass via prototype chain traversal"
- "Unauthenticated SSRF via HTTP redirect bypass in LiveLinks proxy"
Bad:
- "XSS vulnerability found" (no mechanism, no component)
- "Possible SQL injection" (speculative)
- "Security issue in API" (says nothing)
What NOT to Do
- Do NOT submit without a validated PoC
- Do NOT inflate CVSS beyond demonstrated impact
- Do NOT submit theoretical findings ("an attacker could potentially...")
- Do NOT spam multiple low-quality reports — one rejected report damages signal
- Do NOT submit to out-of-scope targets
- Do NOT submit duplicate findings without checking
kg_query(kind="finding")