blitzstrike 2.4.178 → 2.4.180
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 +33 -0
- package/dist/index.js +53 -30
- package/intelligence/frameworks.json +129 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,39 @@ 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.180] — 2026-10-11
|
|
9
|
+
|
|
10
|
+
### Changed — goal decomposition corrected (goal = deliverable, not process)
|
|
11
|
+
|
|
12
|
+
- `decompose_goal` now registers the goal as ONE final deliverable (optional
|
|
13
|
+
vulnclass) and returns the decomposition rules + the six-phase PROCESS plan as
|
|
14
|
+
a reference — the process (recon→report) is the HOW and is no longer registered
|
|
15
|
+
as goals. `goal_set` accepts a `vulnclass` tag.
|
|
16
|
+
|
|
17
|
+
### Changed — constraint self-containment + out-of-scope fact
|
|
18
|
+
|
|
19
|
+
- Constraints must be self-contained (replace pronouns with the concrete host/port);
|
|
20
|
+
a new target discovered outside the constraints is recorded as an out-of-scope
|
|
21
|
+
fact and skipped, never authorized.
|
|
22
|
+
|
|
23
|
+
### Added — 4 doctrine rules
|
|
24
|
+
|
|
25
|
+
- `constraint_self_contained`, `record_is_memory` (write-back is anti-compaction
|
|
26
|
+
long-term memory — record immediately, only increments), `wrapup_highest_priority`
|
|
27
|
+
(land conclusions then stop), `high_value_surface` (parsing/charset, upload,
|
|
28
|
+
(de)serialization, cache race, TOCTOU, type confusion, mass assignment).
|
|
29
|
+
|
|
30
|
+
## [2.4.179] — 2026-10-11
|
|
31
|
+
|
|
32
|
+
### Added — WordPress P1-P6 vulnerability pattern taxonomy
|
|
33
|
+
|
|
34
|
+
- `intelligence/frameworks.json` (id=wordpress) now carries a `patterns` taxonomy:
|
|
35
|
+
P1 RCE, P2 arbitrary file upload, P3 unauthenticated account takeover, P4
|
|
36
|
+
unauthenticated password reset, P5 privilege escalation, P6 AJAX/REST
|
|
37
|
+
authorization failure — each with source signals, detect (what to trace),
|
|
38
|
+
fixed (the correct control), and anchor WPVDB record ids.
|
|
39
|
+
- `frameworkProfile()` exposes `patterns`; `framework_intel` returns them.
|
|
40
|
+
|
|
8
41
|
## [2.4.178] — 2026-10-11
|
|
9
42
|
|
|
10
43
|
### Added — goal decomposition (six-phase plan)
|
package/dist/index.js
CHANGED
|
@@ -63774,6 +63774,26 @@ var HUNTING_DOCTRINE = [
|
|
|
63774
63774
|
id: "observed_vs_inferred",
|
|
63775
63775
|
title: "Observed vs Inferred — Never Upgrade Inferred to Confirmed",
|
|
63776
63776
|
rule: "Tag every conclusion with its confidence honestly: OBSERVED (you directly triggered it and hold the request/response or command output) vs INFERRED (you deduced it from a fingerprint/version/diff/phenomenon without actually triggering it). A version/CVE match, a 'looks injectable' param, or a patch-diff inference is INFERRED and must never be reported as a confirmed finding — record it as a hypothesis and verify it live (strike_verify / OOB / a clean oracle) before it can claim confirmed. Disproof is worth as much as proof: an honest dead verdict is a deliverable, an overstated inferred-as-confirmed is a retraction waiting to happen."
|
|
63777
|
+
},
|
|
63778
|
+
{
|
|
63779
|
+
id: "constraint_self_contained",
|
|
63780
|
+
title: "Constraints Are Self-Contained; New Target Outside Them Is Not Authorization",
|
|
63781
|
+
rule: "Every operation constraint MUST be self-contained: replace 'this target' / 'current port' / 'this host' with the CONCRETE host/port/domain, because constraints are injected into later prompts standalone and a pronoun means nothing out of context. And a new target/port/host you discover OUTSIDE the active constraints is NOT authorization: record it as an out-of-scope fact (record_fact, confidence=observed) and skip — never derive an intent or action for it, and never widen a subdomain up to its root domain unless the user explicitly named the whole root."
|
|
63782
|
+
},
|
|
63783
|
+
{
|
|
63784
|
+
id: "record_is_memory",
|
|
63785
|
+
title: "Write-Back Is Your Long-Term Memory — Record Immediately, Only Increments",
|
|
63786
|
+
rule: "Persist every result IMMEDIATELY as you produce it — never accumulate findings in your head or in a scratch note to save for the end (a session can be cut short and everything un-persisted is lost; only what is written down survives). Written records (finding_create / record_fact / surface_add / asset_discovery) are your anti-compaction long-term memory, not just bookkeeping. Write ONLY INCREMENTS: before recording, scan the existing ledger (list_facts / list_findings / coverage) and record only what is NEW — re-wording an existing conclusion just bloats state and misleads you into thinking you made progress. A conclusion that merely corroborates an existing one adds nothing and should not be re-recorded."
|
|
63787
|
+
},
|
|
63788
|
+
{
|
|
63789
|
+
id: "wrapup_highest_priority",
|
|
63790
|
+
title: "Wrap-Up Is the Highest Priority — Land Conclusions, Then Stop",
|
|
63791
|
+
rule: "When you receive a wrap-up/finish signal (or self-judge the goal met / all reasonable routes exhausted), STOP all probing and commands IMMEDIATELY — 'continue exploring / try once more / exhaust this chain / wait for a command result' are all OVERRIDDEN by the wrap-up signal. Land everything still in flight first: write back every un-persisted conclusion (findings, facts, surface verdicts, coverage), then produce a concise plain-language summary of what was achieved, which routes were taken, which findings are confirmed (with PoC locations), and which directions are blocked and why. Report only what was actually done — never pad the wrap-up with unverified 'maybe' leads."
|
|
63792
|
+
},
|
|
63793
|
+
{
|
|
63794
|
+
id: "high_value_surface",
|
|
63795
|
+
title: "High-Value Attack Surface — The Often-Overlooked Faces",
|
|
63796
|
+
rule: "When mapping the attack surface, prioritize these often-overlooked high-value faces (pick what applies, not a checklist obligation): input parsing / encoding / charset boundaries; file upload; (de)serialization; built-in routing + pre-auth-reachable handlers; error-handling leaks; cache poisoning / cache race; race conditions (TOCTOU); type confusion (scalar vs array); and mass assignment. These are where the highest-impact bugs hide when the obvious endpoints come up clean — before declaring a surface exhausted, confirm none of these faces remain untested."
|
|
63777
63797
|
}
|
|
63778
63798
|
];
|
|
63779
63799
|
var DOMAIN_EXHAUSTION_CHECKLIST = [
|
|
@@ -63938,35 +63958,37 @@ function nextId2() {
|
|
|
63938
63958
|
counter2 += 1;
|
|
63939
63959
|
return `G-${String(counter2).padStart(3, "0")}`;
|
|
63940
63960
|
}
|
|
63941
|
-
var
|
|
63942
|
-
{
|
|
63943
|
-
{
|
|
63944
|
-
{
|
|
63945
|
-
{
|
|
63946
|
-
{
|
|
63947
|
-
{
|
|
63961
|
+
var PROCESS_PLAN = [
|
|
63962
|
+
{ phase: "ENUMERATION — discover every in-scope asset", condition: "every host/subdomain/endpoint enumerated (asset_discovery)" },
|
|
63963
|
+
{ phase: "SURFACE — map every endpoint, parameter, and action", condition: "coverage >= 100% (every surface item has a terminal verdict)" },
|
|
63964
|
+
{ phase: "DISCOVERY — find vulnerabilities across every class", condition: "each eligible class × shape carries a terminal verdict" },
|
|
63965
|
+
{ phase: "VERIFICATION — verify each hypothesis live", condition: "every hypothesis verified (strike_verify/OOB) or refuted" },
|
|
63966
|
+
{ phase: "ESCALATION — drive each finding to real impact", condition: "every foothold escalated to records/admin/PII or genuinely blocked" },
|
|
63967
|
+
{ phase: "REPORT — write findings", condition: "generate_report run; zero open obligations" }
|
|
63948
63968
|
];
|
|
63949
63969
|
function setGoals(texts) {
|
|
63950
63970
|
for (const t of texts) {
|
|
63951
63971
|
const text = typeof t === "string" ? t : t.text;
|
|
63972
|
+
const vulnclass = typeof t === "string" ? undefined : t.vulnclass;
|
|
63952
63973
|
const condition = typeof t === "string" ? undefined : t.condition;
|
|
63953
63974
|
const parent_id = typeof t === "string" ? undefined : t.parent_id;
|
|
63954
63975
|
const now = new Date().toISOString();
|
|
63955
|
-
goals.push({ id: nextId2(), text,
|
|
63976
|
+
goals.push({ id: nextId2(), text, status: "pending", ...vulnclass ? { vulnclass } : {}, ...condition ? { condition } : {}, ...parent_id ? { parent_id } : {}, created: now, updated: now });
|
|
63956
63977
|
}
|
|
63957
63978
|
return [...goals];
|
|
63958
63979
|
}
|
|
63959
|
-
function decomposeGoal(text) {
|
|
63980
|
+
function decomposeGoal(text, vulnclass) {
|
|
63960
63981
|
const now = new Date().toISOString();
|
|
63961
|
-
const
|
|
63962
|
-
goals.push(
|
|
63963
|
-
const
|
|
63964
|
-
|
|
63965
|
-
|
|
63966
|
-
|
|
63967
|
-
|
|
63968
|
-
|
|
63969
|
-
|
|
63982
|
+
const goal = { id: nextId2(), text, status: "pending", ...vulnclass ? { vulnclass } : {}, created: now, updated: now };
|
|
63983
|
+
goals.push(goal);
|
|
63984
|
+
const rules = [
|
|
63985
|
+
"A goal is a FINAL, verifiable deliverable — never a process step (recon/scan/vuln-analysis/attack-step/verification are NOT goals).",
|
|
63986
|
+
"One final result -> one goal; multiple INDEPENDENT deliverables -> separate goals (via goal_set), each with its own vulnclass.",
|
|
63987
|
+
"Never invent a goal the user did not state; tag vulnclass only when the deliverable maps to a clear class.",
|
|
63988
|
+
"Extract operation constraints (set_constraint) BEFORE decomposing; a constraint is self-contained (no pronouns — replace 'this target' with the concrete host/port).",
|
|
63989
|
+
"Minimal scope: only the exact target the user named; never widen a subdomain to its root domain."
|
|
63990
|
+
];
|
|
63991
|
+
return { goal, rules, process_plan: PROCESS_PLAN };
|
|
63970
63992
|
}
|
|
63971
63993
|
function proveGoal(id, evidence, reason) {
|
|
63972
63994
|
const g = goals.find((x) => x.id === id);
|
|
@@ -65976,16 +65998,16 @@ ${statusLine}` : statusLine },
|
|
|
65976
65998
|
});
|
|
65977
65999
|
server.registerTool("constraint_set", {
|
|
65978
66000
|
title: "Set an operation constraint (red line)",
|
|
65979
|
-
description: "CONSTRAINTS: register an operation allow/deny rule — the HIGHEST-priority red line that bounds WHAT the agent may DO (beyond mere target scope). Pass mode (deny/allow), action (brute_force / scan / enumerate / upload / exploit / write / exfiltrate / dos / social_eng / credential_use / probe / active / *), an optional target glob (host/port/param, * wildcard), and a reason. DENY rules always win. Use 'active' as an umbrella for all active ops; '*' for everything. Then use constraint_check before any action
|
|
66001
|
+
description: "CONSTRAINTS: register an operation allow/deny rule — the HIGHEST-priority red line that bounds WHAT the agent may DO (beyond mere target scope). Pass mode (deny/allow), action (brute_force / scan / enumerate / upload / exploit / write / exfiltrate / dos / social_eng / credential_use / probe / active / *), an optional target glob (host/port/param, * wildcard), and a reason. DENY rules always win. Write the target SELF-CONTAINED: replace 'this target/current port' with the CONCRETE host/port — constraints are injected standalone and a pronoun means nothing out of context. Use 'active' as an umbrella for all active ops; '*' for everything. Then use constraint_check before any action.",
|
|
65980
66002
|
inputSchema: {
|
|
65981
66003
|
mode: _enum(["deny", "allow"]).describe("deny = forbid this action; allow = explicitly permit it"),
|
|
65982
66004
|
action: string2().describe("Action: brute_force/scan/enumerate/upload/exploit/write/exfiltrate/dos/social_eng/credential_use/probe/active/*"),
|
|
65983
|
-
target: string2().optional().describe("Optional host/port/param glob (* wildcard); unset = applies to every target"),
|
|
66005
|
+
target: string2().optional().describe("Optional host/port/param glob (* wildcard) — write it self-contained (concrete value, no pronoun); unset = applies to every target"),
|
|
65984
66006
|
reason: string2().describe("Why this constraint exists")
|
|
65985
66007
|
}
|
|
65986
66008
|
}, async ({ mode, action, target, reason }) => {
|
|
65987
66009
|
const rule = setConstraint({ mode, action, target, reason });
|
|
65988
|
-
return { content: [{ type: "text", text: JSON.stringify({ ...rule, hint: "DENY rules always win. Check before acting with constraint_check." }) }] };
|
|
66010
|
+
return { content: [{ type: "text", text: JSON.stringify({ ...rule, hint: "DENY rules always win. Check before acting with constraint_check. A new target outside these constraints is NOT authorization — record it as an out-of-scope fact and skip." }) }] };
|
|
65989
66011
|
});
|
|
65990
66012
|
server.registerTool("constraint_check", {
|
|
65991
66013
|
title: "Deterministically check whether an action is allowed",
|
|
@@ -66024,10 +66046,10 @@ ${statusLine}` : statusLine },
|
|
|
66024
66046
|
return { content: [{ type: "text", text: JSON.stringify({ removed: clearConstraint(id), id }) }] };
|
|
66025
66047
|
});
|
|
66026
66048
|
server.registerTool("goal_set", {
|
|
66027
|
-
title: "Register
|
|
66028
|
-
description: "GOALS: register one or more
|
|
66049
|
+
title: "Register final deliverables (goals)",
|
|
66050
|
+
description: "GOALS: register one or more FINAL DELIVERABLES — verifiable results (e.g. 'get RCE', 'read admin PII', 'take over admin'), NOT process steps (recon/scan/analysis/verify are NOT goals). Each goal carries an optional vulnclass (rce/ato/priv-esc/upload/reset/ajax-rest/...) and an optional quantitative condition. goal_status tracks which are met; COMPLETE only when all_met is true.",
|
|
66029
66051
|
inputSchema: {
|
|
66030
|
-
goals: array(object2({ text: string2(), condition: string2().optional() })).describe("
|
|
66052
|
+
goals: array(object2({ text: string2(), vulnclass: string2().optional(), condition: string2().optional() })).describe("Deliverables to register (text + optional vulnclass + optional quantitative condition)")
|
|
66031
66053
|
}
|
|
66032
66054
|
}, async ({ goals }) => {
|
|
66033
66055
|
setGoals(goals);
|
|
@@ -66053,13 +66075,14 @@ ${statusLine}` : statusLine },
|
|
|
66053
66075
|
return { content: [{ type: "text", text: JSON.stringify(goalStatus()) }] };
|
|
66054
66076
|
});
|
|
66055
66077
|
server.registerTool("decompose_goal", {
|
|
66056
|
-
title: "Decompose a high-level goal into
|
|
66057
|
-
description: "GOALS:
|
|
66078
|
+
title: "Decompose a high-level goal into one final deliverable + process plan",
|
|
66079
|
+
description: "GOALS: register a high-level goal as ONE final deliverable (optionally vulnclass-tagged) and return the decomposition RULES (goal ≠ process step; one result = one goal; never invent goals) plus the six-phase PROCESS plan (ENUMERATION→SURFACE→DISCOVERY→VERIFICATION→ESCALATION→REPORT) as a REFERENCE — the process is the HOW and is NOT registered as goals. To split a goal into MULTIPLE independent deliverables, use goal_set with each deliverable's own vulnclass.",
|
|
66058
66080
|
inputSchema: {
|
|
66059
|
-
goal: string2().describe("The high-level goal to
|
|
66081
|
+
goal: string2().describe("The high-level goal / final deliverable to register"),
|
|
66082
|
+
vulnclass: string2().optional().describe("Optional vuln class (rce/ato/priv-esc/upload/reset/ajax-rest/...)")
|
|
66060
66083
|
}
|
|
66061
|
-
}, async ({ goal }) => {
|
|
66062
|
-
const r = decomposeGoal(goal);
|
|
66084
|
+
}, async ({ goal, vulnclass }) => {
|
|
66085
|
+
const r = decomposeGoal(goal, vulnclass);
|
|
66063
66086
|
return { content: [{ type: "text", text: JSON.stringify({ ...r, ...goalStatus() }) }] };
|
|
66064
66087
|
});
|
|
66065
66088
|
server.registerTool("goal_tree", {
|
|
@@ -67199,7 +67222,7 @@ ${statusLine}` : statusLine },
|
|
|
67199
67222
|
});
|
|
67200
67223
|
server.registerTool("framework_intel", {
|
|
67201
67224
|
title: "Framework security knowledge",
|
|
67202
|
-
description: "PHASE 5: return a framework's security knowledge (sources, sinks, sanitizers, auth gates, routing, ORM, middleware) and optionally scan code with those patterns.",
|
|
67225
|
+
description: "PHASE 5: return a framework's security knowledge (sources, sinks, sanitizers, auth gates, routing, ORM, middleware, and — for WordPress — the P1-P6 vulnerability pattern taxonomy: RCE / upload / ATO / reset / priv-esc / AJAX-REST-authz, each with signals, detect, fixed, and anchor WPVDB ids) and optionally scan code with those patterns.",
|
|
67203
67226
|
inputSchema: {
|
|
67204
67227
|
framework: string2().describe("Framework id (see list_frameworks)"),
|
|
67205
67228
|
code: string2().optional().describe("Optional source code to scan with the framework's patterns")
|
|
@@ -576,6 +576,135 @@
|
|
|
576
576
|
"pattern": "plugins_loaded",
|
|
577
577
|
"label": "plugin lifecycle"
|
|
578
578
|
}
|
|
579
|
+
],
|
|
580
|
+
"patterns": [
|
|
581
|
+
{
|
|
582
|
+
"id": "P1",
|
|
583
|
+
"name": "Remote code execution",
|
|
584
|
+
"signals": [
|
|
585
|
+
"dynamic callbacks/templates",
|
|
586
|
+
"generated PHP",
|
|
587
|
+
"command/process functions",
|
|
588
|
+
"executable writes"
|
|
589
|
+
],
|
|
590
|
+
"detect": [
|
|
591
|
+
"eval",
|
|
592
|
+
"assert",
|
|
593
|
+
"variable functions",
|
|
594
|
+
"call_user_func*",
|
|
595
|
+
"shell/process APIs",
|
|
596
|
+
"include paths",
|
|
597
|
+
"generated PHP",
|
|
598
|
+
"executable writes"
|
|
599
|
+
],
|
|
600
|
+
"fixed": "closed allow-list, least-privilege gate, no request input in generated/evaluated PHP",
|
|
601
|
+
"anchors": [
|
|
602
|
+
"69f9dcd8-ab3c-46ed-ac6b-2f1db35f8d1f",
|
|
603
|
+
"df32569a-e4fe-430b-8310-df7be80d7249",
|
|
604
|
+
"9bb1a4ca-976c-461d-82de-8a3b04a56fbc"
|
|
605
|
+
]
|
|
606
|
+
},
|
|
607
|
+
{
|
|
608
|
+
"id": "P2",
|
|
609
|
+
"name": "Arbitrary file upload",
|
|
610
|
+
"signals": [
|
|
611
|
+
"$_FILES",
|
|
612
|
+
"remote import",
|
|
613
|
+
"base64 file content",
|
|
614
|
+
"move_uploaded_file",
|
|
615
|
+
"wp_handle_upload",
|
|
616
|
+
"custom directories"
|
|
617
|
+
],
|
|
618
|
+
"detect": [
|
|
619
|
+
"local filesystem upload",
|
|
620
|
+
"WordPress media upload",
|
|
621
|
+
"remote-fetch/local-copy",
|
|
622
|
+
"third-party storage (confused-deputy)"
|
|
623
|
+
],
|
|
624
|
+
"fixed": "auth/capability + nonce (CSRF only) + server-derived dest + normalized name + extension+MIME+content allow-list + executable denial",
|
|
625
|
+
"anchors": [
|
|
626
|
+
"e424157e-b79f-4000-8dcc-51413581fdec",
|
|
627
|
+
"043f449f-fc65-4218-83d2-7742e62f2af3",
|
|
628
|
+
"110db433-01ec-47ea-b74f-c3faa1757a3c"
|
|
629
|
+
]
|
|
630
|
+
},
|
|
631
|
+
{
|
|
632
|
+
"id": "P3",
|
|
633
|
+
"name": "Unauthenticated account takeover",
|
|
634
|
+
"signals": [
|
|
635
|
+
"weak SSO/payment callbacks",
|
|
636
|
+
"QR/OTP login",
|
|
637
|
+
"auto-login helpers",
|
|
638
|
+
"selected user IDs/emails",
|
|
639
|
+
"bad signatures",
|
|
640
|
+
"wp_set_auth_cookie"
|
|
641
|
+
],
|
|
642
|
+
"detect": [
|
|
643
|
+
"all paths to session establishment",
|
|
644
|
+
"identity lookup"
|
|
645
|
+
],
|
|
646
|
+
"fixed": "verify canonical provider signatures, bind state/code to one account+flow, short expiry/one-time/attempts+rate limits",
|
|
647
|
+
"anchors": [
|
|
648
|
+
"6576dcd1-aea6-47c0-9157-4ca56f426612",
|
|
649
|
+
"d9f1b40f-526a-44ed-a3ec-a3c1ce0f1ece",
|
|
650
|
+
"56fdcba6-c7b1-443d-9f9d-b738ecaadabc"
|
|
651
|
+
]
|
|
652
|
+
},
|
|
653
|
+
{
|
|
654
|
+
"id": "P4",
|
|
655
|
+
"name": "Unauthenticated password reset",
|
|
656
|
+
"signals": [
|
|
657
|
+
"public reset routes",
|
|
658
|
+
"request-selected account/key/password/email-body data"
|
|
659
|
+
],
|
|
660
|
+
"detect": [
|
|
661
|
+
"core/custom reset APIs",
|
|
662
|
+
"mail-body filters"
|
|
663
|
+
],
|
|
664
|
+
"fixed": "expiring one-time server key bound to account + core validation + trusted reset URL/body",
|
|
665
|
+
"anchors": [
|
|
666
|
+
"79fa8b91-f88e-4249-9f17-9e98e879f6fa",
|
|
667
|
+
"6c2d4489-de82-472d-a5f7-dc01b305fdd0"
|
|
668
|
+
]
|
|
669
|
+
},
|
|
670
|
+
{
|
|
671
|
+
"id": "P5",
|
|
672
|
+
"name": "Privilege escalation",
|
|
673
|
+
"signals": [
|
|
674
|
+
"client-controlled role/capabilities/custom meta/options",
|
|
675
|
+
"user insertion/update",
|
|
676
|
+
"restore auto-login"
|
|
677
|
+
],
|
|
678
|
+
"detect": [
|
|
679
|
+
"requests into user/role/cap/meta/option/import/restore mutations"
|
|
680
|
+
],
|
|
681
|
+
"fixed": "server-side field allow-list, discard public role/capability metadata, operation-specific capability, prohibit arbitrary option names",
|
|
682
|
+
"anchors": [
|
|
683
|
+
"04d64797-751a-4cdd-a37d-70afbad5d784",
|
|
684
|
+
"929f243b-2f1c-4eca-88bc-03b1a86270ed",
|
|
685
|
+
"be3d5432-8f8c-4d45-b6e7-de24352378a8"
|
|
686
|
+
]
|
|
687
|
+
},
|
|
688
|
+
{
|
|
689
|
+
"id": "P6",
|
|
690
|
+
"name": "AJAX/REST authorization failure",
|
|
691
|
+
"signals": [
|
|
692
|
+
"wp_ajax_nopriv_*",
|
|
693
|
+
"both auth states",
|
|
694
|
+
"public REST permissions",
|
|
695
|
+
"public/shared nonce",
|
|
696
|
+
"role check without ownership"
|
|
697
|
+
],
|
|
698
|
+
"detect": [
|
|
699
|
+
"every AJAX/REST/admin-post registration -> callback, permissions, request-selected IDs, sink"
|
|
700
|
+
],
|
|
701
|
+
"fixed": "nonce (CSRF) + authentication (identity) + current_user_can (authority) + object policy (ownership)",
|
|
702
|
+
"anchors": [
|
|
703
|
+
"030939ee-9aa9-4082-934e-c9a07fc3dfc3",
|
|
704
|
+
"c81aa489-0663-40b7-b2ce-f4c8f2edd4b6",
|
|
705
|
+
"e31c9bf0-7340-4bd7-ad6e-6ad01737654a"
|
|
706
|
+
]
|
|
707
|
+
}
|
|
579
708
|
]
|
|
580
709
|
},
|
|
581
710
|
{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blitzstrike",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.180",
|
|
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": {
|