@akasecurity/cli 0.8.1 → 0.9.0-rc1

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.
Files changed (215) hide show
  1. package/README.md +2 -0
  2. package/dist/cli.js +2353 -1293
  3. package/package.json +12 -6
  4. package/web-ui/packages/dashboard-ui/package.json +1 -1
  5. package/web-ui/packages/detections/package.json +2 -2
  6. package/web-ui/packages/local-ops/package.json +3 -2
  7. package/web-ui/packages/persistence/package.json +2 -2
  8. package/web-ui/packages/plugin-sdk/package.json +29 -0
  9. package/web-ui/packages/schema/package.json +2 -2
  10. package/web-ui/rules/code-flaws/auth-jwt-no-verify.json +20 -0
  11. package/web-ui/rules/code-flaws/auth-ssl-verify-false.json +19 -0
  12. package/web-ui/rules/code-flaws/cmd-inject-exec.json +20 -0
  13. package/web-ui/rules/code-flaws/cmd-inject-node-exec.json +20 -0
  14. package/web-ui/rules/code-flaws/cmd-inject-shell.json +20 -0
  15. package/web-ui/rules/code-flaws/crypto-insecure-random.json +20 -0
  16. package/web-ui/rules/code-flaws/crypto-weak-hash-md5.json +16 -0
  17. package/web-ui/rules/code-flaws/crypto-weak-hash-sha1.json +23 -0
  18. package/web-ui/rules/code-flaws/deser-java-ois.json +22 -0
  19. package/web-ui/rules/code-flaws/deser-pickle.json +16 -0
  20. package/web-ui/rules/code-flaws/deser-yaml-unsafe.json +16 -0
  21. package/web-ui/rules/code-flaws/dev-debug-enabled.json +13 -0
  22. package/web-ui/rules/code-flaws/dev-placeholder-secret.json +24 -0
  23. package/web-ui/rules/code-flaws/dev-wildcard-cors.json +17 -0
  24. package/web-ui/rules/code-flaws/eval-dynamic-exec.json +17 -0
  25. package/web-ui/rules/code-flaws/hardcoded-password.json +23 -0
  26. package/web-ui/rules/code-flaws/hardcoded-secret-key.json +17 -0
  27. package/web-ui/rules/code-flaws/path-traversal-join.json +19 -0
  28. package/web-ui/rules/code-flaws/path-traversal-open.json +20 -0
  29. package/web-ui/rules/code-flaws/prototype-pollution-merge.json +16 -0
  30. package/web-ui/rules/code-flaws/regex-redos-backtrack.json +13 -0
  31. package/web-ui/rules/code-flaws/sql-inject-concat-dot.json +16 -0
  32. package/web-ui/rules/code-flaws/sql-inject-concat.json +13 -0
  33. package/web-ui/rules/code-flaws/sql-inject-format.json +16 -0
  34. package/web-ui/rules/code-flaws/sql-inject-interp.json +19 -0
  35. package/web-ui/rules/code-flaws/ssrf-user-url.json +16 -0
  36. package/web-ui/rules/code-flaws/xss-dangerously-set.json +16 -0
  37. package/web-ui/rules/code-flaws/xss-inner-html.json +16 -0
  38. package/web-ui/rules/code-flaws/xss-unescaped-render.json +16 -0
  39. package/web-ui/rules/core-code-context/db-table-name.json +29 -0
  40. package/web-ui/rules/core-code-context/feature-flag.json +24 -0
  41. package/web-ui/rules/core-code-context/file-path.json +17 -0
  42. package/web-ui/rules/core-code-context/internal-domain.json +13 -0
  43. package/web-ui/rules/core-code-context/internal-ip.json +13 -0
  44. package/web-ui/rules/core-code-context/internal-url.json +27 -0
  45. package/web-ui/rules/core-code-context/localhost-ref.json +13 -0
  46. package/web-ui/rules/core-code-context/stack-trace.json +13 -0
  47. package/web-ui/rules/core-financial/credit-card.json +14 -0
  48. package/web-ui/rules/core-financial/cusip.json +14 -0
  49. package/web-ui/rules/core-financial/cvv.json +13 -0
  50. package/web-ui/rules/core-financial/iban.json +17 -0
  51. package/web-ui/rules/core-financial/paypal.json +14 -0
  52. package/web-ui/rules/core-financial/routing-number.json +14 -0
  53. package/web-ui/rules/core-financial/salary.json +23 -0
  54. package/web-ui/rules/core-financial/swift.json +14 -0
  55. package/web-ui/rules/core-phi/biometric-ref.json +23 -0
  56. package/web-ui/rules/core-phi/genetic-data.json +24 -0
  57. package/web-ui/rules/core-phi/group-id.json +19 -0
  58. package/web-ui/rules/core-phi/hipaa-identifier.json +13 -0
  59. package/web-ui/rules/core-phi/icd10-code.json +14 -0
  60. package/web-ui/rules/core-phi/member-id.json +13 -0
  61. package/web-ui/rules/core-phi/mrn.json +13 -0
  62. package/web-ui/rules/core-phi/ndc-code.json +13 -0
  63. package/web-ui/rules/core-pii/dob.json +18 -0
  64. package/web-ui/rules/core-pii/drivers-license-us.json +14 -0
  65. package/web-ui/rules/core-pii/email.json +13 -0
  66. package/web-ui/rules/core-pii/home-address.json +21 -0
  67. package/web-ui/rules/core-pii/ip-address.json +13 -0
  68. package/web-ui/rules/core-pii/mac-address.json +13 -0
  69. package/web-ui/rules/core-pii/name.json +21 -0
  70. package/web-ui/rules/core-pii/national-id.json +27 -0
  71. package/web-ui/rules/core-pii/passport-us.json +17 -0
  72. package/web-ui/rules/core-pii/phone-intl.json +13 -0
  73. package/web-ui/rules/core-pii/phone-us.json +17 -0
  74. package/web-ui/rules/core-pii/ssn.json +13 -0
  75. package/web-ui/rules/core-pii/vin.json +13 -0
  76. package/web-ui/rules/core-pii/zip.json +30 -0
  77. package/web-ui/rules/secrets/anthropic-api-key.json +14 -0
  78. package/web-ui/rules/secrets/aws-access-key.json +14 -0
  79. package/web-ui/rules/secrets/aws-secret-key.json +15 -0
  80. package/web-ui/rules/secrets/azure-connection-string.json +13 -0
  81. package/web-ui/rules/secrets/cloudflare-api-key.json +15 -0
  82. package/web-ui/rules/secrets/datadog-key.json +15 -0
  83. package/web-ui/rules/secrets/digitalocean-token.json +13 -0
  84. package/web-ui/rules/secrets/discord-token.json +14 -0
  85. package/web-ui/rules/secrets/gcp-service-account.json +16 -0
  86. package/web-ui/rules/secrets/github-pat.json +16 -0
  87. package/web-ui/rules/secrets/gitlab-token.json +14 -0
  88. package/web-ui/rules/secrets/heroku-api-key.json +14 -0
  89. package/web-ui/rules/secrets/npm-token.json +14 -0
  90. package/web-ui/rules/secrets/openai-api-key.json +14 -0
  91. package/web-ui/rules/secrets/pulumi-access-token.json +14 -0
  92. package/web-ui/rules/secrets/sendgrid-key.json +14 -0
  93. package/web-ui/rules/secrets/slack-token.json +13 -0
  94. package/web-ui/rules/secrets/stripe-live-key.json +14 -0
  95. package/web-ui/rules/secrets/terraform-cloud-token.json +16 -0
  96. package/web-ui/rules/secrets/twilio-key.json +13 -0
  97. package/web-ui/rules/secrets/vault-token.json +14 -0
  98. package/web-ui/rules/secrets-infra/api-key-header.json +15 -0
  99. package/web-ui/rules/secrets-infra/basic-auth-header.json +13 -0
  100. package/web-ui/rules/secrets-infra/basic-auth-url.json +13 -0
  101. package/web-ui/rules/secrets-infra/bearer-token.json +17 -0
  102. package/web-ui/rules/secrets-infra/db-connection-string.json +13 -0
  103. package/web-ui/rules/secrets-infra/docker-config-auth.json +13 -0
  104. package/web-ui/rules/secrets-infra/env-key-value.json +14 -0
  105. package/web-ui/rules/secrets-infra/generic-high-entropy-secret.json +18 -0
  106. package/web-ui/rules/secrets-infra/jwt-token.json +16 -0
  107. package/web-ui/rules/secrets-infra/kubeconfig-token.json +14 -0
  108. package/web-ui/rules/secrets-infra/password-field.json +14 -0
  109. package/web-ui/rules/secrets-infra/pgp-private-key.json +15 -0
  110. package/web-ui/rules/secrets-infra/ssh-private-key.json +15 -0
  111. package/web-ui/web-ui/.next/BUILD_ID +1 -1
  112. package/web-ui/web-ui/.next/app-build-manifest.json +56 -55
  113. package/web-ui/web-ui/.next/app-path-routes-manifest.json +6 -6
  114. package/web-ui/web-ui/.next/build-manifest.json +2 -2
  115. package/web-ui/web-ui/.next/prerender-manifest.json +15 -15
  116. package/web-ui/web-ui/.next/required-server-files.json +4 -3
  117. package/web-ui/web-ui/.next/server/app/(app)/activity/page.js +2 -2
  118. package/web-ui/web-ui/.next/server/app/(app)/activity/page.js.nft.json +1 -1
  119. package/web-ui/web-ui/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
  120. package/web-ui/web-ui/.next/server/app/(app)/data-shares/page.js +2 -2
  121. package/web-ui/web-ui/.next/server/app/(app)/data-shares/page.js.nft.json +1 -1
  122. package/web-ui/web-ui/.next/server/app/(app)/data-shares/page_client-reference-manifest.js +1 -1
  123. package/web-ui/web-ui/.next/server/app/(app)/detections/page.js +2 -2
  124. package/web-ui/web-ui/.next/server/app/(app)/detections/page.js.nft.json +1 -1
  125. package/web-ui/web-ui/.next/server/app/(app)/detections/page_client-reference-manifest.js +1 -1
  126. package/web-ui/web-ui/.next/server/app/(app)/exceptions/[id]/page.js +2 -2
  127. package/web-ui/web-ui/.next/server/app/(app)/exceptions/[id]/page.js.nft.json +1 -1
  128. package/web-ui/web-ui/.next/server/app/(app)/exceptions/[id]/page_client-reference-manifest.js +1 -1
  129. package/web-ui/web-ui/.next/server/app/(app)/exceptions/new/page.js +2 -2
  130. package/web-ui/web-ui/.next/server/app/(app)/exceptions/new/page.js.nft.json +1 -1
  131. package/web-ui/web-ui/.next/server/app/(app)/exceptions/new/page_client-reference-manifest.js +1 -1
  132. package/web-ui/web-ui/.next/server/app/(app)/exceptions/page.js +1 -1
  133. package/web-ui/web-ui/.next/server/app/(app)/exceptions/page.js.nft.json +1 -1
  134. package/web-ui/web-ui/.next/server/app/(app)/exceptions/page_client-reference-manifest.js +1 -1
  135. package/web-ui/web-ui/.next/server/app/(app)/findings/page.js +2 -2
  136. package/web-ui/web-ui/.next/server/app/(app)/findings/page.js.nft.json +1 -1
  137. package/web-ui/web-ui/.next/server/app/(app)/findings/page_client-reference-manifest.js +1 -1
  138. package/web-ui/web-ui/.next/server/app/(app)/inventory/page.js +2 -2
  139. package/web-ui/web-ui/.next/server/app/(app)/inventory/page.js.nft.json +1 -1
  140. package/web-ui/web-ui/.next/server/app/(app)/inventory/page_client-reference-manifest.js +1 -1
  141. package/web-ui/web-ui/.next/server/app/(app)/policies/page.js +2 -2
  142. package/web-ui/web-ui/.next/server/app/(app)/policies/page.js.nft.json +1 -1
  143. package/web-ui/web-ui/.next/server/app/(app)/policies/page_client-reference-manifest.js +1 -1
  144. package/web-ui/web-ui/.next/server/app/(app)/scan/page.js +1 -1
  145. package/web-ui/web-ui/.next/server/app/(app)/scan/page.js.nft.json +1 -1
  146. package/web-ui/web-ui/.next/server/app/(app)/scan/page_client-reference-manifest.js +1 -1
  147. package/web-ui/web-ui/.next/server/app/(app)/security/page.js +1 -1
  148. package/web-ui/web-ui/.next/server/app/(app)/security/page.js.nft.json +1 -1
  149. package/web-ui/web-ui/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -1
  150. package/web-ui/web-ui/.next/server/app/(app)/settings/page.js +2 -2
  151. package/web-ui/web-ui/.next/server/app/(app)/settings/page.js.nft.json +1 -1
  152. package/web-ui/web-ui/.next/server/app/(app)/settings/page_client-reference-manifest.js +1 -1
  153. package/web-ui/web-ui/.next/server/app/(app)/updates/page.js +2 -2
  154. package/web-ui/web-ui/.next/server/app/(app)/updates/page.js.nft.json +1 -1
  155. package/web-ui/web-ui/.next/server/app/(app)/updates/page_client-reference-manifest.js +1 -1
  156. package/web-ui/web-ui/.next/server/app/_not-found/page.js +1 -1
  157. package/web-ui/web-ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  158. package/web-ui/web-ui/.next/server/app/_not-found.html +1 -1
  159. package/web-ui/web-ui/.next/server/app/_not-found.rsc +2 -2
  160. package/web-ui/web-ui/.next/server/app/index.html +1 -1
  161. package/web-ui/web-ui/.next/server/app/index.rsc +2 -2
  162. package/web-ui/web-ui/.next/server/app/page.js +1 -1
  163. package/web-ui/web-ui/.next/server/app/page_client-reference-manifest.js +1 -1
  164. package/web-ui/web-ui/.next/server/app-paths-manifest.json +6 -6
  165. package/web-ui/web-ui/.next/server/chunks/366.js +582 -0
  166. package/web-ui/web-ui/.next/server/chunks/45.js +1 -1
  167. package/web-ui/web-ui/.next/server/chunks/461.js +5 -5
  168. package/web-ui/web-ui/.next/server/chunks/484.js +580 -0
  169. package/web-ui/web-ui/.next/server/chunks/773.js +4 -4
  170. package/web-ui/web-ui/.next/server/chunks/900.js +1 -0
  171. package/web-ui/web-ui/.next/server/chunks/918.js +2 -0
  172. package/web-ui/web-ui/.next/server/functions-config-manifest.json +5 -5
  173. package/web-ui/web-ui/.next/server/middleware-manifest.json +5 -5
  174. package/web-ui/web-ui/.next/server/pages/404.html +1 -1
  175. package/web-ui/web-ui/.next/server/pages/500.html +1 -1
  176. package/web-ui/web-ui/.next/server/server-reference-manifest.js +1 -1
  177. package/web-ui/web-ui/.next/server/server-reference-manifest.json +1 -1
  178. package/web-ui/web-ui/.next/static/chunks/{24-b20c857178647805.js → 24-55b96836aea5ce23.js} +3 -3
  179. package/web-ui/web-ui/.next/static/chunks/561-c3388f066f813e17.js +1 -0
  180. package/web-ui/web-ui/.next/static/chunks/app/(app)/activity/page-0c208c8b275a69ac.js +1 -0
  181. package/web-ui/web-ui/.next/static/chunks/app/(app)/data-shares/page-041187c76bd42461.js +1 -0
  182. package/web-ui/web-ui/.next/static/chunks/app/(app)/detections/page-481fedcbfb474cef.js +1 -0
  183. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/[id]/page-a20e7d7a2f0ad507.js +1 -0
  184. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/new/page-2cfe42c3dd4833c3.js +1 -0
  185. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/page-849d66cc2cd77cb6.js +1 -0
  186. package/web-ui/web-ui/.next/static/chunks/app/(app)/findings/page-d33f3999e89c7e77.js +1 -0
  187. package/web-ui/web-ui/.next/static/chunks/app/(app)/inventory/page-76edd10592ba3cb1.js +1 -0
  188. package/web-ui/web-ui/.next/static/chunks/app/(app)/layout-d15081016f40ac92.js +1 -0
  189. package/web-ui/web-ui/.next/static/chunks/app/(app)/scan/page-50b604f229747240.js +1 -0
  190. package/web-ui/web-ui/.next/static/chunks/app/(app)/settings/page-92d1086c8e8ed3bf.js +1 -0
  191. package/web-ui/web-ui/.next/static/chunks/app/(app)/updates/{page-b9607b5e2e8700d6.js → page-c3c1671d32547619.js} +1 -1
  192. package/web-ui/web-ui/.next/static/chunks/app/{layout-8b19b03146218dc7.js → layout-40fea3e270a8e120.js} +1 -1
  193. package/web-ui/web-ui/.next/static/css/43f95c94ecc1bd17.css +2 -0
  194. package/web-ui/web-ui/package.json +1 -1
  195. package/web-ui/web-ui/server.js +1 -1
  196. package/LICENSE +0 -201
  197. package/web-ui/web-ui/.next/server/chunks/116.js +0 -536
  198. package/web-ui/web-ui/.next/server/chunks/223.js +0 -534
  199. package/web-ui/web-ui/.next/server/chunks/226.js +0 -2
  200. package/web-ui/web-ui/.next/server/chunks/640.js +0 -1
  201. package/web-ui/web-ui/.next/static/chunks/561-3a19cd28d2b941fa.js +0 -1
  202. package/web-ui/web-ui/.next/static/chunks/app/(app)/activity/page-f6b1b344709ee48e.js +0 -1
  203. package/web-ui/web-ui/.next/static/chunks/app/(app)/data-shares/page-548fa0d3dee6e829.js +0 -1
  204. package/web-ui/web-ui/.next/static/chunks/app/(app)/detections/page-0bfa1f371b65b5ad.js +0 -1
  205. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/[id]/page-56ec5c05f347108a.js +0 -1
  206. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/new/page-cb33dc32fd3648bf.js +0 -1
  207. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/page-b6fbc540ef0a50f8.js +0 -1
  208. package/web-ui/web-ui/.next/static/chunks/app/(app)/findings/page-94eb9d838ae00222.js +0 -1
  209. package/web-ui/web-ui/.next/static/chunks/app/(app)/inventory/page-89cf3ac5a30e76a0.js +0 -1
  210. package/web-ui/web-ui/.next/static/chunks/app/(app)/layout-a86819fe3aeb2491.js +0 -1
  211. package/web-ui/web-ui/.next/static/chunks/app/(app)/scan/page-0d43a6b2acafe349.js +0 -1
  212. package/web-ui/web-ui/.next/static/chunks/app/(app)/settings/page-2cf02a09402cfb4d.js +0 -1
  213. package/web-ui/web-ui/.next/static/css/69dfaec5234c6b99.css +0 -2
  214. /package/web-ui/web-ui/.next/static/{X9C7-HlMI5zAQEKfIW_6e → unUYwnPVSRwxtrUFgSAxr}/_buildManifest.js +0 -0
  215. /package/web-ui/web-ui/.next/static/{X9C7-HlMI5zAQEKfIW_6e → unUYwnPVSRwxtrUFgSAxr}/_ssgManifest.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akasecurity/cli",
