blitzstrike 2.4.79 → 2.4.81
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 +32 -0
- package/chains.json +42 -6
- package/dist/index.js +311 -270
- package/intelligence/patterns.json +105 -27
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,38 @@ 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.81] — 2026-09-17
|
|
9
|
+
|
|
10
|
+
### Added — impact-first prioritization via typical bounty payout
|
|
11
|
+
|
|
12
|
+
- Every pattern in `patterns.json` now carries `payout_min` / `payout_max` /
|
|
13
|
+
`typical_payout` (e.g. sql_injection `$1K–$15K`, ssrf `$1K–$15K`, deserialization
|
|
14
|
+
`$5K–$30K`, idor `$1K–$10K`). `pattern_lookup` returns the range so a raw detector
|
|
15
|
+
hit is grounded with its bounty value.
|
|
16
|
+
- `attack_plan` now emits `typical_payout` + `expected_value_usd`
|
|
17
|
+
(`success_probability × payout midpoint`) per vector, so the driving agent can
|
|
18
|
+
prioritize impact-first (highest expected bounty) instead of relevance-only.
|
|
19
|
+
Non-detector vectors (xss / business_logic / open_redirect / …) fall back to a
|
|
20
|
+
curated PAYOUT_FALLBACK table.
|
|
21
|
+
|
|
22
|
+
Competitive analysis source: Awarexone/Agentic-Bug-Hunter (impact-first framing).
|
|
23
|
+
|
|
24
|
+
## [2.4.80] — 2026-09-17
|
|
25
|
+
|
|
26
|
+
### Changed — LLM-facing wiring for the two new web-class detectors
|
|
27
|
+
|
|
28
|
+
- The system prompt ("NEWEST DETECTORS" block) now documents `jwt_alg_confusion`
|
|
29
|
+
and `cache_deception` — what they detect, the CWE, and a concrete TO TRY recipe
|
|
30
|
+
for each — so the LLM knows these detectors exist and how to act on a hit.
|
|
31
|
+
- `orchestrator.ts` escalation map now routes `jwt_alg_confusion` →
|
|
32
|
+
`jwt_alg_confusion_forgery` and `cache_deception` → `cache_deception` chains.
|
|
33
|
+
- Added a dedicated `cache_deception` escalation chain (chains.json) — request an
|
|
34
|
+
authenticated path with a static extension, then re-fetch anonymously — and
|
|
35
|
+
pointed the cache_deception pattern's chain_templates at it.
|
|
36
|
+
|
|
37
|
+
Full end-to-end ground: synonym_lookup → pattern_lookup (CWE + chains + bypass)
|
|
38
|
+
→ severity_calibrate (P1/P2) → list_chains → coverage_matrix.
|
|
39
|
+
|
|
8
40
|
## [2.4.79] — 2026-09-17
|
|
9
41
|
|
|
10
42
|
### Changed — precision pass (FP reduction, benchmark-driven)
|
package/chains.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "blitzstrike-chains-v1",
|
|
3
3
|
"version": "1.0.0",
|
|
4
|
-
"_comment": "Escalation chains. Each chain links a confirmed primitive into a higher-impact outcome. BlitzStrike edge vs other catalogs: every step carries an invariant_check (what MUST hold) and a negative_control (how to refute). Never hardcode in Python
|
|
4
|
+
"_comment": "Escalation chains. Each chain links a confirmed primitive into a higher-impact outcome. BlitzStrike edge vs other catalogs: every step carries an invariant_check (what MUST hold) and a negative_control (how to refute). Never hardcode in Python — edit here.",
|
|
5
5
|
"min_severity": "medium",
|
|
6
6
|
"chains": [
|
|
7
7
|
{
|
|
@@ -603,7 +603,7 @@
|
|
|
603
603
|
"steps": [
|
|
604
604
|
{
|
|
605
605
|
"order": 1,
|
|
606
|
-
"action": "Test alg=none / RS256
|
|
606
|
+
"action": "Test alg=none / RS256→HS256 confusion",
|
|
607
607
|
"tool_hint": "strike_verify",
|
|
608
608
|
"success_criteria": "forged token accepted",
|
|
609
609
|
"invariant_check": "server does not pin algorithm / reuses public key as HMAC secret",
|
|
@@ -1190,7 +1190,7 @@
|
|
|
1190
1190
|
},
|
|
1191
1191
|
{
|
|
1192
1192
|
"order": 4,
|
|
1193
|
-
"action": "Test RS256
|
|
1193
|
+
"action": "Test RS256→HS256: sign with public key as HMAC secret",
|
|
1194
1194
|
"tool_hint": "jwt_tool",
|
|
1195
1195
|
"success_criteria": "Server accepts HS256 token",
|
|
1196
1196
|
"invariant_check": "",
|
|
@@ -2099,7 +2099,7 @@
|
|
|
2099
2099
|
"steps": [
|
|
2100
2100
|
{
|
|
2101
2101
|
"order": 1,
|
|
2102
|
-
"action": "Find dangling CNAME: shop.target.com
|
|
2102
|
+
"action": "Find dangling CNAME: shop.target.com → shops.myshopify.com (404)",
|
|
2103
2103
|
"tool_hint": "subzy",
|
|
2104
2104
|
"success_criteria": "Claimable subdomain found",
|
|
2105
2105
|
"invariant_check": "",
|
|
@@ -2585,7 +2585,7 @@
|
|
|
2585
2585
|
},
|
|
2586
2586
|
{
|
|
2587
2587
|
"order": 4,
|
|
2588
|
-
"action": "Blind extraction: {\"password\":{\"$regex\":\"^a\"}}
|
|
2588
|
+
"action": "Blind extraction: {\"password\":{\"$regex\":\"^a\"}} — iterate chars",
|
|
2589
2589
|
"tool_hint": "nosqlmap",
|
|
2590
2590
|
"success_criteria": "Full DB dumped",
|
|
2591
2591
|
"invariant_check": "",
|
|
@@ -2621,7 +2621,7 @@
|
|
|
2621
2621
|
},
|
|
2622
2622
|
{
|
|
2623
2623
|
"order": 2,
|
|
2624
|
-
"action": "Enumerate users: admin*)(uid=*))(|(uid=*a*)
|
|
2624
|
+
"action": "Enumerate users: admin*)(uid=*))(|(uid=*a*) — check response delta",
|
|
2625
2625
|
"tool_hint": "manual",
|
|
2626
2626
|
"success_criteria": "User list built",
|
|
2627
2627
|
"invariant_check": "",
|
|
@@ -2754,6 +2754,42 @@
|
|
|
2754
2754
|
"curl",
|
|
2755
2755
|
"swaks"
|
|
2756
2756
|
]
|
|
2757
|
+
},
|
|
2758
|
+
{
|
|
2759
|
+
"id": "cache_deception",
|
|
2760
|
+
"name": "Web Cache Deception",
|
|
2761
|
+
"triggers": [
|
|
2762
|
+
"cache deception",
|
|
2763
|
+
"cache key",
|
|
2764
|
+
"static extension",
|
|
2765
|
+
"cookie-less cache"
|
|
2766
|
+
],
|
|
2767
|
+
"required_findings": [
|
|
2768
|
+
"cache_deception"
|
|
2769
|
+
],
|
|
2770
|
+
"severity": "high",
|
|
2771
|
+
"steps": [
|
|
2772
|
+
{
|
|
2773
|
+
"order": 1,
|
|
2774
|
+
"action": "Request an authenticated path with a static extension appended (.css/.js/.png)",
|
|
2775
|
+
"tool_hint": "cache_gap / strike_verify",
|
|
2776
|
+
"success_criteria": "the private response is cached under the static URL",
|
|
2777
|
+
"invariant_check": "cache key omits the session cookie while the backend serves per-session data",
|
|
2778
|
+
"negative_control": "cookie included in cache key = victim response not cached"
|
|
2779
|
+
},
|
|
2780
|
+
{
|
|
2781
|
+
"order": 2,
|
|
2782
|
+
"action": "Re-fetch the same URL anonymously and confirm the victim's private body is returned",
|
|
2783
|
+
"tool_hint": "curl / strike_verify",
|
|
2784
|
+
"success_criteria": "victim-session data disclosed to an anonymous caller",
|
|
2785
|
+
"invariant_check": "cache serves the cached body regardless of the requester's session",
|
|
2786
|
+
"negative_control": "cache bypassed or auth required on re-fetch = no disclosure"
|
|
2787
|
+
}
|
|
2788
|
+
],
|
|
2789
|
+
"tools": [
|
|
2790
|
+
"curl",
|
|
2791
|
+
"cache_gap"
|
|
2792
|
+
]
|
|
2757
2793
|
}
|
|
2758
2794
|
]
|
|
2759
2795
|
}
|