blitzstrike 2.4.24 → 2.4.26
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 +29 -0
- package/dist/index.js +67 -9
- package/package.json +1 -1
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.26] — 2026-09-14
|
|
9
|
+
|
|
10
|
+
### Added — derived success_probability + estimated_time + plan modes
|
|
11
|
+
|
|
12
|
+
- `attack_plan` now returns, per vector, a DERIVED success_probability
|
|
13
|
+
(relevance prior: clamp(0.85 - 0.15*(priority-1), 0.25, 0.85) — priority 1 =
|
|
14
|
+
0.85 down to priority 4 = 0.40) and estimated_time_sec (from an
|
|
15
|
+
operation-class table: passive/config < injection < deep/manual), plus a
|
|
16
|
+
total_estimated_time_sec.
|
|
17
|
+
- New `mode` param: full (all vectors) / quick (priority<=2) / stealth
|
|
18
|
+
(passive/config vectors only) — objective-based planning like HexStrike's
|
|
19
|
+
decision engine, but DERIVED (not hardcoded 0.8/0.9 guesses).
|
|
20
|
+
- success_probability is a PLANNING prior, deliberately distinct from the
|
|
21
|
+
evidence-backed confidence (computeConfidence) — documented in the tool.
|
|
22
|
+
|
|
23
|
+
## [2.4.25] — 2026-09-14
|
|
24
|
+
|
|
25
|
+
### Doctrine — "if you can continue, why not? if possible, why not try?"
|
|
26
|
+
|
|
27
|
+
- Added an explicit chain-execution DOCTRINE to the system prompt: a chain
|
|
28
|
+
step you CAN execute is one you MUST execute now. A PREREQUISITE (e.g. a
|
|
29
|
+
CORS->session-theft chain needing "a foothold on any subdomain") is a chain
|
|
30
|
+
step, NOT a "next engagement" — check for dangling DNS / XSS now, don't
|
|
31
|
+
defer it.
|
|
32
|
+
- Tightened the completion rule: COMPLETE means every lead verified/blocked
|
|
33
|
+
AND every reachable chain step executed or blocked (no deferred
|
|
34
|
+
escalations); declaring COMPLETE with a reachable chain step deferred is a
|
|
35
|
+
violation.
|
|
36
|
+
|
|
8
37
|
## [2.4.24] — 2026-09-14
|
|
9
38
|
|
|
10
39
|
### Fixed — LLM finding-lifecycle loop (opencode "repeated failures")
|
package/dist/index.js
CHANGED
|
@@ -32486,7 +32486,55 @@ var TECH_HINTS = {
|
|
|
32486
32486
|
aspnet: ["deserialization", "viewstate"],
|
|
32487
32487
|
nextjs: ["ssrf", "idor"]
|
|
32488
32488
|
};
|
|
32489
|
-
|
|
32489
|
+
var STEALTH_VECTORS = new Set([
|
|
32490
|
+
"cors_misconfiguration",
|
|
32491
|
+
"jwt",
|
|
32492
|
+
"open_redirect",
|
|
32493
|
+
"idor",
|
|
32494
|
+
"auth_bypass",
|
|
32495
|
+
"rest_api_auth",
|
|
32496
|
+
"debug_mode",
|
|
32497
|
+
"actuator_exposure",
|
|
32498
|
+
"viewstate",
|
|
32499
|
+
"xmlrpc"
|
|
32500
|
+
]);
|
|
32501
|
+
var VECTOR_TIME = {
|
|
32502
|
+
cors_misconfiguration: 90,
|
|
32503
|
+
jwt: 90,
|
|
32504
|
+
open_redirect: 120,
|
|
32505
|
+
debug_mode: 90,
|
|
32506
|
+
actuator_exposure: 90,
|
|
32507
|
+
viewstate: 120,
|
|
32508
|
+
xmlrpc: 120,
|
|
32509
|
+
rest_api_auth: 120,
|
|
32510
|
+
xss: 180,
|
|
32511
|
+
sql_injection: 180,
|
|
32512
|
+
ssti: 180,
|
|
32513
|
+
ssrf: 180,
|
|
32514
|
+
command_injection: 180,
|
|
32515
|
+
path_traversal: 180,
|
|
32516
|
+
lfi: 180,
|
|
32517
|
+
nosql_injection: 180,
|
|
32518
|
+
mass_assignment: 180,
|
|
32519
|
+
prototype_pollution: 180,
|
|
32520
|
+
xxe: 240,
|
|
32521
|
+
file_upload: 240,
|
|
32522
|
+
deserialization: 240,
|
|
32523
|
+
pickle_deserialization: 240,
|
|
32524
|
+
idor: 300,
|
|
32525
|
+
auth_bypass: 300,
|
|
32526
|
+
business_logic: 360,
|
|
32527
|
+
upload_rce: 300,
|
|
32528
|
+
wp_plugin_audit: 600
|
|
32529
|
+
};
|
|
32530
|
+
var DEFAULT_VECTOR_TIME = 180;
|
|
32531
|
+
function successProbability(priority) {
|
|
32532
|
+
return Math.round(Math.min(0.85, Math.max(0.25, 0.85 - 0.15 * (priority - 1))) * 100) / 100;
|
|
32533
|
+
}
|
|
32534
|
+
function estimateTime(vector) {
|
|
32535
|
+
return VECTOR_TIME[vector] ?? DEFAULT_VECTOR_TIME;
|
|
32536
|
+
}
|
|
32537
|
+
function attackPlan(target, tech = [], params = [], mode = "full") {
|
|
32490
32538
|
const data = loadJson("attack_vectors");
|
|
32491
32539
|
const totalCategories = data?.categories.length ?? 0;
|
|
32492
32540
|
const plan = BASE_VECTORS.map((v) => ({ ...v, source: "base" }));
|
|
@@ -32510,18 +32558,27 @@ function attackPlan(target, tech = [], params = []) {
|
|
|
32510
32558
|
for (const h of hints)
|
|
32511
32559
|
add(h, 2, `tech '${t}' suggests ${h}`, "technique_lookup / read_skill", "tech");
|
|
32512
32560
|
}
|
|
32513
|
-
|
|
32561
|
+
let sorted = plan.sort((a, b) => a.priority - b.priority || a.vector.localeCompare(b.vector));
|
|
32562
|
+
if (mode === "quick")
|
|
32563
|
+
sorted = sorted.filter((p) => p.priority <= 2);
|
|
32564
|
+
else if (mode === "stealth")
|
|
32565
|
+
sorted = sorted.filter((p) => STEALTH_VECTORS.has(p.vector));
|
|
32566
|
+
const totalTime = sorted.reduce((s, p) => s + estimateTime(p.vector), 0);
|
|
32514
32567
|
return {
|
|
32515
32568
|
target,
|
|
32569
|
+
mode,
|
|
32516
32570
|
taxonomy: { total_categories: totalCategories, total_vectors_here: sorted.length },
|
|
32517
32571
|
plan: sorted.map((p, i) => ({
|
|
32518
32572
|
order: i + 1,
|
|
32519
32573
|
vector: p.vector,
|
|
32520
32574
|
priority: p.priority,
|
|
32575
|
+
success_probability: successProbability(p.priority),
|
|
32576
|
+
estimated_time_sec: estimateTime(p.vector),
|
|
32521
32577
|
reason: p.reason,
|
|
32522
32578
|
tool: p.tool,
|
|
32523
32579
|
source: p.source
|
|
32524
|
-
}))
|
|
32580
|
+
})),
|
|
32581
|
+
total_estimated_time_sec: totalTime
|
|
32525
32582
|
};
|
|
32526
32583
|
}
|
|
32527
32584
|
var PACKAGE_PAYLOADS = join8(ROOT3, "payloads");
|
|
@@ -56467,11 +56524,11 @@ function createServer() {
|
|
|
56467
56524
|
}, {
|
|
56468
56525
|
instructions: "Blitz Strike — deterministic security-audit toolbelt. You reason; its tools do the deterministic work (scan, taint, verify, evidence).\\n\\n" + "FIRST ACTION (when the user says test / scan / audit / engagement / pentest <URL or path>):\\n" + "- Call run_engagement(target) — or run_autonomous(target) to also get escalation paths. ONE call runs the whole engagement (recon -> sweep -> checks -> report).\\n" + "- NEVER do manual live_recon / blitz_scan first, and never fall back to manual probing. Manual tools are ONLY for follow-up AFTER run_engagement, or when the user names a specific sub-step.\\n\\n" + "RULES (never violate):\\n" + `- A hit is a HYPOTHESIS; live verification (marker + negative control) is the verdict. Never report unverified.
|
|
56469
56526
|
` + `- run_engagement / run_autonomous return status DETECTED (NOT "complete") — that is the signal to VERIFY. After detection you MUST strike_verify (or verify_file_read for CWE-22, drive_devtools for DOM/JS precision) on each finding, then generate_report. Detection without verification is NOT a deliverable.
|
|
56470
|
-
` + "- scope_check is intel-only, never gates. No scope = proceed (repo disclaimer carries responsibility). No authorization gate — hunt the target you are given.\\n" + "- strike_verify + live checks AUTO-attempt WAF bypass. Don't report 'needs bypass' without re-probing.\\n" + "- NEVER ask 'should I continue?' / 'say the word' / 'want me to pursue' / 'next?' — that is a hard violation. Execute the full chain autonomously until COMPLETE. Pause only: destructive/DoS consent, external block (OTP/cred), or COMPLETE.\\n" + "- One hard stop: malicious/third-party infra ('find the actor') -> static + takedown only.\\n" + "- FINDING LIFECYCLE (stateful — never loop stateless tools): advance findings via finding_create -> strike_verify -> strike_resolve. finding_transition now takes a FULL finding JSON + target status and RETURNS the updated finding (pass the object, never a status string); a bad move returns 'illegal transition' + the legal next states. confidence_score is DETERMINISTIC (same factors -> same score) — call it ONCE, never retry; it changes nothing.\\n\\n" + "CHAIN DECISIONS (a confirmed finding is the START, not the end):\\n" + "- For each confirmed finding, enumerate follow-ups with list_chains + chain_links: ESCALATE (what it becomes), CHAIN (compose with other findings), BYPASS, PIVOT (new surface now reachable).\\n" + "- Ask the chain-aware question: 'I found X -> what can I NOW read / do / access?' e.g. SQLi -> query the DB for credentials AND for the Werkzeug console PIN / secrets / source; LFI -> read configs, keys, PIN inputs; cred dump -> crack offline -> authenticate -> privileged actions.\\n" + "- Every follow-up is a HYPOTHESIS — verify each before it enters the report. Don't stop at 'found SQLi'; follow where the chain leads.\\n" + "- EXECUTE follow-ups NOW, not as 'next phase': any leaked source/error -> scan_leaked_source(text) to enumerate sinks (eval/exec/SECRET_KEY/creds) then exploit each; dumped hashes -> crack_hash(hash) now; hidden-content IDOR -> test the direct route. A 'next chain' you write is a TODO — run it, never leave it as a recommendation.\\n\\n" + `DELIVERABLE + PERSISTENCE (recon is INPUT, not output):
|
|
56527
|
+
` + "- scope_check is intel-only, never gates. No scope = proceed (repo disclaimer carries responsibility). No authorization gate — hunt the target you are given.\\n" + "- strike_verify + live checks AUTO-attempt WAF bypass. Don't report 'needs bypass' without re-probing.\\n" + "- NEVER ask 'should I continue?' / 'say the word' / 'want me to pursue' / 'next?' — that is a hard violation. Execute the full chain autonomously until COMPLETE. COMPLETE means every lead verified/blocked AND every reachable chain step executed or blocked (no deferred escalations). Pause only: destructive/DoS consent, external block (OTP/cred), or genuine COMPLETE.\\n" + "- One hard stop: malicious/third-party infra ('find the actor') -> static + takedown only.\\n" + "- FINDING LIFECYCLE (stateful — never loop stateless tools): advance findings via finding_create -> strike_verify -> strike_resolve. finding_transition now takes a FULL finding JSON + target status and RETURNS the updated finding (pass the object, never a status string); a bad move returns 'illegal transition' + the legal next states. confidence_score is DETERMINISTIC (same factors -> same score) — call it ONCE, never retry; it changes nothing.\\n\\n" + "CHAIN DECISIONS (a confirmed finding is the START, not the end):\\n" + "- For each confirmed finding, enumerate follow-ups with list_chains + chain_links: ESCALATE (what it becomes), CHAIN (compose with other findings), BYPASS, PIVOT (new surface now reachable).\\n" + "- Ask the chain-aware question: 'I found X -> what can I NOW read / do / access?' e.g. SQLi -> query the DB for credentials AND for the Werkzeug console PIN / secrets / source; LFI -> read configs, keys, PIN inputs; cred dump -> crack offline -> authenticate -> privileged actions.\\n" + "- Every follow-up is a HYPOTHESIS — verify each before it enters the report. Don't stop at 'found SQLi'; follow where the chain leads.\\n" + "- EXECUTE follow-ups NOW, not as 'next phase': any leaked source/error -> scan_leaked_source(text) to enumerate sinks (eval/exec/SECRET_KEY/creds) then exploit each; dumped hashes -> crack_hash(hash) now; hidden-content IDOR -> test the direct route. A 'next chain' you write is a TODO — run it, never leave it as a recommendation.\\n\\n" + "- DOCTRINE — 'if you can continue, why not? if possible, why not try?': a chain step you CAN execute is one you MUST execute. A PREREQUISITE is a chain step, NOT a separate engagement — e.g. a CORS->session-theft chain needing 'a foothold on any subdomain (XSS / dangling-DNS takeover)' means CHECK for it NOW: resolve every allowlisted subdomain and test each for dangling delegation (NXDOMAIN, unclaimed S3/bucket, dangling SaaS CNAME) + probe for XSS — do NOT write 'dangling-DNS audit is the next engagement'. Declaring COMPLETE while a reachable chain step is deferred is a violation.\\n\\n" + `DELIVERABLE + PERSISTENCE (recon is INPUT, not output):
|
|
56471
56528
|
` + `- The deliverable is a HackerOne-grade FINDING report via generate_report, NEVER a hand-written recon/surface map. Recon is input; confirmed findings are the output.
|
|
56472
56529
|
` + `- After recon, VERIFY every lead before it enters the report: strike_verify (marker + negative control) for HTTP, browser_validate for DOM/JS. A lead is a HYPOTHESIS until verified.
|
|
56473
56530
|
` + `- A hard block (Cloudflare/WAF/IP-block/captcha) is NOT the end: mark the finding blocked + note the required vantage (residential / authorized / correct-SNI / --resolve direct-to-origin), then CONTINUE to the next lead (origin bypass, non-prod cluster, mobile APK, subdomain).
|
|
56474
|
-
` + `- Keep trying every lead until each is verified or blocked, THEN generate_report. Never deliver a bare surface map.
|
|
56531
|
+
` + `- 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.
|
|
56475
56532
|
|
|
56476
56533
|
` + "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.
|
|
56477
56534
|
` + `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.
|
|
@@ -57107,14 +57164,15 @@ ${statusLine}` : statusLine },
|
|
|
57107
57164
|
});
|
|
57108
57165
|
server.registerTool("attack_plan", {
|
|
57109
57166
|
title: "Prioritized attack-vector plan for a target",
|
|
57110
|
-
description: "DECISION: return the prioritized attack-vector plan for a target — the vectors to test (injection vectors always listed, then param/tech hints add + reprioritize), each with a reason
|
|
57167
|
+
description: "DECISION: return the prioritized attack-vector plan for a target — the vectors to test (injection vectors always listed, then param/tech hints add + reprioritize), each with a reason, the specific tool, a DERIVED success_probability (relevance prior) and estimated_time_sec. Pass mode: full (all vectors) / quick (priority<=2 only) / stealth (passive/config vectors only). Call this AFTER run_engagement recon to decide what to test next with data instead of guessing.",
|
|
57111
57168
|
inputSchema: {
|
|
57112
57169
|
target: string2().describe("Target URL/host"),
|
|
57113
57170
|
tech: array(string2()).optional().describe("Detected technologies (from recon)"),
|
|
57114
|
-
params: array(string2()).optional().describe("Discovered input parameters (from recon)")
|
|
57171
|
+
params: array(string2()).optional().describe("Discovered input parameters (from recon)"),
|
|
57172
|
+
mode: _enum(["full", "quick", "stealth"]).optional().describe("Plan mode: full (default) / quick (top-priority only) / stealth (passive vectors only)")
|
|
57115
57173
|
}
|
|
57116
|
-
}, async ({ target, tech, params }) => {
|
|
57117
|
-
return { content: [{ type: "text", text: JSON.stringify(attackPlan(target, tech ?? [], params ?? [])) }] };
|
|
57174
|
+
}, async ({ target, tech, params, mode }) => {
|
|
57175
|
+
return { content: [{ type: "text", text: JSON.stringify(attackPlan(target, tech ?? [], params ?? [], mode ?? "full")) }] };
|
|
57118
57176
|
});
|
|
57119
57177
|
server.registerTool("payload_lookup", {
|
|
57120
57178
|
title: "Look up exploit payloads",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blitzstrike",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.26",
|
|
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": {
|