3
- "version": "0.8.1",
3
+ "version": "0.9.0-rc1",
4
4
  "description": "AI Traffic Control — local-first CLI to inspect and govern AI agent traffic on your machine",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -32,9 +32,10 @@
32
32
  "react-dom": "^19.2.7"
33
33
  },
34
34
  "devDependencies": {
35
- "@types/node": "^26.1.1",
35
+ "@types/node": "^24.13.3",
36
36
  "@types/react": "^19.2.17",
37
37
  "eslint": "^9.0.0",
38
+ "postject": "^1.0.0-alpha.6",
38
39
  "tsup": "^8.0.0",
39
40
  "tsx": "^4.23.1",
40
41
  "typescript": "^5.8.0",
@@ -43,16 +44,21 @@
43
44
  "@akasecurity/detections": "0.8.0",
44
45
  "@akasecurity/eslint-config": "0.8.0",
45
46
  "@akasecurity/local-ops": "0.8.0",
46
- "@akasecurity/plugin-sdk": "0.8.0",
47
- "@akasecurity/schema": "0.8.0",
48
47
  "@akasecurity/persistence": "0.8.0",
49
- "@akasecurity/web-ui": "0.8.0"
48
+ "@akasecurity/web-ui": "0.8.0",
49
+ "@akasecurity/plugin-sdk": "0.8.0",
50
+ "@akasecurity/schema": "0.8.0"
50
51
  },
