blitzstrike 1.6.0 → 1.7.1

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,28 @@ 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
+ ## [1.7.1] — 2026-09-14
9
+
10
+ ### Fixed — npm publish (dist-tag + staged-version)
11
+
12
+ - Republish with the `latest` dist-tag corrected (previous publishes left
13
+ `latest` pinned to 1.0.95) and a clean tarball (1.6.0/1.7.0 were stuck in a
14
+ staged state).
15
+
16
+ ## [1.7.0] — 2026-09-13
17
+
18
+ ### Added — advanced deterministic checks (live + source)
19
+
20
+ - Live pipeline: `run_engagement` now also runs advanced deterministic checks —
21
+ SSTI (`{{7*7}}` → `49`), SSRF (cloud metadata reflected through a URL param),
22
+ and error-based SQLi (SQL error signature) — on top of the standard
23
+ reflected/header/redirect/traversal/CORS sweep.
24
+ - Source pipeline: `complex_scan` grows from 6 to 9 detectors — added SSRF
25
+ (user-controlled URL with no host allowlist), XXE (user XML parsed without
26
+ disabling entities), and SSTI (user input into a template render), each with
27
+ a defense-suppression check (allowlist / libxml_disable_entity_loader /
28
+ basename).
29
+
8
30
  ## [1.6.0] — 2026-09-13
9
31
 
10
32
  ### Added — task checkpoint journal (per-workstream resume)
package/dist/index.js CHANGED
@@ -32207,6 +32207,74 @@ async function runDeterministicChecks(url) {
32207
32207
  }
32208
32208
  return findings;
32209
32209
  }
