blitzstrike 2.4.76 → 2.4.78

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 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
+ ## [2.4.78] — 2026-09-17
9
+
10
+ ### Fixed — taint-engine sanitizer name collision (whole-class FN)
11
+
12
+ - The Python taint adapter neutralized every identifier inside a sanitizer call
13
+ (e.g. `int(os.environ.get("PORT", "5000"))` neutralized the method name `get`
14
+ for sql_execution/command_execution). Because taint state is keyed by name, that
15
+ polluted the `get` in `request.args.get(...)` elsewhere and wrongly suppressed
16
+ real findings (labs20 f-string SQLi went undetected). Sanitizers now only
17
+ neutralize VALUE arguments, skipping dotted-chain receiver/method names and
18
+ string literals. Python f-string SQLi (`request.args.get -> f"{var}" -> execute`)
19
+ is now caught.
20
+
21
+ ## [2.4.77] — 2026-09-17
22
+
23
+ ### Changed — SQLi Node/Python coverage + missing_authz root-path precision
24
+
25
+ - `detectSqlInjection` now matches Node/Python sinks (`pool.query`, `client.query`,
26
+ `connection.query`, `db.query`, `pg.query`, `sequelize.query`, `knex.raw`,
27
+ `sqlx::query(&format!`, `cursor.execute` / `.execute`) and recognizes Node
28
+ template-literal `${var}`, Python f-string `{var}`, and JS `+ var` interpolation
29
+ as string-built queries (cross-file case).
30
+ - `detectRouteAuthz` now skips root/empty paths (`@app.get("/")`) as public-by-design
31
+ (was flagging the index route), plus `home`/`index`/`root` route segments.
32
+
8
33
  ## [2.4.76] — 2026-09-17
9
34
 
10
35
  ### Fixed — config/manifest files were not scanned (whole-class FN)
package/dist/index.js CHANGED
@@ -16098,7 +16098,7 @@ var init_framework_security = __esm(() => {
16098
16098
  { framework: "aspnet", entry: /\[Http(?:Get|Post|Put|Delete|Patch)\b/g, auth: /\[Authorize|User\.Identity|IsInRole|AuthorizeAsync|\[AllowAnonymous|IAuthorizationService/, window: 2 },
16099
16099
  { framework: "rails", entry: /class\s+\w+\s*<\s*ApplicationController/g, auth: /before_action\s+:authenticate|before_action\s+:authorize|authenticate_user!|authorize\s+|current_user|authenticate/, window: 6 }
16100
16100
  ];
16101
- PUBLIC_ROUTE_RE = /['"`]\/?(?:(?:api|v1|v2|o|auth|adminapi)\/)?(?:register|login|logout|signup|signin|forgot-password|reset-password|health|healthz|ready|status|version|ping|static|public|assets|css|js|img|favicon|echo|config|docs|openapi|swagger|robots|sitemap|graphql|graphiql|query|upload|callback|webhook)[/'"?]|['"`]\/?['"`]$/i;
16101
+ PUBLIC_ROUTE_RE = /['"`]\/?(?:(?:api|v1|v2|o|auth|adminapi)\/)?(?:register|login|logout|signup|signin|forgot-password|reset-password|health|healthz|ready|status|version|ping|static|public|assets|css|js|img|favicon|echo|config|docs|openapi|swagger|robots|sitemap|graphql|graphiql|query|upload|callback|webhook|home|index|root)[/'"?]|['"`]\/?['"`](?!["'`])/i;
16102
16102
  });
16103
16103
 
16104
16104
  // src/complex-bugs.ts
@@ -16543,7 +16543,7 @@ function detectUnrestrictedUpload(code, file, out) {
16543
16543
  }
16544
16544
  function detectSqlInjection(code, file, out) {
16545
16545
  const ls = lines2(code);
16546
- const sinkRe = /\$wpdb->(get_results|get_col|get_var|get_row|query)\s*\(|->query\s*\(|->execute\s*\(|mysqli_query\s*\(|pg_query\s*\(|DB::unprepared\s*\(|[->.]whereRaw\s*\(|[->.]selectRaw\s*\(/g;
16546
+ const sinkRe = /\$wpdb->(get_results|get_col|get_var|get_row|query)\s*\(|[->.]query\s*\(|[->.]execute\s*\(|mysqli_query\s*\(|pg_query\s*\(|DB::unprepared\s*\(|[->.]whereRaw\s*\(|[->.]selectRaw\s*\(|sqlx::query(?:_as)?\s*\(\s*&\s*format!|sequelize\.query\s*\(|knex\.raw\s*\(|\bpool\.query\s*\(|\bclient\.query\s*\(|\bconnection\.query\s*\(|\bdb\.query\s*\(|\bpg\.query\s*\(/g;
16547
16547
  let m;
16548
16548
  while ((m = sinkRe.exec(code)) !== null) {
16549
16549
  const ln = lineNo2(code, m.index);
@@ -16554,8 +16554,8 @@ function detectSqlInjection(code, file, out) {
16554
16554
  continue;
16555
16555
  if (SOURCE_TOKENS3.test(scope))
16556
16556
  continue;
16557
- const inlineConcat = /(\.\s*\$[A-Za-z_]\w*|\+\s*[A-Za-z_$]\w*)/.test(l);
16558
- const assignConcat = /(?:^|\n)\s*\$[A-Za-z_]\w*\s*(?:\.=|=)\s*[^;\n]*["'][^"']*["']\s*\.\s*\$[A-Za-z_]\w*/.test(scope);
16557
+ const inlineConcat = /(\.\s*\$[A-Za-z_]\w*|\+\s*[A-Za-z_$]\w*|\$\{[^}]+\}|<<\s*[A-Za-z_$]|\{[A-Za-z_]\w*\})/.test(l);
16558
+ const assignConcat = /(?:^|\n)\s*\$[A-Za-z_]\w*\s*(?:\.=|=)\s*[^;\n]*["'][^"']*["']\s*\.\s*\$[A-Za-z_]\w*/.test(scope) || /(?:^|\n)\s*(?:const|let|var)\s+[A-Za-z_$]\w*\s*=\s*`[^`]*\$\{[^}]+\}[^`]*`/.test(scope) || /(?:^|\n)\s*[A-Za-z_]\w*\s*=\s*f["']/.test(scope);
16559
16559
  if (!inlineConcat && !assignConcat)
16560
16560
  continue;
16561
16561
  out.push({
@@ -56908,9 +56908,13 @@ var pythonAdapter = {
56908
56908
  sinks.push({ variable: v, kind, line: lineOf(n), cwe });
56909
56909
  }
56910
56910
  for (const [re, kinds] of PY_SANITIZERS) {
56911
- if (re.test(full))
56912
- for (const v of argVars)
56911
+ if (re.test(full)) {
56912
+ for (const v of argVars) {
56913
+ if (new RegExp(`\\b${v}\\s*[.(]`).test(full))
56914
+ continue;
56913
56915
  sanitizers.push({ variable: v, neutralizes: kinds, line: lineOf(n) });
56916
+ }
56917
+ }
56914
56918
  }
56915
56919
  calls.push({ name: callee, args: argVars, line: lineOf(n) });
56916
56920
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blitzstrike",
3
- "version": "2.4.76",
3
+ "version": "2.4.78",
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": {