51
52
  "scripts": {
52
53
  "dev": "tsx src/cli.ts",
53
54
  "build": "tsup",
55
+ "build:sea": "tsup --config tsup.sea.config.ts",
56
+ "smoke:sea": "node scripts/smoke-sea.mjs",
57
+ "smoke:dashboard": "node scripts/smoke-dashboard.mjs",
58
+ "package:sea": "node scripts/package-sea.mjs",
59
+ "archive:sea": "node scripts/archive-sea.mjs",
54
60
  "bundle:web-ui": "node scripts/bundle-web-ui.mjs",
55
- "lint": "eslint src",
61
+ "lint": "eslint src test",
56
62
  "test": "vitest run",
57
63
  "typecheck": "tsc --noEmit"
58
64
  }
@@ -8,7 +8,7 @@
8
8
  "./recommendations": "./src/security/recommendations.ts"
9
9
  },
10
10
  "scripts": {
11
- "lint": "eslint src",
11
+ "lint": "eslint src test",
12
12
  "typecheck": "tsc --noEmit",
13
13
  "test": "vitest run"
14
14
  },
@@ -7,7 +7,7 @@
7
7
  ".": "./src/index.ts"
8
8
  },
9
9
  "scripts": {
10
- "lint": "eslint src",
10
+ "lint": "eslint src test",
11
11
  "typecheck": "tsc --noEmit",
12
12
  "test": "vitest run"
13
13
  },