32210
+ var SSTI_PROBE = "{{7*7}}";
32211
+ var SSTI_PARAMS = ["name", "template", "q", "search", "query", "message", "title", "content", "input", "data", "page", "id"];
32212
+ var SSRF_TARGET = "http://169.254.169.254/latest/meta-data/";
32213
+ var SSRF_MARKERS = ["ami-id", "instance-id", "security-credentials", "instance-type"];
32214
+ var SSRF_PARAMS = ["url", "uri", "path", "host", "domain", "webhook", "callback", "redirect", "proxy", "src", "dest", "link", "target", "endpoint", "image", "img"];
32215
+ var SQLI_PROBE = "'";
32216
+ var SQLI_MARKERS = ["sql syntax", "mysql", "mysqli", "postgresql", "sqlite", "ora-", "odbc", "syntax error", "unclosed quotation", "you have an error in your sql"];
32217
+ var SQLI_PARAMS = ["id", "user", "username", "email", "product", "item", "category", "page", "search", "q", "query", "order", "sort"];
32218
+ async function runAdvancedChecks(url) {
32219
+ const findings = [];
32220
+ const base = url.replace(/\/+$/, "");
32221
+ const sep = base.includes("?") ? "&" : "?";
32222
+ for (const p of SSTI_PARAMS) {
32223
+ const r = await httpGet2(`${base}${sep}${p}=${encodeURIComponent(SSTI_PROBE)}`);
32224
+ if (r && r.body.includes("49") && !r.body.includes(SSTI_PROBE)) {
32225
+ findings.push(makeFinding({
32226
+ title: `Server-side template injection via parameter '${p}'`,
32227
+ target: { type: "web", host: url, endpoint: `?${p}=` },
32228
+ severity: "critical",
32229
+ cwe: "CWE-1336",
32230
+ cweName: "Improper Neutralization of Special Elements Used in a Template Engine",
32231
+ source: { type: "request_parameter", name: p },
32232
+ sink: { type: "template_engine", symbol: p },
32233
+ chainId: "ssti",
32234
+ chainName: "Server-side template injection",
32235
+ status: "hypothesis"
32236
+ }));
32237
+ }
32238
+ }
32239
+ for (const p of SSRF_PARAMS) {
32240
+ const r = await httpGet2(`${base}${sep}${p}=${encodeURIComponent(SSRF_TARGET)}`);
32241
+ if (r && SSRF_MARKERS.some((m) => r.body.includes(m))) {
32242
+ findings.push(makeFinding({
32243
+ title: `Server-side request forgery via parameter '${p}'`,
32244
+ target: { type: "web", host: url, endpoint: `?${p}=` },
32245
+ severity: "critical",
32246
+ cwe: "CWE-918",
32247
+ cweName: "Server-Side Request Forgery (SSRF)",
32248
+ source: { type: "request_parameter", name: p },
32249
+ sink: { type: "ssrf", symbol: p },
32250
+ chainId: "ssrf",
32251
+ chainName: "Server-side request forgery",
32252
+ status: "hypothesis"
32253
+ }));
32254
+ }
32255
+ }
32256
+ for (const p of SQLI_PARAMS) {
32257
+ const r = await httpGet2(`${base}${sep}${p}=${encodeURIComponent(SQLI_PROBE)}`);
32258
+ if (r) {
32259
+ const body = r.body.toLowerCase();
32260
+ if (SQLI_MARKERS.some((m) => body.includes(m))) {
32261
+ findings.push(makeFinding({
32262
+ title: `SQL injection (error-based) via parameter '${p}'`,
32263
+ target: { type: "web", host: url, endpoint: `?${p}=` },
32264
+ severity: "critical",
32265
+ cwe: "CWE-89",
32266
+ cweName: "Improper Neutralization of Special Elements used in an SQL Command",
32267
+ source: { type: "request_parameter", name: p },
32268
+ sink: { type: "sql_query", symbol: p },
32269
+ chainId: "sql_injection",
32270
+ chainName: "SQL injection",
32271
+ status: "hypothesis"
32272
+ }));
32273
+ }
32274
+ }
32275
+ }
32276
+ return findings;
32277
+ }
32210
32278
  async function runLiveEngagement(url, scope = "", mode = "bug-bounty") {
32211
32279
  const report = { banner: engagementBanner(url, mode), target: url, mode, findings: [], scope: null, status: "" };
32212
32280
  const sc = scopeCheck(url, scope, mode);
@@ -32245,6 +32313,7 @@ async function runLiveEngagement(url, scope = "", mode = "bug-bounty") {
32245
32313
  findings.push(resolveFinding(finding, verdict));
32246
32314
  }
32247
32315
  findings.push(...await runDeterministicChecks(url));
32316
+ findings.push(...await runAdvancedChecks(url));
32248
32317
  report.findings = findings.map((f) => ({
32249
32318
  id: f.id,
32250
32319
  status: f.status,
@@ -53686,6 +53755,9 @@ function detectComplexBugs(code, file) {
53686
53755
  detectPrototypePollution(code, file, out);
53687
53756
  detectCrlfInjection(code, file, out);
53688
53757
  detectPathConfusion(code, file, out);
53758
+ detectSsrF(code, file, out);
53759
+ detectXxe(code, file, out);
53760
+ detectSsti(code, file, out);
53689
53761
  const seen = new Set;
53690
53762
  return out.filter((f) => {
53691
53763
  const key = `${f.type}:${f.line}`;
@@ -53764,6 +53836,78 @@ function detectPathConfusion(code, file, out) {
53764
53836
  });
53765
53837
  }
53766
53838
  }
53839
+ function detectSsrF(code, file, out) {
53840
+ const ls = lines2(code);
53841
+ const re = /\b(file_get_contents|fopen|file|readfile|curl_setopt|curl_init|fetch|axios|requests\.(get|post|put)|urllib\.request|http_get|wp_remote_(get|post)|new\s+URL\s*\(|got\(|http\.(get|request))\s*\(/g;
53842
+ let m;
53843
+ while ((m = re.exec(code)) !== null) {
53844
+ const ln = lineNo2(code, m.index);
53845
+ const l = ls[ln - 1] ?? "";
53846
+ const scope = ls.slice(Math.max(0, ln - 3), ln).join(`
53847
+ `);
53848
+ if (!SOURCE_TOKENS2.test(l) && !SOURCE_TOKENS2.test(scope))
53849
+ continue;
53850
+ if (/(allowlist|whitelist|in_array|preg_match|parse_url|startsWith\(["']https?|endsWith\(["']|basename|realpath|normalize)/i.test(scope + `
53851
+ ` + l))
53852
+ continue;
53853
+ out.push({
53854
+ file,
53855
+ line: ln,
53856
+ type: "ssrf",
53857
+ category: "SSRF (user-controlled URL)",
53858
+ severity: "high",
53859
+ evidence: l.trim(),
53860
+ detail: "User input reaches a URL-accepting sink with no host allowlist — SSRF (cloud metadata, internal port scan, IAM credential theft)."
53861
+ });
53862
+ }
53863
+ }
53864
+ function detectXxe(code, file, out) {
53865
+ const ls = lines2(code);
53866
+ const re = /\b(simplexml_load_string|simplexml_load_file|new\s+SimpleXMLElement|->loadXML\s*\(|->load\s*\(|XMLReader\s*->\s*XML\s*\(|libxml_parse)\s*\(?/g;
53867
+ let m;
53868
+ while ((m = re.exec(code)) !== null) {
53869
+ const ln = lineNo2(code, m.index);
53870
+ const l = ls[ln - 1] ?? "";
53871
+ const scope = ls.slice(Math.max(0, ln - 4), ln).join(`
53872
+ `);
53873
+ if (!SOURCE_TOKENS2.test(l) && !SOURCE_TOKENS2.test(scope))
53874
+ continue;
53875
+ if (/libxml_disable_entity_loader\s*\(\s*true|LIBXML_NONET/.test(scope + `
53876
+ ` + l))
53877
+ continue;
53878
+ out.push({
53879
+ file,
53880
+ line: ln,
53881
+ type: "xxe",
53882
+ category: "XXE (unprotected XML parse)",
53883
+ severity: "high",
53884
+ evidence: l.trim(),
53885
+ detail: "User-controlled XML parsed without disabling external entities — XXE (file read, SSRF, billion-laughs DoS)."
53886
+ });
53887
+ }
53888
+ }
53889
+ function detectSsti(code, file, out) {
53890
+ const ls = lines2(code);
53891
+ const re = /\b(render_template_string|Template\s*\(|res\.render\s*\(|ejs\.(render|compile)\s*\(|_\.template\s*\(|render_string|twig\.render|Jinja2\(|jinja2\.Template)\s*\(?/g;
53892
+ let m;
53893
+ while ((m = re.exec(code)) !== null) {
53894
+ const ln = lineNo2(code, m.index);
53895
+ const l = ls[ln - 1] ?? "";
53896
+ const scope = ls.slice(Math.max(0, ln - 3), ln).join(`
53897
+ `);
53898
+ if (!SOURCE_TOKENS2.test(l) && !SOURCE_TOKENS2.test(scope))
53899
+ continue;
53900
+ out.push({
53901
+ file,
53902
+ line: ln,
53903
+ type: "ssti",
53904
+ category: "SSTI (template render of user input)",
53905
+ severity: "high",
53906
+ evidence: l.trim(),
53907
+ detail: "User input reaches a template render with no sandbox — SSTI (`{{7*7}}`, `${7*7}`, `#{7*7}`) → RCE."
53908
+ });
53909
+ }
53910
+ }
53767
53911
 
53768
53912
  // src/guidance.ts
53769
53913
  var SINK_DIRECTIVES = {
@@ -54163,7 +54307,7 @@ function createServer() {
54163
54307
  name: "blitzstrike",
54164
54308
  version: "1.0.0"
54165
54309
  }, {
54166
- instructions: "Blitz Strike is a universal penetration-testing toolbelt with three tiers — " + "BLITZ (reconnaissance / attack-surface mapping), EAGLE-EYE (source-to-sink " + "analysis), STRIKE (live validation) — plus a canonical evidence-first finding " + "engine and a multi-language taint engine.\\n\\n" + "CORE MENTAL MODEL:\\n" + "- A scanner hit is a HYPOTHESIS, not a finding. Live verification (or data-flow " + " proof) is the verdict. Never report an unverified hit as a vulnerability.\\n" + "- Distinguish REACHABLE from mere PRESENT: a sink is only a finding when tainted " + " input reaches it AND it is not neutralized by a sanitizer and not guarded by an " + " auth gate.\\n\\n" + "HOW TO RUN AN AUDIT (start here):\\n" + "0. ROUTE BY TARGET. Classify automatically - no need to ask. A URL - with or " + " without http/https - is LIVE (live_recon + the " + " web-hunting doctrine + strike_verify). A filesystem path (exists on disk, " + " or a code extension) is SOURCE audit (source-audit doctrine: blitz_scan + " + " eagle_eye2 + complex_scan/route_scan). TWO DOCTRINES - never mix: live " + " web/API -> web-hunting skill; source tree -> source-audit skill. For a WHOLE " + " engagement prefer run_engagement (one call, no babysitting) FIRST; steps 1-5 " + " below are the manual path for targeted follow-up on a specific finding.\\n" + "1. RECORD SCOPE. scope_check classifies the target (intel for the report) - " + " it does NOT gate the engagement. No authorization gate: the repo disclaimer " + " places responsibility on the user. Hunt the target you are given.\\n" + "2. MAP THE SURFACE (BLITZ). For a source tree use blitz_scan (tree) or blitz_file " + " (single file) then enrich_scan to match sinks to escalation chains. For a live " + " URL use live_recon for a full pass (fingerprint/WAF/tech/version/crawler/params/" + " subdomains/API endpoints/intel correlation) — it returns next_steps. active_scan " + " is the lighter alternative. Both record scope internally.\\n" + "3. TRACE REACHABILITY (EAGLE-EYE). For every sink, determine whether attacker " + " input actually reaches it:\\n" + " - PHP/JS/TS/Python/Java source: taint_file (auto-detects language) or " + " taint_scan/taint_tree (PHP AST). list_languages shows what's supported.\\n" + " - Any language: trace_data_flow (window heuristic) and eagle_eye/eagle_grep " + " (function-scoped view of sinks + auth gates). Beyond taint: route_scan (route confusion / dispatch abuse / batch forwarding) and complex_scan (deserialization->POP, type juggling, mass assignment, prototype pollution, CRLF/header injection, path confusion) catch classes plain taint misses.\\n" + " A sink counts only if tainted input reaches it unsanitized and unguarded.\\n" + "4. VALIDATE (STRIKE). Confirm live with strike_verify using a MARKER plus a " + " NEGATIVE CONTROL plus a BASELINE. The verdict is deterministic: marker " + " reflected AND control inert = confirmed; both reflected = false_positive; " + " marker not reflected = unconfirmed. Feed the verdict to strike_resolve to " + " advance the finding lifecycle (hypothesis->validating->confirmed). Use " + " read_tool_manual for the exploit tool's manual, payload_lookup for payloads, " + " detect_waf/tech_correlation for context.\\n" + "5. RECORD + REPORT. Create a canonical finding with finding_create, advance it " + " through the lifecycle with finding_transition, attach confidence_score, and " + " redact any secrets before persisting. Only report findings that survived " + " verification.\\n\\n" + "SUPPORTING LAYERS:\\n" + "- run_engagement: ONE call does the whole audit (no babysitting). Source path -> " + " full static pipeline + inline report (markdown/JSON/SARIF). URL target -> " + " full autonomous live pipeline (live_recon recon + deterministic checks: reflected " + " input, security headers, open redirect, path traversal, CORS) + findings + report. " + " PREFER THIS FIRST for a whole engagement; drive " + " the steps above manually only for targeted follow-up on a specific finding.\\n" + "- run_autonomous: run_engagement + the escalation path pre-attached to every " + " finding (chain name/severity/prerequisites + ordered next_steps with tool_hint/" + " success_criteria/negative_control) + a deterministic termination reason. Use it " + " when you want the 'what to do next' already computed per finding.\\n" + "- list_chains: 57 escalation chains (source -> sink -> impact).\\n" + "- list_languages / taint_file: multi-language taint (PHP, JS/TS, Python, Java).\\n" + "- tool_lookup / ensure_tool / list_tools: 130-tool catalog, auto-install.\\n" + "- read_playbook / list_playbooks: 17 engagement playbooks (web-app, api-security, " + " source-code-audit, active-directory, mobile, external-attack-surface, ...).\\n" + "- skill_lookup / read_skill / list_skills: 39 skills (7 bs-* agent doctrine: " + " orchestrate, scope, source-audit, web-hunting, verify, review, report; + " + " technique playbooks: WP/PHP 0-day, AD, malware, mobile, cloud).\\n" + "- read_tool_manual / list_manuals: 317 tool manuals (sqlmap, nmap, commix, ...).\\n" + "- payload_lookup / read_payload: 66 payload collections (sqli, xss, ssti, xxe, lfi).\\n" + "- detect_waf / tech_correlation / cve_correlation / port_correlation: signature " + " + correlation intelligence.\\n" + "- nvd_lookup / fofa_search: CVE lookup + asset reconnaissance (FOFA needs env creds).\\n" + "- remember / memory_lookup / memory_list: persist + recall verified knowledge.\\n\\n" + "RESOURCE MAP (know what to reach for):\\n" + "- ORCHESTRATION = the engagement framework. orchestration() returns the " + " lifecycle (scope->recon->analyze->deep->verify->report, each with " + " entry/exit criteria) + sub-agent team + handoff contract + termination " + " criteria. Load it at engagement start. Autonomous driving aids: plan() " + " (deterministic phase plan + next action), delegate() (parallel-first " + " subagent batches + retry pattern), worktree() (isolate a workstream), " + " watchdog() (detect a stalled phase), context_prune() (compact state so " + " you can drop raw detail), and task_start/task_checkpoint/task_status/" + " task_resume (per-workstream checkpoint journal — resume a failed task " + " from its last completed step, never restart).\\n" + "- TOOL = acts (scan, taint, verify, record, correlate). Call it to DO something.\\n" + "- PLAYBOOK = campaign plan for a target TYPE. read_playbook(web-application) " + " BEFORE a full engagement of that type.\\n" + "- SKILL = procedure doctrine. Load the bs-* skill for the phase you are on " + " (orchestrate, scope, web-hunting for LIVE, source-audit for SOURCE, verify, " + " review, report); load a technique skill for the specific technique.\\n" + "- MANUAL = deep reference for ONE tool. read_tool_manual right before using it.\\n" + "- CATALOG = external tools (130: sqlmap, nmap, nuclei, ffuf, ysoserial, ...). " + " Blitz Strike's OWN tools find + verify; the catalog is for deeper EXTERNAL " + " exploitation/enumeration. After your own analysis confirms a finding, run " + " tool_lookup -> ensure_tool (auto-install) -> read_tool_manual to drive the " + " external tool that demonstrates impact.\\n" + "- PAYLOAD = attack payloads for a class. payload_lookup before crafting a probe.\\n" + "- INTELLIGENCE = knowledge. list_attack_vectors (34 categories) maps the " + " full surface during RECON; list_chains (57) turns a finding into impact; " + " chain_links composes chains for complex bugs; bypass_lookup when blocked; " + " payload_lookup when crafting a probe. technique_lookup(cls) returns the " + " DETAILED methodology + tricks for a vulnerability class (ssrf, ssti, " + " jwt, deserialization, ...) - load before testing a class. wstg_map maps " + " an OWASP category to coverage; taxonomy maps findings to standard IDs " + " (OWASP Top 10 / API Top 10 / CWE / ASVS); doctrine_map shows how everything links.\\n\\n" + "NO-BABYSITTING (while scanning + testing):\\n" + "- Scan the WHOLE surface before reporting - every file, entry point, and sink. " + " Do not stop after the first hit to ask; keep enumerating the full tree.\\n" + "- Test every hypothesis through its full verification cycle - vary probes on " + " failure, apply bypasses when blocked, keep going. Do not pause to ask.\\n" + "- Persist through partial results: a scan that surfaces few sinks is NOT done - " + " widen the surface, escalate detectors, dig into each reachable sink.\\n" + "- NEVER ask 'should I continue?' / 'proceed?' / approval-style questions. " + " Continue autonomously - the moment one step verifies, start the next. " + " Pause ONLY when: a genuinely destructive/DoS action needs consent, an " + " external dependency beyond your control blocks you (e.g. phone OTP), or " + " the engagement is COMPLETE (deliver the final report). Otherwise keep hunting.\\n\\n" + "PERSISTENCE (complex bugs - do not give up):\\n" + "- There is NO retry cap. A failed probe/sub-agent is diagnosed and resumed " + " until verified or definitively ruled out - never move on unverified.\\n" + "- On any failure (empty output, blocked probe, failed sub-agent/model), call " + " retry_guidance(signal) for concrete recovery actions before giving up.\\n" + "- On a model/sub-agent error (rate-limit, quota, timeout, 5xx, auth, " + " unavailable), model_fallback(signal) classifies it and returns the exact " + " recovery (retry+backoff / fall back / shrink scope / fix credentials / " + " abort). Do not fall back blindly - the class decides.\\n" + "- One failed probe != not vulnerable. Vary: alternative sinks, other params, " + " encoding/case/whitespace bypasses, different injection context.\\n" + "- Empty output != no findings. Re-run (server may be stale after an upgrade - " + " /reload-mcp), or escalate to route_scan / complex_scan for classes taint " + " misses (POP chains, type juggling, mass assignment, route confusion).\\n" + "- A 'sanitized' sink may not be safe. Challenge the sanitizer: loose == vs ===, " + " missing EXTR_SKIP, int cast truncation, weak regex.\\n" + "- An unconfirmed hypothesis is KEPT as hypothesis - try alternate verification, " + " then let adversarial review decide.\\n" + "- Complex chains (deserialization->POP, LFI->RCE) need the FULL chain traced, " + ` not just the first sink.\\n
54310
+ instructions: "Blitz Strike is a universal penetration-testing toolbelt with three tiers — " + "BLITZ (reconnaissance / attack-surface mapping), EAGLE-EYE (source-to-sink " + "analysis), STRIKE (live validation) — plus a canonical evidence-first finding " + "engine and a multi-language taint engine.\\n\\n" + "CORE MENTAL MODEL:\\n" + "- A scanner hit is a HYPOTHESIS, not a finding. Live verification (or data-flow " + " proof) is the verdict. Never report an unverified hit as a vulnerability.\\n" + "- Distinguish REACHABLE from mere PRESENT: a sink is only a finding when tainted " + " input reaches it AND it is not neutralized by a sanitizer and not guarded by an " + " auth gate.\\n\\n" + "HOW TO RUN AN AUDIT (start here):\\n" + "0. ROUTE BY TARGET. Classify automatically - no need to ask. A URL - with or " + " without http/https - is LIVE (live_recon + the " + " web-hunting doctrine + strike_verify). A filesystem path (exists on disk, " + " or a code extension) is SOURCE audit (source-audit doctrine: blitz_scan + " + " eagle_eye2 + complex_scan/route_scan). TWO DOCTRINES - never mix: live " + " web/API -> web-hunting skill; source tree -> source-audit skill. For a WHOLE " + " engagement prefer run_engagement (one call, no babysitting) FIRST; steps 1-5 " + " below are the manual path for targeted follow-up on a specific finding.\\n" + "1. RECORD SCOPE. scope_check classifies the target (intel for the report) - " + " it does NOT gate the engagement. No authorization gate: the repo disclaimer " + " places responsibility on the user. Hunt the target you are given.\\n" + "2. MAP THE SURFACE (BLITZ). For a source tree use blitz_scan (tree) or blitz_file " + " (single file) then enrich_scan to match sinks to escalation chains. For a live " + " URL use live_recon for a full pass (fingerprint/WAF/tech/version/crawler/params/" + " subdomains/API endpoints/intel correlation) — it returns next_steps. active_scan " + " is the lighter alternative. Both record scope internally.\\n" + "3. TRACE REACHABILITY (EAGLE-EYE). For every sink, determine whether attacker " + " input actually reaches it:\\n" + " - PHP/JS/TS/Python/Java source: taint_file (auto-detects language) or " + " taint_scan/taint_tree (PHP AST). list_languages shows what's supported.\\n" + " - Any language: trace_data_flow (window heuristic) and eagle_eye/eagle_grep " + " (function-scoped view of sinks + auth gates). Beyond taint: route_scan (route confusion / dispatch abuse / batch forwarding) and complex_scan (deserialization->POP, type juggling, mass assignment, prototype pollution, CRLF/header injection, path confusion, SSRF, XXE, SSTI) catch classes plain taint misses.\\n" + " A sink counts only if tainted input reaches it unsanitized and unguarded.\\n" + "4. VALIDATE (STRIKE). Confirm live with strike_verify using a MARKER plus a " + " NEGATIVE CONTROL plus a BASELINE. The verdict is deterministic: marker " + " reflected AND control inert = confirmed; both reflected = false_positive; " + " marker not reflected = unconfirmed. Feed the verdict to strike_resolve to " + " advance the finding lifecycle (hypothesis->validating->confirmed). Use " + " read_tool_manual for the exploit tool's manual, payload_lookup for payloads, " + " detect_waf/tech_correlation for context.\\n" + "5. RECORD + REPORT. Create a canonical finding with finding_create, advance it " + " through the lifecycle with finding_transition, attach confidence_score, and " + " redact any secrets before persisting. Only report findings that survived " + " verification.\\n\\n" + "SUPPORTING LAYERS:\\n" + "- run_engagement: ONE call does the whole audit (no babysitting). Source path -> " + " full static pipeline + inline report (markdown/JSON/SARIF). URL target -> " + " full autonomous live pipeline (live_recon recon + deterministic checks: reflected " + " input, security headers, open redirect, path traversal, CORS) + findings + report. " + " PREFER THIS FIRST for a whole engagement; drive " + " the steps above manually only for targeted follow-up on a specific finding.\\n" + "- run_autonomous: run_engagement + the escalation path pre-attached to every " + " finding (chain name/severity/prerequisites + ordered next_steps with tool_hint/" + " success_criteria/negative_control) + a deterministic termination reason. Use it " + " when you want the 'what to do next' already computed per finding.\\n" + "- list_chains: 57 escalation chains (source -> sink -> impact).\\n" + "- list_languages / taint_file: multi-language taint (PHP, JS/TS, Python, Java).\\n" + "- tool_lookup / ensure_tool / list_tools: 130-tool catalog, auto-install.\\n" + "- read_playbook / list_playbooks: 17 engagement playbooks (web-app, api-security, " + " source-code-audit, active-directory, mobile, external-attack-surface, ...).\\n" + "- skill_lookup / read_skill / list_skills: 39 skills (7 bs-* agent doctrine: " + " orchestrate, scope, source-audit, web-hunting, verify, review, report; + " + " technique playbooks: WP/PHP 0-day, AD, malware, mobile, cloud).\\n" + "- read_tool_manual / list_manuals: 317 tool manuals (sqlmap, nmap, commix, ...).\\n" + "- payload_lookup / read_payload: 66 payload collections (sqli, xss, ssti, xxe, lfi).\\n" + "- detect_waf / tech_correlation / cve_correlation / port_correlation: signature " + " + correlation intelligence.\\n" + "- nvd_lookup / fofa_search: CVE lookup + asset reconnaissance (FOFA needs env creds).\\n" + "- remember / memory_lookup / memory_list: persist + recall verified knowledge.\\n\\n" + "RESOURCE MAP (know what to reach for):\\n" + "- ORCHESTRATION = the engagement framework. orchestration() returns the " + " lifecycle (scope->recon->analyze->deep->verify->report, each with " + " entry/exit criteria) + sub-agent team + handoff contract + termination " + " criteria. Load it at engagement start. Autonomous driving aids: plan() " + " (deterministic phase plan + next action), delegate() (parallel-first " + " subagent batches + retry pattern), worktree() (isolate a workstream), " + " watchdog() (detect a stalled phase), context_prune() (compact state so " + " you can drop raw detail), and task_start/task_checkpoint/task_status/" + " task_resume (per-workstream checkpoint journal — resume a failed task " + " from its last completed step, never restart).\\n" + "- TOOL = acts (scan, taint, verify, record, correlate). Call it to DO something.\\n" + "- PLAYBOOK = campaign plan for a target TYPE. read_playbook(web-application) " + " BEFORE a full engagement of that type.\\n" + "- SKILL = procedure doctrine. Load the bs-* skill for the phase you are on " + " (orchestrate, scope, web-hunting for LIVE, source-audit for SOURCE, verify, " + " review, report); load a technique skill for the specific technique.\\n" + "- MANUAL = deep reference for ONE tool. read_tool_manual right before using it.\\n" + "- CATALOG = external tools (130: sqlmap, nmap, nuclei, ffuf, ysoserial, ...). " + " Blitz Strike's OWN tools find + verify; the catalog is for deeper EXTERNAL " + " exploitation/enumeration. After your own analysis confirms a finding, run " + " tool_lookup -> ensure_tool (auto-install) -> read_tool_manual to drive the " + " external tool that demonstrates impact.\\n" + "- PAYLOAD = attack payloads for a class. payload_lookup before crafting a probe.\\n" + "- INTELLIGENCE = knowledge. list_attack_vectors (34 categories) maps the " + " full surface during RECON; list_chains (57) turns a finding into impact; " + " chain_links composes chains for complex bugs; bypass_lookup when blocked; " + " payload_lookup when crafting a probe. technique_lookup(cls) returns the " + " DETAILED methodology + tricks for a vulnerability class (ssrf, ssti, " + " jwt, deserialization, ...) - load before testing a class. wstg_map maps " + " an OWASP category to coverage; taxonomy maps findings to standard IDs " + " (OWASP Top 10 / API Top 10 / CWE / ASVS); doctrine_map shows how everything links.\\n\\n" + "NO-BABYSITTING (while scanning + testing):\\n" + "- Scan the WHOLE surface before reporting - every file, entry point, and sink. " + " Do not stop after the first hit to ask; keep enumerating the full tree.\\n" + "- Test every hypothesis through its full verification cycle - vary probes on " + " failure, apply bypasses when blocked, keep going. Do not pause to ask.\\n" + "- Persist through partial results: a scan that surfaces few sinks is NOT done - " + " widen the surface, escalate detectors, dig into each reachable sink.\\n" + "- NEVER ask 'should I continue?' / 'proceed?' / approval-style questions. " + " Continue autonomously - the moment one step verifies, start the next. " + " Pause ONLY when: a genuinely destructive/DoS action needs consent, an " + " external dependency beyond your control blocks you (e.g. phone OTP), or " + " the engagement is COMPLETE (deliver the final report). Otherwise keep hunting.\\n\\n" + "PERSISTENCE (complex bugs - do not give up):\\n" + "- There is NO retry cap. A failed probe/sub-agent is diagnosed and resumed " + " until verified or definitively ruled out - never move on unverified.\\n" + "- On any failure (empty output, blocked probe, failed sub-agent/model), call " + " retry_guidance(signal) for concrete recovery actions before giving up.\\n" + "- On a model/sub-agent error (rate-limit, quota, timeout, 5xx, auth, " + " unavailable), model_fallback(signal) classifies it and returns the exact " + " recovery (retry+backoff / fall back / shrink scope / fix credentials / " + " abort). Do not fall back blindly - the class decides.\\n" + "- One failed probe != not vulnerable. Vary: alternative sinks, other params, " + " encoding/case/whitespace bypasses, different injection context.\\n" + "- Empty output != no findings. Re-run (server may be stale after an upgrade - " + " /reload-mcp), or escalate to route_scan / complex_scan for classes taint " + " misses (POP chains, type juggling, mass assignment, route confusion).\\n" + "- A 'sanitized' sink may not be safe. Challenge the sanitizer: loose == vs ===, " + " missing EXTR_SKIP, int cast truncation, weak regex.\\n" + "- An unconfirmed hypothesis is KEPT as hypothesis - try alternate verification, " + " then let adversarial review decide.\\n" + "- Complex chains (deserialization->POP, LFI->RCE) need the FULL chain traced, " + ` not just the first sink.\\n
54167
54311
  ` + "- When a probe is BLOCKED by a WAF/filter/sanitizer, call bypass_lookup(defense) " + " for concrete techniques (encoding, case, comment insertion, chunked, null byte, " + " double-encoding, verb tampering, header spoofing) and apply them - do not give up.\\n" + "- CHAIN findings: a low-severity finding may escalate — do not assume it is the " + " end of the story. list_chains / chain_links show whether it composes into a " + " multi-stage chain (e.g. SSRF->metadata, SQLi->RCE, LFI->RCE, upload->shell). " + " Check before concluding, and do not overclaim an escalation that is not there.\\n\\n" + "- Complex bugs chain ACROSS chains: after confirming one chain, chain_links " + " shows what follows (SSRF->metadata then default-creds->pivot via stolen IAM). " + " Trace the full composition, not just a single chain.\\n\\n" + "HYPOTHESIS EXPANSION (from each finding, enumerate + verify every follow-up):\\n" + "- A confirmed finding is the START, not the end. From each one, enumerate " + " the follow-ups: ESCALATE (list_chains + chain_links), CHAIN (chain_links " + " from->to), BYPASS (bypass_lookup), PIVOT (new endpoints/sinks now reachable).\\n" + "- Every follow-up (this might happen, this could chain, maybe bypassable) is " + " a HYPOTHESIS, not a finding. Verify EACH via strike_verify (marker + negative " + " control) before it enters the report.\\n" + "- Never report speculation: might / could / possibly live in the " + " hypothesis list, never in the report. Every report line is a verified fact.\\n\\n" + "PROFESSIONAL JUDGMENT (act like a senior tester, not a checklist runner):\\n" + "- PRIORITIZE by severity, computed deterministically with cvss_score (impact x " + " exploitability) and weighted by escalation potential (chain_links). Do NOT rank " + " by bug class - a critical stored XSS that yields account takeover outranks an " + " unreachable blind RCE. Weight by the engagement context (which asset/data is " + " most sensitive for THIS target).\\n" + "- Recognize dead ends: if a branch yields nothing after a few varied probes, " + " note it and move on. Do not tunnel-vision one sink at the expense of the rest.\\n" + "- Live-test with care: respect rate limits, do not lock accounts, do not " + " trigger DoS. Test non-destructively and prove impact with the smallest payload.\\n" + "- Know when done: stop when the termination criteria are met, not when you feel " + " tired. A thorough audit over a rushed one, every time.\\n\\n" + "IRON RULES:\\n" + "- No authorization gate - the repo disclaimer places responsibility on the " + " user. Hunt the target you are given (like nmap/sqlmap/Burp, which do not " + " ask). The one hard stop: malicious/third-party infra (cari pelaku) - hold/static.\\n" + " need finer control."
54168
54312
  });
54169
54313
  server.registerTool("blitz_scan", {
@@ -54351,7 +54495,7 @@ function createServer() {
54351
54495
  });
54352
54496
  server.registerTool("run_engagement", {
54353
54497
  title: "STRIKE full engagement",
54354
- description: "STRIKE: run a full audit in ONE call (no babysitting). Source path -> triage -> chain enrichment -> findings -> inline report (markdown+JSON+SARIF). URL target -> full autonomous live pipeline: live_recon (fingerprint/WAF/tech/crawl/subdomains/API) + deterministic security checks (reflected input via marker/negative-control, missing security headers, open redirect, path traversal, CORS) -> findings -> inline report. Prefer this over driving tools one-by-one when you want the whole engagement in a single deterministic call.",
54498
+ description: "STRIKE: run a full audit in ONE call (no babysitting). Source path -> triage -> chain enrichment -> findings -> inline report (markdown+JSON+SARIF). URL target -> full autonomous live pipeline: live_recon (fingerprint/WAF/tech/crawl/subdomains/API) + deterministic security checks (reflected input, missing headers, open redirect, path traversal, CORS) + advanced checks (SSTI, SSRF, error-based SQLi) -> findings -> inline report. Prefer this over driving tools one-by-one when you want the whole engagement in a single deterministic call.",
54355
54499
  inputSchema: {
54356
54500
  target: string2().describe("Source path or URL"),
54357
54501
  scope: string2().optional().describe("Scope (for URL targets)"),
@@ -55127,8 +55271,8 @@ ${statusLine}` : statusLine },
55127
55271
  };
55128
55272
  });
55129
55273
  server.registerTool("complex_scan", {
55130
- title: "Complex-bug scan (deserialization / type juggling / mass assignment / prototype pollution / CRLF / path confusion)",
55131
- description: "Complex-bug detection beyond taint: deserialization→POP gadget chain (unserialize + magic method), type juggling (loose ==/!= vs hash/secret), mass assignment (extract/parse_str without a safe flag), prototype pollution (unsafe merge of request data), CRLF/header injection (user input into a header), and path confusion (user input into a file path without canonicalization).",
55274
+ title: "Complex-bug scan (deserialization / type juggling / mass assignment / prototype pollution / CRLF / path confusion / SSRF / XXE / SSTI)",
55275
+ description: "Complex-bug detection beyond taint: deserialization→POP gadget chain (unserialize + magic method), type juggling (loose ==/!= vs hash/secret), mass assignment (extract/parse_str without a safe flag), prototype pollution (unsafe merge of request data), CRLF/header injection (user input into a header), path confusion (user input into a file path without canonicalization), SSRF (user-controlled URL with no host allowlist), XXE (user XML parsed without disabling entities), and SSTI (user input into a template render with no sandbox).",
55132
55276
  inputSchema: { path: string2().describe("Source file path") }
55133
55277
  }, async ({ path }) => {
55134
55278
  const code = readFileSync19(path, "utf8");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blitzstrike",
3
- "version": "1.6.0",
3
+ "version": "1.7.1",
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": {