blitzstrike 2.4.181 → 2.4.182

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,15 @@ 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.182] — 2026-10-11
9
+
10
+ ### Added — HTTP-level asset fingerprinting (Shodan-style MMH3)
11
+
12
+ - New `favicon_hash` tool + `src/fingerprint.ts`: MurmurHash3 (x86 32-bit) favicon
13
+ fingerprint — the Shodan-compatible `http.favicon.hash` (verified against the
14
+ python `mmh3` reference: 9/9 vectors match) — plus body SHA-256 for content dedup
15
+ and the base64 `mmh3:` form. The same favicon hash means the same product/tech
16
+ even across unrelated hosts, so it is the strongest web-asset pivoting signal.
9
17
 
10
18
  ### Changed — goal decomposition corrected (goal = deliverable, not process)
11
19
 
@@ -20,7 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
20
28
  a new target discovered outside the constraints is recorded as an out-of-scope
21
29
  fact and skipped, never authorized.
22
30
 
23
- ### Added — 4 doctrine rules
31
+ ### Added — 6 doctrine rules
24
32
 
25
33
  - `constraint_self_contained`, `record_is_memory` (write-back is anti-compaction
26
34
  long-term memory — record immediately, only increments), `wrapup_highest_priority`
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.182",
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": {