@@ -17,7 +17,7 @@
17
17
  "devDependencies": {
18
18
  "@akasecurity/eslint-config": "workspace:*",
19
19
  "@akasecurity/extract": "workspace:*",
20
- "@types/node": "^26.1.1",
20
+ "@types/node": "^24.13.3",
21
21
  "eslint": "^9.0.0",
22
22
  "typescript": "^5.8.0",
23
23
  "vitest": "^4.1.10"
@@ -7,19 +7,20 @@
7
7
  ".": "./src/index.ts"
8
8
  },
9
9
  "scripts": {
10
- "lint": "eslint src",
10
+ "lint": "eslint src test",
11
11
  "typecheck": "tsc --noEmit",
12
12
  "test": "vitest run"
13
13
  },
14
14
  "dependencies": {
15
15
  "@akasecurity/detections": "workspace:*",
16
16
  "@akasecurity/persistence": "workspace:*",
17
+ "@akasecurity/plugin-sdk": "workspace:*",
17
18
  "@akasecurity/schema": "workspace:*",
18
19
  "ignore": "^7.0.6"
19
20
  },
20
21
  "devDependencies": {
21
22
  "@akasecurity/eslint-config": "workspace:*",
22
- "@types/node": "^26.1.1",
23
+ "@types/node": "^24.13.3",
23
24
  "eslint": "^9.0.0",
24
25
  "typescript": "^5.8.0",
25
26
  "vitest": "^4.1.10"
@@ -7,7 +7,7 @@
7
7
  ".": "./src/index.ts"
8
8
  },
