@akasecurity/cli 0.8.1 → 0.8.2

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 (204) hide show
  1. package/dist/cli.js +1814 -1069
  2. package/package.json +6 -6
  3. package/web-ui/packages/dashboard-ui/package.json +1 -1
  4. package/web-ui/packages/detections/package.json +2 -2
  5. package/web-ui/packages/local-ops/package.json +3 -2
  6. package/web-ui/packages/persistence/package.json +2 -2
  7. package/web-ui/packages/plugin-sdk/package.json +29 -0
  8. package/web-ui/packages/schema/package.json +2 -2
  9. package/web-ui/rules/code-flaws/auth-jwt-no-verify.json +20 -0
  10. package/web-ui/rules/code-flaws/auth-ssl-verify-false.json +19 -0
  11. package/web-ui/rules/code-flaws/cmd-inject-exec.json +20 -0
  12. package/web-ui/rules/code-flaws/cmd-inject-node-exec.json +20 -0
  13. package/web-ui/rules/code-flaws/cmd-inject-shell.json +20 -0
  14. package/web-ui/rules/code-flaws/crypto-insecure-random.json +20 -0
  15. package/web-ui/rules/code-flaws/crypto-weak-hash-md5.json +16 -0
  16. package/web-ui/rules/code-flaws/crypto-weak-hash-sha1.json +23 -0
  17. package/web-ui/rules/code-flaws/deser-java-ois.json +22 -0
  18. package/web-ui/rules/code-flaws/deser-pickle.json +16 -0
  19. package/web-ui/rules/code-flaws/deser-yaml-unsafe.json +16 -0
  20. package/web-ui/rules/code-flaws/dev-debug-enabled.json +13 -0
  21. package/web-ui/rules/code-flaws/dev-placeholder-secret.json +24 -0
  22. package/web-ui/rules/code-flaws/dev-wildcard-cors.json +17 -0
  23. package/web-ui/rules/code-flaws/eval-dynamic-exec.json +17 -0
  24. package/web-ui/rules/code-flaws/hardcoded-password.json +23 -0
  25. package/web-ui/rules/code-flaws/hardcoded-secret-key.json +17 -0
  26. package/web-ui/rules/code-flaws/path-traversal-join.json +19 -0
  27. package/web-ui/rules/code-flaws/path-traversal-open.json +20 -0
  28. package/web-ui/rules/code-flaws/prototype-pollution-merge.json +16 -0
  29. package/web-ui/rules/code-flaws/regex-redos-backtrack.json +13 -0
  30. package/web-ui/rules/code-flaws/sql-inject-concat-dot.json +16 -0
  31. package/web-ui/rules/code-flaws/sql-inject-concat.json +13 -0
  32. package/web-ui/rules/code-flaws/sql-inject-format.json +16 -0
  33. package/web-ui/rules/code-flaws/sql-inject-interp.json +19 -0
  34. package/web-ui/rules/code-flaws/ssrf-user-url.json +16 -0
  35. package/web-ui/rules/code-flaws/xss-dangerously-set.json +16 -0
  36. package/web-ui/rules/code-flaws/xss-inner-html.json +16 -0
  37. package/web-ui/rules/code-flaws/xss-unescaped-render.json +16 -0
  38. package/web-ui/rules/core-code-context/db-table-name.json +30 -0
  39. package/web-ui/rules/core-code-context/feature-flag.json +24 -0
  40. package/web-ui/rules/core-code-context/file-path.json +17 -0
  41. package/web-ui/rules/core-code-context/internal-domain.json +13 -0
  42. package/web-ui/rules/core-code-context/internal-ip.json +13 -0
  43. package/web-ui/rules/core-code-context/internal-url.json +27 -0
  44. package/web-ui/rules/core-code-context/localhost-ref.json +13 -0
  45. package/web-ui/rules/core-code-context/stack-trace.json +13 -0
  46. package/web-ui/rules/core-financial/credit-card.json +14 -0
  47. package/web-ui/rules/core-financial/cusip.json +14 -0
  48. package/web-ui/rules/core-financial/cvv.json +13 -0
  49. package/web-ui/rules/core-financial/iban.json +17 -0
  50. package/web-ui/rules/core-financial/paypal.json +14 -0
  51. package/web-ui/rules/core-financial/routing-number.json +14 -0
  52. package/web-ui/rules/core-financial/salary.json +23 -0
  53. package/web-ui/rules/core-financial/swift.json +14 -0
  54. package/web-ui/rules/core-phi/biometric-ref.json +23 -0
  55. package/web-ui/rules/core-phi/genetic-data.json +24 -0
  56. package/web-ui/rules/core-phi/group-id.json +19 -0
  57. package/web-ui/rules/core-phi/hipaa-identifier.json +13 -0
  58. package/web-ui/rules/core-phi/icd10-code.json +14 -0
  59. package/web-ui/rules/core-phi/member-id.json +13 -0
  60. package/web-ui/rules/core-phi/mrn.json +13 -0
  61. package/web-ui/rules/core-phi/ndc-code.json +13 -0
  62. package/web-ui/rules/core-pii/dob.json +18 -0
  63. package/web-ui/rules/core-pii/drivers-license-us.json +14 -0
  64. package/web-ui/rules/core-pii/email.json +13 -0
  65. package/web-ui/rules/core-pii/home-address.json +21 -0
  66. package/web-ui/rules/core-pii/ip-address.json +13 -0
  67. package/web-ui/rules/core-pii/mac-address.json +13 -0
  68. package/web-ui/rules/core-pii/name.json +21 -0
  69. package/web-ui/rules/core-pii/national-id.json +27 -0
  70. package/web-ui/rules/core-pii/passport-us.json +17 -0
  71. package/web-ui/rules/core-pii/phone-intl.json +13 -0
  72. package/web-ui/rules/core-pii/phone-us.json +17 -0
  73. package/web-ui/rules/core-pii/ssn.json +13 -0
  74. package/web-ui/rules/core-pii/vin.json +13 -0
  75. package/web-ui/rules/core-pii/zip.json +30 -0
  76. package/web-ui/rules/secrets/anthropic-api-key.json +14 -0
  77. package/web-ui/rules/secrets/aws-access-key.json +14 -0
  78. package/web-ui/rules/secrets/aws-secret-key.json +15 -0
  79. package/web-ui/rules/secrets/azure-connection-string.json +13 -0
  80. package/web-ui/rules/secrets/cloudflare-api-key.json +15 -0
  81. package/web-ui/rules/secrets/datadog-key.json +15 -0
  82. package/web-ui/rules/secrets/digitalocean-token.json +13 -0
  83. package/web-ui/rules/secrets/discord-token.json +14 -0
  84. package/web-ui/rules/secrets/gcp-service-account.json +16 -0
  85. package/web-ui/rules/secrets/github-pat.json +16 -0
  86. package/web-ui/rules/secrets/gitlab-token.json +14 -0
  87. package/web-ui/rules/secrets/heroku-api-key.json +14 -0
  88. package/web-ui/rules/secrets/npm-token.json +14 -0
  89. package/web-ui/rules/secrets/openai-api-key.json +14 -0
  90. package/web-ui/rules/secrets/pulumi-access-token.json +14 -0
  91. package/web-ui/rules/secrets/sendgrid-key.json +14 -0
  92. package/web-ui/rules/secrets/slack-token.json +13 -0
  93. package/web-ui/rules/secrets/stripe-live-key.json +14 -0
  94. package/web-ui/rules/secrets/terraform-cloud-token.json +16 -0
  95. package/web-ui/rules/secrets/twilio-key.json +13 -0
  96. package/web-ui/rules/secrets/vault-token.json +14 -0
  97. package/web-ui/rules/secrets-infra/api-key-header.json +15 -0
  98. package/web-ui/rules/secrets-infra/basic-auth-header.json +13 -0
  99. package/web-ui/rules/secrets-infra/basic-auth-url.json +13 -0
  100. package/web-ui/rules/secrets-infra/bearer-token.json +17 -0
  101. package/web-ui/rules/secrets-infra/db-connection-string.json +13 -0
  102. package/web-ui/rules/secrets-infra/docker-config-auth.json +13 -0
  103. package/web-ui/rules/secrets-infra/env-key-value.json +14 -0
  104. package/web-ui/rules/secrets-infra/generic-high-entropy-secret.json +18 -0
  105. package/web-ui/rules/secrets-infra/jwt-token.json +16 -0
  106. package/web-ui/rules/secrets-infra/kubeconfig-token.json +14 -0
  107. package/web-ui/rules/secrets-infra/password-field.json +14 -0
  108. package/web-ui/rules/secrets-infra/pgp-private-key.json +15 -0
  109. package/web-ui/rules/secrets-infra/ssh-private-key.json +15 -0
  110. package/web-ui/web-ui/.next/BUILD_ID +1 -1
  111. package/web-ui/web-ui/.next/app-build-manifest.json +41 -41
  112. package/web-ui/web-ui/.next/app-path-routes-manifest.json +6 -6
  113. package/web-ui/web-ui/.next/build-manifest.json +2 -2
  114. package/web-ui/web-ui/.next/prerender-manifest.json +3 -3
  115. package/web-ui/web-ui/.next/required-server-files.json +2 -1
  116. package/web-ui/web-ui/.next/server/app/(app)/activity/page.js +2 -2
  117. package/web-ui/web-ui/.next/server/app/(app)/activity/page.js.nft.json +1 -1
  118. package/web-ui/web-ui/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
  119. package/web-ui/web-ui/.next/server/app/(app)/data-shares/page.js +2 -2
  120. package/web-ui/web-ui/.next/server/app/(app)/data-shares/page.js.nft.json +1 -1
  121. package/web-ui/web-ui/.next/server/app/(app)/data-shares/page_client-reference-manifest.js +1 -1
  122. package/web-ui/web-ui/.next/server/app/(app)/detections/page.js +2 -2
  123. package/web-ui/web-ui/.next/server/app/(app)/detections/page.js.nft.json +1 -1
  124. package/web-ui/web-ui/.next/server/app/(app)/detections/page_client-reference-manifest.js +1 -1
  125. package/web-ui/web-ui/.next/server/app/(app)/exceptions/[id]/page.js +2 -2
  126. package/web-ui/web-ui/.next/server/app/(app)/exceptions/[id]/page.js.nft.json +1 -1
  127. package/web-ui/web-ui/.next/server/app/(app)/exceptions/[id]/page_client-reference-manifest.js +1 -1
  128. package/web-ui/web-ui/.next/server/app/(app)/exceptions/new/page.js +2 -2
  129. package/web-ui/web-ui/.next/server/app/(app)/exceptions/new/page.js.nft.json +1 -1
  130. package/web-ui/web-ui/.next/server/app/(app)/exceptions/new/page_client-reference-manifest.js +1 -1
  131. package/web-ui/web-ui/.next/server/app/(app)/exceptions/page.js +1 -1
  132. package/web-ui/web-ui/.next/server/app/(app)/exceptions/page.js.nft.json +1 -1
  133. package/web-ui/web-ui/.next/server/app/(app)/exceptions/page_client-reference-manifest.js +1 -1
  134. package/web-ui/web-ui/.next/server/app/(app)/findings/page.js +2 -2
  135. package/web-ui/web-ui/.next/server/app/(app)/findings/page.js.nft.json +1 -1
  136. package/web-ui/web-ui/.next/server/app/(app)/findings/page_client-reference-manifest.js +1 -1
  137. package/web-ui/web-ui/.next/server/app/(app)/inventory/page.js +2 -2
  138. package/web-ui/web-ui/.next/server/app/(app)/inventory/page.js.nft.json +1 -1
  139. package/web-ui/web-ui/.next/server/app/(app)/inventory/page_client-reference-manifest.js +1 -1
  140. package/web-ui/web-ui/.next/server/app/(app)/policies/page.js +2 -2
  141. package/web-ui/web-ui/.next/server/app/(app)/policies/page.js.nft.json +1 -1
  142. package/web-ui/web-ui/.next/server/app/(app)/policies/page_client-reference-manifest.js +1 -1
  143. package/web-ui/web-ui/.next/server/app/(app)/scan/page.js +1 -1
  144. package/web-ui/web-ui/.next/server/app/(app)/scan/page.js.nft.json +1 -1
  145. package/web-ui/web-ui/.next/server/app/(app)/scan/page_client-reference-manifest.js +1 -1
  146. package/web-ui/web-ui/.next/server/app/(app)/security/page.js +1 -1
  147. package/web-ui/web-ui/.next/server/app/(app)/security/page.js.nft.json +1 -1
  148. package/web-ui/web-ui/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -1
  149. package/web-ui/web-ui/.next/server/app/(app)/settings/page.js +2 -2
  150. package/web-ui/web-ui/.next/server/app/(app)/settings/page.js.nft.json +1 -1
  151. package/web-ui/web-ui/.next/server/app/(app)/settings/page_client-reference-manifest.js +1 -1
  152. package/web-ui/web-ui/.next/server/app/(app)/updates/page.js +2 -2
  153. package/web-ui/web-ui/.next/server/app/(app)/updates/page.js.nft.json +1 -1
  154. package/web-ui/web-ui/.next/server/app/(app)/updates/page_client-reference-manifest.js +1 -1
  155. package/web-ui/web-ui/.next/server/app/_not-found/page.js +1 -1
  156. package/web-ui/web-ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  157. package/web-ui/web-ui/.next/server/app/_not-found.html +1 -1
  158. package/web-ui/web-ui/.next/server/app/_not-found.rsc +2 -2
  159. package/web-ui/web-ui/.next/server/app/index.html +1 -1
  160. package/web-ui/web-ui/.next/server/app/index.rsc +2 -2
  161. package/web-ui/web-ui/.next/server/app/page.js +1 -1
  162. package/web-ui/web-ui/.next/server/app/page_client-reference-manifest.js +1 -1
  163. package/web-ui/web-ui/.next/server/app-paths-manifest.json +6 -6
  164. package/web-ui/web-ui/.next/server/chunks/366.js +566 -0
  165. package/web-ui/web-ui/.next/server/chunks/45.js +1 -1
  166. package/web-ui/web-ui/.next/server/chunks/484.js +564 -0
  167. package/web-ui/web-ui/.next/server/chunks/913.js +2 -0
  168. package/web-ui/web-ui/.next/server/functions-config-manifest.json +5 -5
  169. package/web-ui/web-ui/.next/server/middleware-manifest.json +5 -5
  170. package/web-ui/web-ui/.next/server/pages/404.html +1 -1
  171. package/web-ui/web-ui/.next/server/pages/500.html +1 -1
  172. package/web-ui/web-ui/.next/server/server-reference-manifest.js +1 -1
  173. package/web-ui/web-ui/.next/server/server-reference-manifest.json +1 -1
  174. package/web-ui/web-ui/.next/static/chunks/561-46ea4b9ad0419130.js +1 -0
  175. package/web-ui/web-ui/.next/static/chunks/app/(app)/activity/{page-f6b1b344709ee48e.js → page-49c63d0cec0da80d.js} +1 -1
  176. package/web-ui/web-ui/.next/static/chunks/app/(app)/data-shares/page-d469bd704615ea76.js +1 -0
  177. package/web-ui/web-ui/.next/static/chunks/app/(app)/detections/page-07ca4b0ce174ef7a.js +1 -0
  178. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/[id]/page-16d5fd7d373c8f0b.js +1 -0
  179. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/new/page-d6cfd847bb528eec.js +1 -0
  180. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/{page-b6fbc540ef0a50f8.js → page-291617f3a4d46a01.js} +1 -1
  181. package/web-ui/web-ui/.next/static/chunks/app/(app)/findings/{page-94eb9d838ae00222.js → page-c59135e0cfa8d5c7.js} +1 -1
  182. package/web-ui/web-ui/.next/static/chunks/app/(app)/inventory/page-0eb54f5acb30a73e.js +1 -0
  183. package/web-ui/web-ui/.next/static/chunks/app/(app)/scan/page-b00573441ac43bdf.js +1 -0
  184. package/web-ui/web-ui/.next/static/chunks/app/(app)/settings/page-3b5fe92cd995b763.js +1 -0
  185. package/web-ui/web-ui/.next/static/chunks/app/(app)/updates/page-50f828314c9a5d91.js +1 -0
  186. package/web-ui/web-ui/.next/static/css/dfdcbdce6b7c9eb0.css +2 -0
  187. package/web-ui/web-ui/package.json +1 -1
  188. package/web-ui/web-ui/server.js +1 -1
  189. package/LICENSE +0 -201
  190. package/web-ui/web-ui/.next/server/chunks/116.js +0 -536
  191. package/web-ui/web-ui/.next/server/chunks/223.js +0 -534
  192. package/web-ui/web-ui/.next/server/chunks/226.js +0 -2
  193. package/web-ui/web-ui/.next/static/chunks/561-3a19cd28d2b941fa.js +0 -1
  194. package/web-ui/web-ui/.next/static/chunks/app/(app)/data-shares/page-548fa0d3dee6e829.js +0 -1
  195. package/web-ui/web-ui/.next/static/chunks/app/(app)/detections/page-0bfa1f371b65b5ad.js +0 -1
  196. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/[id]/page-56ec5c05f347108a.js +0 -1
  197. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/new/page-cb33dc32fd3648bf.js +0 -1
  198. package/web-ui/web-ui/.next/static/chunks/app/(app)/inventory/page-89cf3ac5a30e76a0.js +0 -1
  199. package/web-ui/web-ui/.next/static/chunks/app/(app)/scan/page-0d43a6b2acafe349.js +0 -1
  200. package/web-ui/web-ui/.next/static/chunks/app/(app)/settings/page-2cf02a09402cfb4d.js +0 -1
  201. package/web-ui/web-ui/.next/static/chunks/app/(app)/updates/page-b9607b5e2e8700d6.js +0 -1
  202. package/web-ui/web-ui/.next/static/css/69dfaec5234c6b99.css +0 -2
  203. /package/web-ui/web-ui/.next/static/{X9C7-HlMI5zAQEKfIW_6e → zNaHfOWePiRki0ugHKYzl}/_buildManifest.js +0 -0
  204. /package/web-ui/web-ui/.next/static/{X9C7-HlMI5zAQEKfIW_6e → zNaHfOWePiRki0ugHKYzl}/_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.8.2",
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,7 +32,7 @@
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
38
  "tsup": "^8.0.0",
