blitzstrike 2.4.181 → 2.4.183

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,7 +5,23 @@ 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.180] — 2026-10-11
8
+ ## [2.4.183] — 2026-11-03
9
+
10
+ ### Fixed — corrected stale CHANGELOG release dates
11
+
12
+ - Entries 2.4.169–2.4.178 were dated 2026-10-11 but published 2026-10-12;
13
+ 2.4.179 published 2026-10-18; 2.4.182 published 2026-11-03. Dates corrected
14
+ to match the npm publish times.
15
+
16
+ ## [2.4.182] — 2026-11-03
17
+
18
+ ### Added — HTTP-level asset fingerprinting (Shodan-style MMH3)
19
+
20
+ - New `favicon_hash` tool + `src/fingerprint.ts`: MurmurHash3 (x86 32-bit) favicon
21
+ fingerprint — the Shodan-compatible `http.favicon.hash` (verified against the
22
+ python `mmh3` reference: 9/9 vectors match) — plus body SHA-256 for content dedup
23
+ and the base64 `mmh3:` form. The same favicon hash means the same product/tech
24
+ even across unrelated hosts, so it is the strongest web-asset pivoting signal.
9
25
 
10
26
  ### Changed — goal decomposition corrected (goal = deliverable, not process)
11
27
 
@@ -20,7 +36,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
20
36
  a new target discovered outside the constraints is recorded as an out-of-scope
21
37
  fact and skipped, never authorized.
22
38
 
23
- ### Added — 4 doctrine rules
39
+ ### Added — 6 doctrine rules
24
40
 
25
41
  - `constraint_self_contained`, `record_is_memory` (write-back is anti-compaction
26
42
  long-term memory — record immediately, only increments), `wrapup_highest_priority`
@@ -29,7 +45,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
29
45
  `serial_chain_discipline` (each chain step consumes the prior step's REAL output),
30
46
  `compression_discipline` (synthesize causally, preserve observed/inferred + source ids).
31
47
 
32
- ## [2.4.179] — 2026-10-11
48
+ ## [2.4.179] — 2026-10-18
33
49
 
34
50
  ### Added — WordPress P1-P6 vulnerability pattern taxonomy
35
51
 
@@ -40,7 +56,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
40
56
  fixed (the correct control), and anchor WPVDB record ids.
41
57
  - `frameworkProfile()` exposes `patterns`; `framework_intel` returns them.
42
58
 
43
- ## [2.4.178] — 2026-10-11
59
+ ## [2.4.178] — 2026-10-12
44
60
 
45
61
  ### Added — goal decomposition (six-phase plan)
46
62
 
@@ -49,7 +65,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
49
65
  ESCALATION → REPORT), each with its own quantitative condition. `goal_tree`
50
66
  shows the parent → sub-goal hierarchy and per-parent progress.
51
67
 
52
- ## [2.4.177] — 2026-10-11
68
+ ## [2.4.177] — 2026-10-12
53
69
 
54
70
  ### Added — surface coverage tracker (quantitative progress)
55
71
 
@@ -60,7 +76,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
60
76
  - Gives the agent a measurable "how done are we" number — a goal like
61
77
  "coverage >= 80%" is now verifiable against the measured pct before prove_goal.
62
78
 
63
- ## [2.4.176] — 2026-10-11
79
+ ## [2.4.176] — 2026-10-12
64
80
 
65
81
  ### Added — retest context (completes the retest loop)
66
82
 
@@ -69,7 +85,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
69
85
  evidence grouped by role (proof/baseline/verification) + reproducible flag,
70
86
  the active operation constraints, and the current goal state.
71
87
 
72
- ## [2.4.175] — 2026-10-11
88
+ ## [2.4.175] — 2026-10-12
73
89
 
74
90
  ### Added — evidence roles (structured proof/baseline/verification/supporting)
75
91
 
@@ -79,7 +95,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
79
95
  returns the role breakdown + a `reproducible` flag (true only when a finding has
80
96
  proof + baseline + verification — the three roles a HackerOne-grade PoC needs).
81
97
 
