blitzstrike 2.4.99 → 2.4.101

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,29 @@ 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.101] — 2026-09-17
9
+
10
+ ### Added — three new hunting classes (techniques + attack vectors)
11
+
12
+ - Added `broken_link_hijacking` (expired-domain takeover), `padding_oracle`
13
+ (CBC PKCS#7 cookie/token decryption), and `dns_rebinding` (hostname
14
+ re-resolution to internal IP) to the technique base (53 → 56 classes) and the
15
+ attack-vector taxonomy (588 → 591 vectors). Each carries summary, objectives,
16
+ how-to-test steps, concrete techniques, and verify (marker + negative
17
+ control) — matching the existing per-class methodology shape.
18
+
19
+ ## [2.4.100] — 2026-09-17
20
+
21
+ ### Fixed — data-file resolution was `process.cwd()`-dependent (broke under npx)
22
+
23
+ - `watchlist()` / `watchlistCveMatches()` resolved `intelligence/watchlist.json`
24
+ via `process.cwd()`; `run_enterprise_benchmark()` resolved `bench/enterprise`
25
+ fixtures the same way. When the MCP server / compiled binary runs from any
26
+ directory other than the package root (the `npx blitzstrike` case), both threw
27
+ `ENOENT`. Now both resolve via `import.meta.url` (module-relative), matching
28
+ every other data loader (`patterns.ts`, `chains.json`, `tools-catalog.json`).
29
+ Verified: `watchlist()` and the enterprise fixtures load from an arbitrary cwd.
30
+
8
31
  ## [2.4.99] — 2026-09-17
9
32
 
10
33
  ### Fixed — grounding completeness for the CVE watchlist class tags
package/dist/index.js CHANGED
@@ -17287,7 +17287,7 @@ document.getElementById('out').innerHTML = u;
17287
17287
  // src/variants.ts
17288
17288
  import { readFileSync as readFileSync21 } from "node:fs";
17289
17289
  import { join as join21, dirname as dirname5 } from "node:path";
