blitzstrike 2.4.48 → 2.4.49

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,19 @@ 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.49] — 2026-09-14
9
+
10
+ ### Changed — REST permission_callback precision (traced to WP_REST_Server)
11
+
12
+ - Traced WP core `class-wp-rest-server.php` dispatch: `permission_callback` is
13
+ OPTIONAL and defaults to PUBLIC when absent. Now distinguishes three cases:
14
+ missing (HIGH — forgot, defaults public), `__return_true` (MEDIUM — explicitly
15
+ public, the classic "commented out check_admin_permission" pattern), and a
16
+ real callback (skip — function/method/current_user_can).
17
+ - Sanitizer table widened to the full `formatting.php` surface: `esc_textarea`,
18
+ `esc_js`, `sanitize_url`, `sanitize_title`, `sanitize_title_with_dashes`,
19
+ `sanitize_user`, `wp_validate_boolean`.
20
+
8
21
  ## [2.4.48] — 2026-09-14
9
22
 
10
23
  ### Changed — Precision + consistency (traced to WP core dispatch)
package/dist/index.js CHANGED
@@ -56202,6 +56202,8 @@ var SANITIZERS2 = {
56202
56202
  esc_attr: { context: "html_attr", level: "sanitized" },
56203
56203
  esc_url: { context: "url", level: "sanitized" },
56204
56204
  esc_url_raw: { context: "url", level: "sanitized" },
56205
+ esc_textarea: { context: "html", level: "sanitized" },
56206
+ esc_js: { context: "js", level: "sanitized" },
56205
56207
  urlencode: { context: "url", level: "sanitized" },
56206
56208
  rawurlencode: { context: "url", level: "sanitized" },
56207
56209
  wp_json_encode: { context: "json", level: "sanitized" },
@@ -56211,7 +56213,12 @@ var SANITIZERS2 = {
56211
56213
  sanitize_key: { context: "key", level: "validated" },
56212
56214
  sanitize_email: { context: "email", level: "validated" },
56213
56215
  sanitize_file_name: { context: "filename", level: "validated" },
56214
- filter_var: { context: "validated", level: "validated" }
56216
+ sanitize_url: { context: "url", level: "validated" },
56217
+ sanitize_title: { context: "slug", level: "validated" },
56218
+ sanitize_title_with_dashes: { context: "slug", level: "validated" },
56219
+ sanitize_user: { context: "username", level: "validated" },
56220
+ filter_var: { context: "validated", level: "validated" },
56221
+ wp_validate_boolean: { context: "validated", level: "validated" }
56215
56222
  };
56216
56223
  var PSEUDO_SANITIZERS = new Set([
56217
56224
  "trim",
@@ -56529,8 +56536,14 @@ function detectWpAuthz(code, file, out) {
56529
56536
  while ((m = restRe.exec(code)) !== null) {
56530
56537
  const line = lineNoOf(code, m.index);
56531
56538
  const window2 = code.slice(m.index, m.index + 800);
56532
- if (/permission_callback/.test(window2))
56539
+ const pc = window2.match(/permission_callback['"]?\s*=>\s*(.+?)(?:,|\s*\n|\])/);
56540
+ if (pc) {
56541
+ const expr = pc[1].trim();
56542
+ if (/__return_true/.test(expr)) {
56543
+ out.push({ file, line, type: "missing_authz", category: "REST route explicitly public (__return_true)", severity: "medium", evidence: `register_rest_route('${m[1]}', '${m[2]}')`, detail: `REST route '${m[1]}${m[2]}' sets permission_callback to __return_true (always allow) — verify the endpoint does not expose sensitive data or perform privileged actions.` });
56544
+ }
56533
56545
  continue;
56546
+ }
56534
56547
  out.push({ file, line, type: "missing_authz", category: "REST route missing permission_callback", severity: "high", evidence: `register_rest_route('${m[1]}', '${m[2]}')`, detail: `REST route '${m[1]}${m[2]}' has no permission_callback — the endpoint defaults to public (auth bypass).` });
56535
56548
  }
56536
56549
  const formRe = /add_action\s*\(\s*['"](init|admin_init|wp_loaded|template_redirect|parse_request|wp)['"]\s*,\s*(.+?)\s*\)/g;
@@ -57953,7 +57966,7 @@ var ENTERPRISE_FIXTURES = [
57953
57966
  { id: "js-express", dir: join18(ROOT6, "js-express"), expected_vulns: 2 },
57954
57967
  { id: "py-django", dir: join18(ROOT6, "py-django"), expected_vulns: 2 },
57955
57968
  { id: "java-spring", dir: join18(ROOT6, "java-spring"), expected_vulns: 2 },
57956
- { id: "wp-batch-route", dir: join18(ROOT6, "wp-batch-route"), expected_vulns: 2 },
57969
+ { id: "wp-batch-route", dir: join18(ROOT6, "wp-batch-route"), expected_vulns: 3 },
57957
57970
  { id: "php-complex", dir: join18(ROOT6, "php-complex"), expected_vulns: 4 }
57958
57971
  ];
57959
57972
  function sourceFiles(root) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blitzstrike",
3
- "version": "2.4.48",
3
+ "version": "2.4.49",
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": {