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 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
- ## [1.8.0] — 2026-09-14
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