17290
- import { fileURLToPath as fileURLToPath11 } from "node:url";
17290
+ import { fileURLToPath as fileURLToPath12 } from "node:url";
17291
17291
  function loadVariants() {
17292
17292
  try {
17293
17293
  const doc = JSON.parse(readFileSync21(join21(__dirname5, "..", "intelligence", "variants.json"), "utf8"));
@@ -17344,7 +17344,7 @@ function variantCoverageText() {
17344
17344
  var __dirname5, CROSS_FILE_ONLY;
17345
17345
  var init_variants = __esm(() => {
17346
17346
  init_complex_bugs();
17347
- __dirname5 = dirname5(fileURLToPath11(import.meta.url));
17347
+ __dirname5 = dirname5(fileURLToPath12(import.meta.url));
17348
17348
  CROSS_FILE_ONLY = new Set(["priv_esc"]);
17349
17349
  });
17350
17350
 
@@ -17352,7 +17352,7 @@ var init_variants = __esm(() => {
17352
17352
  import { mkdirSync as mkdirSync10, writeFileSync as writeFileSync9, readFileSync as readFileSync27, readdirSync as readdirSync7, statSync as statSync4, rmSync as rmSync5 } from "node:fs";
17353
17353
  import { join as join26 } from "node:path";
17354
17354
  import { homedir as homedir10 } from "node:os";
17355
- import { fileURLToPath as fileURLToPath13 } from "node:url";
17355
+ import { fileURLToPath as fileURLToPath15 } from "node:url";
17356
17356
  import { spawnSync as spawnSync4 } from "node:child_process";
17357
17357
  function dirExists(p) {
17358
17358
  try {
@@ -17392,8 +17392,8 @@ function syncData() {
17392
17392
  data_root: DATA_ROOT2
17393
17393
  };
17394
17394
  }
17395
- const localPayloads = join26(ROOT7, "payloads");
17396
- const localTemplates = join26(ROOT7, "templates");
17395
+ const localPayloads = join26(ROOT8, "payloads");
17396
+ const localTemplates = join26(ROOT8, "templates");
17397
17397
  let payloadsSynced = false;
17398
17398
  let templatesSynced = false;
17399
17399
  if (!hasPayloads && dirExists(localPayloads)) {
@@ -17448,9 +17448,9 @@ function manualCopy(src, dst) {
17448
17448
  writeFileSync9(d, readFileSync27(s));
17449
17449
  }
17450
17450
  }
17451
- var ROOT7, DATA_ROOT2, GITHUB_REPO = "https://github.com/shinthink/blitzstrike.git";
17451
+ var ROOT8, DATA_ROOT2, GITHUB_REPO = "https://github.com/shinthink/blitzstrike.git";
17452
17452
  var init_sync = __esm(() => {
17453
- ROOT7 = join26(fileURLToPath13(new URL(".", import.meta.url)), "..");
17453
+ ROOT8 = join26(fileURLToPath15(new URL(".", import.meta.url)), "..");
17454
17454
  DATA_ROOT2 = process.env.BLITZSTRIKE_DATA ?? join26(homedir10(), ".blitzstrike", "data");
17455
17455
  });
17456
17456
 
@@ -17498,13 +17498,13 @@ var init_update = __esm(() => {
17498
17498
  // src/release.ts
17499
17499
  import { readFileSync as readFileSync29, existsSync as existsSync16 } from "node:fs";
17500
17500
  import { join as join27 } from "node:path";
17501
- import { fileURLToPath as fileURLToPath14 } from "node:url";
17501
+ import { fileURLToPath as fileURLToPath16 } from "node:url";
17502
17502
  import { execSync as execSync4 } from "node:child_process";
17503
17503
  function validateRelease() {
17504
17504
  const checks = [];
17505
17505
  checks.push({ name: "package.json version", ok: true, detail: VERSION });
17506
17506
  try {
17507
- const changelog = readFileSync29(join27(ROOT8, "CHANGELOG.md"), "utf8");
17507
+ const changelog = readFileSync29(join27(ROOT9, "CHANGELOG.md"), "utf8");
17508
17508
  const m = changelog.match(/^##\s+\[([0-9]+\.[0-9]+\.[0-9]+)\]/m);
17509
17509
  const changelogVersion = m?.[1] ?? null;
17510
17510
  checks.push({
@@ -17516,7 +17516,7 @@ function validateRelease() {
17516
17516
  checks.push({ name: "CHANGELOG version", ok: false, detail: "CHANGELOG.md not found" });
17517
17517
  }
17518
17518
  try {
17519
- const tag = execSync4("git describe --tags --abbrev=0", { cwd: ROOT8, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
17519
+ const tag = execSync4("git describe --tags --abbrev=0", { cwd: ROOT9, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
17520
17520
  checks.push({ name: "Git tag", ok: tag === `v${VERSION}`, detail: tag, soft: true });
17521
17521
  } catch {
17522
17522
  checks.push({ name: "Git tag", ok: true, detail: "unavailable (no git/tags)", soft: true });
@@ -17536,22 +17536,22 @@ function validateRelease() {
17536
17536
  return { version: VERSION, checks, consistent: checks.filter((c) => !c.soft).every((c) => c.ok) };
17537
17537
  }
17538
17538
  function lockfilePresent() {
17539
- return existsSync16(join27(ROOT8, "package-lock.json")) || existsSync16(join27(ROOT8, "bun.lock")) || existsSync16(join27(ROOT8, "bun.lockb"));
17539
+ return existsSync16(join27(ROOT9, "package-lock.json")) || existsSync16(join27(ROOT9, "bun.lock")) || existsSync16(join27(ROOT9, "bun.lockb"));
17540
17540
  }
17541
- var ROOT8;
17541
+ var ROOT9;
17542
17542
  var init_release = __esm(() => {
17543
17543
  init_version();
17544
- ROOT8 = join27(fileURLToPath14(new URL(".", import.meta.url)), "..");
17544
+ ROOT9 = join27(fileURLToPath16(new URL(".", import.meta.url)), "..");
17545
17545
  });
17546
17546
 
17547
17547
  // src/dependency.ts
17548
17548
  import { readFileSync as readFileSync30 } from "node:fs";
17549
17549
  import { join as join28 } from "node:path";
17550
- import { fileURLToPath as fileURLToPath15 } from "node:url";
17550
+ import { fileURLToPath as fileURLToPath17 } from "node:url";
17551
17551
  function checkDependencies() {
17552
17552
  let pkg = {};
17553
17553
  try {
17554
- pkg = JSON.parse(readFileSync30(join28(ROOT9, "package.json"), "utf8"));
17554
+ pkg = JSON.parse(readFileSync30(join28(ROOT10, "package.json"), "utf8"));
17555
17555
  } catch {
17556
17556
  return { install_scripts: [], git_dependencies: [], total_dependencies: 0, safe: false };
17557
17557
  }
@@ -17572,16 +17572,16 @@ function checkDependencies() {
17572
17572
  safe: installScripts.length === 0 && gitDependencies.length === 0
17573
17573
  };
17574
17574
  }
17575
- var ROOT9;
17575
+ var ROOT10;
17576
17576
  var init_dependency = __esm(() => {
17577
- ROOT9 = join28(fileURLToPath15(new URL(".", import.meta.url)), "..");
17577
+ ROOT10 = join28(fileURLToPath17(new URL(".", import.meta.url)), "..");
17578
17578
  });
17579
17579
 
17580
17580
  // src/cli.ts
17581
17581
  import { readFileSync as readFileSync31, existsSync as existsSync17, writeFileSync as writeFileSync10, mkdirSync as mkdirSync11 } from "node:fs";
17582
17582
  import { join as join29, dirname as dirname6 } from "node:path";
17583
17583
  import { homedir as homedir11 } from "node:os";
17584
- import { fileURLToPath as fileURLToPath16 } from "node:url";
17584
+ import { fileURLToPath as fileURLToPath18 } from "node:url";
17585
17585
  import { spawnSync as spawnSync5 } from "node:child_process";
17586
17586
  function which(cmd) {
17587
17587
  return spawnSync5("sh", ["-c", 'command -v "$1" >/dev/null 2>&1', "sh", cmd]).status === 0;
@@ -17624,7 +17624,7 @@ async function runDoctor() {
17624
17624
  detail: h1 ? `X-HackerOne-Research: ${h1}` : "H1_USERNAME not set",
17625
17625
  fix: h1 ? undefined : "export H1_USERNAME=<your-hackerone-username> (adds X-HackerOne-Research to outbound requests)"
17626
17626
  });
17627
- const dataOk = existsSync17(join29(ROOT10, "chains.json")) && existsSync17(join29(ROOT10, "tools-catalog.json"));
17627
+ const dataOk = existsSync17(join29(ROOT11, "chains.json")) && existsSync17(join29(ROOT11, "tools-catalog.json"));
17628
17628
  issues.push({
17629
17629
  name: "Data layers (chains + tools-catalog)",
17630
17630
  status: dataOk ? "ok" : "fail",
@@ -17675,14 +17675,14 @@ BlitzStrike — ${verdict}`);
17675
17675
  function resolveCommand() {
17676
17676
  if (which("blitzstrike"))
17677
17677
  return { command: "blitzstrike", args: ["serve", "--mcp"] };
17678
- const src = join29(ROOT10, "src", "index.ts");
17678
+ const src = join29(ROOT11, "src", "index.ts");
17679
17679
  if (which("bun") && existsSync17(src))
17680
17680
  return { command: "bun", args: ["run", src, "serve", "--mcp"] };
17681
17681
  if (which("npx"))
17682
17682
  return { command: "npx", args: ["-y", "blitzstrike", "serve", "--mcp"] };
17683
17683
  if (which("bunx"))
17684
17684
  return { command: "bunx", args: ["blitzstrike", "serve", "--mcp"] };
17685
- const dist = join29(ROOT10, "dist", "index.js");
17685
+ const dist = join29(ROOT11, "dist", "index.js");
17686
17686
  if (existsSync17(dist))
17687
17687
  return { command: "bun", args: [dist, "serve", "--mcp"] };
17688
17688
  return { command: "npx", args: ["-y", "blitzstrike", "serve", "--mcp"] };
@@ -17722,7 +17722,7 @@ function opencodeWrite(p) {
17722
17722
  };
17723
17723
  }
17724
17724
  function copyOpenCodeAgents() {
17725
- const srcDir = join29(ROOT10, "opencode-agents");
17725
+ const srcDir = join29(ROOT11, "opencode-agents");
17726
17726
  const dstDir = join29(homedir11(), ".config", "opencode", "agents");
17727
17727
  if (!existsSync17(srcDir))
17728
17728
  return;
@@ -17966,13 +17966,13 @@ Failed (${failedList.length}) — reason per tool:`);
17966
17966
  Common causes: missing toolchain, pip/git network failures, or very heavy builds. ` + `Re-run after installing the missing toolchain — failed tools are skipped, not fatal.`);
17967
17967
  }
17968
17968
  }
17969
- var ROOT10;
17969
+ var ROOT11;
17970
17970
  var init_cli = __esm(() => {
17971
17971
  init_catalog();
17972
17972
  init_release();
17973
17973
  init_dependency();
17974
17974
  init_mcp_status();
17975
- ROOT10 = join29(fileURLToPath16(new URL(".", import.meta.url)), "..");
17975
+ ROOT11 = join29(fileURLToPath18(new URL(".", import.meta.url)), "..");
17976
17976
  });
17977
17977
 
17978
17978
  // node_modules/zod/v3/helpers/util.js
@@ -32695,7 +32695,7 @@ async function nvdLookup(cveId) {
32695
32695
  init_scanner();
32696
32696
  import { readFileSync as readFileSync11, existsSync as existsSync8, statSync as statSync2 } from "node:fs";
32697
32697
  import { join as join13 } from "node:path";
32698
- import { fileURLToPath as fileURLToPath6 } from "node:url";
32698
+ import { fileURLToPath as fileURLToPath7 } from "node:url";
32699
32699
 
32700
32700
  // src/memory.ts
32701
32701
  import { readFileSync as readFileSync2, appendFileSync, mkdirSync, existsSync, writeFileSync } from "node:fs";
@@ -36080,6 +36080,8 @@ import { execFileSync } from "node:child_process";
36080
36080
  import { resolve4, Resolver } from "node:dns/promises";
36081
36081
  import { readFileSync as readFileSync10 } from "node:fs";
36082
36082
  import { join as join12 } from "node:path";
36083
+ import { fileURLToPath as fileURLToPath6 } from "node:url";
36084
+ var ROOT4 = join12(fileURLToPath6(new URL(".", import.meta.url)), "..");
36083
36085
  var BLOCKING_KEYWORDS = /internet positif|kominfo|\.go\.id\b|pemblokiran|ditutup|dilarang|akses dibatasi|blocked|restricted|illegal|advertencia|coljuegos|regulat|forbidden|this (site|website) has been (blocked|banned)/i;
36084
36086
  var HOSTNAME_RE = /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i;
36085
36087
  function isValidHostname(host) {
@@ -36153,7 +36155,7 @@ async function resolveCheck(host) {
36153
36155
  };
36154
36156
  }
36155
36157
  function loadWatchlist() {
36156
- const raw = readFileSync10(join12(process.cwd(), "intelligence", "watchlist.json"), "utf8");
36158
+ const raw = readFileSync10(join12(ROOT4, "intelligence", "watchlist.json"), "utf8");
36157
36159
  const data = JSON.parse(raw);
36158
36160
  return { cwe_frequency: data.cwe_frequency ?? [], cve_watchlist: data.cve_watchlist ?? [] };
36159
36161
  }
@@ -36776,7 +36778,7 @@ function loadChains() {
36776
36778
  if (_chainsCache)
36777
36779
  return _chainsCache;
36778
36780
  try {
36779
- const dir = join13(fileURLToPath6(new URL(".", import.meta.url)), "..");
36781
+ const dir = join13(fileURLToPath7(new URL(".", import.meta.url)), "..");
36780
36782
  const path = join13(dir, "chains.json");
36781
36783
  const raw = JSON.parse(readFileSync11(path, "utf8"));
36782
36784
  _chainsCache = raw.chains ?? [];
@@ -37559,7 +37561,7 @@ var CHAIN_ID_TO_ESCALATION = {
37559
37561
  };
37560
37562
  function loadChainLinks() {
37561
37563
  try {
37562
- const dir = join13(fileURLToPath6(new URL(".", import.meta.url)), "..");
37564
+ const dir = join13(fileURLToPath7(new URL(".", import.meta.url)), "..");
37563
37565
  const data = JSON.parse(readFileSync11(join13(dir, "intelligence", "chain_links.json"), "utf8"));
37564
37566
  return data.links ?? [];
37565
37567
  } catch {
@@ -37718,9 +37720,9 @@ function compactState(phase, findings) {
37718
37720
  // src/tasks.ts
37719
37721
  import { mkdirSync as mkdirSync6, readFileSync as readFileSync12, writeFileSync as writeFileSync3 } from "node:fs";
37720
37722
  import { join as join14 } from "node:path";
37721
- import { fileURLToPath as fileURLToPath7 } from "node:url";
37723
+ import { fileURLToPath as fileURLToPath8 } from "node:url";
37722
37724
  function tasksDir() {
37723
- return join14(fileURLToPath7(new URL(".", import.meta.url)), "..", ".blitzstrike", "tasks");
37725
+ return join14(fileURLToPath8(new URL(".", import.meta.url)), "..", ".blitzstrike", "tasks");
37724
37726
  }
37725
37727
  function taskPath(id) {
37726
37728
  return join14(tasksDir(), `${id}.json`);
@@ -58386,9 +58388,9 @@ function analyzePatchFiles(oldPath, newPath, language) {
58386
58388
  // src/frameworks.ts
58387
58389
  import { readFileSync as readFileSync18, existsSync as existsSync9 } from "node:fs";
58388
58390
  import { join as join17 } from "node:path";
58389
- import { fileURLToPath as fileURLToPath8 } from "node:url";
58390
- var ROOT4 = join17(fileURLToPath8(new URL(".", import.meta.url)), "..");
58391
- var INTEL2 = join17(ROOT4, "intelligence");
58391
+ import { fileURLToPath as fileURLToPath9 } from "node:url";
58392
+ var ROOT5 = join17(fileURLToPath9(new URL(".", import.meta.url)), "..");
58393
+ var INTEL2 = join17(ROOT5, "intelligence");
58392
58394
  var cache = null;
58393
58395
  function load3() {
58394
58396
  if (cache)
@@ -59087,8 +59089,8 @@ async function validateLeakedKey(input) {
59087
59089
  // src/hackbot-arena.ts
59088
59090
  import { readFileSync as readFileSync19 } from "node:fs";
59089
59091
  import { join as join19, dirname as dirname3 } from "node:path";
59090
- import { fileURLToPath as fileURLToPath9 } from "node:url";
59091
- var __dirname3 = dirname3(fileURLToPath9(import.meta.url));
59092
+ import { fileURLToPath as fileURLToPath10 } from "node:url";
59093
+ var __dirname3 = dirname3(fileURLToPath10(import.meta.url));
59092
59094
  function load4() {
59093
59095
  try {
59094
59096
  return JSON.parse(readFileSync19(join19(__dirname3, "..", "intelligence", "hackbot-arena.json"), "utf8"));
@@ -59255,8 +59257,8 @@ function listSeverityMap() {
59255
59257
  // src/datarefresh.ts
59256
59258
  import { readFileSync as readFileSync20 } from "node:fs";
59257
59259
  import { join as join20, dirname as dirname4 } from "node:path";
59258
- import { fileURLToPath as fileURLToPath10 } from "node:url";
59259
- var __dirname4 = dirname4(fileURLToPath10(import.meta.url));
59260
+ import { fileURLToPath as fileURLToPath11 } from "node:url";
59261
+ var __dirname4 = dirname4(fileURLToPath11(import.meta.url));
59260
59262
  function loadJson2(rel) {
59261
59263
  try {
59262
59264
  return JSON.parse(readFileSync20(join20(__dirname4, "..", rel), "utf8"));
@@ -59296,11 +59298,11 @@ init_variants();
59296
59298
  // src/benchmark.ts
59297
59299
  import { readFileSync as readFileSync22, readdirSync as readdirSync5, writeFileSync as writeFileSync6, rmSync as rmSync3, mkdirSync as mkdirSync7 } from "node:fs";
59298
59300
  import { join as join22 } from "node:path";
59299
- import { fileURLToPath as fileURLToPath12 } from "node:url";
59301
+ import { fileURLToPath as fileURLToPath13 } from "node:url";
59300
59302
  import { tmpdir as tmpdir3, homedir as homedir8 } from "node:os";
59301
59303
  init_complex_bugs();
59302
- var ROOT5 = join22(fileURLToPath12(new URL(".", import.meta.url)), "..");
59303
- var CORPUS = join22(ROOT5, "bench", "corpus");
59304
+ var ROOT6 = join22(fileURLToPath13(new URL(".", import.meta.url)), "..");
59305
+ var CORPUS = join22(ROOT6, "bench", "corpus");
59304
59306
  var CAPTURED_CORPUS_DIR = process.env.BLITZSTRIKE_CORPUS_DIR ?? join22(homedir8(), ".blitzstrike", "corpus");
59305
59307
  function parseCorpusFile(path) {
59306
59308
  let text;
@@ -61607,15 +61609,16 @@ solc = "0.8.20"
61607
61609
  // src/enterprise-benchmark.ts
61608
61610
  import { existsSync as existsSync15, readFileSync as readFileSync26, readdirSync as readdirSync6, statSync as statSync3 } from "node:fs";
61609
61611
  import { join as join25, resolve } from "node:path";
61612
+ import { fileURLToPath as fileURLToPath14 } from "node:url";
61610
61613
  init_complex_bugs();
61611
- var ROOT6 = resolve(process.cwd(), "bench", "enterprise");
61614
+ var ROOT7 = resolve(fileURLToPath14(new URL(".", import.meta.url)), "..", "bench", "enterprise");
61612
61615
  var ENTERPRISE_FIXTURES = [
61613
- { id: "php-laravel", dir: join25(ROOT6, "php-laravel"), expected_vulns: 4 },
61614
- { id: "js-express", dir: join25(ROOT6, "js-express"), expected_vulns: 2 },
61615
- { id: "py-django", dir: join25(ROOT6, "py-django"), expected_vulns: 2 },
61616
- { id: "java-spring", dir: join25(ROOT6, "java-spring"), expected_vulns: 2 },
61617
- { id: "wp-batch-route", dir: join25(ROOT6, "wp-batch-route"), expected_vulns: 3 },
61618
- { id: "php-complex", dir: join25(ROOT6, "php-complex"), expected_vulns: 4 }
61616
+ { id: "php-laravel", dir: join25(ROOT7, "php-laravel"), expected_vulns: 4 },
61617
+ { id: "js-express", dir: join25(ROOT7, "js-express"), expected_vulns: 2 },
61618
+ { id: "py-django", dir: join25(ROOT7, "py-django"), expected_vulns: 2 },
61619
+ { id: "java-spring", dir: join25(ROOT7, "java-spring"), expected_vulns: 2 },
61620
+ { id: "wp-batch-route", dir: join25(ROOT7, "wp-batch-route"), expected_vulns: 3 },
61621
+ { id: "php-complex", dir: join25(ROOT7, "php-complex"), expected_vulns: 4 }
61619
61622
  ];
61620
61623
  function sourceFiles(root) {
61621
61624
  const out = [];
@@ -63040,7 +63043,7 @@ ${statusLine}` : statusLine },
63040
63043
  });
63041
63044
  server.registerTool("technique_lookup", {
63042
63045
  title: "Detailed bug-hunting technique base",
63043
- description: "INTEL: return the DETAILED methodology + tricks for one vulnerability class (52 classes: ssrf, request smuggling, cache poisoning, race conditions, ssti, deserialization, prototype pollution, mass assignment, sql/nosql injection, xss, cors, csrf, jwt, oauth, host header, open redirect, subdomain takeover, idor, graphql, websocket, file upload, path traversal/LFI, command injection, xxe, crlf, ldap, xpath, xslt, ssi, xssi, email, formula/CSV, orm, rsql, unicode, dangling markup, account takeover, 2fa bypass, rate-limit, password reset, captcha, registration, payment bypass, timing, uuid, reverse tabnabbing, iframe traps, cookies, postMessage, ...). Each returns summary, objectives, how_to_test steps, concrete techniques, and verify (marker + negative control). Load before testing a class to hunt it in detail.",
63046
+ description: "INTEL: return the DETAILED methodology + tricks for one vulnerability class (56 classes: ssrf, request smuggling, cache poisoning, race conditions, ssti, deserialization, prototype pollution, mass assignment, sql/nosql injection, xss, cors, csrf, jwt, oauth, host header, open redirect, subdomain takeover, broken link hijacking, dns rebinding, padding oracle, idor, graphql, websocket, file upload, path traversal/LFI, command injection, xxe, crlf, ldap, xpath, xslt, ssi, xssi, email, formula/CSV, orm, rsql, unicode, dangling markup, account takeover, 2fa bypass, rate-limit, password reset, captcha, registration, payment bypass, timing, uuid, reverse tabnabbing, iframe traps, cookies, postMessage, ...). Each returns summary, objectives, how_to_test steps, concrete techniques, and verify (marker + negative control). Load before testing a class to hunt it in detail.",
63044
63047
  inputSchema: {
63045
63048
  cls: string2().optional().describe("Optional class id or name (e.g. 'ssrf', 'request smuggling', 'ssti').")
63046
63049
  }
@@ -63857,11 +63860,11 @@ async function serve() {
63857
63860
  init_cli();
63858
63861
  import { readFileSync as readFileSync32, existsSync as existsSync18 } from "node:fs";
63859
63862
  import { join as join30 } from "node:path";
63860
- import { fileURLToPath as fileURLToPath17 } from "node:url";
63861
- var ROOT11 = join30(fileURLToPath17(new URL(".", import.meta.url)), "..");
63863
+ import { fileURLToPath as fileURLToPath19 } from "node:url";
63864
+ var ROOT12 = join30(fileURLToPath19(new URL(".", import.meta.url)), "..");
63862
63865
  function readVersion() {
63863
63866
  try {
63864
- const p = join30(ROOT11, "package.json");
63867
+ const p = join30(ROOT12, "package.json");
63865
63868
  if (existsSync18(p))
63866
63869
  return JSON.parse(readFileSync32(p, "utf8")).version ?? "1.0.0";
63867
63870
  } catch {}