blitzstrike 2.4.101 → 2.4.103
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 +26 -0
- package/dist/index.js +192 -3
- package/intelligence/watchlist.json +54 -18
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,32 @@ 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.103] — 2026-09-17
|
|
9
|
+
|
|
10
|
+
### Added — version-precise fingerprint-first (semver narrowing)
|
|
11
|
+
|
|
12
|
+
- `watchlistCveMatches` / `live_recon` now narrow the suggested CVEs by the
|
|
13
|
+
detected VERSION, not just the product. Each version-aware CVE carries a
|
|
14
|
+
`fixed_in` (semver boundary) + `version_key`; a detected version >= `fixed_in`
|
|
15
|
+
is excluded as patched, so `live_recon` names the EXACT CVE for the running
|
|
16
|
+
version instead of the whole product family. Verified: Next.js 14.2.5 →
|
|
17
|
+
CVE-2025-29927 (affected) but not CVE-2024-34351 (patched 14.1.1); Next.js
|
|
18
|
+
15.3.0 → both excluded; unknown version → full product list (fallback).
|
|
19
|
+
|
|
20
|
+
## [2.4.102] — 2026-09-17
|
|
21
|
+
|
|
22
|
+
### Added — `broken_link_scan` (broken-link hijacking live detector)
|
|
23
|
+
|
|
24
|
+
- New `broken_link_scan(url)` tool: crawls the target's outbound references
|
|
25
|
+
(script/link/img/src + inline JS URLs), then checks each referenced hostname's
|
|
26
|
+
DNS + RDAP registration status. Unregistered (RDAP 404) or in-drop-cycle
|
|
27
|
+
(pendingDelete/redemptionPeriod) domains are flagged CLAIMABLE — register the
|
|
28
|
+
expired domain and inherit the trust of every page that still loads it.
|
|
29
|
+
Verdict is derived live from DNS + RDAP, never a static list. Distinct from
|
|
30
|
+
`subdomain_takeover` (dangling CNAME); this is a fully-expired registrable
|
|
31
|
+
domain. Verified live: example.com → registered (not claimable), a
|
|
32
|
+
nonexistent domain → RDAP 404 → claimable.
|
|
33
|
+
|
|
8
34
|
## [2.4.101] — 2026-09-17
|
|
9
35
|
|
|
10
36
|
### Added — three new hunting classes (techniques + attack vectors)
|
package/dist/index.js
CHANGED
|
@@ -36189,18 +36189,41 @@ function watchlist() {
|
|
|
36189
36189
|
const recommendation = `Prioritize the ${unsaturated.length} non-saturated classes (top: ${unsaturated.slice(0, 3).map((e) => e.cwe).join(", ")}) — high frequency + high payout + not yet saturated. Skip saturated/low-value classes (XSS/CSRF/open-redirect standalone) unless they chain into account takeover. FINGERPRINT FIRST: if the target stack matches a watchlist product (Next.js, Kibana, Langflow, Confluence/Jira, PAN-OS, Grafana), test that specific CVE — top EPSS/report CVEs: ${topCve}.`;
|
|
36190
36190
|
return { cwe_frequency: entries, cve_watchlist, recommendation };
|
|
36191
36191
|
}
|
|
36192
|
-
function
|
|
36192
|
+
function semverLt(a, b) {
|
|
36193
|
+
const pa = a.replace(/^v/, "").split(/[-+.]/).map((x) => parseInt(x, 10) || 0);
|
|
36194
|
+
const pb = b.replace(/^v/, "").split(/[-+.]/).map((x) => parseInt(x, 10) || 0);
|
|
36195
|
+
for (let i = 0;i < Math.max(pa.length, pb.length); i++) {
|
|
36196
|
+
const x = pa[i] ?? 0;
|
|
36197
|
+
const y = pb[i] ?? 0;
|
|
36198
|
+
if (x !== y)
|
|
36199
|
+
return x < y;
|
|
36200
|
+
}
|
|
36201
|
+
return false;
|
|
36202
|
+
}
|
|
36203
|
+
function watchlistCveMatches(techs, headers = {}, body = "", versions = []) {
|
|
36193
36204
|
const { cve_watchlist } = loadWatchlist();
|
|
36194
36205
|
const haystack = `${techs.join(" ")} ${Object.keys(headers).join(" ")} ${Object.values(headers).join(" ")} ${body}`.toLowerCase();
|
|
36195
36206
|
return cve_watchlist.filter((c) => {
|
|
36196
36207
|
const m = c.match;
|
|
36197
36208
|
if (!m)
|
|
36198
36209
|
return false;
|
|
36210
|
+
let matched = false;
|
|
36199
36211
|
try {
|
|
36200
|
-
|
|
36212
|
+
matched = new RegExp(m, "i").test(haystack);
|
|
36201
36213
|
} catch {
|
|
36214
|
+
matched = false;
|
|
36215
|
+
}
|
|
36216
|
+
if (!matched)
|
|
36202
36217
|
return false;
|
|
36218
|
+
const fixedIn = c.fixed_in;
|
|
36219
|
+
const vkey = c.version_key;
|
|
36220
|
+
if (fixedIn && vkey) {
|
|
36221
|
+
const v = versions.find((x) => x.product.toLowerCase().includes(vkey.toLowerCase()));
|
|
36222
|
+
if (v?.version && !semverLt(v.version, fixedIn)) {
|
|
36223
|
+
return false;
|
|
36224
|
+
}
|
|
36203
36225
|
}
|
|
36226
|
+
return true;
|
|
36204
36227
|
});
|
|
36205
36228
|
}
|
|
36206
36229
|
|
|
@@ -36638,7 +36661,7 @@ async function liveRecon(target, includeActive = false) {
|
|
|
36638
36661
|
const waf = detectWaf(root.headers, root.body);
|
|
36639
36662
|
const techs = detectTech(root.headers, root.body);
|
|
36640
36663
|
const versions = extractVersion(root.headers, root.body);
|
|
36641
|
-
const suggestedCves = watchlistCveMatches(techs, root.headers, root.body);
|
|
36664
|
+
const suggestedCves = watchlistCveMatches(techs, root.headers, root.body, versions);
|
|
36642
36665
|
const { links, scripts } = crawlLinks(base, root.body);
|
|
36643
36666
|
const { robots, sitemap } = await fetchRobotsAndSitemap(base);
|
|
36644
36667
|
const allUrls = [...links, ...scripts, ...robots, ...sitemap];
|
|
@@ -59295,6 +59318,163 @@ function dataRefresh() {
|
|
|
59295
59318
|
init_verify_harness();
|
|
59296
59319
|
init_variants();
|
|
59297
59320
|
|
|
59321
|
+
// src/broken-link.ts
|
|
59322
|
+
import { resolve4 as resolve43 } from "node:dns/promises";
|
|
59323
|
+
function hostFromUrl(u) {
|
|
59324
|
+
try {
|
|
59325
|
+
const h = new URL(u.startsWith("//") ? `https:${u}` : u).hostname.toLowerCase();
|
|
59326
|
+
return h || null;
|
|
59327
|
+
} catch {
|
|
59328
|
+
return null;
|
|
59329
|
+
}
|
|
59330
|
+
}
|
|
59331
|
+
var ALWAYS_ALIVE = new Set([
|
|
59332
|
+
"googleapis.com",
|
|
59333
|
+
"gstatic.com",
|
|
59334
|
+
"google.com",
|
|
59335
|
+
"googletagmanager.com",
|
|
59336
|
+
"google-analytics.com",
|
|
59337
|
+
"cloudflare.com",
|
|
59338
|
+
"cloudflareinsights.com",
|
|
59339
|
+
"jsdelivr.net",
|
|
59340
|
+
"unpkg.com",
|
|
59341
|
+
"cdnjs.cloudflare.com",
|
|
59342
|
+
"bootstrapcdn.com",
|
|
59343
|
+
"jquery.com",
|
|
59344
|
+
"fontawesome.com",
|
|
59345
|
+
"stackpathcdn.com",
|
|
59346
|
+
"w3.org",
|
|
59347
|
+
"schema.org",
|
|
59348
|
+
"github.com",
|
|
59349
|
+
"github.io",
|
|
59350
|
+
"npmjs.com",
|
|
59351
|
+
"nodejs.org",
|
|
59352
|
+
"microsoft.com",
|
|
59353
|
+
"azureedge.net",
|
|
59354
|
+
"azure.com",
|
|
59355
|
+
"akamai.net",
|
|
59356
|
+
"akamaized.net",
|
|
59357
|
+
"amazonaws.com",
|
|
59358
|
+
"amazon.com",
|
|
59359
|
+
"cloudfront.net",
|
|
59360
|
+
"youtube.com",
|
|
59361
|
+
"youtu.be",
|
|
59362
|
+
"instagram.com",
|
|
59363
|
+
"facebook.com",
|
|
59364
|
+
"fbcdn.net",
|
|
59365
|
+
"twitter.com",
|
|
59366
|
+
"x.com",
|
|
59367
|
+
"tiktok.com",
|
|
59368
|
+
"pinterest.com",
|
|
59369
|
+
"linkedin.com",
|
|
59370
|
+
"apple.com",
|
|
59371
|
+
"mozilla.org",
|
|
59372
|
+
"gravatar.com",
|
|
59373
|
+
"twimg.com",
|
|
59374
|
+
"g.co",
|
|
59375
|
+
"goo.gl",
|
|
59376
|
+
"bit.ly",
|
|
59377
|
+
"tinyurl.com",
|
|
59378
|
+
"paypal.com",
|
|
59379
|
+
"stripe.com",
|
|
59380
|
+
"shopify.com",
|
|
59381
|
+
"wordpress.org",
|
|
59382
|
+
"wp.com"
|
|
59383
|
+
]);
|
|
59384
|
+
function extractOutboundHosts(html, baseHost) {
|
|
59385
|
+
const hosts = new Set;
|
|
59386
|
+
for (const m of html.matchAll(/(?:src|href)\s*=\s*["']([^"']+)["']/gi)) {
|
|
59387
|
+
const h = hostFromUrl(m[1]);
|
|
59388
|
+
if (h)
|
|
59389
|
+
hosts.add(h);
|
|
59390
|
+
}
|
|
59391
|
+
for (const m of html.matchAll(/https?:\/\/([a-z0-9.-]+)/gi)) {
|
|
59392
|
+
hosts.add(m[1].toLowerCase());
|
|
59393
|
+
}
|
|
59394
|
+
const base = baseHost.toLowerCase().replace(/^www\./, "");
|
|
59395
|
+
const out = [...hosts].filter((h) => {
|
|
59396
|
+
const lh = h.toLowerCase().replace(/^www\./, "");
|
|
59397
|
+
if (lh === base || lh.endsWith(`.${base}`))
|
|
59398
|
+
return false;
|
|
59399
|
+
if (ALWAYS_ALIVE.has(lh))
|
|
59400
|
+
return false;
|
|
59401
|
+
for (const s of ALWAYS_ALIVE)
|
|
59402
|
+
if (lh.endsWith(`.${s}`))
|
|
59403
|
+
return false;
|
|
59404
|
+
return true;
|
|
59405
|
+
});
|
|
59406
|
+
return [...new Set(out)].sort();
|
|
59407
|
+
}
|
|
59408
|
+
async function checkDomainStatus(domain) {
|
|
59409
|
+
let resolved = true;
|
|
59410
|
+
try {
|
|
59411
|
+
await resolve43(domain);
|
|
59412
|
+
} catch {
|
|
59413
|
+
resolved = false;
|
|
59414
|
+
}
|
|
59415
|
+
try {
|
|
59416
|
+
const res = await fetch(`https://rdap.org/domain/${domain}`, {
|
|
59417
|
+
signal: AbortSignal.timeout(7000),
|
|
59418
|
+
headers: { accept: "application/json" }
|
|
59419
|
+
});
|
|
59420
|
+
if (res.status === 404) {
|
|
59421
|
+
return { status: "unregistered", claimable: true, evidence: "RDAP 404 — domain not registered, registrable now" };
|
|
59422
|
+
}
|
|
59423
|
+
const data = await res.json();
|
|
59424
|
+
const statuses = data.status ?? [];
|
|
59425
|
+
if (statuses.includes("pendingDelete") || statuses.includes("redemptionPeriod")) {
|
|
59426
|
+
return { status: statuses.join(","), claimable: true, evidence: `RDAP ${statuses.join(",")} — in the drop cycle, registrable soon` };
|
|
59427
|
+
}
|
|
59428
|
+
if (statuses.length > 0) {
|
|
59429
|
+
return { status: statuses.join(","), claimable: false, evidence: `RDAP ${statuses.join(",")} — still registered${resolved ? "" : " (held, no DNS)"}` };
|
|
59430
|
+
}
|
|
59431
|
+
return { status: resolved ? "resolved" : "nxdomain", claimable: false, evidence: "RDAP returned no status (inconclusive)" };
|
|
59432
|
+
} catch {
|
|
59433
|
+
return { status: resolved ? "resolved" : "nxdomain", claimable: false, evidence: resolved ? "RDAP lookup failed — cannot confirm registration status" : "NXDOMAIN + RDAP lookup failed (inconclusive)" };
|
|
59434
|
+
}
|
|
59435
|
+
}
|
|
59436
|
+
async function brokenLinkScan(url, maxHosts = 30) {
|
|
59437
|
+
const base = url.startsWith("http") ? url : `https://${url}`;
|
|
59438
|
+
const baseHost = (() => {
|
|
59439
|
+
try {
|
|
59440
|
+
return new URL(base).hostname;
|
|
59441
|
+
} catch {
|
|
59442
|
+
return url;
|
|
59443
|
+
}
|
|
59444
|
+
})();
|
|
59445
|
+
let html = "";
|
|
59446
|
+
try {
|
|
59447
|
+
const res = await fetch(base, { signal: AbortSignal.timeout(15000), redirect: "follow", headers: researchHeaders() });
|
|
59448
|
+
html = (await res.text()).slice(0, 1e6);
|
|
59449
|
+
} catch {
|
|
59450
|
+
return { target: base, base_host: baseHost, outbound_hosts: 0, checked: 0, claimable: [], inconclusive: [] };
|
|
59451
|
+
}
|
|
59452
|
+
const hosts = extractOutboundHosts(html, baseHost).slice(0, maxHosts);
|
|
59453
|
+
const claimable = [];
|
|
59454
|
+
const inconclusive = [];
|
|
59455
|
+
for (let i = 0;i < hosts.length; i += 5) {
|
|
59456
|
+
const batch = hosts.slice(i, i + 5);
|
|
59457
|
+
const results = await Promise.all(batch.map(async (h) => {
|
|
59458
|
+
const r = await checkDomainStatus(h);
|
|
59459
|
+
return { domain: h, ...r };
|
|
59460
|
+
}));
|
|
59461
|
+
for (const r of results) {
|
|
59462
|
+
if (r.claimable)
|
|
59463
|
+
claimable.push({ domain: r.domain, status: r.status, claimable: true, evidence: r.evidence, source: "outbound-reference" });
|
|
59464
|
+
else if (r.status === "nxdomain")
|
|
59465
|
+
inconclusive.push(r.domain);
|
|
59466
|
+
}
|
|
59467
|
+
}
|
|
59468
|
+
return {
|
|
59469
|
+
target: base,
|
|
59470
|
+
base_host: baseHost,
|
|
59471
|
+
outbound_hosts: hosts.length,
|
|
59472
|
+
checked: hosts.length,
|
|
59473
|
+
claimable,
|
|
59474
|
+
inconclusive
|
|
59475
|
+
};
|
|
59476
|
+
}
|
|
59477
|
+
|
|
59298
59478
|
// src/benchmark.ts
|
|
59299
59479
|
import { readFileSync as readFileSync22, readdirSync as readdirSync5, writeFileSync as writeFileSync6, rmSync as rmSync3, mkdirSync as mkdirSync7 } from "node:fs";
|
|
59300
59480
|
import { join as join22 } from "node:path";
|
|
@@ -62890,6 +63070,15 @@ ${statusLine}` : statusLine },
|
|
|
62890
63070
|
}, async () => {
|
|
62891
63071
|
return { content: [{ type: "text", text: JSON.stringify(watchlist()) }] };
|
|
62892
63072
|
});
|
|
63073
|
+
server.registerTool("broken_link_scan", {
|
|
63074
|
+
title: "Broken-link hijacking / expired-domain takeover (live detector)",
|
|
63075
|
+
description: "Detect expired-domain takeover (broken-link hijacking): crawl the target's outbound references (script/link/img/src + inline JS URLs), then check each referenced hostname's DNS + RDAP registration status. A domain that is unregistered (RDAP 404) or in the drop cycle (pendingDelete/redemptionPeriod) is CLAIMABLE — register it and inherit the trust of every page that still loads it. Distinct from subdomain_takeover (a dangling CNAME); this is a fully-expired registrable domain. Verdict is derived live from DNS + RDAP, never a static list.",
|
|
63076
|
+
inputSchema: {
|
|
63077
|
+
url: string2().describe("Target URL (https://target.com) — crawls outbound references")
|
|
63078
|
+
}
|
|
63079
|
+
}, async ({ url }) => {
|
|
63080
|
+
return { content: [{ type: "text", text: JSON.stringify(await brokenLinkScan(url)) }] };
|
|
63081
|
+
});
|
|
62893
63082
|
server.registerTool("auto_poc", {
|
|
62894
63083
|
title: "Auto-PoC — generate a copy-paste-ready reproduction recipe",
|
|
62895
63084
|
description: "Turn a finding into a concrete reproduction recipe (the 'reproducible' gate question made executable). Given a vuln class + target + endpoint + param, emit the exact request (with a MARKER), a NEGATIVE CONTROL, and the expected differential that PROVES the bug — plus a Patchstack-style title, derived severity, and the fix. Covers sql_injection, missing_authz/idor, ssrf, xss, ssti, command_injection, file_upload, mass_assignment, jwt_alg_confusion, crlf, open_redirect, xxe, prototype_pollution, deserialization, hardcoded_secret, cache_deception, cors_misconfiguration, subdomain_takeover. Pass type='list' to enumerate supported classes.",
|
|
@@ -181,7 +181,9 @@
|
|
|
181
181
|
"epss": 1.0,
|
|
182
182
|
"reports": 2669,
|
|
183
183
|
"fingerprint": "Confluence (Server/Data Center) \u2014 /login.action, confluence headers",
|
|
184
|
-
"match": "confluence|login\\.action|atlassian"
|
|
184
|
+
"match": "confluence|login\\.action|atlassian",
|
|
185
|
+
"fixed_in": "7.13.0",
|
|
186
|
+
"version_key": "confluence"
|
|
185
187
|
},
|
|
186
188
|
{
|
|
187
189
|
"cve": "CVE-2025-29927",
|
|
@@ -191,7 +193,9 @@
|
|
|
191
193
|
"epss": 0.9962,
|
|
192
194
|
"reports": 132,
|
|
193
195
|
"fingerprint": "_next/static/chunks/ bundles; x-middleware-subrequest header",
|
|
194
|
-
"match": "_next/|__next|next\\.js|middleware"
|
|
196
|
+
"match": "_next/|__next|next\\.js|middleware",
|
|
197
|
+
"fixed_in": "15.2.3",
|
|
198
|
+
"version_key": "next"
|
|
195
199
|
},
|
|
196
200
|
{
|
|
197
201
|
"cve": "CVE-2025-55182",
|
|
@@ -201,7 +205,9 @@
|
|
|
201
205
|
"epss": 0.9956,
|
|
202
206
|
"reports": 415,
|
|
203
207
|
"fingerprint": "_next/ + Server Function / flight endpoints",
|
|
204
|
-
"match": "_next/|server function|react server|rsc"
|
|
208
|
+
"match": "_next/|server function|react server|rsc",
|
|
209
|
+
"fixed_in": null,
|
|
210
|
+
"version_key": null
|
|
205
211
|
},
|
|
206
212
|
{
|
|
207
213
|
"cve": "CVE-2025-3248",
|
|
@@ -211,7 +217,9 @@
|
|
|
211
217
|
"epss": 0.9997,
|
|
212
218
|
"reports": 29,
|
|
213
219
|
"fingerprint": "/api/v1/validate/code \u2014 AI/agent tooling",
|
|
214
|
-
"match": "langflow|validate/code"
|
|
220
|
+
"match": "langflow|validate/code",
|
|
221
|
+
"fixed_in": null,
|
|
222
|
+
"version_key": null
|
|
215
223
|
},
|
|
216
224
|
{
|
|
217
225
|
"cve": "CVE-2024-34351",
|
|
@@ -221,7 +229,9 @@
|
|
|
221
229
|
"epss": 0.0545,
|
|
222
230
|
"reports": 50,
|
|
223
231
|
"fingerprint": "Next.js Server Actions (Host header + relative redirect)",
|
|
224
|
-
"match": "_next/|server action"
|
|
232
|
+
"match": "_next/|server action",
|
|
233
|
+
"fixed_in": "14.1.1",
|
|
234
|
+
"version_key": "next"
|
|
225
235
|
},
|
|
226
236
|
{
|
|
227
237
|
"cve": "CVE-2025-0133",
|
|
@@ -231,7 +241,9 @@
|
|
|
231
241
|
"epss": 0.4352,
|
|
232
242
|
"reports": 1990,
|
|
233
243
|
"fingerprint": "GlobalProtect captive portal",
|
|
234
|
-
"match": "globalprotect|palo alto|pan-os|pan os"
|
|
244
|
+
"match": "globalprotect|palo alto|pan-os|pan os",
|
|
245
|
+
"fixed_in": null,
|
|
246
|
+
"version_key": null
|
|
235
247
|
},
|
|
236
248
|
{
|
|
237
249
|
"cve": "CVE-2026-0257",
|
|
@@ -241,7 +253,9 @@
|
|
|
241
253
|
"epss": 0.8668,
|
|
242
254
|
"reports": 27,
|
|
243
255
|
"fingerprint": "GlobalProtect portal/gateway",
|
|
244
|
-
"match": "globalprotect|palo alto|pan-os|pan os"
|
|
256
|
+
"match": "globalprotect|palo alto|pan-os|pan os",
|
|
257
|
+
"fixed_in": null,
|
|
258
|
+
"version_key": null
|
|
245
259
|
},
|
|
246
260
|
{
|
|
247
261
|
"cve": "CVE-2025-4123",
|
|
@@ -251,7 +265,9 @@
|
|
|
251
265
|
"epss": 0.9781,
|
|
252
266
|
"reports": 220,
|
|
253
267
|
"fingerprint": "Grafana path traversal + open redirect (Image Renderer)",
|
|
254
|
-
"match": "grafana|x-grafana"
|
|
268
|
+
"match": "grafana|x-grafana",
|
|
269
|
+
"fixed_in": null,
|
|
270
|
+
"version_key": null
|
|
255
271
|
},
|
|
256
272
|
{
|
|
257
273
|
"cve": "CVE-2021-20323",
|
|
@@ -261,7 +277,9 @@
|
|
|
261
277
|
"epss": 0.3725,
|
|
262
278
|
"reports": 107,
|
|
263
279
|
"fingerprint": "Keycloak auth flows",
|
|
264
|
-
"match": "keycloak|kc-|realms/"
|
|
280
|
+
"match": "keycloak|kc-|realms/",
|
|
281
|
+
"fixed_in": null,
|
|
282
|
+
"version_key": null
|
|
265
283
|
},
|
|
266
284
|
{
|
|
267
285
|
"cve": "CVE-2018-5230",
|
|
@@ -271,7 +289,9 @@
|
|
|
271
289
|
"epss": 0.3761,
|
|
272
290
|
"reports": 4694,
|
|
273
291
|
"fingerprint": "Jira /issuecollector custom fields",
|
|
274
|
-
"match": "jira|issuecollector|atlassian"
|
|
292
|
+
"match": "jira|issuecollector|atlassian",
|
|
293
|
+
"fixed_in": null,
|
|
294
|
+
"version_key": null
|
|
275
295
|
},
|
|
276
296
|
{
|
|
277
297
|
"cve": "CVE-2026-33461",
|
|
@@ -281,7 +301,9 @@
|
|
|
281
301
|
"epss": 0.0028,
|
|
282
302
|
"reports": 8,
|
|
283
303
|
"fingerprint": "Kibana internal Fleet endpoints",
|
|
284
|
-
"match": "kibana|elastic|fleet"
|
|
304
|
+
"match": "kibana|elastic|fleet",
|
|
305
|
+
"fixed_in": null,
|
|
306
|
+
"version_key": null
|
|
285
307
|
},
|
|
286
308
|
{
|
|
287
309
|
"cve": "CVE-2026-49093",
|
|
@@ -291,7 +313,9 @@
|
|
|
291
313
|
"epss": 0.002,
|
|
292
314
|
"reports": 5,
|
|
293
315
|
"fingerprint": "Kibana connectors / allowlist bypass",
|
|
294
|
-
"match": "kibana|elastic|connector"
|
|
316
|
+
"match": "kibana|elastic|connector",
|
|
317
|
+
"fixed_in": null,
|
|
318
|
+
"version_key": null
|
|
295
319
|
},
|
|
296
320
|
{
|
|
297
321
|
"cve": "CVE-2026-26938",
|
|
@@ -301,7 +325,9 @@
|
|
|
301
325
|
"epss": 0.0025,
|
|
302
326
|
"reports": 5,
|
|
303
327
|
"fingerprint": "Kibana Workflows",
|
|
304
|
-
"match": "kibana|elastic|workflow"
|
|
328
|
+
"match": "kibana|elastic|workflow",
|
|
329
|
+
"fixed_in": null,
|
|
330
|
+
"version_key": null
|
|
305
331
|
},
|
|
306
332
|
{
|
|
307
333
|
"cve": "CVE-2026-33068",
|
|
@@ -311,7 +337,9 @@
|
|
|
311
337
|
"epss": 0.0034,
|
|
312
338
|
"reports": 5,
|
|
313
339
|
"fingerprint": "repo .claude/settings.json",
|
|
314
|
-
"match": "\\.claude/settings"
|
|
340
|
+
"match": "\\.claude/settings",
|
|
341
|
+
"fixed_in": null,
|
|
342
|
+
"version_key": null
|
|
315
343
|
},
|
|
316
344
|
{
|
|
317
345
|
"cve": "CVE-2025-25297",
|
|
@@ -321,7 +349,9 @@
|
|
|
321
349
|
"epss": 0.0062,
|
|
322
350
|
"reports": 2,
|
|
323
351
|
"fingerprint": "Label Studio S3 integration",
|
|
324
|
-
"match": "label ?studio|labelstudio|label-studio"
|
|
352
|
+
"match": "label ?studio|labelstudio|label-studio",
|
|
353
|
+
"fixed_in": null,
|
|
354
|
+
"version_key": null
|
|
325
355
|
},
|
|
326
356
|
{
|
|
327
357
|
"cve": "CVE-2026-33309",
|
|
@@ -331,7 +361,9 @@
|
|
|
331
361
|
"epss": 0.0142,
|
|
332
362
|
"reports": 6,
|
|
333
363
|
"fingerprint": "Langflow multipart upload filename",
|
|
334
|
-
"match": "langflow"
|
|
364
|
+
"match": "langflow",
|
|
365
|
+
"fixed_in": null,
|
|
366
|
+
"version_key": null
|
|
335
367
|
},
|
|
336
368
|
{
|
|
337
369
|
"cve": "CVE-2026-45543",
|
|
@@ -341,7 +373,9 @@
|
|
|
341
373
|
"epss": 0.0027,
|
|
342
374
|
"reports": 5,
|
|
343
375
|
"fingerprint": "Nextcloud Forms collaborator removal",
|
|
344
|
-
"match": "nextcloud|ocs-provider"
|
|
376
|
+
"match": "nextcloud|ocs-provider",
|
|
377
|
+
"fixed_in": null,
|
|
378
|
+
"version_key": null
|
|
345
379
|
},
|
|
346
380
|
{
|
|
347
381
|
"cve": "CVE-2017-15277",
|
|
@@ -351,7 +385,9 @@
|
|
|
351
385
|
"epss": 0.1919,
|
|
352
386
|
"reports": 5914,
|
|
353
387
|
"fingerprint": "image processing (GIF upload)",
|
|
354
|
-
"match": "imagemagick|graphicsmagick"
|
|
388
|
+
"match": "imagemagick|graphicsmagick",
|
|
389
|
+
"fixed_in": null,
|
|
390
|
+
"version_key": null
|
|
355
391
|
}
|
|
356
392
|
]
|
|
357
393
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blitzstrike",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.103",
|
|
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": {
|