blitzstrike 2.4.55 → 2.4.57

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,35 @@ 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.57] — 2026-09-14
9
+
10
+ ### Added — Secret detection v2 (single taxonomy + format + entropy tiers)
11
+
12
+ - New `src/secrets.ts` — the single source of truth for secret field names,
13
+ known-format signatures, and redaction patterns. `sinks.scanSinks`,
14
+ `complex-bugs.detectHardcodedSecret`, and the evidence redactor all import
15
+ from it (previously three divergent copies).
16
+ - `hardcoded_secret` now detects in THREE tiers: (1) a known secret FIELD
17
+ assigned a literal (HIGH), (2) a known secret FORMAT — JWT/AWS/GitHub/Slack/
18
+ Google/Twilio/SendGrid/Mailgun/PEM — regardless of variable name (HIGH), and
19
+ (3) a high-entropy token (Shannon ≥ 4.5 bits/char, ≥32 chars, mixed case+digit)
20
+ under a non-obvious name (MEDIUM, suspect). Entropy skips minified/bundled files.
21
+ - CWE map completed: added `type_juggling` (CWE-697), `path_confusion` (CWE-22),
22
+ `wrong_sanitizer` (CWE-20) — the compliance tool now maps all 16 detector types.
23
+ - Added a detector-inventory self-test: every ComplexBugType must have a CWE
24
+ mapping (fails at build time if a new detector forgets its mapping).
25
+
26
+ ## [2.4.56] — 2026-09-14
27
+
28
+ ### Added — Hardcoded-secret detector (CWE-798)
29
+
30
+ - New `detectHardcodedSecret`: flags a secret field (api_key, db_password,
31
+ access_token, aws_*_key, client_secret, jwt_secret, …) assigned a hardcoded
32
+ literal value in source — CWE-798 Use of Hard-coded Credentials. Skips
33
+ placeholders, environment lookups (`getenv`/`process.env`), variable references,
34
+ and comment mentions. CWE mapping added; the LLM system prompt now directs
35
+ live verification of frontend/JS secrets via chrome-devtools (drive_devtools).
36
+
8
37
  ## [2.4.55] — 2026-09-14
9
38
 
10
39
  ### Changed — universal framing (no vendor-specific references)
