blitzstrike 1.0.70 → 1.0.72
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 +25 -0
- package/bench/corpus/js-ssti-vuln.md +8 -0
- package/bench/corpus/php-ldap-vuln.md +9 -0
- package/bench/corpus/php-xpath-vuln.md +9 -0
- package/bench/corpus/py-ssti-vuln.md +8 -0
- package/bench/corpus/py-xss-escape.md +1 -1
- package/bench/corpus/py-xxe-vuln.md +8 -0
- package/bench/corpus/py-zipslip-vuln.md +8 -0
- package/dist/index.js +67 -21
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,31 @@ 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.0.72] — 2026-09-13
|
|
9
|
+
|
|
10
|
+
### Changed — coordinated agent guidance
|
|
11
|
+
|
|
12
|
+
- Added `next_steps` directives for the three new sink classes (SSTI, XPath,
|
|
13
|
+
LDAP injection) so a driving LLM is told exactly how to validate each one
|
|
14
|
+
after detection — not just "go verify it".
|
|
15
|
+
- Updated the static MCP `instructions`: now directs the agent to `route_scan`
|
|
16
|
+
and `complex_scan` for the deep/complex classes, and corrects the stale
|
|
17
|
+
skill count (85 → 38).
|
|
18
|
+
|
|
19
|
+
## [1.0.71] — 2026-09-13
|
|
20
|
+
|
|
21
|
+
### Added — expanded sink-class coverage
|
|
22
|
+
|
|
23
|
+
- **Filled two empty sink classes** across all four languages:
|
|
24
|
+
- `xml_processing` (XXE) — PHP `simplexml_load_string/file`, JS `DOMParser`,
|
|
25
|
+
Python `etree.parse`/`minidom.parse`/`xml.sax`, Java XML parsers.
|
|
26
|
+
- `archive_extraction` (zip slip) — PHP `->extractTo`, JS `extractAllTo`,
|
|
27
|
+
Python `extractall`/`shutil.unpack_archive`, Java `ZipInputStream`.
|
|
28
|
+
- **Three new sink classes** (SSTI, XPath, LDAP injection) across PHP / JS /
|
|
29
|
+
Python / Java adapters + the PHP depth layer.
|
|
30
|
+
- Fixed a coverage-matrix desync (Python `http_request` was marked false).
|
|
31
|
+
- Corpus grew 103 → 109 fixtures (tp=77, tn=32, fp=0, fn=0).
|
|
32
|
+
|
|
8
33
|
## [1.0.70] — 2026-09-13
|
|
9
34
|
|
|
10
35
|
### Fixed — polish from live LLM-driven verification
|
package/dist/index.js
CHANGED
|
@@ -31711,7 +31711,10 @@ var SINK_CLASS_MAP = [
|
|
|
31711
31711
|
[/\bheader\(|\bwp_redirect\(/, { id: "redirect", category: "Redirect handling", cwe: "CWE-601" }],
|
|
31712
31712
|
[/echo\s|print\s|\bprintf\(/, { id: "html_render", category: "HTML rendering (XSS)", cwe: "CWE-79" }],
|
|
31713
31713
|
[/\bsimplexml_load_string\(|new SimpleXMLElement|DOMDocument/, { id: "xml_processing", category: "XML processing (XXE)", cwe: "CWE-611" }],
|
|
31714
|
-
[/\bZipArchive|\bPharData|->extractTo\(/, { id: "archive_extraction", category: "Archive extraction (zip slip)", cwe: "CWE-22" }]
|
|
31714
|
+
[/\bZipArchive|\bPharData|->extractTo\(/, { id: "archive_extraction", category: "Archive extraction (zip slip)", cwe: "CWE-22" }],
|
|
31715
|
+
[/\bcreateTemplate\(/, { id: "template_injection", category: "Template injection (SSTI)", cwe: "CWE-1336" }],
|
|
31716
|
+
[/->xpath\(|DOMXPath/, { id: "xpath_injection", category: "XPath injection", cwe: "CWE-643" }],
|
|
31717
|
+
[/\bldap_search\(|\bldap_list\(|\bldap_read\(/, { id: "ldap_injection", category: "LDAP injection", cwe: "CWE-90" }]
|
|
31715
31718
|
];
|
|
31716
31719
|
function classifySink2(sink) {
|
|
31717
31720
|
for (const [re, cls] of SINK_CLASS_MAP) {
|
|
@@ -51053,7 +51056,15 @@ var PHP_SINKS = [
|
|
|
51053
51056
|
["file_put_contents", "file_operations", "CWE-434"],
|
|
51054
51057
|
["include", "file_inclusion", "CWE-98"],
|
|
51055
51058
|
["require", "file_inclusion", "CWE-98"],
|
|
51056
|
-
["file_get_contents", "http_request", "CWE-918"]
|
|
51059
|
+
["file_get_contents", "http_request", "CWE-918"],
|
|
51060
|
+
["simplexml_load_string", "xml_processing", "CWE-611"],
|
|
51061
|
+
["simplexml_load_file", "xml_processing", "CWE-611"],
|
|
51062
|
+
["extractTo", "archive_extraction", "CWE-22"],
|
|
51063
|
+
["createTemplate", "template_injection", "CWE-1336"],
|
|
51064
|
+
["xpath", "xpath_injection", "CWE-643"],
|
|
51065
|
+
["ldap_search", "ldap_injection", "CWE-90"],
|
|
51066
|
+
["ldap_list", "ldap_injection", "CWE-90"],
|
|
51067
|
+
["ldap_read", "ldap_injection", "CWE-90"]
|
|
51057
51068
|
];
|
|
51058
51069
|
var PHP_SANITIZERS = [
|
|
51059
51070
|
["htmlspecialchars", ["html_render"]],
|
|
@@ -51186,7 +51197,14 @@ var JS_SINKS = [
|
|
|
51186
51197
|
[/http\.get|https\.get|axios/i, "http_request", "CWE-918"],
|
|
51187
51198
|
[/http\.request|https\.request/i, "http_request", "CWE-918"],
|
|
51188
51199
|
[/redirect\s*\(/i, "redirect", "CWE-601"],
|
|
51189
|
-
[/res\.redirect/i, "redirect", "CWE-601"]
|
|
51200
|
+
[/res\.redirect/i, "redirect", "CWE-601"],
|
|
51201
|
+
[/new\s+DOMParser/i, "xml_processing", "CWE-611"],
|
|
51202
|
+
[/DOMParser/i, "xml_processing", "CWE-611"],
|
|
51203
|
+
[/extractAllTo\s*\(/i, "archive_extraction", "CWE-22"],
|
|
51204
|
+
[/extractTo\s*\(/i, "archive_extraction", "CWE-22"],
|
|
51205
|
+
[/ejs\.render|ejs\.compile|pug\.compile|handlebars\.compile|nunjucks\.render|_\s*\.template/i, "template_injection", "CWE-1336"],
|
|
51206
|
+
[/xpath\.evaluate|document\.evaluate/i, "xpath_injection", "CWE-643"],
|
|
51207
|
+
[/ldap\.search|ldapjs|client\.search/i, "ldap_injection", "CWE-90"]
|
|
51190
51208
|
];
|
|
51191
51209
|
var JS_SANITIZERS = [
|
|
51192
51210
|
[/escapeHtml/i, ["html_render"]],
|
|
@@ -51330,7 +51348,13 @@ var PY_SINKS = [
|
|
|
51330
51348
|
[/pickle\.loads\s*\(/i, "deserialization", "CWE-502"],
|
|
51331
51349
|
[/yaml\.load\s*\(/i, "deserialization", "CWE-502"],
|
|
51332
51350
|
[/os\.popen\s*\(/i, "command_execution", "CWE-78"],
|
|
51333
|
-
[/os\.exec/i, "command_execution", "CWE-78"]
|
|
51351
|
+
[/os\.exec/i, "command_execution", "CWE-78"],
|
|
51352
|
+
[/xml\.etree\.ElementTree\.parse|etree\.parse|lxml\.etree\.parse|minidom\.parse|xml\.sax|fromstring/i, "xml_processing", "CWE-611"],
|
|
51353
|
+
[/\.extractall\s*\(/i, "archive_extraction", "CWE-22"],
|
|
51354
|
+
[/shutil\.unpack_archive/i, "archive_extraction", "CWE-22"],
|
|
51355
|
+
[/render_template_string|jinja2\.Template|env\.from_string/i, "template_injection", "CWE-1336"],
|
|
51356
|
+
[/\.xpath\s*\(|etree\.XPath|lxml\.etree\.XPath/i, "xpath_injection", "CWE-643"],
|
|
51357
|
+
[/ldap\.search|\.search_s\s*\(/i, "ldap_injection", "CWE-90"]
|
|
51334
51358
|
];
|
|
51335
51359
|
var PY_SANITIZERS = [
|
|
51336
51360
|
[/escape\s*\(/i, ["html_render"]],
|
|
@@ -51459,7 +51483,11 @@ var JAVA_SINKS = [
|
|
|
51459
51483
|
[/DocumentBuilder|SAXParser|XMLReader/i, "xml_processing", "CWE-611"],
|
|
51460
51484
|
[/\.parse\s*\(/i, "xml_processing", "CWE-611"],
|
|
51461
51485
|
[/sendRedirect\s*\(/i, "redirect", "CWE-601"],
|
|
51462
|
-
[/\.forward\s*\(/i, "redirect", "CWE-601"]
|
|
51486
|
+
[/\.forward\s*\(/i, "redirect", "CWE-601"],
|
|
51487
|
+
[/ZipInputStream|ZipFile|getNextEntry|ZipEntry/i, "archive_extraction", "CWE-22"],
|
|
51488
|
+
[/Velocity\.evaluate|Freemarker|Template\.process|\.process\s*\(/i, "template_injection", "CWE-1336"],
|
|
51489
|
+
[/XPath\.evaluate|XPath\.compile|XPathExpression|XPathFactory/i, "xpath_injection", "CWE-643"],
|
|
51490
|
+
[/DirContext\.search|LdapTemplate\.search|InitialDirContext/i, "ldap_injection", "CWE-90"]
|
|
51463
51491
|
];
|
|
51464
51492
|
var JAVA_SANITIZERS = [
|
|
51465
51493
|
[/HtmlUtils\.htmlEscape/i, ["html_render"]],
|
|
@@ -52455,7 +52483,10 @@ var SINK_DIRECTIVES = {
|
|
|
52455
52483
|
html_render: "Validate the XSS with strike_verify (reflected marker script vs inert control). Check WAF first with detect_waf — many XSS are filtered at the edge.",
|
|
52456
52484
|
xml_processing: "Validate XXE with strike_verify (external entity marker vs control). Read payload_lookup for xxe payloads.",
|
|
52457
52485
|
archive_extraction: "Validate the archive/path issue (zip-slip / path traversal) with strike_verify. Confirm the extraction path is attacker-controlled.",
|
|
52458
|
-
path_traversal: "Validate path traversal with strike_verify (marker file read vs control). Read payload_lookup for path-traversal payloads."
|
|
52486
|
+
path_traversal: "Validate path traversal with strike_verify (marker file read vs control). Read payload_lookup for path-traversal payloads.",
|
|
52487
|
+
template_injection: "SSTI needs a template-expression probe (e.g. {{7*7}} / ${7*7} / <%= 7*7 %>) — the marker is the evaluated arithmetic, the control is a benign literal. Confirm the template engine actually renders user input before reporting.",
|
|
52488
|
+
xpath_injection: "Validate XPath injection with strike_verify (an XPath boolean/union probe vs a control that stays inert). Confirm the XPath expression is built from attacker-controlled input.",
|
|
52489
|
+
ldap_injection: "Validate LDAP injection with strike_verify (an LDAP filter-wildcard/OR probe vs a control). Confirm the filter is concatenated from attacker-controlled input."
|
|
52459
52490
|
};
|
|
52460
52491
|
function nextSteps(ctx) {
|
|
52461
52492
|
const steps = [];
|
|
@@ -53131,7 +53162,10 @@ var SINK_CLASSES = [
|
|
|
53131
53162
|
"html_render",
|
|
53132
53163
|
"xml_processing",
|
|
53133
53164
|
"archive_extraction",
|
|
53134
|
-
"path_traversal"
|
|
53165
|
+
"path_traversal",
|
|
53166
|
+
"template_injection",
|
|
53167
|
+
"xpath_injection",
|
|
53168
|
+
"ldap_injection"
|
|
53135
53169
|
];
|
|
53136
53170
|
var PHP_SINKS2 = {
|
|
53137
53171
|
sql_execution: true,
|
|
@@ -53143,9 +53177,12 @@ var PHP_SINKS2 = {
|
|
|
53143
53177
|
http_request: true,
|
|
53144
53178
|
redirect: true,
|
|
53145
53179
|
html_render: true,
|
|
53146
|
-
xml_processing:
|
|
53147
|
-
archive_extraction:
|
|
53148
|
-
path_traversal: true
|
|
53180
|
+
xml_processing: true,
|
|
53181
|
+
archive_extraction: true,
|
|
53182
|
+
path_traversal: true,
|
|
53183
|
+
template_injection: true,
|
|
53184
|
+
xpath_injection: true,
|
|
53185
|
+
ldap_injection: true
|
|
53149
53186
|
};
|
|
53150
53187
|
var JS_SINKS2 = {
|
|
53151
53188
|
sql_execution: true,
|
|
@@ -53157,9 +53194,12 @@ var JS_SINKS2 = {
|
|
|
53157
53194
|
http_request: true,
|
|
53158
53195
|
redirect: true,
|
|
53159
53196
|
html_render: true,
|
|
53160
|
-
xml_processing:
|
|
53161
|
-
archive_extraction:
|
|
53162
|
-
path_traversal: true
|
|
53197
|
+
xml_processing: true,
|
|
53198
|
+
archive_extraction: true,
|
|
53199
|
+
path_traversal: true,
|
|
53200
|
+
template_injection: true,
|
|
53201
|
+
xpath_injection: true,
|
|
53202
|
+
ldap_injection: true
|
|
53163
53203
|
};
|
|
53164
53204
|
var PY_SINKS2 = {
|
|
53165
53205
|
sql_execution: true,
|
|
@@ -53168,12 +53208,15 @@ var PY_SINKS2 = {
|
|
|
53168
53208
|
file_operations: true,
|
|
53169
53209
|
file_inclusion: false,
|
|
53170
53210
|
deserialization: true,
|
|
53171
|
-
http_request:
|
|
53211
|
+
http_request: true,
|
|
53172
53212
|
redirect: true,
|
|
53173
53213
|
html_render: true,
|
|
53174
|
-
xml_processing:
|
|
53175
|
-
archive_extraction:
|
|
53176
|
-
path_traversal: true
|
|
53214
|
+
xml_processing: true,
|
|
53215
|
+
archive_extraction: true,
|
|
53216
|
+
path_traversal: true,
|
|
53217
|
+
template_injection: true,
|
|
53218
|
+
xpath_injection: true,
|
|
53219
|
+
ldap_injection: true
|
|
53177
53220
|
};
|
|
53178
53221
|
var JAVA_SINKS2 = {
|
|
53179
53222
|
sql_execution: true,
|
|
@@ -53185,9 +53228,12 @@ var JAVA_SINKS2 = {
|
|
|
53185
53228
|
http_request: true,
|
|
53186
53229
|
redirect: true,
|
|
53187
53230
|
html_render: true,
|
|
53188
|
-
xml_processing:
|
|
53189
|
-
archive_extraction:
|
|
53190
|
-
path_traversal: true
|
|
53231
|
+
xml_processing: true,
|
|
53232
|
+
archive_extraction: true,
|
|
53233
|
+
path_traversal: true,
|
|
53234
|
+
template_injection: true,
|
|
53235
|
+
xpath_injection: true,
|
|
53236
|
+
ldap_injection: true
|
|
53191
53237
|
};
|
|
53192
53238
|
var SINK_BY_LANG = {
|
|
53193
53239
|
php: PHP_SINKS2,
|
|
@@ -53244,7 +53290,7 @@ function createServer() {
|
|
|
53244
53290
|
name: "blitzstrike",
|
|
53245
53291
|
version: "1.0.0"
|
|
53246
53292
|
}, {
|
|
53247
|
-
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" + "1. SCOPE FIRST. Call scope_check(target, scope, mode) before ANY active testing. " + " Passive analysis (reading source, fingerprinting public pages) needs no gate; " + " active probing (exploitation, fuzzing, path brute-force) is blocked until scope " + " authorizes it.\\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 gated alternative. Both re-check 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).\\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 -> " + " autonomous live marker sweep + confirmed findings + report. Prefer this first.\\n" + "- list_languages / taint_file: multi-language taint (PHP, JS/TS, Python, Java).\\n" + "- list_chains: 57 escalation chains (source -> sink -> impact).\\n" + "- tool_lookup / ensure_tool / list_tools: 130-tool catalog, auto-install.\\n" + "- skill_lookup / read_skill / list_skills:
|
|
53293
|
+
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" + "1. SCOPE FIRST. Call scope_check(target, scope, mode) before ANY active testing. " + " Passive analysis (reading source, fingerprinting public pages) needs no gate; " + " active probing (exploitation, fuzzing, path brute-force) is blocked until scope " + " authorizes it.\\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 gated alternative. Both re-check 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) 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 -> " + " autonomous live marker sweep + confirmed findings + report. Prefer this first.\\n" + "- list_languages / taint_file: multi-language taint (PHP, JS/TS, Python, Java).\\n" + "- list_chains: 57 escalation chains (source -> sink -> impact).\\n" + "- tool_lookup / ensure_tool / list_tools: 130-tool catalog, auto-install.\\n" + "- skill_lookup / read_skill / list_skills: 38 skills (WP/PHP 0-day, AD, " + " malware, mobile, cloud, etc.).\\n" + "- read_playbook / read_tool_manual / list_manuals: 270 tool manuals + engagement " + " playbooks.\\n" + "- detect_waf / tech_correlation / cve_correlation / port_correlation: signature " + " + correlation intelligence.\\n" + "- nvd_lookup / fofa_search: CVE + asset reconnaissance (FOFA needs env creds).\\n" + "- remember / memory_lookup / memory_list: persist + recall verified knowledge.\\n\\n" + "IRON RULES:\\n" + "- Scope first; authorized targets only. Refuse out-of-scope or destructive/DoS work.\\n" + "- A hit is a hypothesis; a verified exploit (or proven data-flow) is the finding.\\n" + "- Prefer the one-call run_engagement path; fall back to granular tools when you " + " need finer control."
|
|
53248
53294
|
});
|
|
53249
53295
|
server.registerTool("blitz_scan", {
|
|
53250
53296
|
title: "BLITZ scan",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blitzstrike",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.72",
|
|
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": {
|