blitzstrike 1.9.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +487 -2
- package/dist/index.js +2931 -1375
- package/intelligence/framework_tricks.json +337 -336
- package/intelligence/retry_guidance.json +10 -0
- package/intelligence/techniques.json +1208 -1183
- package/opencode-agents/Blitz Strike.md +70 -36
- package/opencode-agents/Strike.md +4 -2
- package/package.json +1 -1
- package/skills/bs-flask-debug-rce.md +142 -0
- package/skills/bs-orchestrate-engagement.md +8 -0
- package/skills/hp-dast-active-scan.md +1 -1
- package/tools-catalog.json +5631 -5192
package/CHANGELOG.md
CHANGED
|
@@ -5,14 +5,499 @@ All notable changes to Blitz Strike are documented here.
|
|
|
5
5
|
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
7
7
|
|
|
8
|
-
## [
|
|
8
|
+
## [2.4.0] — 2026-09-14
|
|
9
|
+
|
|
10
|
+
### Added — bulk tool installation (install the whole catalog at once)
|
|
11
|
+
|
|
12
|
+
- `installAllTools({ category?, concurrency? })` + `ensureToolAsync()`: install
|
|
13
|
+
every non-MCP-server catalog tool in parallel (bounded concurrency), skipping
|
|
14
|
+
MCP servers (they are connected, not installed). Returns installed /
|
|
15
|
+
already_installed / failed + per-tool result.
|
|
16
|
+
- CLI: `blitzstrike install-tools` (all), `--category recon` (filter),
|
|
17
|
+
`--concurrency 8` (workers), `--dry-run` (preview without installing).
|
|
18
|
+
- MCP tool `install_all_tools` so the driving agent can mass-provision the
|
|
19
|
+
toolbelt instead of ensure_tool one-by-one.
|
|
20
|
+
|
|
21
|
+
## [2.3.4] — 2026-09-14
|
|
22
|
+
|
|
23
|
+
### Fixed — CI failure (browser checks threw on missing Chromium binary)
|
|
24
|
+
|
|
25
|
+
- Root cause: `chromium.launch()` sat OUTSIDE the try/catch in all four browser
|
|
26
|
+
checks, so a clean CI runner (playwright-core installed but no Chromium binary)
|
|
27
|
+
threw an uncaught error → the browser-dispatch unit test failed.
|
|
28
|
+
- Added `launchHeadless()` which returns null on launch failure; every browser
|
|
29
|
+
check now degrades to `unavailable` instead of throwing. Verified by running the
|
|
30
|
+
browser dispatch with `PLAYWRIGHT_BROWSERS_PATH=/nonexistent`.
|
|
31
|
+
|
|
32
|
+
## [2.3.3] — 2026-09-14
|
|
33
|
+
|
|
34
|
+
### Added — Burp Suite MCP auto-verification (SSE detect + handshake)
|
|
35
|
+
|
|
36
|
+
- New `src/burp-mcp.ts`: `driveBurpMCP(url)` detects whether the Burp MCP SSE
|
|
37
|
+
server is alive (default http://127.0.0.1:9876/sse), then performs the MCP SSE
|
|
38
|
+
handshake (endpoint event → initialize → tools/list) and returns the server
|
|
39
|
+
info + tool list — or a clear, actionable "start Burp + load the extension"
|
|
40
|
+
error when it is unreachable.
|
|
41
|
+
- The `burp` chain hint now auto-verifies: `executeChainSteps` probes the SSE
|
|
42
|
+
endpoint and reports alive/not-alive instead of returning a connect string.
|
|
43
|
+
|
|
44
|
+
## [2.3.2] — 2026-09-14
|
|
45
|
+
|
|
46
|
+
### Added — chrome-devtools-mcp auto-verification (Blitz becomes an MCP client)
|
|
47
|
+
|
|
48
|
+
- New `src/devtools.ts`: a minimal MCP stdio client + `driveChromeDevtools(target)`.
|
|
49
|
+
Blitz now spawns chrome-devtools-mcp, performs the initialize handshake, and
|
|
50
|
+
DRIVES its tools (list_pages → navigate_page → list_network_requests →
|
|
51
|
+
list_console_messages → evaluate_script) against a target, returning live traffic,
|
|
52
|
+
console messages, and a JS eval.
|
|
53
|
+
- The `browser_devtools` chain hint now auto-executes: `executeChainSteps` spawns
|
|
54
|
+
and drives a real browser session instead of returning a connect string.
|
|
55
|
+
- New MCP tool `drive_devtools` so the driving agent can open any URL in a live
|
|
56
|
+
Chrome and capture network/console/eval on demand.
|
|
57
|
+
- Discovers a usable Chromium (system Chrome → playwright cache) and passes
|
|
58
|
+
`--no-sandbox --disable-gpu` for root/container runs.
|
|
59
|
+
|
|
60
|
+
## [2.3.1] — 2026-09-14
|
|
61
|
+
|
|
62
|
+
### Fixed — verified both MCP servers live (no more "pajangan")
|
|
63
|
+
|
|
64
|
+
- **chrome-devtools-mcp** verified end-to-end over stdio: initialize handshake OK,
|
|
65
|
+
`navigate_page` → httpbin 200, `list_network_requests` returns real traffic,
|
|
66
|
+
`evaluate_script` runs JS. Root/container runs crash with "Target closed" unless
|
|
67
|
+
`--chromeArg=--no-sandbox --chromeArg=--disable-gpu` is passed — the `serve`
|
|
68
|
+
string and doctrine now include these.
|
|
69
|
+
- **burp-suite-mcp** connection details corrected: it is NOT an npm package / BApp
|
|
70
|
+
store entry — it's a Burp Java extension built via `./gradlew embedProxyJar`
|
|
71
|
+
(→ build/libs/burp-mcp-all.jar), loaded in Burp → Extensions, default SSE
|
|
72
|
+
`http://127.0.0.1:9876`, plus the packaged stdio proxy
|
|
73
|
+
`java -jar mcp-proxy-all.jar --sse-url http://127.0.0.1:9876`.
|
|
74
|
+
- Doctrine EXTERNAL MCP SERVERS line now carries the exact, tested commands.
|
|
75
|
+
|
|
76
|
+
## [2.3.0] — 2026-09-14
|
|
77
|
+
|
|
78
|
+
### Added — external MCP server integration (chrome-devtools + burp-suite)
|
|
79
|
+
|
|
80
|
+
- Added `chrome-devtools-mcp` + `burp-suite-mcp` to the catalog (now 141 tools) as
|
|
81
|
+
a new `mcp-server` category. These are discoverable via list_tools, installable
|
|
82
|
+
via ensure_tool, and carry a `serve` connection string.
|
|
83
|
+
- `runCatalogTool` detects `mcp-server` entries and returns the connection string
|
|
84
|
+
(npx / Burp extension) instead of spawning a long-running daemon as a one-shot
|
|
85
|
+
subprocess; the chain executor surfaces them as a deferred "connect" step.
|
|
86
|
+
- `toolForHint("burp")` now resolves to `burp-suite-mcp` (previously deferred).
|
|
87
|
+
- Added an EXTERNAL MCP SERVERS doctrine line so the driving agent knows to CONNECT
|
|
88
|
+
chrome-devtools-mcp (raw network/console/cookie inspection) and burp-suite-mcp
|
|
89
|
+
(proxy + active scanning) for depth the built-in browser can't reach.
|
|
90
|
+
|
|
91
|
+
## [2.2.4] — 2026-09-14
|
|
92
|
+
|
|
93
|
+
### Added — browser chain steps auto-execute (no longer deferred)
|
|
94
|
+
|
|
95
|
+
- Mapped the `browser` / `browser_devtools` chain hints to a finding-level browser
|
|
96
|
+
validation. The executor now drives a real headless Chromium to validate the
|
|
97
|
+
finding (DOM XSS / open redirect / auth bypass / CSRF), choosing the check from
|
|
98
|
+
the finding's class via a data map — the browser tool is the same for every
|
|
99
|
+
chain, only the check type varies.
|
|
100
|
+
|
|
101
|
+
## [2.2.3] — 2026-09-14
|
|
102
|
+
|
|
103
|
+
### Added — catalog tools for previously-unresolved chain hints
|
|
104
|
+
|
|
105
|
+
- Added 9 catalog tools so more chain steps execute instead of deferring to the
|
|
106
|
+
LLM: inql (GraphQL), smuggler (request smuggling), subjs (JS endpoint extract),
|
|
107
|
+
subzy (subdomain takeover), tplmap (SSTI), kubectl, interactsh-client (OOB),
|
|
108
|
+
rogue-jndi (JNDI), ssh. Catalog now 139 tools.
|
|
109
|
+
- `toolForHint` now strips ALL non-alphanumerics when matching, so `rogue_jndi`,
|
|
110
|
+
`rogue-jndi` and `roguejndi` resolve to the same tool.
|
|
111
|
+
|
|
112
|
+
## [2.2.2] — 2026-09-14
|
|
113
|
+
|
|
114
|
+
### Fixed — interconnection audit bugs
|
|
115
|
+
|
|
116
|
+
- **runCatalogTool dropped the target for 34 no-required-flag tools** (curl, httpx,
|
|
117
|
+
nmap, dnsx, trufflehog, ...) — the command was built with no target at all. Now
|
|
118
|
+
falls back to an unambiguous target flag (-u/--url/--domain/--target) or a
|
|
119
|
+
positional argument. Extracted `buildCatalogCommand` for deterministic testing.
|
|
120
|
+
- **CRLF probe double-encoded** — `encodeURIComponent("%0d%0a…")` produced
|
|
121
|
+
`%250d%250a`, so the CRLF was never injected (permanent false negative). The
|
|
122
|
+
probe is now pre-encoded and sent as-is.
|
|
123
|
+
- **Stale run_autonomous note** — still told the LLM to "follow next_steps to
|
|
124
|
+
verify" after the chain executor began auto-executing those steps; updated.
|
|
125
|
+
|
|
126
|
+
## [2.2.1] — 2026-09-14
|
|
127
|
+
|
|
128
|
+
### Changed — chain executor is now generic name-based dispatch (no semantic buckets)
|
|
129
|
+
|
|
130
|
+
- Removed the hardcoded `tool_hint ~ verify/crack/scan` category mapping. The
|
|
131
|
+
executor now resolves each chain step's `tool_hint` by NAME against a Blitz
|
|
132
|
+
finding-tool registry (strike_verify / crack_hash / scan_leaked_source + chain
|
|
133
|
+
aliases), then the external-tool catalog, then manual. Whatever tool the chain
|
|
134
|
+
names for a finding runs — per-target, per-finding, no per-vuln or per-category
|
|
135
|
+
hardcoding.
|
|
136
|
+
|
|
137
|
+
## [2.2.0] — 2026-09-14
|
|
138
|
+
|
|
139
|
+
### Added — catalog tool execution (LLM ↔ tools ↔ external tools connected)
|
|
140
|
+
|
|
141
|
+
- `runCatalogTool(hint, target, extra_flags)` + `toolForHint(hint)`: map a chain
|
|
142
|
+
step's tool_hint (sqlmap, nuclei, jwt_tool, hydra, subfinder, ...) to a catalog
|
|
143
|
+
tool, ensure it is installed (auto-install via ensure_tool), and RUN it against
|
|
144
|
+
the finding's target with the tool's required flags auto-built. Returns exit code
|
|
145
|
+
+ capped output. Non-interactive; no destructive flags beyond the tool's own.
|
|
146
|
+
- Chain executor now runs catalog-tool hints as a "tool" outcome — a chain step
|
|
147
|
+
that says `sqlmap` executes sqlmap instead of being deferred to the LLM.
|
|
148
|
+
- New MCP tool `run_catalog_tool` so the driving agent can run external tools
|
|
149
|
+
directly against a target.
|
|
150
|
+
|
|
151
|
+
## [2.1.0] — 2026-09-14
|
|
152
|
+
|
|
153
|
+
### Added — generic chain executor (findings advance through their chain in the pipeline)
|
|
154
|
+
|
|
155
|
+
- New `src/chain-executor.ts`: `executeChainSteps(finding, steps)` interprets each
|
|
156
|
+
chain step's `tool_hint` and runs the matching deterministic operation, so the
|
|
157
|
+
PIPELINE executes a finding's escalation chain instead of leaving it as a
|
|
158
|
+
hypothesis for the LLM. Target-agnostic: works for SQLi, SSRF, SSTI, LFI, JWT,
|
|
159
|
+
deserialization, etc.
|
|
160
|
+
- `tool_hint ~ verify` → strike_verify (marker + negative control) → confirmed/blocked
|
|
161
|
+
- `tool_hint ~ crack` → crack_hash on any hashes in the finding's evidence
|
|
162
|
+
- `tool_hint ~ scan` → scan_leaked_source on the finding's evidence text
|
|
163
|
+
- otherwise → flagged `deferred` with the exact action + tool
|
|
164
|
+
- `run_autonomous` now executes the chain steps for every finding and attaches
|
|
165
|
+
`escalation.executed` (one result per step) alongside the `next_steps`.
|
|
166
|
+
|
|
167
|
+
## [2.0.0] — 2026-09-14
|
|
168
|
+
|
|
169
|
+
### Added — full-power attack-vector expansion (JWT / CRLF / host-header / origin bypass)
|
|
170
|
+
|
|
171
|
+
- **JWT alg-confusion check** — detects JWTs in cookies/headers/body, tests
|
|
172
|
+
alg:none acceptance (signature stripped), and flags RS/ES → HS256 confusion
|
|
173
|
+
candidates.
|
|
174
|
+
- **CRLF / header-injection check** — injects `%0d%0aX-BlitzStrike: injected` into
|
|
175
|
+
redirect/url/next/state/token params and flags any reflected header.
|
|
176
|
+
- **Host-header injection check** — sends an attacker Host and detects reflection
|
|
177
|
+
in Location / Set-Cookie / body.
|
|
178
|
+
- **Origin-exposure flag (direct-to-origin bypass)** — live_recon now classifies
|
|
179
|
+
every resolved host/IP against known CDN ranges (Cloudflare/CloudFront/Fastly/
|
|
180
|
+
Akamai/DDoS-Guard/Imperva) and surfaces `origin_exposed` + a next_step for
|
|
181
|
+
`--resolve` direct-to-origin testing (WAF/CDN layer evaporates).
|
|
182
|
+
|
|
183
|
+
## [1.19.4] — 2026-09-14
|
|
184
|
+
|
|
185
|
+
### Fixed — engagement model: recon is input, not the deliverable
|
|
186
|
+
|
|
187
|
+
- Added a DELIVERABLE + PERSISTENCE doctrine: the deliverable is a HackerOne-grade
|
|
188
|
+
FINDING report (generate_report), never a hand-written recon/surface map; verify
|
|
189
|
+
every lead (strike_verify marker+control / browser_validate) before it becomes a
|
|
190
|
+
finding; a hard block (Cloudflare/WAF/IP/captcha) is NOT the end — mark it
|
|
191
|
+
blocked + note the required vantage, then continue to the next lead; keep trying
|
|
192
|
+
every lead until verified or blocked, THEN generate_report.
|
|
193
|
+
- generate_report description now states it is the FINAL deliverable and enumerates
|
|
194
|
+
the full HackerOne-grade section layout.
|
|
195
|
+
|
|
196
|
+
## [1.19.3] — 2026-09-14
|
|
197
|
+
|
|
198
|
+
### Fixed — full interconnection audit (no dead/orphan layer)
|
|
199
|
+
|
|
200
|
+
- Added a KNOWLEDGE BASE line to the MCP instructions so the driving agent can
|
|
201
|
+
discover every layer on demand: skillLookup/listSkills (40 skills),
|
|
202
|
+
list_attack_vectors/attack_vectors (34-category taxonomy), taxonomy(kind)
|
|
203
|
+
(OWASP/CWE/ASVS/API-top-10), read_playbook (17), list_manuals/read_tool_manual
|
|
204
|
+
(317). Verified end-to-end: 97 tools → 35 data functions → 26 data files; 40
|
|
205
|
+
skills loadable; 53 techniques, 57 chains, 18 chain_links, 588 vectors all
|
|
206
|
+
resolve.
|
|
207
|
+
- Fixed taxonomy CWE lookup: `taxonomy("cwe", "89")` now matches CWE-89 (query
|
|
208
|
+
normalized to the bare number).
|
|
209
|
+
|
|
210
|
+
## [1.19.2] — 2026-09-14
|
|
211
|
+
|
|
212
|
+
### Fixed — sink scan now fires on EVERY response, not just detected probes
|
|
213
|
+
|
|
214
|
+
- `probeWithBypass` scans every response for leaked sinks regardless of whether
|
|
215
|
+
the specific injection was detected — an SSTI/SSRF/XSS probe that hits a 500
|
|
216
|
+
traceback now still captures the eval()/SECRET_KEY/requests.get sinks it
|
|
217
|
+
reveals. Sink collection was also moved BEFORE the detection early-return so a
|
|
218
|
+
non-detecting probe still contributes its leaked sinks.
|
|
219
|
+
- `strike_verify` now returns a `leaked_sinks` field — the baseline/marker/
|
|
220
|
+
control responses are scanned for tracebacks and any revealed sink is attached
|
|
221
|
+
to the verdict.
|
|
222
|
+
|
|
223
|
+
## [1.19.1] — 2026-09-14
|
|
224
|
+
|
|
225
|
+
### Fixed — sink enumeration now deterministic (not eyeball-dependent) + no-babysitting hardening
|
|
226
|
+
|
|
227
|
+
- `probeWithBypass` now scans every error/traceback response for sinks and
|
|
228
|
+
`runAdvancedChecks` turns each distinct sink into its own hypothesis Finding.
|
|
229
|
+
An SQL-error traceback that also shows `eval()` + `SECRET_KEY` + `requests.get`
|
|
230
|
+
now yields an RCE finding + a credential finding + an SSRF finding
|
|
231
|
+
automatically — the driving agent no longer has to notice them by hand.
|
|
232
|
+
- No-babysitting rule hardened: "say the word / want me to pursue / should I
|
|
233
|
+
continue" are explicit hard violations — execute the full chain until COMPLETE.
|
|
234
|
+
|
|
235
|
+
## [1.19.0] — 2026-09-14
|
|
236
|
+
|
|
237
|
+
### Added — generalized leaked-source sink scan + deterministic hash cracking
|
|
238
|
+
|
|
239
|
+
- `scan_leaked_source` tool + `sinks.ts`: scan ARBITRARY leaked text (any 500
|
|
240
|
+
traceback, debug page, source dump, config, error message, credential dump)
|
|
241
|
+
for dangerous sinks — eval/exec/os.system/subprocess (RCE),
|
|
242
|
+
render_template_string (SSTI), SQL string-building, requests.get (SSRF),
|
|
243
|
+
file read (LFI), SECRET_KEY/API keys, hardcoded creds, pickle/unserialize,
|
|
244
|
+
XML parse (XXE). Each hit returns the line, snippet, and next action. Not
|
|
245
|
+
Werkzeug-specific — works on any leak.
|
|
246
|
+
- `live_recon` now auto-scans the root response for source leaks and attaches
|
|
247
|
+
the enumerated sinks to the recon output.
|
|
248
|
+
- `crack_hash` tool + `hash.ts`: identify the hash type and immediately try a
|
|
249
|
+
built-in common-password list offline, then return the exact hashcat/john
|
|
250
|
+
command for a full crack — so "crack the hashes" becomes an action, not a
|
|
251
|
+
recommendation.
|
|
252
|
+
- Doctrine: "a 'next chain' you write is a TODO — run it, never leave it as a
|
|
253
|
+
recommendation" (scan_leaked_source / crack_hash as the execute-now tools).
|
|
254
|
+
|
|
255
|
+
## [1.18.1] — 2026-09-14
|
|
256
|
+
|
|
257
|
+
### Fixed — Werkzeug skill over-fixated on the PIN, missing the easier RCE path
|
|
258
|
+
|
|
259
|
+
- The Flask debug skill previously led with PIN derivation, which caused the
|
|
260
|
+
driving agent to get stuck on "one PIN away" and miss the SOURCE-DISCLOSURE
|
|
261
|
+
path (every 500 leaks app source → read it → find eval()/SECRET_KEY/hardcoded
|
|
262
|
+
creds → exploit directly). Reordered: source-disclosure is now Path 1 (read
|
|
263
|
+
the leaked source line-by-line, run blitz_file/taint_file on it), PIN is
|
|
264
|
+
Path 2. Doctrine updated to match.
|
|
265
|
+
|
|
266
|
+
## [1.18.0] — 2026-09-14
|
|
267
|
+
|
|
268
|
+
### Added — Werkzeug debug console PIN derivation (RCE follow-through)
|
|
269
|
+
|
|
270
|
+
- New skill `bs-flask-debug-rce` + technique class `flask_debug_pin`: when the
|
|
271
|
+
LLM finds a PIN-locked Werkzeug/Flask debug console it now derives the PIN
|
|
272
|
+
(deterministically computed from username + modname + app name + mod_path +
|
|
273
|
+
MAC-decimal + machine-id) instead of stopping at "one PIN away from RCE".
|
|
274
|
+
Includes the full SHA1 algorithm, a brute-force matrix for unknown bits, and
|
|
275
|
+
marker + negative-control verification.
|
|
276
|
+
- Flask framework tricks now note the PIN-derivation chain.
|
|
277
|
+
- Doctrine hardened: "EXECUTE follow-ups NOW, not as next phase" — debug console
|
|
278
|
+
→ derive the PIN, dumped hashes → crack/reuse, hidden-content IDOR → test the
|
|
279
|
+
direct route.
|
|
280
|
+
|
|
281
|
+
## [1.17.2] — 2026-09-14
|
|
282
|
+
|
|
283
|
+
### Fixed — SSRF false positives + fuller chain composition
|
|
284
|
+
|
|
285
|
+
- The fetch-reflect SSRF probe used `http://example.com/` → "Example Domain",
|
|
286
|
+
which matched the target's own content (23 false-positive CRITICALs on
|
|
287
|
+
example.com). Now uses a unique canary
|
|
288
|
+
(`http://httpbin.org/anything/blitzstrike-ssrf-canary`) so only a real
|
|
289
|
+
server-side fetch reflects it.
|
|
290
|
+
- Escalation mapping now points each chainId at the richer composition chain
|
|
291
|
+
(more steps + a `leads_to` entry): ssti→ssti_to_full_rce,
|
|
292
|
+
deserialization→deserialization_to_rce, path_traversal→
|
|
293
|
+
path_traversal_to_credential_theft, idor→idor_to_admin_takeover,
|
|
294
|
+
open_redirect→open_redirect_to_oauth_theft.
|
|
295
|
+
|
|
296
|
+
## [1.17.1] — 2026-09-14
|
|
297
|
+
|
|
298
|
+
### Fixed — chain escalation was silently broken + restored chain-aware doctrine
|
|
299
|
+
|
|
300
|
+
- `run_autonomous` escalation lookup was broken: a finding's `chain_id`
|
|
301
|
+
(e.g. `sql_injection`) never matched the chains.json ids (e.g. `sqli_to_rce`),
|
|
302
|
+
so every finding's `escalation` was null. Added a chain-id mapping and now
|
|
303
|
+
attach the escalation chain (steps + tools) AND a `leads_to` composition
|
|
304
|
+
(from chain_links.json) — e.g. SQLi → `sqli_to_hash_dump_and_crack` +
|
|
305
|
+
`path_traversal_to_credential_theft`.
|
|
306
|
+
- Restored a compact "CHAIN DECISIONS" doctrine to the MCP instructions: a
|
|
307
|
+
confirmed finding is the START, not the end — enumerate ESCALATE / CHAIN /
|
|
308
|
+
BYPASS / PIVOT follow-ups and ask "I found X → what can I now read/do/access?"
|
|
309
|
+
(SQLi → query for creds + console PIN + source), verifying each follow-up.
|
|
310
|
+
|
|
311
|
+
## [1.17.0] — 2026-09-14
|
|
312
|
+
|
|
313
|
+
### Added — attack_plan (data-driven attack-vector decisions)
|
|
314
|
+
|
|
315
|
+
- New `attack_plan(target, tech, params)` tool: turns recon context (detected
|
|
316
|
+
tech + discovered params) into a prioritized list of attack vectors to test,
|
|
317
|
+
each with a reason and the specific tool. Base injection vectors are always
|
|
318
|
+
listed; param hints (id→idor/sqli, url→ssrf/redirect, cmd→command-injection)
|
|
319
|
+
and tech hints (wordpress/laravel/flask/spring/...) add and reprioritize.
|
|
320
|
+
- The MCP instructions now point to `attack_plan` as the way to "decide what to
|
|
321
|
+
test next" — the driving agent enumerates the full vector surface with data
|
|
322
|
+
instead of guessing a few checks.
|
|
323
|
+
|
|
324
|
+
## [1.16.0] — 2026-09-14
|
|
325
|
+
|
|
326
|
+
### Added — more injection vectors (command injection + real XSS + fetch-reflect SSRF)
|
|
327
|
+
|
|
328
|
+
- **Command injection (CWE-78)** — new advanced check: injects `; id` into 14
|
|
329
|
+
command-ish params (cmd/command/exec/run/ping/host/ip/file/path/...) and flags
|
|
330
|
+
a hit on `uid=`/`gid=`/`www-data`/shell output.
|
|
331
|
+
- **Reflected XSS (CWE-79)** — now tests REAL payloads, not just a random
|
|
332
|
+
marker: `<script>alert(document.domain)</script>` (script context) and
|
|
333
|
+
`"><img src=x onerror=alert(1)>` (attribute breakout), flagging UNESCAPED
|
|
334
|
+
reflection. The previous reflected-input sweep only detected reflection, not
|
|
335
|
+
whether XSS was actually possible.
|
|
336
|
+
- **SSRF** — added a second probe (`http://example.com/` → "Example Domain") to
|
|
337
|
+
catch fetch-reflect SSRF, and expanded the param list (fetch/download/import/
|
|
338
|
+
feed/source/load/next).
|
|
339
|
+
- writeup engine + report now carry command-injection and XSS impact/remediation.
|
|
340
|
+
|
|
341
|
+
## [1.15.1] — 2026-09-14
|
|
342
|
+
|
|
343
|
+
### Changed — every finding now carries a full CVSS v3.1 vector
|
|
344
|
+
|
|
345
|
+
- The report emits a complete CVSS v3.1 vector string (e.g.
|
|
346
|
+
`CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H`) alongside the score. When a
|
|
347
|
+
finding has no explicit CVSS, a severity-band metric set is used to compute
|
|
348
|
+
both score and vector, so the detailed-findings table always shows the vector.
|
|
349
|
+
|
|
350
|
+
## [1.15.0] — 2026-09-14
|
|
351
|
+
|
|
352
|
+
### Added — HackerOne-grade report generation
|
|
353
|
+
|
|
354
|
+
- New `writeup` engine (`src/writeup.ts`) turns every finding into the prose a
|
|
355
|
+
professional report needs: description, root cause, numbered reproduction
|
|
356
|
+
steps, impact, remediation, and references — pulling structured content from
|
|
357
|
+
the technique knowledge base (summary + how_to_test) and the finding's own
|
|
358
|
+
CWE/severity/chain.
|
|
359
|
+
- `reportMarkdown` rewritten to a full assessment-report format: Executive
|
|
360
|
+
Summary, Scope, Methodology, Summary of Findings table, per-finding detailed
|
|
361
|
+
sections (severity/CVSS/CWE/status/confidence + description + root cause +
|
|
362
|
+
reproduction + impact + remediation + references), Recommendations, and an
|
|
363
|
+
Appendix (unverified hypotheses + cleared false positives).
|
|
364
|
+
- CVSS falls back to a severity-band default (critical 9.8 / high 8.1 / medium
|
|
365
|
+
6.1 / low 3.1) when a finding has no explicit CVSS, so the report never shows
|
|
366
|
+
a bare "—".
|
|
367
|
+
|
|
368
|
+
## [1.14.1] — 2026-09-14
|
|
369
|
+
|
|
370
|
+
### Fixed — LLM wasn't reliably reaching for tools (instructions were a 14KB manual)
|
|
371
|
+
|
|
372
|
+
- MCP `instructions` shrunk 13,989 → 1,720 chars. The old text was a full
|
|
373
|
+
methodology manual; smaller driving models (e.g. GLM) drowned in it and missed
|
|
374
|
+
the one directive that matters. Now the FIRST lines are the actionable trigger:
|
|
375
|
+
"user says test/scan/audit → call run_engagement FIRST", followed by the
|
|
376
|
+
non-negotiable rules. Detailed methodology stays in the skills (loaded
|
|
377
|
+
on-demand via read_skill).
|
|
378
|
+
- `run_engagement` / `run_autonomous` descriptions now lead with the trigger
|
|
379
|
+
("the DEFAULT first call when the user asks to test/scan/audit") instead of a
|
|
380
|
+
weak "prefer this".
|
|
381
|
+
|
|
382
|
+
## [1.14.0] — 2026-09-14
|
|
383
|
+
|
|
384
|
+
### Fixed — live pipeline timeout (parallelized request trees)
|
|
385
|
+
|
|
386
|
+
- The full live engagement was exceeding the 120s MCP tool timeout because every
|
|
387
|
+
request was sequential. Now parallelized:
|
|
388
|
+
- `dnsBrute` (51 lookups), `scanPorts` (26 probes), `discoverApi` (14 paths)
|
|
389
|
+
run concurrently via `Promise.allSettled`.
|
|
390
|
+
- Passive recon phases (subdomains / DNS / Wayback / API) run in parallel.
|
|
391
|
+
- Reflected sweep (9 params), deterministic checks (open-redirect + traversal),
|
|
392
|
+
and advanced checks (SSTI/SSRF/SQLi — 40 params) all run in parallel.
|
|
393
|
+
- Wayback CDX timeout 60s → 25s.
|
|
394
|
+
- `run_engagement` on a live URL now completes in ~15-20s instead of timing out.
|
|
395
|
+
|
|
396
|
+
## [1.13.2] — 2026-09-14
|
|
397
|
+
|
|
398
|
+
### Fixed — OpenCode connection + server version reporting
|
|
399
|
+
|
|
400
|
+
- `opencodeWrite` now writes the RESOLVED command (global `blitzstrike` binary
|
|
401
|
+
first, npx only as fallback) instead of hardcoding `npx -y blitzstrike`, which
|
|
402
|
+
could pull a stale npm-registry version. A locally-installed build is always
|
|
403
|
+
preferred.
|
|
404
|
+
- MCP `serverInfo.version` now reports the real package version (was hardcoded
|
|
405
|
+
"1.0.0"), so a driving agent can see exactly which build it is talking to.
|
|
406
|
+
|
|
407
|
+
## [1.13.1] — 2026-09-14
|
|
408
|
+
|
|
409
|
+
### Changed — cross-agent consistency (100% one doctrine)
|
|
410
|
+
|
|
411
|
+
- Rewrote the OpenCode orchestrator persona (`opencode-agents/Blitz Strike.md`)
|
|
412
|
+
and fixed `Strike.md` — removed the stale scope/authorization gate language
|
|
413
|
+
("approval gate", "authorize=true", "authorized targets only", "ask before
|
|
414
|
+
proceeding") so every persona now matches the MCP instructions: scope is
|
|
415
|
+
intel-only, no authorization gate, `run_engagement` = FIRST + ONLY action,
|
|
416
|
+
WAF bypass is automatic.
|
|
417
|
+
- Portable persona (AGENTS.md / CLAUDE.md / SKILL.md) synced to the same
|
|
418
|
+
doctrine + added the scope/WAF-bypass section.
|
|
419
|
+
- MCP instructions now state that `strike_verify` + live checks AUTO-attempt WAF
|
|
420
|
+
bypass (do not report "needs WAF bypass" without re-probing).
|
|
421
|
+
|
|
422
|
+
## [1.13.0] — 2026-09-14
|
|
423
|
+
|
|
424
|
+
### Added — WAF-bypass-aware verification
|
|
425
|
+
|
|
426
|
+
- `strike_verify` now detects a WAF block (403/406 or a block-page signature —
|
|
427
|
+
"Akses Dibatasi" / F5 / Cloudflare / ModSecurity / etc.) and, instead of
|
|
428
|
+
declaring "unconfirmed", retries the marker through 6 evasion variants
|
|
429
|
+
(double URL-encode, case variation, HTML entity, inline comment split,
|
|
430
|
+
separator, null byte). A variant that reflects the original marker = confirmed
|
|
431
|
+
with the bypass technique recorded.
|
|
432
|
+
- The advanced live checks (SSTI / SSRF / error-based SQLi) now use the same
|
|
433
|
+
bypass re-probe, so a WAF-gated injection is actually tested rather than
|
|
434
|
+
reported as "needs WAF bypass".
|
|
435
|
+
|
|
436
|
+
## [1.12.0] — 2026-09-14
|
|
437
|
+
|
|
438
|
+
### Changed — scope is intel-only (never a gate)
|
|
439
|
+
|
|
440
|
+
- `scope_check` / `active_scan` / `run_engagement` no longer refuse a URL for
|
|
441
|
+
lack of scope. Scope is classified (in_scope / out_of_scope / not_in_scope /
|
|
442
|
+
unscoped) and recorded for the report, but `allowed` is always true — the repo
|
|
443
|
+
disclaimer carries responsibility (exactly like nmap/sqlmap/Burp).
|
|
444
|
+
- Routing doctrine hardened: when the user says "test / scan / audit / pentest",
|
|
445
|
+
the FIRST and ONLY action is `run_engagement` (or `run_autonomous`) — never a
|
|
446
|
+
manual live_recon/blitz_scan first, never a fallback to manual probing.
|
|
447
|
+
|
|
448
|
+
## [1.11.2] — 2026-09-14
|
|
449
|
+
|
|
450
|
+
### Changed — live_recon result caps lifted
|
|
451
|
+
|
|
452
|
+
- Response body cap 50KB → 500KB (no longer truncates large HTML/sitemap/crt.sh
|
|
453
|
+
responses, so no links/endpoints/certs are silently dropped).
|
|
454
|
+
- Wayback CDX limit 500 → 10000 historical URLs.
|
|
455
|
+
- DNS subdomain display cap 8 → 50 in next_steps.
|
|
456
|
+
|
|
457
|
+
## [1.11.1] — 2026-09-14
|
|
458
|
+
|
|
459
|
+
### Fixed — live engagement friction (scope wildcard + timeout recovery)
|
|
460
|
+
|
|
461
|
+
- Scope matching now handles `*.host` wildcards correctly (apex + subdomains,
|
|
462
|
+
and no loose substring false matches). Previously `*.vuln-web-app.onrender.com`
|
|
463
|
+
failed to match the apex host, forcing a retry loop.
|
|
464
|
+
- Added a `timeout` recovery mode to `retry_guidance` (slow/free-tier targets:
|
|
465
|
+
split into lighter probes, add explicit scope, target one endpoint, retry
|
|
466
|
+
after cold-start).
|
|
467
|
+
|
|
468
|
+
## [1.11.0] — 2026-09-14
|
|
469
|
+
|
|
470
|
+
### Changed — no-babysitting doctrine wired into an autonomous loop
|
|
471
|
+
|
|
472
|
+
- Added an explicit AUTONOMOUS LOOP to the MCP instructions: plan → run_autonomous
|
|
473
|
+
→ delegate → task checkpoint/resume → watchdog → context_prune → terminate.
|
|
474
|
+
No-babysitting is now GUARANTEED by the interconnected tools (code-driven), not
|
|
475
|
+
just by a "never ask" prompt.
|
|
476
|
+
- Fixed the one remaining contradiction: the DAST skill said "always confirm with
|
|
477
|
+
the user"; aligned it to the destructive-consent pause condition (the only
|
|
478
|
+
consent pause; non-destructive steps proceed autonomously).
|
|
479
|
+
|
|
480
|
+
## [1.10.0] — 2026-09-14
|
|
481
|
+
|
|
482
|
+
### Fixed — live pipeline false positives (hypothesis is not a finding)
|
|
483
|
+
|
|
484
|
+
- SSTI detector used the weak marker `{{7*7}}` → `49`, which matched "49"
|
|
485
|
+
appearing randomly in any HTML page (12 false-positive "Critical" on a clean
|
|
486
|
+
target). Switched to the distinctive `{{7*'7'}}` → `7777777` evaluation.
|
|
487
|
+
- Reflected-input sweep reported every tested parameter as a finding even when
|
|
488
|
+
the marker was NOT reflected (9 noise "unconfirmed" findings). Now only a
|
|
489
|
+
CONFIRMED reflection is a finding; negative results are tracked separately
|
|
490
|
+
in `report.tested`.
|
|
491
|
+
|
|
492
|
+
## [1.9.0] — 2026-09-14
|
|
9
493
|
|
|
10
494
|
### Fixed — manuals data layer not bundled in npm tarball
|
|
11
495
|
|
|
12
496
|
- `manuals-index.json` was missing from the package `files` list, so
|
|
13
497
|
`list_manuals` / `read_tool_manual` / `read_playbook` returned empty from an
|
|
14
498
|
npm install (the 317 manuals + 17 playbooks were not indexed). Added the
|
|
15
|
-
index file to the tarball.
|
|
499
|
+
index file to the tarball. Also added a data-layer smoke test
|
|
500
|
+
(`test/data-smoke.ts`) covering every runtime data file (30 checks).
|
|
16
501
|
|
|
17
502
|
## [1.7.1] — 2026-09-14
|
|
18
503
|
|