package/dist/index.js CHANGED
@@ -31000,6 +31000,36 @@ function recordAudit(event, opts = {}) {
31000
31000
  // src/evidence.ts
31001
31001
  init_version();
31002
31002
  import { createHash as createHash2 } from "node:crypto";
31003
+
31004
+ // src/secrets.ts
31005
+ var SECRET_FIELDS = "api[_-]?key|apikey|api[_-]?secret|access[_-]?key|access[_-]?token|secret[_-]?key|secret[_-]?access[_-]?key|auth[_-]?token|client[_-]?secret|consumer[_-]?secret|consumer[_-]?key|private[_-]?key|db[_-]?password|database[_-]?password|db[_-]?pass|passwd|password|jwt[_-]?secret|encryption[_-]?key|encryption[_-]?password|github[_-]?token|gitlab[_-]?token|stripe[_-]?key|sendgrid[_-]?api[_-]?key|datadog[_-]?api[_-]?key|cloudflare[_-]?api[_-]?key|slack[_-]?token|aws[_-]?access[_-]?key[_-]?id|aws[_-]?secret[_-]?access[_-]?key|aws[_-]?session[_-]?token|bot[_-]?token";
31006
+ var SECRET_FORMATS = [
31007
+ { name: "JWT", re: /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{4,}/g },
31008
+ { name: "AWS access key", re: /\bAKIA[0-9A-Z]{16}\b/g },
31009
+ { name: "GitHub PAT (classic)", re: /\bghp_[A-Za-z0-9]{20,}\b/g },
31010
+ { name: "GitHub PAT (fine-grained)", re: /\bgithub_pat_[A-Za-z0-9_]{20,}\b/g },
31011
+ { name: "OpenAI/Stripe key", re: /\bsk-[A-Za-z0-9]{20,}\b/g },
31012
+ { name: "Stripe live/test key", re: /\b(?:sk|pk|rk)_(?:live|test)_[0-9a-zA-Z]{10,}\b/g },
31013
+ { name: "Slack token", re: /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g },
31014
+ { name: "Google API key", re: /\bAIza[0-9A-Za-z_-]{35}\b/g },
31015
+ { name: "Twilio account SID", re: /\bAC[0-9a-f]{32}\b/g },
31016
+ { name: "SendGrid API key", re: /\bSG\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g },
31017
+ { name: "Mailgun API key", re: /\bkey-[0-9a-zA-Z]{32}\b/g },
31018
+ { name: "PEM private key", re: /-----BEGIN [A-Z ]*PRIVATE KEY-----/g }
31019
+ ];
31020
+ function shannonEntropy(s) {
31021
+ if (!s)
31022
+ return 0;
31023
+ const freq = new Map;
31024
+ for (const c of s)
31025
+ freq.set(c, (freq.get(c) ?? 0) + 1);
31026
+ let e = 0;
31027
+ for (const n of freq.values()) {
31028
+ const p = n / s.length;
31029
+ e -= p * Math.log2(p);
31030
+ }
31031
+ return e;
31032
+ }
31003
31033
  var REDACTION_PATTERNS = [
31004
31034
  [/(authorization\s*[:=]\s*)(bearer\s+)?[A-Za-z0-9._~+/=-]{8,}/gi, "$1$2[REDACTED]"],
31005
31035
  [/(api[_-]?key\s*[:=]\s*)["']?[A-Za-z0-9._-]{16,}["']?/gi, "$1[REDACTED]"],
@@ -31011,10 +31041,17 @@ var REDACTION_PATTERNS = [
31011
31041
  [/(session\s*[:=]\s*)["']?[A-Za-z0-9._-]{12,}["']?/gi, "$1[REDACTED]"],
31012
31042
  [/(cookie\s*[:=]\s*)["']?[A-Za-z0-9._-]{12,}["']?/gi, "$1[REDACTED]"],
31013
31043
  [/(set-cookie\s*:\s*)[^\r\n]+/gi, "$1[REDACTED]"],
31044
+ [/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{4,}/g, "[REDACTED]"],
31014
31045
  [/AKIA[0-9A-Z]{16}/g, "[REDACTED]"],
31015
31046
  [/ghp_[A-Za-z0-9]{20,}/g, "[REDACTED]"],
31016
31047
  [/github_pat_[A-Za-z0-9_]{20,}/g, "[REDACTED]"],
31017
31048
  [/sk-[A-Za-z0-9]{20,}/g, "[REDACTED]"],
31049
+ [/\b(?:sk|pk|rk)_(?:live|test)_[0-9a-zA-Z]{10,}\b/g, "[REDACTED]"],
31050
+ [/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g, "[REDACTED]"],
31051
+ [/\bAIza[0-9A-Za-z_-]{35}\b/g, "[REDACTED]"],
31052
+ [/\bAC[0-9a-f]{32}\b/g, "[REDACTED]"],
31053
+ [/\bSG\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g, "[REDACTED]"],
31054
+ [/\bkey-[0-9a-zA-Z]{32}\b/g, "[REDACTED]"],
31018
31055
  [/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g, "[REDACTED]"]
31019
31056
  ];
31020
31057
  function redactSecrets(text) {
@@ -31024,6 +31061,8 @@ function redactSecrets(text) {
31024
31061
  }
31025
31062
  return out;
31026
31063
  }
31064
+
31065
+ // src/evidence.ts
31027
31066
  function hasSecrets(text) {
31028
31067
  return redactSecrets(text) !== text;
31029
31068
  }
@@ -31321,7 +31360,8 @@ var PATTERNS = [
31321
31360
  { type: "credential", label: "password assignment", regex: /(?:password|passwd|pass|pwd)\s*[:=]\s*["'][^"']{3,}["']/i },
31322
31361
  { type: "credential", label: "hardcoded cred", regex: /\b(?:admin|root|user(?:name)?)\s*[:=]\s*["'][^"']{3,}["']/i },
31323
31362
  { type: "deserialization", label: "pickle/unserialize/yaml", regex: /\b(?:pickle\.loads|unserialize\s*\(|yaml\.load\s*\(|marshal\.loads|jsonpickle)/i },
31324
- { type: "xxe", label: "XML parse", regex: /\b(?:etree\.(?:parse|fromstring)|lxml\.etree|xml\.(?:dom|sax)|DocumentBuilder|simplexml_load)/i }
31363
+ { type: "xxe", label: "XML parse", regex: /\b(?:etree\.(?:parse|fromstring)|lxml\.etree|xml\.(?:dom|sax)|DocumentBuilder|simplexml_load)/i },
31364
+ ...SECRET_FORMATS.map((f) => ({ type: "secret", label: f.name, regex: f.re }))
31325
31365
  ];
31326
31366
  function scanSinks(text) {
31327
31367
  if (!text || text.length < 3)
@@ -56776,6 +56816,7 @@ function detectComplexBugs(code, file) {
56776
56816
  detectFileUploadRce(code, file, out);
56777
56817
  detectUnrestrictedUpload(code, file, out);
56778
56818
  detectSqlInjection(code, file, out);
56819
+ detectHardcodedSecret(code, file, out);
56779
56820
  out.push(...detectWrongSanitizer(code, file));
56780
56821
  out.push(...detectMissingAuthz(code, file));
56781
56822
  const seen = new Set;
@@ -57011,6 +57052,93 @@ function detectSqlInjection(code, file, out) {
57011
57052
  });
57012
57053
  }
57013
57054
  }
57055
+ var SECRET_FIELD_RE = new RegExp(`\\b(${SECRET_FIELDS})\\s*(?:::|=>|=|:)\\s*`, "gi");
57056
+ var SECRET_PLACEHOLDER_RE = /^(null|true|false|undefined|your_|xxx+|changeme|example|placeholder|test|secret|password|token|key|api|smtp|localhost|root|admin|pass|change|me|none|na|foo|bar|dummy)$/i;
57057
+ var ENTROPY_EXCLUDE_VAR = /\b(data|payload|content|body|base64|encoded|encode|image|binary|blob|hash|digest|checksum|nonce|uuid|etag|signature|sig|cipher|iv|ciphertext|plaintext|thumb|thumbnail)\b/i;
57058
+ function detectHardcodedSecret(code, file, out) {
57059
+ const ls = lines2(code);
57060
+ const clean = stripCommentsOnly(code);
57061
+ const flaggedLines = new Set;
57062
+ SECRET_FIELD_RE.lastIndex = 0;
57063
+ let m;
57064
+ while ((m = SECRET_FIELD_RE.exec(clean)) !== null) {
57065
+ const field = m[1];
57066
+ const rest = clean.slice(m.index + m[0].length);
57067
+ const lineEnd = rest.search(/\r?\n/);
57068
+ const valueRaw = (lineEnd === -1 ? rest : rest.slice(0, lineEnd)).trim();
57069
+ let value = "";
57070
+ const qm = valueRaw.match(/^["']([^"']{4,})["']/);
57071
+ if (qm)
57072
+ value = qm[1];
57073
+ else
57074
+ value = (valueRaw.match(/^([A-Za-z0-9._/+=@-]{8,})/) ?? [])[1] ?? "";
57075
+ if (!value)
57076
+ continue;
57077
+ if (SECRET_PLACEHOLDER_RE.test(value))
57078
+ continue;
57079
+ if (/\$[A-Za-z_]|[{}\[\]]|process\.env|getenv|os\.environ|config\s*\(|env\s*\(/.test(valueRaw))
57080
+ continue;
57081
+ const ln = lineNo2(code, m.index);
57082
+ flaggedLines.add(ln);
57083
+ out.push({
57084
+ file,
57085
+ line: ln,
57086
+ type: "hardcoded_secret",
57087
+ category: "Hardcoded secret (credential in source)",
57088
+ severity: "high",
57089
+ evidence: (ls[ln - 1] ?? "").trim(),
57090
+ detail: `Secret field '${field}' is assigned a hardcoded value in source — the credential is exposed to anyone with code access (CWE-798 Hard-coded Credentials). Rotate it and load from the environment instead.`
57091
+ });
57092
+ }
57093
+ for (const fmt of SECRET_FORMATS) {
57094
+ fmt.re.lastIndex = 0;
57095
+ let fm;
57096
+ while ((fm = fmt.re.exec(clean)) !== null) {
57097
+ const ln = lineNo2(code, fm.index);
57098
+ if (flaggedLines.has(ln))
57099
+ continue;
57100
+ flaggedLines.add(ln);
57101
+ out.push({
57102
+ file,
57103
+ line: ln,
57104
+ type: "hardcoded_secret",
57105
+ category: "Hardcoded secret (known format)",
57106
+ severity: "high",
57107
+ evidence: (ls[ln - 1] ?? "").trim(),
57108
+ detail: `A ${fmt.name} was found hardcoded in source — the credential is exposed to anyone with code access (CWE-798). Rotate it and load from the environment instead.`
57109
+ });
57110
+ }
57111
+ }
57112
+ const isMinified = /\.min\.(js|css)$/i.test(file) || /[\\/](bundle|vendor|dist|build)[\\/]/i.test(file);
57113
+ if (!isMinified) {
57114
+ const entropyRe = /(\b[A-Za-z_]\w*)\s*(?:::|=>|=|:)\s*["']([A-Za-z0-9_-]{32,})["']/g;
57115
+ entropyRe.lastIndex = 0;
57116
+ let em;
57117
+ while ((em = entropyRe.exec(clean)) !== null) {
57118
+ const varName = em[1];
57119
+ const value = em[2];
57120
+ const ln = lineNo2(code, em.index);
57121
+ if (flaggedLines.has(ln))
57122
+ continue;
57123
+ if (ENTROPY_EXCLUDE_VAR.test(varName))
57124
+ continue;
57125
+ if (!/[A-Z]/.test(value) || !/[a-z]/.test(value) || !/[0-9]/.test(value))
57126
+ continue;
57127
+ if (shannonEntropy(value) < 4.5)
57128
+ continue;
57129
+ flaggedLines.add(ln);
57130
+ out.push({
57131
+ file,
57132
+ line: ln,
57133
+ type: "hardcoded_secret",
57134
+ category: "Suspected secret (high-entropy token)",
57135
+ severity: "medium",
57136
+ evidence: (ls[ln - 1] ?? "").trim(),
57137
+ detail: `'${varName}' is assigned a high-entropy token (Shannon ${shannonEntropy(value).toFixed(2)} bits/char) that looks like a generated credential — verify it is not a secret key/token (CWE-798).`
57138
+ });
57139
+ }
57140
+ }
57141
+ }
57014
57142
 
57015
57143
  // src/guidance.ts
57016
57144
  var SINK_DIRECTIVES = {
@@ -58502,7 +58630,7 @@ function createServer() {
58502
58630
  ` + `- Keep trying every lead AND every chain step until each is verified/executed or blocked, THEN generate_report. Never deliver a bare surface map, and never stop at 'found X' when X enables more.
58503
58631
 
58504
58632
  ` + "TWO PATHS:\\n" + "- Source path on disk -> blitz_scan / taint_file / eagle_eye2 (static).\\n" + "- Live URL -> live_recon / active_scan / strike_verify (web-hunting).\\n\\n" + `DEEPEN A FINDING: attack_plan(target, tech, params) to get the prioritized vector plan (decide what to test next with data); list_chains (escalation), chain_links (compose), technique_lookup(cls), payload_lookup, bypass_lookup (blocked). Phase doctrine: read_skill(bs-orchestrate-engagement | bs-web-hunting | bs-source-audit | bs-verify-finding). Campaign plan: read_playbook(target-type). On any failure call retry_guidance(signal) / model_fallback(signal) before giving up.
58505
- ` + "KNOWLEDGE BASE (discover, don't guess): skillLookup(topic) / listSkills for the 40 attack-path + hunting skills (ap-*, hp-*, bs-*); list_attack_vectors / attack_vectors(cat) for the 34-category vector taxonomy; taxonomy(kind) for OWASP/CWE/ASVS/API-top-10; read_playbook(type) for the 17 campaign playbooks; list_manuals / read_tool_manual for 317 tool references; list_tools / run_catalog_tool for the 141-tool catalog. Every tool, skill, and data layer is reachable from these. CROSS-TARGET INTELLIGENCE: strike_resolve auto-records confirmed/false_positive verdicts into the empirical ledger; query it with intelligence(action=hit_rates/top_vectors) so a new target on a known tech inherits historical hit-rates (attack_plan already blends them into success_probability). LIVE PENTEST + TARGETING (black-box, WAF-safe): cache_gap(base_url, endpoint) fuzzes path-normalization + static-extension variants for cache deception/poisoning; blind_oracle(base_url, param, value) detects which SINK a param reaches (sql/ssti/xss) via benign arithmetic (id=1+0, test${7*7}) WITHOUT a malicious payload; param_precedence(base_url, param, A, B) maps duplicate-parameter precedence (first/last-wins) for WAF-bypass. SOURCE TARGETING: action_surface(code) maps every wp_ajax_* action to its vuln class + DERIVED priority (what to look for WHERE); security_state(sanitizers, sink) gives a wrong-context sanitization verdict; framework_knowledge(framework) returns auth/nonce primitives for 9 frameworks; variant_scan(root, signature) mass-sweeps an install base for ONE bug family; patch_analyze(old, new) REVERSES a security patch into the 0-day, and its mine_signature feeds variant_scan to sweep unpatched copies. All of these are DETECTION HINTS — verify each live (strike_verify / browser_validate) before it enters the report. NEWEST DETECTORS — understand AND try them: variant_scan also emits priv_esc (privilege escalation — a role/capability/user change fed by request input, traced cross-file via reverse call-graph, e.g. set_role($id, sanitize_key($_POST['um-role'])) or update_user_meta(...,'wp_capabilities', $_POST[...])) and flags uploadAllow=>array('all') unrestricted-upload configs as file_upload (the file-manager/connector shape). TO TRY a priv_esc hit: submit the role field with 'administrator' (or send wp_capabilities meta) and confirm the account actually gains admin. TO TRY an unrestricted-upload hit: POST a .php/.phtml and confirm it lands web-reachable + executes. A static hit is a HYPOTHESIS until verified live — never report unverified.\n" + `PRECISION ANALYSIS — chrome-devtools MCP is MANDATORY, not optional:
58633
+ ` + "KNOWLEDGE BASE (discover, don't guess): skillLookup(topic) / listSkills for the 40 attack-path + hunting skills (ap-*, hp-*, bs-*); list_attack_vectors / attack_vectors(cat) for the 34-category vector taxonomy; taxonomy(kind) for OWASP/CWE/ASVS/API-top-10; read_playbook(type) for the 17 campaign playbooks; list_manuals / read_tool_manual for 317 tool references; list_tools / run_catalog_tool for the 141-tool catalog. Every tool, skill, and data layer is reachable from these. CROSS-TARGET INTELLIGENCE: strike_resolve auto-records confirmed/false_positive verdicts into the empirical ledger; query it with intelligence(action=hit_rates/top_vectors) so a new target on a known tech inherits historical hit-rates (attack_plan already blends them into success_probability). LIVE PENTEST + TARGETING (black-box, WAF-safe): cache_gap(base_url, endpoint) fuzzes path-normalization + static-extension variants for cache deception/poisoning; blind_oracle(base_url, param, value) detects which SINK a param reaches (sql/ssti/xss) via benign arithmetic (id=1+0, test${7*7}) WITHOUT a malicious payload; param_precedence(base_url, param, A, B) maps duplicate-parameter precedence (first/last-wins) for WAF-bypass. SOURCE TARGETING: action_surface(code) maps every wp_ajax_* action to its vuln class + DERIVED priority (what to look for WHERE); security_state(sanitizers, sink) gives a wrong-context sanitization verdict; framework_knowledge(framework) returns auth/nonce primitives for 9 frameworks; variant_scan(root, signature) mass-sweeps an install base for ONE bug family; patch_analyze(old, new) REVERSES a security patch into the 0-day, and its mine_signature feeds variant_scan to sweep unpatched copies. All of these are DETECTION HINTS — verify each live (strike_verify / browser_validate) before it enters the report. NEWEST DETECTORS — understand AND try them: variant_scan also emits priv_esc (privilege escalation — a role/capability/user change fed by request input, traced cross-file via reverse call-graph, e.g. set_role($id, sanitize_key($_POST['um-role'])) or update_user_meta(...,'wp_capabilities', $_POST[...])) and flags uploadAllow=>array('all') unrestricted-upload configs as file_upload (the file-manager/connector shape). TO TRY a priv_esc hit: submit the role field with 'administrator' (or send wp_capabilities meta) and confirm the account actually gains admin. TO TRY an unrestricted-upload hit: POST a .php/.phtml and confirm it lands web-reachable + executes. variant_scan also emits hardcoded_secret (CWE-798) in three tiers: a secret field (api_key/db_password/access_token/aws_*) assigned a literal (HIGH), a known secret FORMAT (JWT eyJ…/AWS AKIA…/GitHub ghp_…/Slack xoxb-…/…) regardless of name (HIGH), or a high-entropy suspect token (MEDIUM — verify before reporting). Verify a frontend/JS secret live via drive_devtools (inspect the JS bundle / network response and confirm the key is actually exposed), and for a backend secret confirm it is reachable/valid. A static hit is a HYPOTHESIS until verified live — never report unverified.\n" + `PRECISION ANALYSIS — chrome-devtools MCP is MANDATORY, not optional:
58506
58634
  ` + `- When a lead needs DOM/JS precision — DOM-XSS sink execution, AJAX endpoint + payload interception, JS runtime errors, redirect chains, SSO/token flow, or anything a static HTML glance cannot prove — call drive_devtools(target). It spawns chrome-devtools-mcp and drives a REAL headless browser (navigate -> list_network_requests -> list_console_messages -> evaluate_script), giving reproducible evidence instead of a guess.
58507
58635
  ` + `- Before calling it, check_mcp() to confirm the browser MCP is available; if not, blitzstrike install-tools or npm i -g chrome-devtools-mcp. Never substitute eyeballing minified JS or a static sink guess when a live browser can PROVE it. This is the precision + consistency layer.
58508
58636
  ` + "EXTERNAL MCP SERVERS (verified, connect them — NOT one-shot CLIs): chrome-devtools-mcp (29 tools: list_network_requests/get_network_request for raw HTTP interception, list_console_messages for JS errors + DOM-XSS, evaluate_script to run JS, take_screenshot) -> stdio chrome-devtools-mcp --headless --chromeArg=--no-sandbox --chromeArg=--disable-gpu (as root/container this is MANDATORY or the browser crashes; add --proxyServer http://127.0.0.1:8080 to route through Burp, --acceptInsecureCerts for bad TLS). burp-suite-mcp (proxy history + active scan + repeater) -> NOT npm: build the JAR (git clone https://github.com/PortSwigger/mcp-server.git && cd mcp-server && ./gradlew embedProxyJar), load it in Burp Extensions, then connect the client to http://127.0.0.1:9876 (SSE) or the stdio proxy java -jar mcp-proxy-all.jar --sse-url http://127.0.0.1:9876."
@@ -54,6 +54,10 @@
54
54
  {"id": "web_vulnerabilities_methodology", "cwe": "CWE-1057", "name": "Improper Inventory / Methodology"},
55
55
  {"id": "missing_authz", "cwe": "CWE-862", "name": "Missing Authorization"},
56
56
  {"id": "missing_nonce", "cwe": "CWE-352", "name": "Cross-Site Request Forgery (Missing Nonce)"},
57
- {"id": "priv_esc", "cwe": "CWE-269", "name": "Improper Privilege Management"}
57
+ {"id": "priv_esc", "cwe": "CWE-269", "name": "Improper Privilege Management"},
58
+ {"id": "hardcoded_secret", "cwe": "CWE-798", "name": "Use of Hard-coded Credentials"},
59
+ {"id": "type_juggling", "cwe": "CWE-697", "name": "Incorrect Comparison"},
60
+ {"id": "path_confusion", "cwe": "CWE-22", "name": "Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)"},
61
+ {"id": "wrong_sanitizer", "cwe": "CWE-20", "name": "Improper Input Validation"}
58
62
  ]
59
63
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blitzstrike",
3
- "version": "2.4.55",
3
+ "version": "2.4.57",
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": {