blitzstrike 2.4.95 → 2.4.97
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 +30 -0
- package/README.md +35 -8
- package/dist/index.js +21 -7
- package/intelligence/watchlist.json +334 -28
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,36 @@ 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.97] — 2026-09-17
|
|
9
|
+
|
|
10
|
+
### Added — bugbounty-lab101 knowledge extraction (watchlist upgrade + dedup doctrine)
|
|
11
|
+
|
|
12
|
+
- Upgraded `watchlist()` CVE data from a generic 9-CVE list to the 18
|
|
13
|
+
Hacktivity-ranked CVEs with EPSS, report counts, and per-CVE fingerprint
|
|
14
|
+
hints (Confluence OGNL RCE, Next.js middleware/RSC auth-bypass/RCE, Kibana
|
|
15
|
+
SSRF/authz, Langflow RCE, PAN-OS GlobalProtect, Grafana, Keycloak, Jira).
|
|
16
|
+
`watchlist()` now emits a "fingerprint-first" recommendation: if the target
|
|
17
|
+
stack matches a watchlist product, test that specific CVE instead of relying
|
|
18
|
+
on generic scanning.
|
|
19
|
+
- Added a `dedup_before_report` doctrine rule — search Hacktivity (and prior
|
|
20
|
+
public reports) for the same endpoint/tech/vuln class before writing the
|
|
21
|
+
report; the #1 cause of "Duplicate"/"N/A" rejections is not searching first.
|
|
22
|
+
|
|
23
|
+
## [2.4.96] — 2026-09-17
|
|
24
|
+
|
|
25
|
+
### Security — self-audit (command injection + path traversal fixed)
|
|
26
|
+
|
|
27
|
+
- `resolve_check(host)` interpolated the user-controlled host into a `curl` shell
|
|
28
|
+
string (`execSync`), allowing command injection (`host = "x.com; id"`). Now
|
|
29
|
+
validates the host against a strict hostname regex BEFORE any subprocess/DNS and
|
|
30
|
+
calls curl via `execFileSync` (array argv, no shell) — defense in depth.
|
|
31
|
+
- `foundry_run(contract_name=...)` used the name as a filename under the temp
|
|
32
|
+
project without validation, allowing path traversal (`"../../evil"`). Now
|
|
33
|
+
sanitizes to a valid Solidity identifier (`[A-Za-z_][A-Za-z0-9_]*`), defaulting
|
|
34
|
+
to `Vulnerable` otherwise.
|
|
35
|
+
- Added regression checks: `isValidHostname` rejects shell metacharacters
|
|
36
|
+
(`;`, backticks, `$()`, `|`, `../`, newlines); the identifier regex is shared.
|
|
37
|
+
|
|
8
38
|
## [2.4.95] — 2026-09-17
|
|
9
39
|
|
|
10
40
|
### Fixed — full interconnection audit (unreachable template + 2 ungrounded classes)
|
package/README.md
CHANGED
|
@@ -52,6 +52,13 @@ source analysis, and validation — into three tool tiers executed server-side.
|
|
|
52
52
|
Reconnaissance → analysis → validation. Nothing is reported until STRIKE
|
|
53
53
|
confirms it.
|
|
54
54
|
|
|
55
|
+
Beyond the three tiers, Blitz Strike also ships **Web3 audit** (deterministic
|
|
56
|
+
Solidity + executable Foundry proof), a **live logic-bug prober** (sibling
|
|
57
|
+
enumeration + differential IDOR), **hunting intel** (CWE/CVE watchlist + DNS
|
|
58
|
+
sinkhole detection), and **out-of-band proof** — so IDOR/auth logic bugs, blind
|
|
59
|
+
injection, and smart-contract findings are all caught and proven, not just
|
|
60
|
+
pattern-matched.
|
|
61
|
+
|
|
55
62
|
---
|
|
56
63
|
|
|
57
64
|
## Autonomous, LLM-driven
|
|
@@ -220,7 +227,7 @@ MCP servers. With no client detected, it prints the snippet for manual paste.
|
|
|
220
227
|
| `dedup_findings(findings)` | Collapse findings that share a root cause (sink × source × CWE) into one group per root cause. |
|
|
221
228
|
| `generate_report(findings, format)` | Emit a reproducible markdown/JSON report with summary + SHA-256 integrity hash. |
|
|
222
229
|
| `run_enterprise_benchmark()` | Run the labelled enterprise corpus and report detection rate, false-positive rate, and precision. |
|
|
223
|
-
| `coverage_matrix()` | Enumerate language × sink-class coverage (
|
|
230
|
+
| `coverage_matrix()` | Enumerate language × sink-class coverage (5 languages) + coverage ratio. |
|
|
224
231
|
|
|
225
232
|
### EAGLE-EYE — taint + data-flow
|
|
226
233
|
|
|
@@ -263,6 +270,26 @@ decoration — they are wired into the flow:
|
|
|
263
270
|
- `tool_lookup(name)` auto-attaches the tool's full manual.
|
|
264
271
|
- `run_engagement()` attaches the relevant manual per matched chain's `tools` field.
|
|
265
272
|
|
|
273
|
+
### WEB3 — smart-contract audit + proof
|
|
274
|
+
|
|
275
|
+
| Tool | Purpose |
|
|
276
|
+
|---|---|
|
|
277
|
+
| `web3_audit(code, path)` | Deterministic Solidity audit — 13 bug classes (reentrancy incl. ERC721/ERC1155 callbacks, unchecked return/arithmetic, tx.origin auth, signature replay, selfdestruct, delegatecall, missing access control, timestamp dependence, spot-price oracle, unbounded loop, encodePacked collision, missing address(0) check) with CWE + severity + line refs. |
|
|
278
|
+
| `foundry_poc(class, contract)` | Generate an executable Foundry test that PROVES a Web3 finding. |
|
|
279
|
+
| `foundry_run(contract_code, poc_code, class_)` | Actually run the Foundry PoC (`forge test`) — a PASSING test = exploit reproduced (deterministic: forge's own verdict). |
|
|
280
|
+
|
|
281
|
+
### HUNTING — doctrine + live logic-bug prober + intel
|
|
282
|
+
|
|
283
|
+
| Tool | Purpose |
|
|
284
|
+
|---|---|
|
|
285
|
+
| `hunting_doctrine()` | High-ROI heuristics — sibling rule, A→B signal, two-account IDOR, PoC escalation, follow-the-money + the always-rejected kill-list. |
|
|
286
|
+
| `kill_list(type)` | Deterministic always-rejected check — missing headers, self-XSS, open-redirect-alone, SSRF-DNS-only, GraphQL-introspection-alone are N/A standalone. |
|
|
287
|
+
| `sibling_scan(base_url, endpoint, token_a, token_b)` | Deterministic LIVE logic-bug prober — sibling enumeration + differential IDOR + auth matrix + mass assignment + rate limit (closes the static-analysis gap on IDOR/auth logic bugs). |
|
|
288
|
+
| `auto_poc(type, base_url, endpoint, param)` | Turn a finding into a copy-paste-ready reproduction recipe (marker + negative control + expected differential + Patchstack-style title). |
|
|
289
|
+
| `watchlist()` | Ranked CWE frequency + high-value CVE watchlist with payout + saturated flag — "what to hunt next". |
|
|
290
|
+
| `resolve_check(host)` | Detect an ISP/country DNS sinkhole (blocking page) before auditing a sensitive-niche domain. |
|
|
291
|
+
| `oob_start()` / `oob_poll(id)` / `oob_stop(id)` | Out-of-band proof — interactsh listener for blind SSRF/XXE/SQLi/command-injection (the canary must actually arrive). |
|
|
292
|
+
|
|
266
293
|
### MEMORY — long-term knowledge (self-growing)
|
|
267
294
|
|
|
268
295
|
| Tool | Purpose |
|
|
@@ -325,7 +352,7 @@ See `ATTRIBUTION.md` for full license/copyright notices.
|
|
|
325
352
|
|
|
326
353
|
## Escalation Chains (chains.json)
|
|
327
354
|
|
|
328
|
-
|
|
355
|
+
58 data-driven escalation chains, each with ordered steps carrying:
|
|
329
356
|
|
|
330
357
|
- `tool_hint` — which Blitz Strike tool to use
|
|
331
358
|
- `success_criteria` — binary observable for the step
|
|
@@ -361,7 +388,7 @@ All other tools need no credentials.
|
|
|
361
388
|
bun install # deps
|
|
362
389
|
bun run typecheck # tsc --noEmit
|
|
363
390
|
bun run build # ESM bundle → dist/index.js
|
|
364
|
-
bun run test # regression + benchmark suite (
|
|
391
|
+
bun run test # regression + benchmark suite (453 checks)
|
|
365
392
|
bun run compile # single static binary → dist/blitzstrike
|
|
366
393
|
```
|
|
367
394
|
|
|
@@ -375,14 +402,14 @@ number you can re-run, not a claim.
|
|
|
375
402
|
- **Benchmark** (`run_enterprise_benchmark`) — a labelled corpus of vulnerable +
|
|
376
403
|
safe fixtures across PHP, JavaScript, Python, and Java. Current result:
|
|
377
404
|
detection rate **1.0**, false-positive rate **0**, precision **1.0**.
|
|
378
|
-
- **Coverage matrix** (`coverage_matrix`) —
|
|
379
|
-
|
|
380
|
-
the language (e.g. Java has no `eval`, Python/Java no
|
|
381
|
-
inclusion, JS no deserialization sink).
|
|
405
|
+
- **Coverage matrix** (`coverage_matrix`) — 5 languages × sink classes = 84%
|
|
406
|
+
coverage (php, javascript, python, java, rust). Uncovered pairs are
|
|
407
|
+
legitimately absent from the language (e.g. Java has no `eval`, Python/Java no
|
|
408
|
+
PHP-style file inclusion, JS no deserialization sink).
|
|
382
409
|
- **Attack-vector taxonomy** (`list_attack_vectors` / `attack_vectors`) — a
|
|
383
410
|
master reference of 34 attack-vector categories (588 vectors) so a driving
|
|
384
411
|
agent can map the *entire* attack surface, not just the obvious sinks.
|
|
385
|
-
- **Regression suite** — `bun run test` runs
|
|
412
|
+
- **Regression suite** — `bun run test` runs 453 checks covering finding
|
|
386
413
|
lifecycle, evidence integrity, CVSS math, taint tracing, dedup, report
|
|
387
414
|
integrity, and benchmark invariants. CI runs it on every push.
|
|
388
415
|
|
package/dist/index.js
CHANGED
|
@@ -17499,7 +17499,7 @@ var init_update = __esm(() => {
|
|
|
17499
17499
|
import { readFileSync as readFileSync29, existsSync as existsSync16 } from "node:fs";
|
|
17500
17500
|
import { join as join27 } from "node:path";
|
|
17501
17501
|
import { fileURLToPath as fileURLToPath14 } from "node:url";
|
|
17502
|
-
import { execSync as
|
|
17502
|
+
import { execSync as execSync4 } from "node:child_process";
|
|
17503
17503
|
function validateRelease() {
|
|
17504
17504
|
const checks = [];
|
|
17505
17505
|
checks.push({ name: "package.json version", ok: true, detail: VERSION });
|
|
@@ -17516,13 +17516,13 @@ function validateRelease() {
|
|
|
17516
17516
|
checks.push({ name: "CHANGELOG version", ok: false, detail: "CHANGELOG.md not found" });
|
|
17517
17517
|
}
|
|
17518
17518
|
try {
|
|
17519
|
-
const tag =
|
|
17519
|
+
const tag = execSync4("git describe --tags --abbrev=0", { cwd: ROOT8, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
|
|
17520
17520
|
checks.push({ name: "Git tag", ok: tag === `v${VERSION}`, detail: tag, soft: true });
|
|
17521
17521
|
} catch {
|
|
17522
17522
|
checks.push({ name: "Git tag", ok: true, detail: "unavailable (no git/tags)", soft: true });
|
|
17523
17523
|
}
|
|
17524
17524
|
try {
|
|
17525
|
-
const published =
|
|
17525
|
+
const published = execSync4("npm view blitzstrike version", { encoding: "utf8", timeout: 8000, stdio: ["ignore", "pipe", "ignore"] }).trim();
|
|
17526
17526
|
checks.push({ name: "npm registry version", ok: published === VERSION, detail: published, soft: true });
|
|
17527
17527
|
} catch {
|
|
17528
17528
|
checks.push({ name: "npm registry version", ok: true, detail: "unavailable (offline)", soft: true });
|
|
@@ -60943,6 +60943,11 @@ var HUNTING_DOCTRINE = [
|
|
|
60943
60943
|
id: "rotation",
|
|
60944
60944
|
title: "20-Minute Rotation",
|
|
60945
60945
|
rule: "Every 20 minutes ask 'am I making progress?'. No → rotate to the next endpoint / subdomain / class. Fresh context finds more bugs than brute force."
|
|
60946
|
+
},
|
|
60947
|
+
{
|
|
60948
|
+
id: "dedup_before_report",
|
|
60949
|
+
title: "Search for Duplicates Before Reporting",
|
|
60950
|
+
rule: "The #1 cause of 'Duplicate'/'N/A' rejections is not searching first. Before writing the report, search Hacktivity (and the program's prior public reports) for the same endpoint/tech/vuln class; an already-reported open S3 bucket, CORS misconfig, or XSS param is not worth a second report. Only submit what is genuinely new."
|
|
60946
60951
|
}
|
|
60947
60952
|
];
|
|
60948
60953
|
function huntingDoctrine() {
|
|
@@ -61408,7 +61413,8 @@ function parseTestResults(out) {
|
|
|
61408
61413
|
}
|
|
61409
61414
|
async function foundryRun(input) {
|
|
61410
61415
|
const forge = findForge();
|
|
61411
|
-
const
|
|
61416
|
+
const rawName = input.contract_name ?? "Vulnerable";
|
|
61417
|
+
const name = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/.test(rawName) ? rawName : "Vulnerable";
|
|
61412
61418
|
if (!forge) {
|
|
61413
61419
|
return {
|
|
61414
61420
|
forge: null,
|
|
@@ -61459,11 +61465,15 @@ solc = "0.8.20"
|
|
|
61459
61465
|
}
|
|
61460
61466
|
|
|
61461
61467
|
// src/hunting-intel.ts
|
|
61462
|
-
import {
|
|
61468
|
+
import { execFileSync as execFileSync5 } from "node:child_process";
|
|
61463
61469
|
import { resolve4 as resolve42, Resolver } from "node:dns/promises";
|
|
61464
61470
|
import { readFileSync as readFileSync25 } from "node:fs";
|
|
61465
61471
|
import { join as join24 } from "node:path";
|
|
61466
61472
|
var BLOCKING_KEYWORDS = /internet positif|kominfo|\.go\.id\b|pemblokiran|ditutup|dilarang|akses dibatasi|blocked|restricted|illegal|advertencia|coljuegos|regulat|forbidden|this (site|website) has been (blocked|banned)/i;
|
|
61473
|
+
var HOSTNAME_RE = /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i;
|
|
61474
|
+
function isValidHostname(host) {
|
|
61475
|
+
return host.length <= 253 && HOSTNAME_RE.test(host);
|
|
61476
|
+
}
|
|
61467
61477
|
async function localResolve(host) {
|
|
61468
61478
|
try {
|
|
61469
61479
|
return await resolve42(host);
|
|
@@ -61484,7 +61494,7 @@ function probeBlockingPage(host, ip, timeoutMs = 8000) {
|
|
|
61484
61494
|
for (const port of ["443", "80"]) {
|
|
61485
61495
|
const scheme = port === "443" ? "https" : "http";
|
|
61486
61496
|
try {
|
|
61487
|
-
const out =
|
|
61497
|
+
const out = execFileSync5("curl", ["-sk", "-m", "6", "--resolve", `${host}:${port}:${ip}`, `${scheme}://${host}/`], { encoding: "utf8", timeout: timeoutMs, stdio: ["ignore", "pipe", "ignore"] });
|
|
61488
61498
|
const preview = out.replace(/\s+/g, " ").trim().slice(0, 300);
|
|
61489
61499
|
if (!preview)
|
|
61490
61500
|
continue;
|
|
@@ -61495,6 +61505,9 @@ function probeBlockingPage(host, ip, timeoutMs = 8000) {
|
|
|
61495
61505
|
}
|
|
61496
61506
|
async function resolveCheck(host) {
|
|
61497
61507
|
const clean = host.replace(/^https?:\/\//, "").split("/")[0];
|
|
61508
|
+
if (!isValidHostname(clean)) {
|
|
61509
|
+
return { host: clean, local_ips: [], public_ips: [], sinkhole: false, verdict: "invalid", evidence: "not a valid hostname — rejected before DNS/subprocess" };
|
|
61510
|
+
}
|
|
61498
61511
|
const local = await localResolve(clean);
|
|
61499
61512
|
const pub = await publicResolve(clean);
|
|
61500
61513
|
if (local.length === 0 && pub.length === 0) {
|
|
@@ -61559,7 +61572,8 @@ function watchlist() {
|
|
|
61559
61572
|
};
|
|
61560
61573
|
}).sort((a, b) => a.rank - b.rank);
|
|
61561
61574
|
const unsaturated = entries.filter((e) => !e.saturated);
|
|
61562
|
-
const
|
|
61575
|
+
const topCve = cve_watchlist.filter((c) => (c.epss ?? 0) >= 0.8 || (c.reports ?? 0) >= 100).slice(0, 4).map((c) => c.cve).join(", ");
|
|
61576
|
+
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}.`;
|
|
61563
61577
|
return { cwe_frequency: entries, cve_watchlist, recommendation };
|
|
61564
61578
|
}
|
|
61565
61579
|
|
|
@@ -1,33 +1,339 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_comment": "Bug-bounty disclosure frequency + payout watchlist. Derived from public disclosure statistics (HackerOne Hacktivity / CWE Top 25) and typical bounty ranges
|
|
2
|
+
"_comment": "Bug-bounty disclosure frequency + payout watchlist. Derived from public disclosure statistics (HackerOne Hacktivity / CWE Top 25) and typical bounty ranges \u2014 a 'what to hunt next' signal, not a vulnerability database. Each CWE entry links to a Blitz Strike detector pattern when one exists (grounding via pattern_lookup).",
|
|
3
3
|
"cwe_frequency": [
|
|
4
|
-
{
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
{
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
4
|
+
{
|
|
5
|
+
"cwe": "CWE-79",
|
|
6
|
+
"name": "Cross-site Scripting (XSS)",
|
|
7
|
+
"rank": 1,
|
|
8
|
+
"saturated": true,
|
|
9
|
+
"pattern": "xss",
|
|
10
|
+
"payout_min": 100,
|
|
11
|
+
"payout_max": 2500,
|
|
12
|
+
"notes": "Most-reported class; heavily automated and low-paying \u2014 hunt only for high-impact variants (stored/account-takeover)."
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"cwe": "CWE-862",
|
|
16
|
+
"name": "Missing Authorization / IDOR",
|
|
17
|
+
"rank": 2,
|
|
18
|
+
"saturated": false,
|
|
19
|
+
"pattern": "missing_authz",
|
|
20
|
+
"payout_min": 1000,
|
|
21
|
+
"payout_max": 10000,
|
|
22
|
+
"notes": "~30% of paid access-control bugs; sibling rule + two-account test are the highest-ROI moves."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"cwe": "CWE-284",
|
|
26
|
+
"name": "Improper Access Control (priv-esc)",
|
|
27
|
+
"rank": 3,
|
|
28
|
+
"saturated": false,
|
|
29
|
+
"pattern": "priv_esc",
|
|
30
|
+
"payout_min": 1000,
|
|
31
|
+
"payout_max": 15000,
|
|
32
|
+
"notes": "Role/privilege escalation; mass assignment + forced membership are under-hunted."
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"cwe": "CWE-89",
|
|
36
|
+
"name": "SQL Injection",
|
|
37
|
+
"rank": 4,
|
|
38
|
+
"saturated": false,
|
|
39
|
+
"pattern": "sql_injection",
|
|
40
|
+
"payout_min": 1000,
|
|
41
|
+
"payout_max": 15000,
|
|
42
|
+
"notes": "Still high-value where it reaches a real query; WAF bypass + second-order matter."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"cwe": "CWE-918",
|
|
46
|
+
"name": "Server-Side Request Forgery (SSRF)",
|
|
47
|
+
"rank": 5,
|
|
48
|
+
"saturated": false,
|
|
49
|
+
"pattern": "ssrf",
|
|
50
|
+
"payout_min": 1000,
|
|
51
|
+
"payout_max": 15000,
|
|
52
|
+
"notes": "P1 when it hits cloud metadata; proof = internal response or OOB callback."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"cwe": "CWE-78",
|
|
56
|
+
"name": "OS Command Injection",
|
|
57
|
+
"rank": 6,
|
|
58
|
+
"saturated": false,
|
|
59
|
+
"pattern": "command_injection",
|
|
60
|
+
"payout_min": 1000,
|
|
61
|
+
"payout_max": 15000,
|
|
62
|
+
"notes": "Critical class; less common than XSS/SQLi but very high impact."
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"cwe": "CWE-502",
|
|
66
|
+
"name": "Insecure Deserialization",
|
|
67
|
+
"rank": 7,
|
|
68
|
+
"saturated": false,
|
|
69
|
+
"pattern": "deserialization",
|
|
70
|
+
"payout_min": 5000,
|
|
71
|
+
"payout_max": 30000,
|
|
72
|
+
"notes": "Highest per-finding payout; needs a gadget chain but very rewarded."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"cwe": "CWE-94",
|
|
76
|
+
"name": "Code Injection / eval",
|
|
77
|
+
"rank": 8,
|
|
78
|
+
"saturated": false,
|
|
79
|
+
"pattern": "command_injection",
|
|
80
|
+
"payout_min": 1000,
|
|
81
|
+
"payout_max": 15000,
|
|
82
|
+
"notes": "eval/exec with user input; folds into RCE umbrella."
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"cwe": "CWE-434",
|
|
86
|
+
"name": "Unrestricted File Upload",
|
|
87
|
+
"rank": 9,
|
|
88
|
+
"saturated": false,
|
|
89
|
+
"pattern": "file_upload",
|
|
90
|
+
"payout_min": 1000,
|
|
91
|
+
"payout_max": 10000,
|
|
92
|
+
"notes": "Upload \u2192 RCE chains pay well; confirm the file actually executes."
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"cwe": "CWE-611",
|
|
96
|
+
"name": "XML External Entity (XXE)",
|
|
97
|
+
"rank": 10,
|
|
98
|
+
"saturated": false,
|
|
99
|
+
"pattern": "xxe",
|
|
100
|
+
"payout_min": 1000,
|
|
101
|
+
"payout_max": 10000,
|
|
102
|
+
"notes": "Less common post-2020 but still found in SOAP/XML upload flows."
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"cwe": "CWE-287",
|
|
106
|
+
"name": "Authentication Bypass",
|
|
107
|
+
"rank": 11,
|
|
108
|
+
"saturated": false,
|
|
109
|
+
"pattern": "type_juggling",
|
|
110
|
+
"payout_min": 1000,
|
|
111
|
+
"payout_max": 15000,
|
|
112
|
+
"notes": "Loose comparison / JWT confusion / OAuth misconfig \u2014 account takeover class."
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"cwe": "CWE-798",
|
|
116
|
+
"name": "Hardcoded Credentials",
|
|
117
|
+
"rank": 12,
|
|
118
|
+
"saturated": false,
|
|
119
|
+
"pattern": "hardcoded_secret",
|
|
120
|
+
"payout_min": 500,
|
|
121
|
+
"payout_max": 10000,
|
|
122
|
+
"notes": "Committed keys are common in JS bundles + .git history; prove the key is ACTIVE."
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"cwe": "CWE-22",
|
|
126
|
+
"name": "Path Traversal / LFI",
|
|
127
|
+
"rank": 13,
|
|
128
|
+
"saturated": true,
|
|
129
|
+
"pattern": "path_confusion",
|
|
130
|
+
"payout_min": 500,
|
|
131
|
+
"payout_max": 5000,
|
|
132
|
+
"notes": "Saturated; value only when it chains to RCE (log poisoning, session files)."
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"cwe": "CWE-601",
|
|
136
|
+
"name": "Open Redirect",
|
|
137
|
+
"rank": 14,
|
|
138
|
+
"saturated": true,
|
|
139
|
+
"pattern": "oauth_misconfig",
|
|
140
|
+
"payout_min": 100,
|
|
141
|
+
"payout_max": 1500,
|
|
142
|
+
"notes": "Standalone is usually N/A; value only chained into OAuth/token theft."
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"cwe": "CWE-352",
|
|
146
|
+
"name": "Cross-Site Request Forgery (CSRF)",
|
|
147
|
+
"rank": 15,
|
|
148
|
+
"saturated": true,
|
|
149
|
+
"pattern": "missing_nonce",
|
|
150
|
+
"payout_min": 100,
|
|
151
|
+
"payout_max": 2000,
|
|
152
|
+
"notes": "Saturated + low; only for high-impact state changes (password/email/transfer)."
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"cwe": "CWE-200",
|
|
156
|
+
"name": "Information Exposure",
|
|
157
|
+
"rank": 16,
|
|
158
|
+
"saturated": true,
|
|
159
|
+
"pattern": "hardcoded_secret",
|
|
160
|
+
"payout_min": 100,
|
|
161
|
+
"payout_max": 2000,
|
|
162
|
+
"notes": "Excessive data exposure / verbose errors; usually a chain enabler, not a standalone bounty."
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"cwe": "CWE-400",
|
|
166
|
+
"name": "Denial of Service / rate-limit",
|
|
167
|
+
"rank": 17,
|
|
168
|
+
"saturated": true,
|
|
169
|
+
"pattern": null,
|
|
170
|
+
"payout_min": 100,
|
|
171
|
+
"payout_max": 1000,
|
|
172
|
+
"notes": "Usually out of scope standalone; relevant only for business-critical flows."
|
|
173
|
+
}
|
|
21
174
|
],
|
|
22
175
|
"cve_watchlist": [
|
|
23
|
-
{
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
176
|
+
{
|
|
177
|
+
"cve": "CVE-2021-26084",
|
|
178
|
+
"name": "Confluence OGNL injection RCE",
|
|
179
|
+
"product": "Atlassian Confluence",
|
|
180
|
+
"class": "rce",
|
|
181
|
+
"epss": 1.0,
|
|
182
|
+
"reports": 2669,
|
|
183
|
+
"fingerprint": "Confluence (Server/Data Center) \u2014 /login.action, confluence headers"
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"cve": "CVE-2025-29927",
|
|
187
|
+
"name": "Next.js middleware auth bypass",
|
|
188
|
+
"product": "Next.js",
|
|
189
|
+
"class": "auth_bypass",
|
|
190
|
+
"epss": 0.9962,
|
|
191
|
+
"reports": 132,
|
|
192
|
+
"fingerprint": "_next/static/chunks/ bundles; x-middleware-subrequest header"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"cve": "CVE-2025-55182",
|
|
196
|
+
"name": "Next.js RSC pre-auth RCE (deserialization)",
|
|
197
|
+
"product": "Next.js / React Server Components",
|
|
198
|
+
"class": "rce",
|
|
199
|
+
"epss": 0.9956,
|
|
200
|
+
"reports": 415,
|
|
201
|
+
"fingerprint": "_next/ + Server Function / flight endpoints"
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"cve": "CVE-2025-3248",
|
|
205
|
+
"name": "Langflow unauth code injection",
|
|
206
|
+
"product": "Langflow",
|
|
207
|
+
"class": "rce",
|
|
208
|
+
"epss": 0.9997,
|
|
209
|
+
"reports": 29,
|
|
210
|
+
"fingerprint": "/api/v1/validate/code \u2014 AI/agent tooling"
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
"cve": "CVE-2024-34351",
|
|
214
|
+
"name": "Next.js Server Actions SSRF",
|
|
215
|
+
"product": "Next.js",
|
|
216
|
+
"class": "ssrf",
|
|
217
|
+
"epss": 0.0545,
|
|
218
|
+
"reports": 50,
|
|
219
|
+
"fingerprint": "Next.js Server Actions (Host header + relative redirect)"
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"cve": "CVE-2025-0133",
|
|
223
|
+
"name": "PAN-OS GlobalProtect portal XSS",
|
|
224
|
+
"product": "Palo Alto PAN-OS",
|
|
225
|
+
"class": "xss",
|
|
226
|
+
"epss": 0.4352,
|
|
227
|
+
"reports": 1990,
|
|
228
|
+
"fingerprint": "GlobalProtect captive portal"
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"cve": "CVE-2026-0257",
|
|
232
|
+
"name": "PAN-OS GlobalProtect auth bypass",
|
|
233
|
+
"product": "Palo Alto PAN-OS / Prisma",
|
|
234
|
+
"class": "auth_bypass",
|
|
235
|
+
"epss": 0.8668,
|
|
236
|
+
"reports": 27,
|
|
237
|
+
"fingerprint": "GlobalProtect portal/gateway"
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"cve": "CVE-2025-4123",
|
|
241
|
+
"name": "Grafana XSS \u2192 SSRF chain",
|
|
242
|
+
"product": "Grafana",
|
|
243
|
+
"class": "xss",
|
|
244
|
+
"epss": 0.9781,
|
|
245
|
+
"reports": 220,
|
|
246
|
+
"fingerprint": "Grafana path traversal + open redirect (Image Renderer)"
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"cve": "CVE-2021-20323",
|
|
250
|
+
"name": "Keycloak reflected XSS (POST)",
|
|
251
|
+
"product": "Keycloak (Red Hat)",
|
|
252
|
+
"class": "xss",
|
|
253
|
+
"epss": 0.3725,
|
|
254
|
+
"reports": 107,
|
|
255
|
+
"fingerprint": "Keycloak auth flows"
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"cve": "CVE-2018-5230",
|
|
259
|
+
"name": "Jira issue collector XSS",
|
|
260
|
+
"product": "Atlassian Jira",
|
|
261
|
+
"class": "xss",
|
|
262
|
+
"epss": 0.3761,
|
|
263
|
+
"reports": 4694,
|
|
264
|
+
"fingerprint": "Jira /issuecollector custom fields"
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
"cve": "CVE-2026-33461",
|
|
268
|
+
"name": "Kibana Fleet endpoint authz (key/token leak)",
|
|
269
|
+
"product": "Elastic Kibana",
|
|
270
|
+
"class": "auth_bypass",
|
|
271
|
+
"epss": 0.0028,
|
|
272
|
+
"reports": 8,
|
|
273
|
+
"fingerprint": "Kibana internal Fleet endpoints"
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
"cve": "CVE-2026-49093",
|
|
277
|
+
"name": "Kibana egress connector SSRF",
|
|
278
|
+
"product": "Elastic Kibana",
|
|
279
|
+
"class": "ssrf",
|
|
280
|
+
"epss": 0.002,
|
|
281
|
+
"reports": 5,
|
|
282
|
+
"fingerprint": "Kibana connectors / allowlist bypass"
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"cve": "CVE-2026-26938",
|
|
286
|
+
"name": "Kibana Workflows template injection \u2192 file read/SSRF",
|
|
287
|
+
"product": "Elastic Kibana",
|
|
288
|
+
"class": "ssti",
|
|
289
|
+
"epss": 0.0025,
|
|
290
|
+
"reports": 5,
|
|
291
|
+
"fingerprint": "Kibana Workflows"
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
"cve": "CVE-2026-33068",
|
|
295
|
+
"name": "Claude Code bypassPermissions via .claude/settings.json",
|
|
296
|
+
"product": "Claude Code",
|
|
297
|
+
"class": "priv_esc",
|
|
298
|
+
"epss": 0.0034,
|
|
299
|
+
"reports": 5,
|
|
300
|
+
"fingerprint": "repo .claude/settings.json"
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"cve": "CVE-2025-25297",
|
|
304
|
+
"name": "Label Studio S3 endpoint SSRF",
|
|
305
|
+
"product": "Label Studio",
|
|
306
|
+
"class": "ssrf",
|
|
307
|
+
"epss": 0.0062,
|
|
308
|
+
"reports": 2,
|
|
309
|
+
"fingerprint": "Label Studio S3 integration"
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
"cve": "CVE-2026-33309",
|
|
313
|
+
"name": "Langflow arbitrary file write \u2192 RCE",
|
|
314
|
+
"product": "Langflow",
|
|
315
|
+
"class": "file_upload",
|
|
316
|
+
"epss": 0.0142,
|
|
317
|
+
"reports": 6,
|
|
318
|
+
"fingerprint": "Langflow multipart upload filename"
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
"cve": "CVE-2026-45543",
|
|
322
|
+
"name": "Nextcloud Forms collaborator read retention",
|
|
323
|
+
"product": "Nextcloud Forms",
|
|
324
|
+
"class": "missing_authz",
|
|
325
|
+
"epss": 0.0027,
|
|
326
|
+
"reports": 5,
|
|
327
|
+
"fingerprint": "Nextcloud Forms collaborator removal"
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
"cve": "CVE-2017-15277",
|
|
331
|
+
"name": "ImageMagick GIF palette memory leak",
|
|
332
|
+
"product": "ImageMagick / GraphicsMagick",
|
|
333
|
+
"class": "infoleak",
|
|
334
|
+
"epss": 0.1919,
|
|
335
|
+
"reports": 5914,
|
|
336
|
+
"fingerprint": "image processing (GIF upload)"
|
|
337
|
+
}
|
|
32
338
|
]
|
|
33
|
-
}
|
|
339
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blitzstrike",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.97",
|
|
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": {
|