9
9
  "scripts": {
10
- "lint": "eslint src",
10
+ "lint": "eslint src test",
11
11
  "typecheck": "tsc --noEmit",
12
12
  "test": "vitest run"
13
13
  },
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "devDependencies": {
18
18
  "@akasecurity/eslint-config": "workspace:*",
19
- "@types/node": "^26.1.1",
19
+ "@types/node": "^24.13.3",
20
20
  "eslint": "^9.0.0",
21
21
  "typescript": "^5.8.0",
22
22
  "vitest": "^4.1.10"
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@akasecurity/plugin-sdk",
3
+ "version": "0.8.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "exports": {
7
+ ".": "./src/index.ts"
8
+ },
9
+ "scripts": {
10
+ "gen:bundled-packs": "node scripts/gen-bundled-packs.mjs",
11
+ "lint": "eslint src test",
12
+ "test": "vitest run",
13
+ "typecheck": "tsc --noEmit"
14
+ },
15
+ "dependencies": {
16
+ "@akasecurity/detections": "workspace:*",
17
+ "@akasecurity/persistence": "workspace:*",
18
+ "@akasecurity/schema": "workspace:*",
19
+ "ignore": "^7.0.6",
20
+ "zod": "^4.0.0"
21
+ },
22
+ "devDependencies": {
23
+ "@akasecurity/eslint-config": "workspace:*",
24
+ "@types/node": "^24.13.3",
25
+ "eslint": "^9.0.0",
26
+ "typescript": "^5.8.0",
27
+ "vitest": "^4.1.10"
28
+ }
29
+ }
@@ -9,7 +9,7 @@
9
9
  "./drizzle": "./src/drizzle/index.ts"
10
10
  },