@@ -41,18 +41,18 @@
41
41
  "vitest": "^4.1.10",
42
42
  "@akasecurity/dashboard-ui": "0.8.0",
43
43
  "@akasecurity/detections": "0.8.0",
44
- "@akasecurity/eslint-config": "0.8.0",
45
44
  "@akasecurity/local-ops": "0.8.0",
45
+ "@akasecurity/persistence": "0.8.0",
46
46
  "@akasecurity/plugin-sdk": "0.8.0",
47
+ "@akasecurity/web-ui": "0.8.0",
47
48
  "@akasecurity/schema": "0.8.0",
48
- "@akasecurity/persistence": "0.8.0",
49
- "@akasecurity/web-ui": "0.8.0"
49
+ "@akasecurity/eslint-config": "0.8.0"
50
50
  },
51
51
  "scripts": {
52
52
  "dev": "tsx src/cli.ts",
53
53
  "build": "tsup",
54
54
  "bundle:web-ui": "node scripts/bundle-web-ui.mjs",
55
- "lint": "eslint src",
55
+ "lint": "eslint src test",
56
56
  "test": "vitest run",
57
57
  "typecheck": "tsc --noEmit"
58
58
  }
@@ -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
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "specVersion": 1,
3
+ "id": "code-flaws/sql-inject-interp",
4
+ "name": "SQL injection via Ruby string interpolation or PHP variable",
5
+ "category": "code_flaw",
6
+ "severity": "high",
7
+ "matcher": {
8
+ "type": "regex",
9
+ "pattern": "(select|insert|update|delete|where)[^\\n]*?(#\\{|\\$[a-z_])",
10
+ "flags": "gi"
11
+ },
12
+ "examples": [
13
+ "\"SELECT * FROM users WHERE id = #{params[:id]}\"",
14
+ "\"SELECT * FROM users WHERE id = $userId\""
15
+ ],
16
+ "appliesTo": {
17
+ "extensions": [".rb", ".php"]
18
+ }
19
+ }