HackerOne Bounty Scope-Guard Skill
You are executing a HackerOne bug bounty workflow. This Skill is a
scope-guard wrapper: first parse and enforce the program scope and program
rules, then hand each in-scope asset to pentest-flow for the actual
security testing. Never touch an out-of-scope asset at any stage.
The launch argument is a HackerOne program link (<SCOPE LINK>), for example
hackerone.com/<handle> or .../policy_scopes. This Skill has no preset scan
target (requires_target: false in frontmatter); targets are discovered from
the program scope.
Startup and output contract
- Do not load or print the reference document during startup. It contains
report-template material and examples; load it only when preparing a report
or when parsing an ambiguous scope requires it.
- Resolve the supplied program link or obtain a pasted scope before claiming
that scope is defined. Never treat example assets in this Skill or its
references as observed program scope.
- Once scope is confirmed, keep the status concise:
Scope defined: <count> in-scope, <count> out-of-scope. Starting recon on <asset>.
- Automatically begin recon on the first confirmed
URL or WILDCARD asset
after you have printed that status in the same workflow that loaded scope.
Do not pause for an asset-selection question unless scope is ambiguous,
contains no directly supported assets, or the user explicitly asks to choose.
- Mid-session user check-ins (e.g. "ready to begin?", "are we ready?") are
not a green light by themselves: answer with scope summary, intended first
asset, and any blockers first. Start or resume recon tools only after an
explicit go-ahead or a clear recon/pentest command.
- Do not print raw HTML, full reference text, or raw tool output. If scope cannot
be loaded, ask the user to paste the Scope tab and stop before testing.
- Never treat
hackerone.com as the recon/pentest target. The program link is
only a discovery seed. Do not run js_recon, dir_enum, subdomain_enum, or
attack tooling against HackerOne itself.
Phase 1: Read scope
Call hackerone_scope first (required)
- Immediately call:
hackerone_scope(program="<SCOPE LINK or handle>").
- This tool queries HackerOne public GraphQL and returns structured in-scope
and out-of-scope assets. Use it even if a prior HTML fetch showed an empty SPA shell.
- Do not reverse-engineer HackerOne JavaScript bundles, dump
/assets/static/*,
or run js_recon on hackerone.com/* to discover the GraphQL endpoint.
Fallback only if hackerone_scope fails
Optional one-shot GET of the program page is allowed only as diagnostics;
an empty SPA shell is normal and not a scope source.
Ask the user to paste the in-scope and out-of-scope tables from the program
page Scope tab. Provide this example format:
In scope:
https://api.example.com | URL | Eligible for bounty
*.example.com | WILDCARD | Eligible for bounty
app.example.com | URL | In scope, NOT bounty-eligible
com.example.android | GOOGLE_PLAY_APP_ID | Eligible for bounty
Out of scope:
blog.example.com | URL
*.corp.example.com | WILDCARD
Parse leniently
- Extract two lists from the tool result or paste: in-scope and
out-of-scope.
- Recognize asset types by human label or API enum:
URL, WILDCARD (*.x.com), CIDR/IP, SOURCE_CODE,
GOOGLE_PLAY_APP_ID/APPLE_STORE_APP_ID/TESTFLIGHT/OTHER_APK/OTHER_IPA,
HARDWARE, AI_MODEL, SMART_CONTRACT, OTHER, and similar values.
- Recognize three eligibility states. Submission eligibility and bounty
eligibility are independent booleans:
submission=true, bounty=true → in scope, testable, bounty eligible.
submission=true, bounty=false → in scope, testable, not bounty eligible.
Do not confuse this with out of scope.
submission=false → out of scope; never test it.
- If parsing is uncertain, ask the user to confirm. Never default an
uncertain asset to in-scope.
Record the boundary internally
- Keep the in-scope assets with their type and eligibility available to the
workflow.
- Keep an out-of-scope deny-list for enforcement throughout the run.
Phase 2: Enforce boundaries
Before any testing begins, state and follow these hard rules throughout:
Scope boundary
- Test only assets in the in-scope list.
- Never touch an asset on the out-of-scope deny-list: do not fetch it, scan
it, or send any payload to it.
pentest-flow may directly handle only URL and WILDCARD assets. Other
types (mobile apps, source code, CIDR, hardware, and so on) are not
automated; ask the user to confirm how they should be handled.
Program rules (in addition to VulnClaw's existing BLOCKED_PATTERNS and
RESERVED_IP_RANGES)
- No DoS or availability impact: prohibit stress tests, resource
exhaustion, and high-volume concurrency.
- Respect rate and automation limits: operate slowly and serially, and
follow any program rule that prohibits automated scanning.
- No social engineering: do not target or phish people.
- Minimal impact and no PII exfiltration: stop once a vulnerability is
verified; do not export real user data or perform destructive actions.
Handle exceptions safely
- If any step could cross the scope boundary or violate a program rule,
stop and ask the user.
Phase 3: Enumerate and confirm
- Use the concise startup status from the output contract and select the
first directly supported asset automatically.
- Ask which asset to start with only when the output contract requires it.
- Handle one asset at a time and confirm each one separately. Avoid
concurrency that could cross the scope boundary or trigger rate limits.
Phase 4: Delegate to pentest-flow
For the selected single in-scope asset:
- Treat that asset as the active target. Run the full
recon → vulnerability-discovery → exploitation workflow against it, not
against the HackerOne scope link.
- Stay within scope throughout. Exclude and report any newly discovered
subdomain or endpoint that is outside the in-scope definition, especially
one that does not match an in-scope
WILDCARD.
- Continue to enforce all Phase 2 program rules.
Phase 5: Report in HackerOne format
For every confirmed finding, produce a report in HackerOne submission format:
- Title — concise description of the vulnerability, including its type and
affected asset.
- Asset — the affected in-scope asset (URL or identifier).
- Severity (CVSS) — CVSS vector and score (Critical/High/Medium/Low).
- Steps to Reproduce — reproducible steps, including requests, responses,
and payloads.
- Impact — exploitability and business impact.
- Remediation — recommended fix.
When there are multiple findings, keep each one in a separate section. Include
a parameterized Python PoC using requests when useful.
Remind the user that reports are for manual submission on HackerOne; this
Skill never submits reports automatically.
References
references/hackerone-report-and-scope.md — scope parsing reference (asset
type ↔ API enum, three-state eligibility, pasted table shapes), mandatory
program rules, and the HackerOne report template.
1---
2name: hackerone
3description: HackerOne bounty program scope-guard workflow — reads program scope, enforces scope and program rules, then hands each in-scope asset to pentest-flow
4requires_target: false
5---
6
7# HackerOne Bounty Scope-Guard Skill
8
9You are executing a HackerOne bug bounty workflow. This Skill is a
10**scope-guard wrapper**: first parse and enforce the program scope and program
11rules, then hand each **in-scope asset** to `pentest-flow` for the actual
12security testing. **Never touch an out-of-scope asset at any stage.**
13
14The launch argument is a HackerOne program link (`<SCOPE LINK>`), for example
15`hackerone.com/<handle>` or `.../policy_scopes`. This Skill has no preset scan
16target (`requires_target: false` in frontmatter); targets are discovered from
17the program scope.
18
19## Startup and output contract
20
21- Do not load or print the reference document during startup. It contains
22 report-template material and examples; load it only when preparing a report
23 or when parsing an ambiguous scope requires it.
24- Resolve the supplied program link or obtain a pasted scope before claiming
25 that scope is defined. Never treat example assets in this Skill or its
26 references as observed program scope.
27- Once scope is confirmed, keep the status concise:
28 `Scope defined: <count> in-scope, <count> out-of-scope. Starting recon on <asset>.`
29- Automatically begin recon on the first confirmed `URL` or `WILDCARD` asset
30 after you have printed that status in the same workflow that loaded scope.
31 Do not pause for an asset-selection question unless scope is ambiguous,
32 contains no directly supported assets, or the user explicitly asks to choose.
33- Mid-session user **check-ins** (e.g. "ready to begin?", "are we ready?") are
34 not a green light by themselves: answer with scope summary, intended first
35 asset, and any blockers first. Start or resume recon tools only after an
36 explicit go-ahead or a clear recon/pentest command.
37- Do not print raw HTML, full reference text, or raw tool output. If scope cannot
38 be loaded, ask the user to paste the Scope tab and stop before testing.
39- **Never treat `hackerone.com` as the recon/pentest target.** The program link is
40 only a discovery seed. Do not run `js_recon`, `dir_enum`, `subdomain_enum`, or
41 attack tooling against HackerOne itself.
42
43## Phase 1: Read scope
44
451. **Call `hackerone_scope` first (required)**
46 - Immediately call: `hackerone_scope(program="<SCOPE LINK or handle>")`.
47 - This tool queries HackerOne public GraphQL and returns structured in-scope
48 and out-of-scope assets. Use it even if a prior HTML fetch showed an empty SPA shell.
49 - **Do not** reverse-engineer HackerOne JavaScript bundles, dump `/assets/static/*`,
50 or run `js_recon` on `hackerone.com/*` to discover the GraphQL endpoint.
51
522. **Fallback only if `hackerone_scope` fails**
53 - Optional one-shot GET of the program page is allowed only as diagnostics;
54 an empty SPA shell is normal and not a scope source.
55 - Ask the user to paste the in-scope and out-of-scope tables from the program
56 page **Scope** tab. Provide this example format:
57
58 ```
59 In scope:
60 https://api.example.com | URL | Eligible for bounty
61 *.example.com | WILDCARD | Eligible for bounty
62 app.example.com | URL | In scope, NOT bounty-eligible
63 com.example.android | GOOGLE_PLAY_APP_ID | Eligible for bounty
64
65 Out of scope:
66 blog.example.com | URL
67 *.corp.example.com | WILDCARD
68 ```
69
703. **Parse leniently**
71 - Extract two lists from the tool result or paste: **in-scope** and
72 **out-of-scope**.
73 - Recognize asset types by human label or API enum:
74 `URL`, `WILDCARD` (`*.x.com`), `CIDR`/IP, `SOURCE_CODE`,
75 `GOOGLE_PLAY_APP_ID`/`APPLE_STORE_APP_ID`/`TESTFLIGHT`/`OTHER_APK`/`OTHER_IPA`,
76 `HARDWARE`, `AI_MODEL`, `SMART_CONTRACT`, `OTHER`, and similar values.
77 - Recognize **three eligibility states**. Submission eligibility and bounty
78 eligibility are independent booleans:
79 - `submission=true, bounty=true` → in scope, testable, bounty eligible.
80 - `submission=true, bounty=false` → **in scope, testable, not bounty eligible**.
81 Do not confuse this with out of scope.
82 - `submission=false` → **out of scope; never test it**.
83 - If parsing is uncertain, ask the user to confirm. **Never default an
84 uncertain asset to in-scope.**
85
864. **Record the boundary internally**
87 - Keep the in-scope assets with their type and eligibility available to the
88 workflow.
89 - Keep an out-of-scope **deny-list** for enforcement throughout the run.
90
91## Phase 2: Enforce boundaries
92
93Before any testing begins, state and follow these **hard rules** throughout:
94
951. **Scope boundary**
96 - Test only assets in the in-scope list.
97 - Never touch an asset on the out-of-scope deny-list: do not fetch it, scan
98 it, or send any payload to it.
99 - `pentest-flow` may directly handle only `URL` and `WILDCARD` assets. Other
100 types (mobile apps, source code, CIDR, hardware, and so on) are not
101 automated; ask the user to confirm how they should be handled.
102
1032. **Program rules** (in addition to VulnClaw's existing `BLOCKED_PATTERNS` and
104 `RESERVED_IP_RANGES`)
105 - **No DoS or availability impact**: prohibit stress tests, resource
106 exhaustion, and high-volume concurrency.
107 - **Respect rate and automation limits**: operate slowly and serially, and
108 follow any program rule that prohibits automated scanning.
109 - **No social engineering**: do not target or phish people.
110 - **Minimal impact and no PII exfiltration**: stop once a vulnerability is
111 verified; do not export real user data or perform destructive actions.
112
1133. **Handle exceptions safely**
114 - If any step could cross the scope boundary or violate a program rule,
115 stop and ask the user.
116
117## Phase 3: Enumerate and confirm
118
1191. Use the concise startup status from the output contract and select the
120 first directly supported asset automatically.
1212. Ask which asset to start with only when the output contract requires it.
1223. **Handle one asset at a time** and confirm each one separately. Avoid
123 concurrency that could cross the scope boundary or trigger rate limits.
124
125## Phase 4: Delegate to pentest-flow
126
127For the selected **single in-scope asset**:
128
1291. Treat that asset as the active target. Run the full
130 recon → vulnerability-discovery → exploitation workflow against **it**, not
131 against the HackerOne scope link.
1322. Stay within scope throughout. Exclude and report any newly discovered
133 subdomain or endpoint that is outside the in-scope definition, especially
134 one that does not match an in-scope `WILDCARD`.
1353. Continue to enforce all Phase 2 program rules.
136
137## Phase 5: Report in HackerOne format
138
139For every confirmed finding, produce a report in **HackerOne submission format**:
140
1411. **Title** — concise description of the vulnerability, including its type and
142 affected asset.
1432. **Asset** — the affected in-scope asset (URL or identifier).
1443. **Severity (CVSS)** — CVSS vector and score (Critical/High/Medium/Low).
1454. **Steps to Reproduce** — reproducible steps, including requests, responses,
146 and payloads.
1475. **Impact** — exploitability and business impact.
1486. **Remediation** — recommended fix.
149
150When there are multiple findings, keep each one in a separate section. Include
151a parameterized Python PoC using `requests` when useful.
152Remind the user that reports are for **manual submission** on HackerOne; this
153Skill never submits reports automatically.
154
155## References
156
157- `references/hackerone-report-and-scope.md` — scope parsing reference (asset
158 type ↔ API enum, three-state eligibility, pasted table shapes), mandatory
159 program rules, and the HackerOne report template.