82
- ## [2.4.174] — 2026-10-11
98
+ ## [2.4.174] — 2026-10-12
83
99
 
84
100
  ### Added — observation ledger + lineage (third write-back channel)
85
101
 
@@ -89,7 +105,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
89
105
  - Completes the three write-back channels: findings (vulns), assets (asset_discovery),
90
106
  and facts (neutral/negative observations that would otherwise be lost).
91
107
 
92
- ## [2.4.173] — 2026-10-11
108
+ ## [2.4.173] — 2026-10-12
93
109
 
94
110
  ### Added — goal tracking + prove_goal (completion signal)
95
111
 
@@ -99,7 +115,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
99
115
  - A goal with a quantitative condition must have its measured value verified before
100
116
  proving it met; the task is complete only when `all_met` is true.
101
117
 
102
- ## [2.4.172] — 2026-10-11
118
+ ## [2.4.172] — 2026-10-12
103
119
 
104
120
  ### Added — operation constraint registry (deterministic red lines)
105
121
 
@@ -111,11 +127,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
111
127
  (host/port/param). DENY rules always win; allowlist mode fails closed.
112
128
  - The operation red line is injected as the top rule of the system prompt.
113
129
 
114
- ## [2.4.171] — 2026-10-11
130
+ ## [2.4.171] — 2026-10-12
115
131
 
116
132
  ### Changed — internal docs cleanup
117
133
 
118
- ## [2.4.170] — 2026-10-11
134
+ ## [2.4.170] — 2026-10-12
119
135
 
120
136
  ### Added — 3-way retest verdict + planner discipline
121
137
 
@@ -129,7 +145,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
129
145
  re-check once), `observed_vs_inferred` (never upgrade a version/CVE/inferred hit
130
146
  to confirmed).
131
147
 
132
- ## [2.4.169] — 2026-10-11
148
+ ## [2.4.169] — 2026-10-12
133
149
 
134
150
  ### Added — finding retest loop (post-confirmation lifecycle)
135
151
 
package/dist/index.js CHANGED
@@ -64119,6 +64119,81 @@ function coverageSummary() {
64119
64119
  };
64120
64120
  }
64121
64121
 
64122
+ // src/fingerprint.ts
64123
+ function mmh3(data, seed = 0) {
64124
+ const c1 = 3432918353;
64125
+ const c2 = 461845907;
64126
+ let h1 = seed | 0;
64127
+ const len = data.length;
64128
+ const nblocks = len >> 2;
64129
+ for (let i = 0;i < nblocks; i++) {
64130
+ const o = i << 2;
64131
+ let k1 = data[o] | data[o + 1] << 8 | data[o + 2] << 16 | data[o + 3] << 24 | 0;
64132
+ k1 = Math.imul(k1, c1) | 0;
64133
+ k1 = k1 << 15 | k1 >>> 17;
64134
+ k1 = Math.imul(k1, c2) | 0;
64135
+ h1 ^= k1;
64136
+ h1 = h1 << 13 | h1 >>> 19;
64137
+ h1 = Math.imul(h1, 5) + 3864292196 | 0;
64138
+ }
64139
+ let k1 = 0;
64140
+ const tail = nblocks << 2;
64141
+ switch (len & 3) {
64142
+ case 3:
64143
+ k1 ^= data[tail + 2] << 16;
64144
+ case 2:
64145
+ k1 ^= data[tail + 1] << 8;
64146
+ case 1:
64147
+ k1 ^= data[tail];
64148
+ k1 = Math.imul(k1, c1) | 0;
64149
+ k1 = k1 << 15 | k1 >>> 17;
64150
+ k1 = Math.imul(k1, c2) | 0;
64151
+ h1 ^= k1;
64152
+ }
64153
+ h1 ^= len;
64154
+ h1 ^= h1 >>> 16;
64155
+ h1 = Math.imul(h1, 2246822507) | 0;
64156
+ h1 ^= h1 >>> 13;
64157
+ h1 = Math.imul(h1, 3266489909) | 0;
64158
+ h1 ^= h1 >>> 16;
64159
+ return h1 | 0;
64160
+ }
64161
+ function faviconHash(bytes) {
64162
+ return mmh3(bytes, 0);
64163
+ }
64164
+ function fingerprintBundle(faviconBytes, body) {
64165
+ let favicon_mmh3 = null;
64166
+ let favicon_mmh3_b64 = null;
64167
+ if (faviconBytes && faviconBytes.length > 0) {
64168
+ favicon_mmh3 = faviconHash(faviconBytes);
64169
+ const buf = new ArrayBuffer(4);
64170
+ const dv = new DataView(buf);
64171
+ dv.setInt32(0, favicon_mmh3, false);
64172
+ favicon_mmh3_b64 = btoa(String.fromCharCode(...new Uint8Array(buf)));
64173
+ }
64174
+ return { favicon_mmh3, favicon_mmh3_b64, body_sha256: sha256(body) };
64175
+ }
64176
+ function decodeFavicon(data, encoding = "base64") {
64177
+ try {
64178
+ if (encoding === "hex") {
64179
+ const s = data.replace(/[^0-9a-fA-F]/g, "");
64180
+ if (s.length % 2 !== 0 || s.length === 0)
64181
+ return null;
64182
+ const out = new Uint8Array(s.length / 2);
64183
+ for (let i = 0;i < out.length; i++)
64184
+ out[i] = parseInt(s.slice(i * 2, i * 2 + 2), 16);
64185
+ return out;
64186
+ }
64187
+ const bin = atob(data);
64188
+ const out = new Uint8Array(bin.length);
64189
+ for (let i = 0;i < bin.length; i++)
64190
+ out[i] = bin.charCodeAt(i);
64191
+ return out;
64192
+ } catch {
64193
+ return null;
64194
+ }
64195
+ }
64196
+
64122
64197
  // src/sibling-scan.ts