11
11
  "scripts": {
12
- "lint": "eslint src",
12
+ "lint": "eslint src test",
13
13
  "typecheck": "tsc --noEmit",
14
14
  "test": "vitest run",
15
15
  "gen:sqlite-ddl": "drizzle-kit generate --config drizzle.config.local.ts && node scripts/gen-sqlite-ddl.mjs"
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "devDependencies": {
22
22
  "@akasecurity/eslint-config": "workspace:*",
23
- "@types/node": "^26.1.1",
23
+ "@types/node": "^24.13.3",
24
24
  "drizzle-kit": "^0.31.0",
25
25
  "eslint": "^9.0.0",
26
26
  "typescript": "^5.8.0",
@@ -0,0 +1,20 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/auth-jwt-no-verify",
4
+ "name": "JWT decoded without signature verification",
5
+ "category": "code_flaw",
6
+ "severity": "critical",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "(verify\\s*=\\s*false|verify_signature.*false|algorithms\\s*=\\s*\\[\\])",
10
+ "flags": "gi"
11
+ },
12
+ "requiresNearby": {
13
+ "labels": ["jwt", "decode", "token"],
14
+ "windowChars": 160
15
+ },
16
+ "examples": [
17
+ "jwt.decode(token, options={\"verify_signature\": False})",
18
+ "jwt.decode(token, algorithms=[])"
19
+ ]
20
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/auth-ssl-verify-false",
4
+ "name": "SSL certificate verification disabled",
5
+ "category": "code_flaw",
6
+ "severity": "high",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "\\brequests\\.(get|post|put|delete|patch|request)\\s*\\([^)]*verify\\s*=\\s*False",
10
+ "flags": "gi"
11
+ },
12
+ "examples": [
13
+ "requests.get(url, verify=False)",
14
+ "requests.post(endpoint, data=payload, verify=False)"
15
+ ],
16
+ "appliesTo": {
17
+ "extensions": [".py"]
18
+ }
19
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/cmd-inject-exec",
4
+ "name": "Command injection via Java Runtime.exec",
5
+ "category": "code_flaw",
6
+ "severity": "critical",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "Runtime\\.getRuntime\\(\\)\\.exec\\(",
10
+ "flags": "g"
11
+ },
12
+ "requiresNearby": {
13
+ "labels": ["input", "request", "param", "user"],
14
+ "windowChars": 200
15
+ },
16
+ "examples": ["Runtime.getRuntime().exec(userInput)"],
17
+ "appliesTo": {
18
+ "extensions": [".java"]
19
+ }
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/cmd-inject-node-exec",
4
+ "name": "Command injection via Node.js exec with variable argument",
5
+ "category": "code_flaw",
6
+ "severity": "critical",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "\\bexec(?:Sync)?\\s*\\(\\s*(?!['\"`])",
10
+ "flags": "g"
11
+ },
12
+ "requiresNearby": {
13
+ "labels": ["input", "request", "param", "argv", "user", "query", "body"],
14
+ "windowChars": 200
15
+ },
16
+ "examples": ["exec(req.query.cmd)", "execSync(userInput)"],
17
+ "appliesTo": {
18
+ "extensions": [".js", ".jsx", ".ts", ".tsx", ".mjs", ".cjs"]
19
+ }
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/cmd-inject-shell",
4
+ "name": "Command injection via subprocess shell=True",
5
+ "category": "code_flaw",
6
+ "severity": "critical",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "subprocess\\.(run|Popen|call|check_output)\\s*\\([^)]*shell\\s*=\\s*True",
10
+ "flags": "gi"
11
+ },
12
+ "requiresNearby": {
13
+ "labels": ["input", "request", "param", "argv", "user"],
14
+ "windowChars": 300
15
+ },
16
+ "examples": ["subprocess.run(user_input, shell=True)"],
17
+ "appliesTo": {
18
+ "extensions": [".py"]
19
+ }
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/crypto-insecure-random",
4
+ "name": "Insecure random number generator used for security-sensitive value",
5
+ "category": "code_flaw",
6
+ "severity": "medium",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "\\b(Math\\.random\\(\\)|random\\.random\\(\\)|random\\.randint\\()",
10
+ "flags": "gi"
11
+ },
12
+ "requiresNearby": {
13
+ "labels": ["token", "session", "key", "password", "secret", "nonce", "salt"],
14
+ "windowChars": 160
15
+ },
16
+ "examples": ["const token = Math.random().toString(36)", "session_key = str(random.random())"],
17
+ "appliesTo": {
18
+ "extensions": [".js", ".jsx", ".ts", ".tsx", ".mjs", ".cjs", ".py"]
19
+ }
20
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/crypto-weak-hash-md5",
4
+ "name": "Weak cryptographic hash: MD5",
5
+ "category": "code_flaw",
6
+ "severity": "medium",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "(hashlib\\.md5\\s*\\(|MD5\\.(?:digest|hash)\\b|Digest::MD5|MessageDigest\\.getInstance\\s*\\(\\s*[\"']MD5[\"'])",
10
+ "flags": "gi"
11
+ },
12
+ "examples": ["hashlib.md5(password.encode())", "MessageDigest.getInstance(\"MD5\")"],
13
+ "appliesTo": {
14
+ "extensions": [".py", ".rb", ".java"]
15
+ }
16
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/crypto-weak-hash-sha1",
4
+ "name": "Weak cryptographic hash: SHA-1 in security context",
5
+ "category": "code_flaw",
6
+ "severity": "medium",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "(hashlib\\.sha1\\s*\\(|SHA1\\.(?:digest|hash)\\b|Digest::SHA1|MessageDigest\\.getInstance\\s*\\(\\s*[\"']SHA-?1[\"'])",
10
+ "flags": "gi"
11
+ },
12
+ "requiresNearby": {
13
+ "labels": ["password", "credential", "hash", "token", "secret"],
14
+ "windowChars": 160
15
+ },
16
+ "examples": [
17
+ "password_hash = hashlib.sha1(password.encode()).hexdigest()",
18
+ "MessageDigest.getInstance(\"SHA1\")"
19
+ ],
20
+ "appliesTo": {
21
+ "extensions": [".py", ".rb", ".java"]
22
+ }
23
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/deser-java-ois",
4
+ "name": "Insecure deserialization via Java ObjectInputStream",
5
+ "category": "code_flaw",
6
+ "severity": "critical",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "\\bObjectInputStream\\b",
10
+ "flags": "g"
11
+ },
12
+ "requiresNearby": {
13
+ "labels": ["readObject"],
14
+ "windowChars": 200
15
+ },
16
+ "examples": [
17
+ "ObjectInputStream ois = new ObjectInputStream(inputStream); Object obj = ois.readObject();"
18
+ ],
19
+ "appliesTo": {
20
+ "extensions": [".java"]
21
+ }
22
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/deser-pickle",
4
+ "name": "Insecure deserialization via Python pickle",
5
+ "category": "code_flaw",
6
+ "severity": "critical",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "\\bpickle\\.loads?\\s*\\(",
10
+ "flags": "gi"
11
+ },
12
+ "examples": ["data = pickle.loads(user_data)", "obj = pickle.load(request.stream)"],
13
+ "appliesTo": {
14
+ "extensions": [".py"]
15
+ }
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/deser-yaml-unsafe",
4
+ "name": "Insecure deserialization via yaml.load without SafeLoader",
5
+ "category": "code_flaw",
6
+ "severity": "high",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "\\byaml\\.load\\s*\\((?![^)]*SafeLoader|[^)]*safe_load)",
10
+ "flags": "gi"
11
+ },
12
+ "examples": ["data = yaml.load(user_input)", "config = yaml.load(f)"],
13
+ "appliesTo": {
14
+ "extensions": [".py"]
15
+ }
16
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/dev-debug-enabled",
4
+ "name": "Debug mode enabled in configuration",
5
+ "category": "code_flaw",
6
+ "severity": "medium",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "\\bdebug\\s*[=:]\\s*(true|1|yes)",
10
+ "flags": "gi"
11
+ },
12
+ "examples": ["DEBUG = True", "debug: true", "app.debug = True"]
13
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/dev-placeholder-secret",
4
+ "name": "Placeholder or default secret left in code",
5
+ "category": "code_flaw",
6
+ "severity": "high",
7
+ "matcher": {
8
+ "type": "keyword",
9
+ "keywords": [
10
+ "changeme",
11
+ "placeholder",
12
+ "your-secret",
13
+ "dev-secret",
14
+ "replace-me",
15
+ "todo-secret"
16
+ ],
17
+ "caseSensitive": false
18
+ },
19
+ "requiresNearby": {
20
+ "labels": ["key", "secret", "password", "token"],
21
+ "windowChars": 80
22
+ },
23
+ "examples": ["SECRET_KEY = 'changeme'", "api_token = 'your-secret'"]
24
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/dev-wildcard-cors",
4
+ "name": "CORS wildcard allowing all origins",
5
+ "category": "code_flaw",
6
+ "severity": "medium",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "(Access-Control-Allow-Origin:\\s*\\*|origin:\\s*[\"']\\*[\"']|allow_all_origins\\s*=\\s*True|CORS_ALLOW_ALL_ORIGINS\\s*=\\s*True)",
10
+ "flags": "gi"
11
+ },
12
+ "examples": [
13
+ "Access-Control-Allow-Origin: *",
14
+ "cors({ origin: '*' })",
15
+ "CORS_ALLOW_ALL_ORIGINS = True"
16
+ ]
17
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/eval-dynamic-exec",
4
+ "name": "Dynamic code execution with user-controlled input",
5
+ "category": "code_flaw",
6
+ "severity": "critical",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "\\b(eval|exec)\\s*\\(\\s*(?!['\"`])",
10
+ "flags": "g"
11
+ },
12
+ "requiresNearby": {
13
+ "labels": ["input", "request", "param", "user", "query", "body"],
14
+ "windowChars": 200
15
+ },
16
+ "examples": ["eval(request.body.code)", "exec(user_input)"]
17
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/hardcoded-password",
4
+ "name": "Hardcoded password in source code",
5
+ "category": "code_flaw",
6
+ "severity": "high",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "(?:password|passwd|pwd)\\s*=\\s*[\"']([^\"']{3,})[\"']",
10
+ "flags": "gi",
11
+ "captureGroup": 1
12
+ },
13
+ "postValidators": [
14
+ {
15
+ "name": "entropy",
16
+ "config": {
17
+ "minLength": 8,
18
+ "threshold": 3.0
19
+ }
20
+ }
21
+ ],
22
+ "examples": ["password = \"Tr0ub4dor&3\"", "DB_PASSWORD = 'c0rr3ctH0rseBatt3ry'"]
23
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/hardcoded-secret-key",
4
+ "name": "Hardcoded API key or secret key in source code",
5
+ "category": "code_flaw",
6
+ "severity": "high",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "\\b(secret[_-]?key|api[_-]?key|auth[_-]?token)\\s*=\\s*[\"'][^\"']{8,}[\"']",
10
+ "flags": "gi"
11
+ },
12
+ "postValidators": ["entropy"],
13
+ "examples": [
14
+ "SECRET_KEY = \"a9f2c8e1b4d7f3a6c9e2b5d8f1a4c7e0\"",
15
+ "api_key = 'sk-proj-abc123XYZ789def456'"
16
+ ]
17
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/path-traversal-join",
4
+ "name": "Path traversal via os.path.join with user-controlled component",
5
+ "category": "code_flaw",
6
+ "severity": "high",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "os\\.path\\.join\\s*\\([^,)]+,\\s*(request|req|params|user)",
10
+ "flags": "gi"
11
+ },
12
+ "examples": [
13
+ "os.path.join(base_dir, request.args['file'])",
14
+ "os.path.join(upload_dir, user_filename)"
15
+ ],
16
+ "appliesTo": {
17
+ "extensions": [".py"]
18
+ }
19
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/path-traversal-open",
4
+ "name": "Path traversal via open() with user-controlled path",
5
+ "category": "code_flaw",
6
+ "severity": "high",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "\\bopen\\s*\\(\\s*(request|req|params|argv|input)",
10
+ "flags": "gi"
11
+ },
12
+ "requiresNearby": {
13
+ "labels": ["request", "param", "input", "argv", "user"],
14
+ "windowChars": 200
15
+ },
16
+ "examples": ["open(request.args['filename'])", "open(params['path'])"],
17
+ "appliesTo": {
18
+ "extensions": [".py", ".rb"]
19
+ }
20
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/prototype-pollution-merge",
4
+ "name": "Prototype pollution via merge with user-controlled input",
5
+ "category": "code_flaw",
6
+ "severity": "high",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "(Object\\.assign\\s*\\(\\s*\\w+\\s*,\\s*(req|request|body|params|query)|_\\.merge\\s*\\(\\s*\\w+\\s*,\\s*(req|request))",
10
+ "flags": "gi"
11
+ },
12
+ "examples": ["Object.assign(config, req.body)", "_.merge(target, request.body)"],
13
+ "appliesTo": {
14
+ "extensions": [".js", ".jsx", ".ts", ".tsx", ".mjs", ".cjs"]
15
+ }
16
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/regex-redos-backtrack",
4
+ "name": "ReDoS via catastrophic backtracking pattern",
5
+ "category": "code_flaw",
6
+ "severity": "medium",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "\\((?:\\?:)?(?:\\\\.|\\[[^\\]]*\\]|[^\\\\()\\[\\]+*?|])[+*](?:(?:\\\\.|\\[[^\\]]*\\]|[^\\\\()\\[\\]+*?|])\\*)?\\)[+*]|\\((?:\\?:)?([^()|]+)\\|\\1\\)[+*]",
10
+ "flags": "g"
11
+ },
12
+ "examples": ["/(a+)+/", "/(\\w+\\s*)+/"]
13
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/sql-inject-concat-dot",
4
+ "name": "SQL injection via string concatenation (PHP dot operator)",
5
+ "category": "code_flaw",
6
+ "severity": "high",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "[\"'][^\\n]*?(select|insert|update|delete|drop|where)[^\\n]*?[\"']\\s*\\.",
10
+ "flags": "gi"
11
+ },
12
+ "appliesTo": {
13
+ "extensions": [".php"]
14
+ },
15
+ "examples": ["$query = \"SELECT * FROM orders WHERE user = \" . $username;"]
16
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/sql-inject-concat",
4
+ "name": "SQL injection via string concatenation",
5
+ "category": "code_flaw",
6
+ "severity": "high",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "[\"']\\s*(?:select\\b[^\\n]*?\\bfrom\\b|insert\\s+into\\b|update\\s+\\S+\\s+set\\b|delete\\s+from\\b|drop\\s+(?:table|database)\\b|where\\b[^\\n]*?=)[^\\n]*?[\"']\\s*\\+",
10
+ "flags": "gi"
11
+ },
12
+ "examples": ["\"SELECT * FROM users WHERE id = \" + userId"]
13
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/sql-inject-format",
4
+ "name": "SQL injection via format string or f-string",
5
+ "category": "code_flaw",
6
+ "severity": "high",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "\\b(?:select\\b[^\\n]*?\\bfrom\\b|insert\\s+into\\b|update\\s+\\S+\\s+set\\b|delete\\s+from\\b|drop\\s+(?:table|database)\\b|where\\b[^\\n]*?=)[^\\n]*?(?:[%][sd]|\\{[^}]+\\})",
10
+ "flags": "gi"
11
+ },
12
+ "examples": [
13
+ "f\"SELECT * FROM users WHERE id = {user_id}\"",
14
+ "\"SELECT * FROM users WHERE name = '%s'\" % name"
15
+ ]
16
+ }