blitzstrike 2.4.120 → 2.4.121

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,6 +5,21 @@ 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
+ ## [2.4.121] — 2026-09-29
9
+
10
+ ### Added — empirical ledger auto-feed + benchmark coverage 30/30
11
+
12
+ - The live probers now auto-record their VERIFIED verdicts into the empirical
13
+ ledger (`intelligence()`): `cve_verify`/`nuclei_scan` (vector "cve"),
14
+ `jwt_forge` (jwt_alg_confusion), `proto_pollution_probe`
15
+ (prototype_pollution), `smuggling_test` (http_request_smuggling) — so a
16
+ confirmed hit feeds attack_plan's Bayesian hit-rates cross-target.
17
+ - Updated the Hackbot-Arena VECTOR_MAP with the new detectors + live probers
18
+ (cache_deception, client_trusted_flag, jwt_alg_confusion, prototype_pollution,
19
+ request-smuggling, password-reset) → detector coverage 26/30 → 30/30 (the 4
20
+ previously-unmapped labs — CacheKey, PasswordResetHarm, StaffDirectory,
21
+ NoteLock — are now covered).
22
+
8
23
  ## [2.4.120] — 2026-09-29
9
24
 
10
25
  ### Added — `nuclei_scan` (fingerprint-driven full DAST) + corpus precision fix
package/dist/index.js CHANGED
@@ -59779,18 +59779,22 @@ function load5() {
59779
59779
  }
59780
59780
  }
59781
59781
  var VECTOR_MAP = [
59782
- { re: /jwt|algorithm confusion|rs256|hs256/i, vectors: ["jwt"], detectors: ["missing_authz"], chains: ["jwt"], tools: ["jwt_analyze", "live_recon"] },
59782
+ { re: /jwt|algorithm confusion|rs256|hs256/i, vectors: ["jwt"], detectors: ["missing_authz", "jwt_alg_confusion"], chains: ["jwt"], tools: ["jwt_analyze", "jwt_forge", "live_recon"] },
59783
59783
  { re: /ssrf|server-side request/i, vectors: ["ssrf"], detectors: ["ssrf"], chains: ["ssrf"], tools: ["live_recon", "blind_oracle", "active_scan"] },
59784
59784
  { re: /sql injection|sqli|postgresql|sql/i, vectors: ["sql_injection"], detectors: ["sql_injection"], chains: ["sql_injection"], tools: ["live_recon", "blind_oracle", "active_scan"] },
59785
59785
  { re: /ssti|template injection|liquid|jinja|twig/i, vectors: ["ssti"], detectors: ["ssti"], chains: ["ssti"], tools: ["live_recon", "blind_oracle"] },
59786
59786
  { re: /command injection|os command|command execution/i, vectors: ["command_injection"], detectors: ["command_injection"], chains: ["command_injection"], tools: ["live_recon", "blind_oracle"] },
59787
- { re: /idor|bola|authorization|broken function|role|membership|ownership|entitlement|directory search|excessive data|data exposure|harvest/i, vectors: ["broken_object_level_authorization"], detectors: ["missing_authz"], chains: ["idor"], tools: ["live_recon", "active_scan", "param_precedence"] },
59787
+ { re: /idor|bola|authorization|broken function|role|membership|ownership|entitlement|directory search|excessive data|data exposure|harvest|substring|search|disclosure/i, vectors: ["broken_object_level_authorization"], detectors: ["missing_authz"], chains: ["idor"], tools: ["live_recon", "active_scan", "param_precedence", "sibling_scan"] },
59788
59788
  { re: /graphql/i, vectors: ["graphql_exposure"], detectors: ["graphql_exposure", "sql_injection"], chains: ["graphql"], tools: ["live_recon", "active_scan"] },
59789
- { re: /cache/i, vectors: ["web_cache_deception"], detectors: [], chains: ["cache_deception"], tools: ["cache_gap", "live_recon"] },
59789
+ { re: /cache/i, vectors: ["web_cache_deception"], detectors: ["cache_deception"], chains: ["cache_deception"], tools: ["cache_gap", "live_recon"] },
59790
59790
  { re: /credential|key|token|bearer|secret|leak|websocket|rum|api key/i, vectors: ["hardcoded_secret"], detectors: ["hardcoded_secret"], chains: ["secret_leak"], tools: ["live_recon", "drive_devtools", "scan_git_history"] },
59791
59791
  { re: /rate.limit|batching|otp/i, vectors: ["business_logic"], detectors: [], chains: ["rate_limit_bypass"], tools: ["race_test", "active_scan"] },
59792
59792
  { re: /mass assignment|self.regist|admin account|user creation|scope/i, vectors: ["mass_assignment"], detectors: ["mass_assignment", "missing_authz"], chains: ["mass_assignment"], tools: ["live_recon", "active_scan"] },
59793
- { re: /deserialization|rce|workflow|execution/i, vectors: ["code_execution"], detectors: ["deserialization"], chains: ["deserialization"], tools: ["live_recon", "active_scan"] }
59793
+ { re: /deserialization|rce|workflow|execution/i, vectors: ["code_execution"], detectors: ["deserialization"], chains: ["deserialization"], tools: ["live_recon", "active_scan"] },
59794
+ { re: /read.only|readonly|canedit|can_edit|ui.*bypass|client.*flag|client.*trusted|disabled.*field|isadmin|is_admin|withvip|premium|unmasked/i, vectors: ["client_trusted_flag"], detectors: ["client_trusted_flag"], chains: ["xss_to_account_takeover"], tools: ["live_recon", "active_scan"] },
59795
+ { re: /password reset|reset.*password|third.party harm|password.*reset/i, vectors: ["business_logic"], detectors: ["missing_authz"], chains: ["idor"], tools: ["live_recon", "sibling_scan"] },
59796
+ { re: /prototype|pollution|__proto__/i, vectors: ["prototype_pollution"], detectors: ["prototype_pollution"], chains: ["prototype_pollution"], tools: ["proto_pollution_probe", "live_recon"] },
59797
+ { re: /smuggl|desync|cl\.te|te\.cl/i, vectors: ["http_request_smuggling"], detectors: [], chains: ["http_request_smuggling"], tools: ["smuggling_test", "live_recon"] }
59794
59798
  ];
