blitzstrike 2.4.25 → 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 +15 -0
- package/dist/index.js +65 -7
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,21 @@ 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
|
+
|
|
8
23
|
## [2.4.25] — 2026-09-14
|
|
9
24
|
|
|
10
25
|
### Doctrine — "if you can continue, why not? if possible, why not try?"
|
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");
|
|
@@ -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": {
|