64123
64198
  var SIBLING_SUFFIXES = [
64124
64199
  "export",
@@ -67230,6 +67305,21 @@ ${statusLine}` : statusLine },
67230
67305
  }]
67231
67306
  };
67232
67307
  });
67308
+ server.registerTool("favicon_hash", {
67309
+ title: "Favicon MMH3 hash (Shodan-style asset fingerprint)",
67310
+ description: "RECON: compute the Shodan-compatible MurmurHash3 (MMH3) fingerprint of a favicon (or any raw bytes) — the strongest pivoting signal for web assets: the SAME favicon hash means the SAME product/tech even across unrelated hosts. Pass base64/hex-encoded favicon bytes (or the response body to also get its SHA-256 for content dedup). Use to fingerprint a live target, dedup assets by body hash, and pivot to every host serving the same favicon.",
67311
+ inputSchema: {
67312
+ data: string2().describe("Favicon bytes as base64 (default) or hex"),
67313
+ encoding: _enum(["base64", "hex"]).optional().describe("How `data` is encoded (default base64)"),
67314
+ body: string2().optional().describe("Optional response body — returns its SHA-256 for content-based asset dedup")
67315
+ }
67316
+ }, async ({ data, encoding, body }) => {
67317
+ const bytes = decodeFavicon(data, encoding ?? "base64");
67318
+ if (!bytes)
67319
+ return { content: [{ type: "text", text: JSON.stringify({ error: "invalid favicon data" }) }] };
67320
+ const bundle = fingerprintBundle(bytes, body ?? "");
67321
+ return { content: [{ type: "text", text: JSON.stringify(bundle) }] };
67322
+ });
67233
67323
  server.registerTool("framework_intel", {
67234
67324
  title: "Framework security knowledge",
67235
67325
  description: "PHASE 5: return a framework's security knowledge (sources, sinks, sanitizers, auth gates, routing, ORM, middleware, and — for WordPress — the P1-P6 vulnerability pattern taxonomy: RCE / upload / ATO / reset / priv-esc / AJAX-REST-authz, each with signals, detect, fixed, and anchor WPVDB ids) and optionally scan code with those patterns.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blitzstrike",
3
- "version": "2.4.181",
3
+ "version": "2.4.183",
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": {