59795
59799
  function mapLab(lab) {
59796
59800
  const out = { vectors: [], detectors: [], chains: [], tools: [] };
@@ -64161,7 +64165,11 @@ ${statusLine}` : statusLine },
64161
64165
  target: string2().describe("Target URL, e.g. https://target.com")
64162
64166
  }
64163
64167
  }, async ({ cve, target }) => {
64164
- return { content: [{ type: "text", text: JSON.stringify(cveVerify(cve, target)) }] };
64168
+ const r = cveVerify(cve, target);
64169
+ if (r.status === "verified") {
64170
+ recordVerdict({ vector: "cve", outcome: "confirmed", target, severity: r.matched[0]?.severity });
64171
+ }
64172
+ return { content: [{ type: "text", text: JSON.stringify(r) }] };
64165
64173
  });
64166
64174
  server.registerTool("nuclei_scan", {
64167
64175
  title: "Fingerprint-driven full DAST scan via nuclei",
@@ -64175,7 +64183,11 @@ ${statusLine}` : statusLine },
64175
64183
  max: number2().optional().describe("Max findings to return (default 50)")
64176
64184
  }
64177
64185
  }, async (opts) => {
64178
- return { content: [{ type: "text", text: JSON.stringify(await nucleiScan(opts)) }] };
64186
+ const r = await nucleiScan(opts);
64187
+ for (const f of r.findings) {
64188
+ recordVerdict({ vector: "cve", outcome: "confirmed", target: opts.target, severity: f.severity });
64189
+ }
64190
+ return { content: [{ type: "text", text: JSON.stringify(r) }] };
64179
64191
  });
64180
64192
  server.registerTool("jwt_forge", {
64181
64193
  title: "Forge JWT confusion tokens and verify which is accepted live",
@@ -64189,7 +64201,11 @@ ${statusLine}` : statusLine },
64189
64201
  public_key: string2().optional().describe("Public key (PEM) to sign HS256 with for the key-confusion attack")
64190
64202
  }
64191
64203
  }, async (opts) => {
64192
- return { content: [{ type: "text", text: JSON.stringify(await jwtForge(opts)) }] };
64204
+ const r = await jwtForge(opts);
64205
+ if (r.status === "ok" && r.forged.some((f) => f.accepted)) {
64206
+ recordVerdict({ vector: "jwt_alg_confusion", outcome: "confirmed", target: opts.endpoint });
64207
+ }
64208
+ return { content: [{ type: "text", text: JSON.stringify(r) }] };
64193
64209
  });
64194
64210
  server.registerTool("proto_pollution_probe", {
64195
64211
  title: "Probe for prototype pollution with a reflection canary",
@@ -64201,7 +64217,11 @@ ${statusLine}` : statusLine },
64201
64217
  param: string2().optional().describe("JSON key to nest the poison under (default 'data')")
64202
64218
  }
64203
64219
  }, async (opts) => {
64204
- return { content: [{ type: "text", text: JSON.stringify(await protoPollutionProbe(opts)) }] };
64220
+ const r = await protoPollutionProbe(opts);
64221
+ if (r.status === "verified") {
64222
+ recordVerdict({ vector: "prototype_pollution", outcome: "confirmed", target: opts.target });
64223
+ }
64224
+ return { content: [{ type: "text", text: JSON.stringify(r) }] };
64205
64225
  });
64206
64226
  server.registerTool("smuggling_test", {
64207
64227
  title: "Detect HTTP request-smuggling (CL.TE / TE.CL) desync live",
@@ -64210,7 +64230,11 @@ ${statusLine}` : statusLine },
64210
64230
  target: string2().describe("Target URL, e.g. https://target.com")
64211
64231
  }
64212
64232
  }, async ({ target }) => {
64213
- return { content: [{ type: "text", text: JSON.stringify(await smugglingTest(target)) }] };
64233
+ const r = await smugglingTest(target);
64234
+ if (r.status === "desync") {
64235
+ recordVerdict({ vector: "http_request_smuggling", outcome: "confirmed", target });
64236
+ }
64237
+ return { content: [{ type: "text", text: JSON.stringify(r) }] };
64214
64238
  });
64215
64239
  server.registerTool("auto_poc", {
64216
64240
  title: "Auto-PoC — generate a copy-paste-ready reproduction recipe",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blitzstrike",
3
- "version": "2.4.120",
3
+ "version": "2.4.121",
4
4
  "description": "Blitz Strike — a universal MCP security-audit toolbelt. BLITZ sweeps the attack surface, EAGLE-EYE traces source-to-sink, STRIKE verifies live. 57 attack chains, 130-tool catalog, intelligence data layer. One server, every agent.",
5
5
  "type": "module",
6
6
  "bin": {