blitzstrike 1.9.0 → 2.4.4

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