torusguard 1.3.0 → 1.3.1

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 (377) hide show
  1. package/.torusguard/.manifest.json +112 -8
  2. package/.torusguard/rules/README.md +93 -62
  3. package/.torusguard/rules/TG-AUTH-001-weak-password-storage.md +103 -0
  4. package/.torusguard/rules/TG-AUTH-002-client-only-authorization.md +85 -0
  5. package/.torusguard/rules/TG-AUTH-003-missing-object-authorization.md +85 -0
  6. package/.torusguard/rules/TG-AUTH-004-insecure-session-cookie.md +96 -0
  7. package/.torusguard/rules/TG-AUTH-005-unsafe-password-reset.md +104 -0
  8. package/.torusguard/rules/TG-CLIENT-001-public-production-source-maps.md +102 -0
  9. package/.torusguard/rules/TG-CLIENT-002-sensitive-client-bundle-content.md +102 -0
  10. package/.torusguard/rules/TG-DB-001-frontend-database-query.md +83 -0
  11. package/.torusguard/rules/TG-DB-002-privileged-database-credential.md +86 -0
  12. package/.torusguard/rules/TG-DB-003-frontend-admin-sdk.md +91 -0
  13. package/.torusguard/rules/TG-DB-004-missing-tenant-query-isolation.md +103 -0
  14. package/.torusguard/rules/TG-INPUT-001-missing-server-validation.md +98 -0
  15. package/.torusguard/rules/TG-INPUT-002-raw-sql-concatenation.md +94 -0
  16. package/.torusguard/rules/TG-INPUT-003-unsafe-html-or-code-execution.md +102 -0
  17. package/.torusguard/rules/TG-INPUT-004-unrestricted-file-upload.md +92 -0
  18. package/.torusguard/rules/TG-INPUT-005-unsafe-template-rendering-and-escaping.md +102 -0
  19. package/.torusguard/rules/TG-INPUT-006-unsafe-file-path-traversal.md +131 -0
  20. package/.torusguard/rules/TG-PLATFORM-001-wildcard-cors-with-credentials.md +101 -0
  21. package/.torusguard/rules/TG-PLATFORM-002-missing-security-headers.md +95 -0
  22. package/.torusguard/rules/TG-PLATFORM-003-production-stack-trace-exposure.md +94 -0
  23. package/.torusguard/rules/TG-PLATFORM-004-missing-request-size-limits.md +102 -0
  24. package/.torusguard/rules/TG-RATE-001-unlimited-auth-endpoint.md +112 -0
  25. package/.torusguard/rules/TG-RATE-002-unlimited-public-write-endpoint.md +109 -0
  26. package/.torusguard/rules/TG-RATE-003-unbounded-resource-consumption.md +105 -0
  27. package/.torusguard/rules/TG-SEC-001-hardcoded-secrets.md +83 -0
  28. package/.torusguard/rules/TG-SEC-002-public-environment-secrets.md +83 -0
  29. package/.torusguard/rules/TG-SEC-003-tracked-env-file.md +79 -0
  30. package/.torusguard/rules/TG-SEC-004-sensitive-logging.md +83 -0
  31. package/.torusguard/rules/active/TG-AUTH-001-weak-password-storage.md +103 -0
  32. package/.torusguard/rules/active/TG-AUTH-002-client-only-authorization.md +85 -0
  33. package/.torusguard/rules/active/TG-AUTH-003-missing-object-authorization.md +85 -0
  34. package/.torusguard/rules/active/TG-AUTH-004-insecure-session-cookie.md +96 -0
  35. package/.torusguard/rules/active/TG-AUTH-005-unsafe-password-reset.md +104 -0
  36. package/.torusguard/rules/active/TG-CLIENT-001-public-production-source-maps.md +102 -0
  37. package/.torusguard/rules/active/TG-CLIENT-002-sensitive-client-bundle-content.md +102 -0
  38. package/.torusguard/rules/active/TG-DB-001-frontend-database-query.md +83 -0
  39. package/.torusguard/rules/active/TG-DB-002-privileged-database-credential.md +86 -0
  40. package/.torusguard/rules/active/TG-DB-003-frontend-admin-sdk.md +91 -0
  41. package/.torusguard/rules/active/TG-DB-004-missing-tenant-query-isolation.md +103 -0
  42. package/.torusguard/rules/active/TG-INPUT-001-missing-server-validation.md +98 -0
  43. package/.torusguard/rules/active/TG-INPUT-002-raw-sql-concatenation.md +94 -0
  44. package/.torusguard/rules/active/TG-INPUT-003-unsafe-html-or-code-execution.md +102 -0
  45. package/.torusguard/rules/active/TG-INPUT-004-unrestricted-file-upload.md +92 -0
  46. package/.torusguard/rules/active/TG-INPUT-005-unsafe-template-rendering-and-escaping.md +102 -0
  47. package/.torusguard/rules/active/TG-INPUT-006-unsafe-file-path-traversal.md +131 -0
  48. package/.torusguard/rules/active/TG-PLATFORM-001-wildcard-cors-with-credentials.md +101 -0
  49. package/.torusguard/rules/active/TG-PLATFORM-002-missing-security-headers.md +95 -0
  50. package/.torusguard/rules/active/TG-PLATFORM-003-production-stack-trace-exposure.md +94 -0
  51. package/.torusguard/rules/active/TG-PLATFORM-004-missing-request-size-limits.md +102 -0
  52. package/.torusguard/rules/active/TG-RATE-001-unlimited-auth-endpoint.md +112 -0
  53. package/.torusguard/rules/active/TG-RATE-002-unlimited-public-write-endpoint.md +109 -0
  54. package/.torusguard/rules/active/TG-RATE-003-unbounded-resource-consumption.md +105 -0
  55. package/.torusguard/rules/active/TG-SEC-001-hardcoded-secrets.md +83 -0
  56. package/.torusguard/rules/active/TG-SEC-002-public-environment-secrets.md +83 -0
  57. package/.torusguard/rules/active/TG-SEC-003-tracked-env-file.md +79 -0
  58. package/.torusguard/rules/active/TG-SEC-004-sensitive-logging.md +83 -0
  59. package/.torusguard/rules/agent/TG-AGENT-001-prompt-injection-system-context.md +56 -0
  60. package/.torusguard/rules/agent/TG-AGENT-002-unsafe-tool-dispatch-unsandboxed-execution.md +68 -0
  61. package/.torusguard/rules/agent/TG-AGENT-003-broad-mcp-tool-scoping.md +53 -0
  62. package/.torusguard/rules/agent/TG-AGENT-004-persistent-memory-cross-session-leakage.md +67 -0
  63. package/.torusguard/rules/authorization/TG-AUTH-006-mass-assignment.md +70 -0
  64. package/.torusguard/rules/authorization/TG-AUTH-007-missing-property-level-authorization.md +71 -0
  65. package/.torusguard/rules/authorization/TG-AUTH-008-untrusted-role-header-injection.md +112 -0
  66. package/.torusguard/rules/business-logic/TG-BIZ-001-client-controlled-sensitive-business-value.md +37 -0
  67. package/.torusguard/rules/business-logic/TG-BIZ-002-replayable-one-time-operation.md +37 -0
  68. package/.torusguard/rules/business-logic/TG-BIZ-003-missing-workflow-state-validation.md +37 -0
  69. package/.torusguard/rules/business-logic/TG-BIZ-004-unrestricted-sensitive-business-flow.md +37 -0
  70. package/.torusguard/rules/cache/TG-CACHE-001-sensitive-response-publicly-cacheable.md +37 -0
  71. package/.torusguard/rules/cache/TG-CACHE-002-missing-user-cache-isolation.md +37 -0
  72. package/.torusguard/rules/cache/TG-CACHE-003-sensitive-data-in-url.md +37 -0
  73. package/.torusguard/rules/csrf/TG-CSRF-001-missing-csrf-protection.md +37 -0
  74. package/.torusguard/rules/csrf/TG-CSRF-002-unsafe-credentialed-cross-origin-request.md +37 -0
  75. package/.torusguard/rules/edge/TG-EDGE-001-serverless-global-state-leak.md +83 -0
  76. package/.torusguard/rules/edge/TG-EDGE-003-aws-lambda-ephemeral-cold-start.md +76 -0
  77. package/.torusguard/rules/graphql/TG-GQL-001-missing-query-depth-or-complexity-limits.md +64 -0
  78. package/.torusguard/rules/graphql/TG-GQL-002-resolver-missing-authorization.md +37 -0
  79. package/.torusguard/rules/graphql/TG-GQL-003-unbounded-graphql-pagination-or-batching.md +37 -0
  80. package/.torusguard/rules/graphql/TG-GQL-004-unnecessary-production-introspection.md +37 -0
  81. package/.torusguard/rules/secrets/TG-SEC-005-secret-in-git-history.md +37 -0
  82. package/.torusguard/rules/secrets/TG-SEC-006-secret-in-build-artifact.md +37 -0
  83. package/.torusguard/rules/secrets/TG-SEC-007-secret-in-test-or-example-fixture.md +37 -0
  84. package/.torusguard/rules/ssrf/TG-SSRF-001-user-controlled-server-side-url-fetch.md +68 -0
  85. package/.torusguard/rules/ssrf/TG-SSRF-002-missing-internal-network-protection.md +37 -0
  86. package/.torusguard/rules/ssrf/TG-SSRF-003-unsafe-redirect-following.md +37 -0
  87. package/.torusguard/rules/ssrf/TG-SSRF-004-unbounded-outbound-request.md +37 -0
  88. package/.torusguard/rules/supply-chain/TG-SUPPLY-001-missing-or-ignored-dependency-lockfile.md +37 -0
  89. package/.torusguard/rules/supply-chain/TG-SUPPLY-002-vulnerable-dependency-review-missing.md +94 -0
  90. package/.torusguard/rules/supply-chain/TG-SUPPLY-003-unsafe-ci-cd-secret-exposure.md +37 -0
  91. package/.torusguard/rules/supply-chain/TG-SUPPLY-004-unpinned-ci-action.md +37 -0
  92. package/.torusguard/rules/supply-chain/TG-SUPPLY-005-unsafe-dependency-install-script.md +37 -0
  93. package/.torusguard/rules/supply-chain/TG-SUPPLY-006-container-build-secret-persistence.md +61 -0
  94. package/.torusguard/rules/webhook/TG-WEBHOOK-001-missing-webhook-signature-verification.md +37 -0
  95. package/.torusguard/rules/webhook/TG-WEBHOOK-002-replayable-webhook.md +37 -0
  96. package/.torusguard/rules/webhook/TG-WEBHOOK-003-missing-webhook-idempotency.md +37 -0
  97. package/.torusguard/rules/webhook/TG-WEBHOOK-004-unvalidated-webhook-event-type.md +37 -0
  98. package/.torusguard/rules/websocket/TG-WS-001-unauthenticated-websocket-handshake.md +82 -0
  99. package/.torusguard/rules/websocket/TG-WS-002-missing-channel-level-authorization.md +37 -0
  100. package/.torusguard/rules/websocket/TG-WS-003-unvalidated-websocket-message.md +37 -0
  101. package/.torusguard/rules/websocket/TG-WS-004-unbounded-websocket-connections.md +37 -0
  102. package/.torusguard/runs/report-latest.html +62 -20
  103. package/.torusguard/runs/run-20260908-112648-audit/findings.json +1520 -0
  104. package/.torusguard/runs/run-20260908-112648-audit/findings.md +560 -0
  105. package/.torusguard/runs/run-20260908-112648-audit/manifest.json +12 -0
  106. package/.torusguard/runs/run-20260908-112648-audit/summary.md +5 -0
  107. package/.torusguard/runs/run-20260908-112722-audit/findings.json +1520 -0
  108. package/.torusguard/runs/run-20260908-112722-audit/findings.md +560 -0
  109. package/.torusguard/runs/run-20260908-112722-audit/manifest.json +12 -0
  110. package/.torusguard/runs/run-20260908-112722-audit/summary.md +5 -0
  111. package/.torusguard/runs/run-20260908-113004-audit/findings.json +1520 -0
  112. package/.torusguard/runs/run-20260908-113004-audit/findings.md +560 -0
  113. package/.torusguard/runs/run-20260908-113004-audit/manifest.json +12 -0
  114. package/.torusguard/runs/run-20260908-113004-audit/summary.md +5 -0
  115. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-115-9a059e/metadata.json +15 -0
  116. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-115-9a059e/minimal_patch_plan.md +21 -0
  117. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-115-9a059e/patch.diff +9 -0
  118. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-119-61557c/metadata.json +15 -0
  119. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-119-61557c/minimal_patch_plan.md +21 -0
  120. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-119-61557c/patch.diff +9 -0
  121. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-265-996ca3/metadata.json +15 -0
  122. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-265-996ca3/minimal_patch_plan.md +21 -0
  123. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-265-996ca3/patch.diff +9 -0
  124. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-334-cb819d/metadata.json +15 -0
  125. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-334-cb819d/minimal_patch_plan.md +21 -0
  126. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-334-cb819d/patch.diff +9 -0
  127. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-503-d11cf8/metadata.json +15 -0
  128. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-503-d11cf8/minimal_patch_plan.md +21 -0
  129. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-503-d11cf8/patch.diff +9 -0
  130. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-79-91f41f/metadata.json +15 -0
  131. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-79-91f41f/minimal_patch_plan.md +21 -0
  132. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-79-91f41f/patch.diff +9 -0
  133. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-107-516a40/metadata.json +15 -0
  134. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-107-516a40/minimal_patch_plan.md +21 -0
  135. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-107-516a40/patch.diff +9 -0
  136. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-128-7809a1/metadata.json +15 -0
  137. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-128-7809a1/minimal_patch_plan.md +21 -0
  138. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-128-7809a1/patch.diff +9 -0
  139. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-232-1b45d1/metadata.json +15 -0
  140. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-232-1b45d1/minimal_patch_plan.md +21 -0
  141. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-232-1b45d1/patch.diff +9 -0
  142. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-003-53-d167b4/metadata.json +15 -0
  143. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-003-53-d167b4/minimal_patch_plan.md +21 -0
  144. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-003-53-d167b4/patch.diff +9 -0
  145. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-209-4f6424/metadata.json +15 -0
  146. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-209-4f6424/minimal_patch_plan.md +21 -0
  147. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-209-4f6424/patch.diff +9 -0
  148. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-257-89bf34/metadata.json +15 -0
  149. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-257-89bf34/minimal_patch_plan.md +21 -0
  150. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-257-89bf34/patch.diff +9 -0
  151. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-341-ce228c/metadata.json +15 -0
  152. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-341-ce228c/minimal_patch_plan.md +21 -0
  153. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-341-ce228c/patch.diff +9 -0
  154. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-355-7b190b/metadata.json +15 -0
  155. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-355-7b190b/minimal_patch_plan.md +21 -0
  156. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-355-7b190b/patch.diff +9 -0
  157. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-64-5af31a/metadata.json +15 -0
  158. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-64-5af31a/minimal_patch_plan.md +21 -0
  159. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-64-5af31a/patch.diff +9 -0
  160. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-9-f51467/metadata.json +15 -0
  161. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-9-f51467/minimal_patch_plan.md +21 -0
  162. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-9-f51467/patch.diff +9 -0
  163. package/.torusguard/runs/run-20260908-113127-audit/findings.json +1520 -0
  164. package/.torusguard/runs/run-20260908-113127-audit/findings.md +560 -0
  165. package/.torusguard/runs/run-20260908-113127-audit/manifest.json +13 -0
  166. package/.torusguard/runs/run-20260908-113127-audit/remediation.md +262 -0
  167. package/.torusguard/runs/run-20260908-113127-audit/summary.md +5 -0
  168. package/.torusguard/runs/run-20260908-115240-audit/apply_plan.md +6 -0
  169. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-115-9a059e/metadata.json +15 -0
  170. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-115-9a059e/minimal_patch_plan.md +21 -0
  171. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-115-9a059e/patch.diff +9 -0
  172. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-119-61557c/metadata.json +15 -0
  173. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-119-61557c/minimal_patch_plan.md +21 -0
  174. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-119-61557c/patch.diff +9 -0
  175. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-265-996ca3/metadata.json +15 -0
  176. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-265-996ca3/minimal_patch_plan.md +21 -0
  177. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-265-996ca3/patch.diff +9 -0
  178. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-334-cb819d/metadata.json +15 -0
  179. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-334-cb819d/minimal_patch_plan.md +21 -0
  180. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-334-cb819d/patch.diff +9 -0
  181. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-503-d11cf8/metadata.json +15 -0
  182. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-503-d11cf8/minimal_patch_plan.md +21 -0
  183. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-503-d11cf8/patch.diff +9 -0
  184. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-79-91f41f/metadata.json +15 -0
  185. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-79-91f41f/minimal_patch_plan.md +21 -0
  186. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-79-91f41f/patch.diff +9 -0
  187. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-107-516a40/metadata.json +15 -0
  188. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-107-516a40/minimal_patch_plan.md +21 -0
  189. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-107-516a40/patch.diff +9 -0
  190. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-128-7809a1/metadata.json +15 -0
  191. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-128-7809a1/minimal_patch_plan.md +21 -0
  192. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-128-7809a1/patch.diff +9 -0
  193. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-232-1b45d1/metadata.json +15 -0
  194. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-232-1b45d1/minimal_patch_plan.md +21 -0
  195. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-232-1b45d1/patch.diff +9 -0
  196. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-003-53-d167b4/metadata.json +15 -0
  197. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-003-53-d167b4/minimal_patch_plan.md +21 -0
  198. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-003-53-d167b4/patch.diff +9 -0
  199. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-platform-001-168-5027cb/metadata.json +15 -0
  200. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-platform-001-168-5027cb/minimal_patch_plan.md +21 -0
  201. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-platform-001-168-5027cb/patch.diff +9 -0
  202. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-209-4f6424/metadata.json +15 -0
  203. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-209-4f6424/minimal_patch_plan.md +21 -0
  204. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-209-4f6424/patch.diff +9 -0
  205. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-257-89bf34/metadata.json +15 -0
  206. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-257-89bf34/minimal_patch_plan.md +21 -0
  207. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-257-89bf34/patch.diff +9 -0
  208. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-341-ce228c/metadata.json +15 -0
  209. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-341-ce228c/minimal_patch_plan.md +21 -0
  210. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-341-ce228c/patch.diff +9 -0
  211. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-355-7b190b/metadata.json +15 -0
  212. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-355-7b190b/minimal_patch_plan.md +21 -0
  213. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-355-7b190b/patch.diff +9 -0
  214. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-64-5af31a/metadata.json +15 -0
  215. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-64-5af31a/minimal_patch_plan.md +21 -0
  216. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-64-5af31a/patch.diff +9 -0
  217. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-9-f51467/metadata.json +15 -0
  218. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-9-f51467/minimal_patch_plan.md +21 -0
  219. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-9-f51467/patch.diff +9 -0
  220. package/.torusguard/runs/run-20260908-115240-audit/diff_summary.md +221 -0
  221. package/.torusguard/runs/run-20260908-115240-audit/findings.json +1553 -0
  222. package/.torusguard/runs/run-20260908-115240-audit/findings.md +572 -0
  223. package/.torusguard/runs/run-20260908-115240-audit/manifest.json +14 -0
  224. package/.torusguard/runs/run-20260908-115240-audit/recheck.md +91 -0
  225. package/.torusguard/runs/run-20260908-115240-audit/remediation.md +278 -0
  226. package/.torusguard/runs/run-20260908-115240-audit/summary.md +5 -0
  227. package/.torusguard/scripts/__pycache__/audit_runner.cpython-311.pyc +0 -0
  228. package/.torusguard/scripts/__pycache__/finding_scorer.cpython-311.pyc +0 -0
  229. package/.torusguard/scripts/__pycache__/memory_engine.cpython-311.pyc +0 -0
  230. package/.torusguard/scripts/__pycache__/monorepo_detector.cpython-311.pyc +0 -0
  231. package/.torusguard/scripts/__pycache__/run_manager.cpython-311.pyc +0 -0
  232. package/.torusguard/scripts/__pycache__/stack_detect.cpython-311.pyc +0 -0
  233. package/.torusguard/scripts/apply_runner.py +332 -0
  234. package/.torusguard/scripts/audit_runner.py +550 -0
  235. package/.torusguard/scripts/diff_guard.py +52 -4
  236. package/.torusguard/scripts/finding_scorer.py +58 -0
  237. package/.torusguard/scripts/harden_runner.py +353 -0
  238. package/.torusguard/scripts/html_reporter.py +25 -10
  239. package/.torusguard/scripts/manifest_builder.py +2 -0
  240. package/.torusguard/scripts/memory_engine.py +4 -0
  241. package/.torusguard/scripts/recheck_runner.py +221 -0
  242. package/.torusguard/scripts/recipes_runner.py +130 -0
  243. package/.torusguard/scripts/run_manager.py +17 -5
  244. package/.torusguard/skills/torusguard/SKILL.md +42 -42
  245. package/.torusguard/snapshots/run-20260908-115240-audit/examples/vulnerable-react-express/client/src/App.jsx.bak +63 -0
  246. package/.torusguard/snapshots/run-20260908-115240-audit/examples/vulnerable-react-express/server/index.js.bak +82 -0
  247. package/.torusguard/snapshots/run-20260908-115240-audit/harness/engine/fixture_manager.py.bak +245 -0
  248. package/.torusguard/snapshots/run-20260908-115240-audit/harness/master_validation.py.bak +698 -0
  249. package/.torusguard/snapshots/run-20260908-115240-audit/harness/runner.py.bak +551 -0
  250. package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_e2e.py.bak +498 -0
  251. package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_qa_v0_6_0.py.bak +572 -0
  252. package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_v0_6_1_scale.py.bak +371 -0
  253. package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_v0_6_2_modern_stacks.py.bak +462 -0
  254. package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_v0_6_3_hardening.py.bak +444 -0
  255. package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_v1_0_0_memory.py.bak +302 -0
  256. package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_v1_1_0_advanced_memory.py.bak +342 -0
  257. package/.torusguard/snapshots/run-20260908-115240-audit/skills/torusguard/payload/scripts/harden_runner.py.bak +353 -0
  258. package/.torusguard/snapshots/run-20260908-115240-audit/tests/test_v0_6_0_governed_remediation.py.bak +353 -0
  259. package/README.md +70 -33
  260. package/bin/torusguard.js +89 -19
  261. package/package.json +1 -1
  262. package/skills/torusguard/SKILL.md +42 -42
  263. package/skills/torusguard/bootstrap.py +147 -68
  264. package/skills/torusguard/payload/.manifest.json +113 -9
  265. package/skills/torusguard/payload/rules/README.md +93 -62
  266. package/skills/torusguard/payload/rules/TG-AUTH-001-weak-password-storage.md +103 -0
  267. package/skills/torusguard/payload/rules/TG-AUTH-002-client-only-authorization.md +85 -0
  268. package/skills/torusguard/payload/rules/TG-AUTH-003-missing-object-authorization.md +85 -0
  269. package/skills/torusguard/payload/rules/TG-AUTH-004-insecure-session-cookie.md +96 -0
  270. package/skills/torusguard/payload/rules/TG-AUTH-005-unsafe-password-reset.md +104 -0
  271. package/skills/torusguard/payload/rules/TG-CLIENT-001-public-production-source-maps.md +102 -0
  272. package/skills/torusguard/payload/rules/TG-CLIENT-002-sensitive-client-bundle-content.md +102 -0
  273. package/skills/torusguard/payload/rules/TG-DB-001-frontend-database-query.md +83 -0
  274. package/skills/torusguard/payload/rules/TG-DB-002-privileged-database-credential.md +86 -0
  275. package/skills/torusguard/payload/rules/TG-DB-003-frontend-admin-sdk.md +91 -0
  276. package/skills/torusguard/payload/rules/TG-DB-004-missing-tenant-query-isolation.md +103 -0
  277. package/skills/torusguard/payload/rules/TG-INPUT-001-missing-server-validation.md +98 -0
  278. package/skills/torusguard/payload/rules/TG-INPUT-002-raw-sql-concatenation.md +94 -0
  279. package/skills/torusguard/payload/rules/TG-INPUT-003-unsafe-html-or-code-execution.md +102 -0
  280. package/skills/torusguard/payload/rules/TG-INPUT-004-unrestricted-file-upload.md +92 -0
  281. package/skills/torusguard/payload/rules/TG-INPUT-005-unsafe-template-rendering-and-escaping.md +102 -0
  282. package/skills/torusguard/payload/rules/TG-INPUT-006-unsafe-file-path-traversal.md +131 -0
  283. package/skills/torusguard/payload/rules/TG-PLATFORM-001-wildcard-cors-with-credentials.md +101 -0
  284. package/skills/torusguard/payload/rules/TG-PLATFORM-002-missing-security-headers.md +95 -0
  285. package/skills/torusguard/payload/rules/TG-PLATFORM-003-production-stack-trace-exposure.md +94 -0
  286. package/skills/torusguard/payload/rules/TG-PLATFORM-004-missing-request-size-limits.md +102 -0
  287. package/skills/torusguard/payload/rules/TG-RATE-001-unlimited-auth-endpoint.md +112 -0
  288. package/skills/torusguard/payload/rules/TG-RATE-002-unlimited-public-write-endpoint.md +109 -0
  289. package/skills/torusguard/payload/rules/TG-RATE-003-unbounded-resource-consumption.md +105 -0
  290. package/skills/torusguard/payload/rules/TG-SEC-001-hardcoded-secrets.md +83 -0
  291. package/skills/torusguard/payload/rules/TG-SEC-002-public-environment-secrets.md +83 -0
  292. package/skills/torusguard/payload/rules/TG-SEC-003-tracked-env-file.md +79 -0
  293. package/skills/torusguard/payload/rules/TG-SEC-004-sensitive-logging.md +83 -0
  294. package/skills/torusguard/payload/rules/active/TG-AUTH-001-weak-password-storage.md +103 -0
  295. package/skills/torusguard/payload/rules/active/TG-AUTH-002-client-only-authorization.md +85 -0
  296. package/skills/torusguard/payload/rules/active/TG-AUTH-003-missing-object-authorization.md +85 -0
  297. package/skills/torusguard/payload/rules/active/TG-AUTH-004-insecure-session-cookie.md +96 -0
  298. package/skills/torusguard/payload/rules/active/TG-AUTH-005-unsafe-password-reset.md +104 -0
  299. package/skills/torusguard/payload/rules/active/TG-CLIENT-001-public-production-source-maps.md +102 -0
  300. package/skills/torusguard/payload/rules/active/TG-CLIENT-002-sensitive-client-bundle-content.md +102 -0
  301. package/skills/torusguard/payload/rules/active/TG-DB-001-frontend-database-query.md +83 -0
  302. package/skills/torusguard/payload/rules/active/TG-DB-002-privileged-database-credential.md +86 -0
  303. package/skills/torusguard/payload/rules/active/TG-DB-003-frontend-admin-sdk.md +91 -0
  304. package/skills/torusguard/payload/rules/active/TG-DB-004-missing-tenant-query-isolation.md +103 -0
  305. package/skills/torusguard/payload/rules/active/TG-INPUT-001-missing-server-validation.md +98 -0
  306. package/skills/torusguard/payload/rules/active/TG-INPUT-002-raw-sql-concatenation.md +94 -0
  307. package/skills/torusguard/payload/rules/active/TG-INPUT-003-unsafe-html-or-code-execution.md +102 -0
  308. package/skills/torusguard/payload/rules/active/TG-INPUT-004-unrestricted-file-upload.md +92 -0
  309. package/skills/torusguard/payload/rules/active/TG-INPUT-005-unsafe-template-rendering-and-escaping.md +102 -0
  310. package/skills/torusguard/payload/rules/active/TG-INPUT-006-unsafe-file-path-traversal.md +131 -0
  311. package/skills/torusguard/payload/rules/active/TG-PLATFORM-001-wildcard-cors-with-credentials.md +101 -0
  312. package/skills/torusguard/payload/rules/active/TG-PLATFORM-002-missing-security-headers.md +95 -0
  313. package/skills/torusguard/payload/rules/active/TG-PLATFORM-003-production-stack-trace-exposure.md +94 -0
  314. package/skills/torusguard/payload/rules/active/TG-PLATFORM-004-missing-request-size-limits.md +102 -0
  315. package/skills/torusguard/payload/rules/active/TG-RATE-001-unlimited-auth-endpoint.md +112 -0
  316. package/skills/torusguard/payload/rules/active/TG-RATE-002-unlimited-public-write-endpoint.md +109 -0
  317. package/skills/torusguard/payload/rules/active/TG-RATE-003-unbounded-resource-consumption.md +105 -0
  318. package/skills/torusguard/payload/rules/active/TG-SEC-001-hardcoded-secrets.md +83 -0
  319. package/skills/torusguard/payload/rules/active/TG-SEC-002-public-environment-secrets.md +83 -0
  320. package/skills/torusguard/payload/rules/active/TG-SEC-003-tracked-env-file.md +79 -0
  321. package/skills/torusguard/payload/rules/active/TG-SEC-004-sensitive-logging.md +83 -0
  322. package/skills/torusguard/payload/rules/agent/TG-AGENT-001-prompt-injection-system-context.md +56 -0
  323. package/skills/torusguard/payload/rules/agent/TG-AGENT-002-unsafe-tool-dispatch-unsandboxed-execution.md +68 -0
  324. package/skills/torusguard/payload/rules/agent/TG-AGENT-003-broad-mcp-tool-scoping.md +53 -0
  325. package/skills/torusguard/payload/rules/agent/TG-AGENT-004-persistent-memory-cross-session-leakage.md +67 -0
  326. package/skills/torusguard/payload/rules/authorization/TG-AUTH-006-mass-assignment.md +70 -0
  327. package/skills/torusguard/payload/rules/authorization/TG-AUTH-007-missing-property-level-authorization.md +71 -0
  328. package/skills/torusguard/payload/rules/authorization/TG-AUTH-008-untrusted-role-header-injection.md +112 -0
  329. package/skills/torusguard/payload/rules/business-logic/TG-BIZ-001-client-controlled-sensitive-business-value.md +37 -0
  330. package/skills/torusguard/payload/rules/business-logic/TG-BIZ-002-replayable-one-time-operation.md +37 -0
  331. package/skills/torusguard/payload/rules/business-logic/TG-BIZ-003-missing-workflow-state-validation.md +37 -0
  332. package/skills/torusguard/payload/rules/business-logic/TG-BIZ-004-unrestricted-sensitive-business-flow.md +37 -0
  333. package/skills/torusguard/payload/rules/cache/TG-CACHE-001-sensitive-response-publicly-cacheable.md +37 -0
  334. package/skills/torusguard/payload/rules/cache/TG-CACHE-002-missing-user-cache-isolation.md +37 -0
  335. package/skills/torusguard/payload/rules/cache/TG-CACHE-003-sensitive-data-in-url.md +37 -0
  336. package/skills/torusguard/payload/rules/csrf/TG-CSRF-001-missing-csrf-protection.md +37 -0
  337. package/skills/torusguard/payload/rules/csrf/TG-CSRF-002-unsafe-credentialed-cross-origin-request.md +37 -0
  338. package/skills/torusguard/payload/rules/edge/TG-EDGE-001-serverless-global-state-leak.md +83 -0
  339. package/skills/torusguard/payload/rules/edge/TG-EDGE-003-aws-lambda-ephemeral-cold-start.md +76 -0
  340. package/skills/torusguard/payload/rules/graphql/TG-GQL-001-missing-query-depth-or-complexity-limits.md +64 -0
  341. package/skills/torusguard/payload/rules/graphql/TG-GQL-002-resolver-missing-authorization.md +37 -0
  342. package/skills/torusguard/payload/rules/graphql/TG-GQL-003-unbounded-graphql-pagination-or-batching.md +37 -0
  343. package/skills/torusguard/payload/rules/graphql/TG-GQL-004-unnecessary-production-introspection.md +37 -0
  344. package/skills/torusguard/payload/rules/secrets/TG-SEC-005-secret-in-git-history.md +37 -0
  345. package/skills/torusguard/payload/rules/secrets/TG-SEC-006-secret-in-build-artifact.md +37 -0
  346. package/skills/torusguard/payload/rules/secrets/TG-SEC-007-secret-in-test-or-example-fixture.md +37 -0
  347. package/skills/torusguard/payload/rules/ssrf/TG-SSRF-001-user-controlled-server-side-url-fetch.md +68 -0
  348. package/skills/torusguard/payload/rules/ssrf/TG-SSRF-002-missing-internal-network-protection.md +37 -0
  349. package/skills/torusguard/payload/rules/ssrf/TG-SSRF-003-unsafe-redirect-following.md +37 -0
  350. package/skills/torusguard/payload/rules/ssrf/TG-SSRF-004-unbounded-outbound-request.md +37 -0
  351. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-001-missing-or-ignored-dependency-lockfile.md +37 -0
  352. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-002-vulnerable-dependency-review-missing.md +94 -0
  353. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-003-unsafe-ci-cd-secret-exposure.md +37 -0
  354. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-004-unpinned-ci-action.md +37 -0
  355. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-005-unsafe-dependency-install-script.md +37 -0
  356. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-006-container-build-secret-persistence.md +61 -0
  357. package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-001-missing-webhook-signature-verification.md +37 -0
  358. package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-002-replayable-webhook.md +37 -0
  359. package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-003-missing-webhook-idempotency.md +37 -0
  360. package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-004-unvalidated-webhook-event-type.md +37 -0
  361. package/skills/torusguard/payload/rules/websocket/TG-WS-001-unauthenticated-websocket-handshake.md +82 -0
  362. package/skills/torusguard/payload/rules/websocket/TG-WS-002-missing-channel-level-authorization.md +37 -0
  363. package/skills/torusguard/payload/rules/websocket/TG-WS-003-unvalidated-websocket-message.md +37 -0
  364. package/skills/torusguard/payload/rules/websocket/TG-WS-004-unbounded-websocket-connections.md +37 -0
  365. package/skills/torusguard/payload/scripts/apply_runner.py +332 -0
  366. package/skills/torusguard/payload/scripts/audit_runner.py +550 -0
  367. package/skills/torusguard/payload/scripts/diff_guard.py +52 -4
  368. package/skills/torusguard/payload/scripts/finding_scorer.py +58 -0
  369. package/skills/torusguard/payload/scripts/harden_runner.py +353 -0
  370. package/skills/torusguard/payload/scripts/html_reporter.py +25 -10
  371. package/skills/torusguard/payload/scripts/manifest_builder.py +2 -0
  372. package/skills/torusguard/payload/scripts/memory_engine.py +4 -0
  373. package/skills/torusguard/payload/scripts/recheck_runner.py +221 -0
  374. package/skills/torusguard/payload/scripts/recipes_runner.py +130 -0
  375. package/skills/torusguard/payload/scripts/run_manager.py +17 -5
  376. package/skills/torusguard/payload/skills/torusguard/SKILL.md +42 -42
  377. package/skills/torusguard/payload/skills/torusguard/bootstrap.py +147 -68
@@ -0,0 +1,96 @@
1
+ # TG-AUTH-004: Insecure Session Cookie Configuration
2
+
3
+ ## Severity
4
+ High
5
+
6
+ ## Applies To
7
+ - Web applications using cookie-based sessions
8
+ - Authentication gateways and reverse proxies
9
+ - Legacy apps migrating from token storage in local storage
10
+ - SSO callback handlers setting auth cookies
11
+
12
+ ## Why It Matters
13
+ Session cookies that lack secure attributes can be stolen, replayed, or manipulated by attackers.
14
+ Missing `HttpOnly` enables JavaScript access during XSS, missing `Secure` exposes cookies over unencrypted transport, and weak `SameSite` settings increase CSRF risk.
15
+ Improper domain/path/lifetime settings also expand token exposure across subdomains and long time windows.
16
+
17
+ ## What TorusGuard Looks For
18
+ - Cookies set without `HttpOnly`, `Secure`, or explicit `SameSite`.
19
+ - Session identifiers in URL parameters or local storage instead of hardened cookies.
20
+ - Excessive cookie lifetime for sensitive sessions.
21
+ - Broad cookie domain scopes (`.example.com`) without necessity.
22
+ - Session rotation missing after login, privilege change, or password reset.
23
+
24
+ ## Unsafe Example
25
+ ```js
26
+ app.post("/api/login", async (req, res) => {
27
+ const sessionId = await createSession(req.body.email, req.body.password);
28
+ if (!sessionId) return res.status(401).json({ ok: false });
29
+
30
+ // Missing critical security attributes
31
+ res.cookie("sid", sessionId, {
32
+ sameSite: "none"
33
+ });
34
+
35
+ res.json({ ok: true });
36
+ });
37
+ ```
38
+
39
+ ## Safe Example
40
+ ```js
41
+ app.post("/api/login", async (req, res) => {
42
+ const user = await verifyCredentials(req.body.email, req.body.password);
43
+ if (!user) return res.status(401).json({ ok: false });
44
+
45
+ const sessionId = await createSession(user.id);
46
+ res.cookie("sid", sessionId, {
47
+ httpOnly: true,
48
+ secure: true,
49
+ sameSite: "lax",
50
+ path: "/",
51
+ maxAge: 1000 * 60 * 30 // 30 minutes
52
+ });
53
+
54
+ res.json({ ok: true });
55
+ });
56
+
57
+ app.post("/api/password/reset/complete", requireAuth, async (req, res) => {
58
+ await invalidateAllSessions(req.auth.userId);
59
+ const rotated = await createSession(req.auth.userId);
60
+
61
+ res.cookie("sid", rotated, {
62
+ httpOnly: true,
63
+ secure: true,
64
+ sameSite: "strict",
65
+ path: "/",
66
+ maxAge: 1000 * 60 * 15
67
+ });
68
+
69
+ res.json({ ok: true });
70
+ });
71
+ ```
72
+
73
+ ## Remediation
74
+ 1. Set `HttpOnly`, `Secure`, and explicit `SameSite` on all session/auth cookies.
75
+ 2. Use HTTPS everywhere; reject insecure origins and mixed-content session transport.
76
+ 3. Minimize cookie scope with narrow domain/path and reasonable expiration.
77
+ 4. Rotate session IDs on authentication, privilege transitions, and credential recovery.
78
+ 5. Invalidate old sessions on logout, password changes, and suspicious activity.
79
+ 6. Add CSRF protections compatible with cookie strategy for state-changing requests.
80
+
81
+ ## Verification
82
+ - Inspect `Set-Cookie` headers in browser/network tools for required attributes.
83
+ - Attempt JavaScript cookie reads and confirm auth cookies are inaccessible.
84
+ - Test login over HTTP in non-production environments and ensure secure policy behavior.
85
+ - Validate old session IDs stop working after rotation events.
86
+ - Confirm cross-site POST attempts are blocked by SameSite and CSRF controls.
87
+
88
+ ## False Positives and Exceptions
89
+ - `SameSite=None` can be valid for specific cross-site SSO flows, but requires `Secure` and additional CSRF controls.
90
+ - Development environments on localhost may need adjusted secure handling; document separation from production settings.
91
+ - Stateless bearer tokens in headers are out of scope for this rule but require equivalent protections.
92
+
93
+ ## Related Rules
94
+ - [TG-AUTH-002](./TG-AUTH-002-client-only-authorization.md)
95
+ - [TG-AUTH-005](./TG-AUTH-005-unsafe-password-reset.md)
96
+ - [TG-INPUT-003](./TG-INPUT-003-unsafe-html-or-code-execution.md)
@@ -0,0 +1,104 @@
1
+ # TG-AUTH-005: Unsafe Password Reset Flow
2
+
3
+ ## Severity
4
+ High
5
+
6
+ ## Applies To
7
+ - "Forgot password" and account recovery endpoints
8
+ - Email/SMS reset token issuance and verification
9
+ - Self-service credential recovery in web and mobile apps
10
+ - Administrative reset tooling for user accounts
11
+
12
+ ## Why It Matters
13
+ Password reset is a high-value account takeover target because it bypasses existing credentials.
14
+ Weak reset token generation, leakage through URLs/logs, missing expiry, and lack of rate limiting can let attackers hijack accounts at scale.
15
+ Unsafe reset completion logic can also leave existing sessions active, preserving attacker access.
16
+
17
+ ## What TorusGuard Looks For
18
+ - Predictable reset tokens or short numeric codes without brute-force protection.
19
+ - Reset tokens stored in plaintext and compared directly.
20
+ - Missing token expiry, single-use enforcement, or account binding checks.
21
+ - User enumeration through distinct responses for existing vs non-existing emails.
22
+ - Failure to invalidate active sessions after successful password reset.
23
+
24
+ ## Unsafe Example
25
+ ```js
26
+ app.post("/api/password/forgot", async (req, res) => {
27
+ const user = await db.user.findUnique({ where: { email: req.body.email } });
28
+ if (!user) return res.status(404).json({ ok: false, error: "No account found" });
29
+
30
+ const token = Math.floor(Math.random() * 1000000).toString();
31
+ await db.password_reset.create({
32
+ data: { user_id: user.id, token, expires_at: null, used: false }
33
+ });
34
+
35
+ await sendMail(user.email, `Reset link: https://app.example/reset?token=${token}`);
36
+ res.json({ ok: true });
37
+ });
38
+ ```
39
+
40
+ ## Safe Example
41
+ ```js
42
+ import crypto from "crypto";
43
+
44
+ app.post("/api/password/forgot", async (req, res) => {
45
+ const email = String(req.body.email || "").toLowerCase();
46
+ const user = await db.user.findUnique({ where: { email } });
47
+
48
+ // Always return generic response to prevent user enumeration
49
+ if (user) {
50
+ const rawToken = crypto.randomBytes(32).toString("hex");
51
+ const tokenHash = crypto.createHash("sha256").update(rawToken).digest("hex");
52
+ const expiresAt = new Date(Date.now() + 15 * 60 * 1000);
53
+
54
+ await db.password_reset.create({
55
+ data: { user_id: user.id, token_hash: tokenHash, expires_at: expiresAt, used: false }
56
+ });
57
+
58
+ await sendMail(user.email, `Reset link: https://app.example/reset?token=${rawToken}`);
59
+ }
60
+
61
+ res.json({ ok: true, message: "If an account exists, a reset email has been sent." });
62
+ });
63
+
64
+ app.post("/api/password/reset", async (req, res) => {
65
+ const rawToken = String(req.body.token || "");
66
+ const newPassword = String(req.body.newPassword || "");
67
+ const tokenHash = crypto.createHash("sha256").update(rawToken).digest("hex");
68
+
69
+ const record = await db.password_reset.findFirst({
70
+ where: { token_hash: tokenHash, used: false, expires_at: { gt: new Date() } }
71
+ });
72
+ if (!record) return res.status(400).json({ ok: false, error: "Invalid or expired token" });
73
+
74
+ await setUserPassword(record.user_id, newPassword);
75
+ await db.password_reset.update({ where: { id: record.id }, data: { used: true } });
76
+ await invalidateAllSessions(record.user_id);
77
+ res.json({ ok: true });
78
+ });
79
+ ```
80
+
81
+ ## Remediation
82
+ 1. Generate cryptographically strong, high-entropy reset tokens and store only token hashes.
83
+ 2. Enforce short token lifetime, one-time use, and strict account binding.
84
+ 3. Apply rate limits and anomaly detection on reset request and token verification endpoints.
85
+ 4. Return generic responses for reset initiation to prevent account enumeration.
86
+ 5. Invalidate active sessions and recovery artifacts after successful password reset.
87
+ 6. Require strong new passwords and optionally step-up verification for risky reset attempts.
88
+
89
+ ## Verification
90
+ - Request reset for known and unknown emails; verify indistinguishable responses.
91
+ - Attempt brute-force token guesses and confirm lockout/rate-limit behavior.
92
+ - Reuse a consumed token and confirm it fails.
93
+ - Use an expired token and verify rejection path.
94
+ - Confirm all existing sessions are invalidated after reset completion.
95
+
96
+ ## False Positives and Exceptions
97
+ - Enterprise SSO environments may delegate password reset externally; local reset flows should be disabled or strongly gated.
98
+ - Short OTP codes can be acceptable when combined with strict attempt limits, device binding, and very short expiry.
99
+ - Manual support resets need controlled operator workflows and audit trails.
100
+
101
+ ## Related Rules
102
+ - [TG-AUTH-001](./TG-AUTH-001-weak-password-storage.md)
103
+ - [TG-AUTH-004](./TG-AUTH-004-insecure-session-cookie.md)
104
+ - [TG-INPUT-001](./TG-INPUT-001-missing-server-validation.md)
@@ -0,0 +1,102 @@
1
+ # TG-CLIENT-001: Public Production Source Maps
2
+
3
+ ## Severity
4
+
5
+ Medium
6
+
7
+ ## Applies To
8
+
9
+ - Vite production builds (`build.sourcemap`)
10
+ - Next.js production source map settings (`productionBrowserSourceMaps`)
11
+ - Create React App/Webpack production `devtool` configuration
12
+ - Static hosting/CDN configurations that publish `.map` assets publicly
13
+ - Any SPA/SSR frontend bundle served to untrusted clients
14
+
15
+ ## Why It Matters
16
+
17
+ Source maps improve debugging, but can expose internal implementation details.
18
+ Public `.map` files make reverse engineering easier at scale.
19
+ Attackers can quickly recover original symbols, comments, and code structure.
20
+ This increases the efficiency of finding hidden routes, feature flags, and weak points.
21
+ It does not create a vulnerability alone, but it lowers attacker effort materially.
22
+ Browser DevTools cannot be blocked, so exposure must be reduced at build and hosting layers.
23
+
24
+ ## What TorusGuard Looks For
25
+
26
+ - Build configs enabling source maps for production bundles
27
+ - Presence of emitted `*.js.map` or `*.css.map` in deploy artifacts
28
+ - CDN/static host rules that allow unauthenticated access to map files
29
+ - Missing split behavior (private error telemetry maps vs public maps)
30
+ - Framework defaults overridden to expose maps in production
31
+ - CI pipelines that upload maps to public artifact locations
32
+
33
+ ## Unsafe Example
34
+
35
+ ```ts
36
+ // vite.config.ts
37
+ import { defineConfig } from "vite";
38
+
39
+ export default defineConfig({
40
+ build: {
41
+ sourcemap: true
42
+ }
43
+ });
44
+ ```
45
+
46
+ ```js
47
+ // next.config.js
48
+ module.exports = {
49
+ productionBrowserSourceMaps: true
50
+ };
51
+ ```
52
+
53
+ ## Safe Example
54
+
55
+ ```ts
56
+ // vite.config.ts
57
+ import { defineConfig } from "vite";
58
+
59
+ export default defineConfig({
60
+ build: {
61
+ sourcemap: false
62
+ }
63
+ });
64
+ ```
65
+
66
+ ```js
67
+ // next.config.js
68
+ module.exports = {
69
+ productionBrowserSourceMaps: false
70
+ };
71
+ ```
72
+
73
+ ## Remediation
74
+
75
+ 1. Disable public production source maps by default in Vite/Next/CRA/Webpack.
76
+ 2. If stack-trace symbolication is required, upload maps to a private error-monitoring service only.
77
+ 3. Block direct `.map` retrieval on CDN and static hosting layers.
78
+ 4. Validate build pipelines do not copy maps into public deployment folders.
79
+ 5. Remove already published map files from current and prior versions where feasible.
80
+ 6. Document an exception process for temporary debugging in production.
81
+ 7. Pair with bundle scanning to ensure sensitive literals are not shipped regardless.
82
+
83
+ ## Verification
84
+
85
+ - Build production artifacts and confirm no `*.map` files in public output.
86
+ - Request known map paths in deployed environments and verify denial/404 behavior.
87
+ - Check framework configs (`vite.config`, `next.config`, webpack overrides) for safe values.
88
+ - Confirm telemetry symbolication still works via private upload channels where used.
89
+ - Validate rollback artifacts are also map-free in release storage.
90
+
91
+ ## False Positives and Exceptions
92
+
93
+ - Private internal tools served only behind corporate SSO and network controls
94
+ - Short-lived troubleshooting releases with approved exception and explicit expiry
95
+ - Source maps uploaded privately to monitoring vendor, not served publicly
96
+ - Bundles where maps exist on disk but are never deployed to public hosts
97
+
98
+ ## Related Rules
99
+
100
+ - `TG-CLIENT-002-sensitive-client-bundle-content.md`
101
+ - `TG-PLATFORM-003-production-stack-trace-exposure.md`
102
+ - `TG-SEC-002-public-environment-secrets.md`
@@ -0,0 +1,102 @@
1
+ # TG-CLIENT-002: Sensitive Client Bundle Content
2
+
3
+ ## Severity
4
+
5
+ High
6
+
7
+ ## Applies To
8
+
9
+ - Frontend JavaScript/TypeScript bundles shipped to browsers
10
+ - React, Next.js, Vite, CRA, and other web client builds
11
+ - Client logs (`console.log`, telemetry breadcrumbs, debug overlays)
12
+ - Embedded config constants and generated runtime environment payloads
13
+ - Source files that may be tree-shaken incorrectly but still leak literals
14
+
15
+ ## Why It Matters
16
+
17
+ Anything shipped to the browser is attacker-accessible by design.
18
+ Secrets, tokens, admin keys, or internal endpoints in bundles are effectively public.
19
+ Sensitive debug logs can leak credentials into screenshots and support tickets.
20
+ A single hardcoded secret can enable direct backend or third-party API compromise.
21
+ This is a high-impact exposure class and often immediately exploitable.
22
+ Browser DevTools cannot be blocked, so any client-shipped secret should be treated as compromised.
23
+
24
+ ## What TorusGuard Looks For
25
+
26
+ - Hardcoded API keys, bearer tokens, private keys, or signing secrets in client code
27
+ - Usage of server-only env vars in frontend modules
28
+ - `console.log`/`console.debug` outputting JWTs, session tokens, or PII
29
+ - Debug utilities that serialize auth headers or full user objects in production
30
+ - References to admin-only endpoints from unauthenticated client paths
31
+ - Bundle artifacts containing known secret patterns or credential-like strings
32
+
33
+ ## Unsafe Example
34
+
35
+ ```ts
36
+ // src/api/client.ts
37
+ const ADMIN_TOKEN = "sk_live_9f2a...supersecret";
38
+
39
+ export async function createInvoice(payload: unknown) {
40
+ console.log("using token", ADMIN_TOKEN);
41
+ return fetch("https://api.example.com/admin/invoices", {
42
+ method: "POST",
43
+ headers: {
44
+ Authorization: `Bearer ${ADMIN_TOKEN}`,
45
+ "Content-Type": "application/json"
46
+ },
47
+ body: JSON.stringify(payload)
48
+ });
49
+ }
50
+ ```
51
+
52
+ ## Safe Example
53
+
54
+ ```ts
55
+ // src/api/client.ts
56
+ export async function createInvoice(payload: unknown) {
57
+ return fetch("/api/invoices", {
58
+ method: "POST",
59
+ headers: { "Content-Type": "application/json" },
60
+ body: JSON.stringify(payload)
61
+ });
62
+ }
63
+
64
+ // server route uses server-side credentials only
65
+ app.post("/api/invoices", requireAuth, async (req, res) => {
66
+ const result = await billing.createInvoice(req.user.id, req.body);
67
+ res.json(result);
68
+ });
69
+ ```
70
+
71
+ ## Remediation
72
+
73
+ 1. Remove all secrets and privileged tokens from client code and build-time env payloads.
74
+ 2. Move privileged API calls behind server endpoints with proper authz checks.
75
+ 3. Restrict frontend env variables to explicitly public-safe values only.
76
+ 4. Strip sensitive console statements in production builds.
77
+ 5. Add CI secret scanning for source and compiled bundles.
78
+ 6. Rotate any leaked credentials immediately and revoke prior tokens.
79
+ 7. Add code review gates that block server-only value usage in client modules.
80
+ 8. Educate teams that browser code is always inspectable by users and attackers.
81
+
82
+ ## Verification
83
+
84
+ - Inspect built bundles and search for token/key patterns and internal secrets.
85
+ - Run app in production mode and confirm no sensitive console output.
86
+ - Verify privileged operations require server-mediated authentication and authorization.
87
+ - Validate rotated credentials are active and leaked values are revoked.
88
+ - Confirm public env allowlist is enforced in CI/build scripts.
89
+
90
+ ## False Positives and Exceptions
91
+
92
+ - Public publishable keys intentionally designed for client use (documented by vendor)
93
+ - Fake/sample credentials used only in local demo code outside production builds
94
+ - Debug logs in non-production branches that are stripped before release
95
+ - Internal tools with private distribution, if risk accepted explicitly
96
+
97
+ ## Related Rules
98
+
99
+ - `TG-SEC-001-hardcoded-secrets.md`
100
+ - `TG-SEC-002-public-environment-secrets.md`
101
+ - `TG-CLIENT-001-public-production-source-maps.md`
102
+ - `TG-AUTH-002-client-only-authorization.md`
@@ -0,0 +1,83 @@
1
+ # TG-DB-001: Frontend Database Query Logic
2
+
3
+ ## Severity
4
+ High
5
+
6
+ ## Applies To
7
+ - Frontend source paths such as `src/`, `app/`, `pages/`, `components/`, `client/`, `public/`
8
+ - Browser-executed JavaScript and TypeScript bundles
9
+ - SSR-hybrid projects where code placement can blur server/client boundaries
10
+ - Shared utility modules imported by frontend entry points
11
+
12
+ ## Why It Matters
13
+ Executing SQL construction or raw database access logic in frontend code exposes internal schema assumptions and trust boundaries.
14
+ Even if direct DB connectivity fails in browsers, query logic can leak sensitive structure, encourage insecure architecture, and lead to credential exposure attempts.
15
+ Database interaction must stay on trusted server infrastructure with controlled authorization.
16
+
17
+ ## What TorusGuard Looks For
18
+ - SQL strings (`SELECT`, `INSERT`, `UPDATE`, `DELETE`) in frontend-scoped files
19
+ - Query builders or DB clients imported into client-rendered modules
20
+ - Functions assembling SQL fragments from user input in browser code
21
+ - Mentions of table names, admin joins, or migration SQL in UI components
22
+ - Direct network calls from frontend intended for database endpoints
23
+
24
+ ## Unsafe Example
25
+ ```ts
26
+ // src/components/UserLookup.tsx
27
+ export function loadUserByEmail(email: string) {
28
+ const sql = `SELECT id, role FROM users WHERE email = '${email}' LIMIT 1`;
29
+
30
+ return fetch("/db/query", {
31
+ method: "POST",
32
+ headers: { "content-type": "application/json" },
33
+ body: JSON.stringify({ sql }),
34
+ }).then((r) => r.json());
35
+ }
36
+ ```
37
+
38
+ ## Safe Example
39
+ ```ts
40
+ // src/components/UserLookup.tsx
41
+ export function loadUserByEmail(email: string) {
42
+ return fetch("/api/users/lookup", {
43
+ method: "POST",
44
+ headers: { "content-type": "application/json" },
45
+ body: JSON.stringify({ email }),
46
+ }).then((r) => r.json());
47
+ }
48
+ ```
49
+
50
+ ```ts
51
+ // server/routes/users.ts
52
+ app.post("/api/users/lookup", async (req, res) => {
53
+ const user = await userRepo.findByEmail(req.body.email);
54
+ res.json({ id: user?.id, role: user?.role ?? "none" });
55
+ });
56
+ ```
57
+
58
+ ## Remediation (numbered)
59
+ 1. Remove SQL strings and database query logic from frontend-scoped files.
60
+ 2. Move all data access into backend APIs, repositories, or service layers.
61
+ 3. Validate and authorize request parameters on the server before querying.
62
+ 4. Return minimal response shapes needed by the UI.
63
+ 5. Review frontend imports to prevent accidental DB client inclusion.
64
+ 6. Add static checks that disallow SQL keywords in client-targeted directories.
65
+ 7. Document architecture boundaries between browser code and data layers.
66
+
67
+ ## Verification
68
+ - Scan frontend paths for SQL keywords and DB client imports.
69
+ - Confirm browser bundles contain no query builders or SQL literals.
70
+ - Validate data retrieval flows through authenticated backend endpoints.
71
+ - Test unauthorized requests to ensure server-side access controls hold.
72
+ - Review code ownership and lint rules enforcing client/server separation.
73
+
74
+ ## False Positives and Exceptions
75
+ - Static tutorial snippets in markdown may contain SQL and are non-executable.
76
+ - Demo strings in tests are acceptable if isolated from production bundles.
77
+ - Client files that only reference SQL terms in copy text are low risk.
78
+ - Exceptions should be time-bound and approved by architecture owners.
79
+
80
+ ## Related Rules
81
+ - [TG-DB-002](./TG-DB-002-privileged-database-credential.md) - Privileged DB credentials in browser exposure
82
+ - [TG-DB-003](./TG-DB-003-frontend-admin-sdk.md) - Admin/server SDK usage in frontend code
83
+ - [TG-SEC-002](./TG-SEC-002-public-environment-secrets.md) - Public-prefixed secret leakage
@@ -0,0 +1,86 @@
1
+ # TG-DB-002: Privileged Database Credential in Browser Context
2
+
3
+ ## Severity
4
+ Critical
5
+
6
+ ## Applies To
7
+ - Browser-executed code in frontend apps and static assets
8
+ - Public environment variables consumed by client bundles
9
+ - Mobile web, desktop web, and embedded webview clients
10
+ - Shared modules imported into client-side runtime
11
+
12
+ ## Why It Matters
13
+ Privileged database credentials in browser-accessible code grant attackers direct or indirect control over sensitive data stores.
14
+ Service-role keys and admin database URLs typically bypass row-level access controls and can expose full datasets.
15
+ Because frontend artifacts are publicly retrievable, embedded privileged credentials should be treated as compromised.
16
+
17
+ ## What TorusGuard Looks For
18
+ - Service-role keys and admin tokens referenced in frontend code
19
+ - Database URLs containing usernames/passwords in browser-executed modules
20
+ - Public env variables with names such as:
21
+ - `NEXT_PUBLIC_DATABASE_URL`
22
+ - `VITE_SUPABASE_SERVICE_ROLE_KEY`
23
+ - `REACT_APP_ADMIN_DB_TOKEN`
24
+ - Client initialization using elevated credentials intended for server trust zones
25
+ - Fallback credential constants used when env vars are missing
26
+
27
+ ## Unsafe Example
28
+ ```ts
29
+ // src/lib/dbClient.ts
30
+ import { createClient } from "@supabase/supabase-js";
31
+
32
+ const url = process.env.NEXT_PUBLIC_DATABASE_URL!;
33
+ const serviceRole = process.env.NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY!;
34
+
35
+ export const db = createClient(url, serviceRole, {
36
+ auth: { persistSession: false },
37
+ });
38
+ ```
39
+
40
+ ## Safe Example
41
+ ```ts
42
+ // src/lib/publicClient.ts
43
+ import { createClient } from "@supabase/supabase-js";
44
+
45
+ const url = process.env.NEXT_PUBLIC_SUPABASE_URL!;
46
+ const anonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!;
47
+
48
+ export const publicDb = createClient(url, anonKey);
49
+ ```
50
+
51
+ ```ts
52
+ // server/lib/adminDb.ts
53
+ import { createClient } from "@supabase/supabase-js";
54
+
55
+ export const adminDb = createClient(
56
+ process.env.SUPABASE_URL!,
57
+ process.env.SUPABASE_SERVICE_ROLE_KEY!,
58
+ );
59
+ ```
60
+
61
+ ## Remediation (numbered)
62
+ 1. Remove privileged DB credentials from all frontend and public env sources.
63
+ 2. Rotate exposed service-role keys, passwords, and privileged tokens immediately.
64
+ 3. Migrate privileged operations to backend-only services and APIs.
65
+ 4. Use least-privilege client credentials (anonymous/public keys) in browser code.
66
+ 5. Audit access logs for misuse during exposure window.
67
+ 6. Enforce CI policy blocking privileged credential names in public scopes.
68
+ 7. Add architecture documentation defining credential trust boundaries.
69
+
70
+ ## Verification
71
+ - Inspect client bundles and source maps for privileged credential artifacts.
72
+ - Confirm frontend uses only non-privileged credentials and constrained APIs.
73
+ - Validate server-only secrets are loaded from private runtime environments.
74
+ - Test rotated privileged credentials and verify old keys are rejected.
75
+ - Review monitoring for anomalous database access during and after remediation.
76
+
77
+ ## False Positives and Exceptions
78
+ - Public anonymous keys may look secret-like but are intentionally non-privileged.
79
+ - Documentation examples can trigger detections; verify they are non-operational.
80
+ - Local-only sandbox credentials are still risky if bundled into distributed builds.
81
+ - Exceptions require security approval, owner assignment, and expiration date.
82
+
83
+ ## Related Rules
84
+ - [TG-SEC-001](./TG-SEC-001-hardcoded-secrets.md) - Hardcoded secrets in tracked source
85
+ - [TG-SEC-002](./TG-SEC-002-public-environment-secrets.md) - Secrets in public env namespaces
86
+ - [TG-DB-003](./TG-DB-003-frontend-admin-sdk.md) - Admin SDK usage in frontend runtime
@@ -0,0 +1,91 @@
1
+ # TG-DB-003: Frontend Use of Admin or Server-Only Database SDKs
2
+
3
+ ## Severity
4
+ Critical
5
+
6
+ ## Applies To
7
+ - Frontend directories such as `src/`, `app/`, `pages/`, `components/`, `client/`, `public/`
8
+ - Browser bundles in React, Next.js client components, Vite, and CRA
9
+ - Shared package imports consumed by client entry points
10
+ - Build systems that can accidentally include server-only dependencies
11
+
12
+ ## Why It Matters
13
+ Admin SDKs and server drivers are designed for trusted environments and often assume unrestricted credentials and network access.
14
+ Using packages like Firebase Admin, Prisma, or `pg` in frontend paths risks exposing privileged behavior, credentials, and internal data models.
15
+ Even failed browser execution can leak sensitive implementation details and weaken architectural boundaries.
16
+
17
+ ## What TorusGuard Looks For
18
+ - Imports of server-only SDKs in frontend-targeted files:
19
+ - `firebase-admin`
20
+ - `@prisma/client`
21
+ - `pg`
22
+ - Initialization logic for admin clients in UI components or client utilities
23
+ - Conditional imports attempting to bypass bundler checks in browser code
24
+ - Code patterns that create server DB connections in frontend modules
25
+ - Shared files that instantiate privileged clients and are imported by frontend
26
+
27
+ ## Unsafe Example
28
+ ```ts
29
+ // src/app/dashboard/adminMetrics.tsx
30
+ import { PrismaClient } from "@prisma/client";
31
+ import { Client } from "pg";
32
+
33
+ const prisma = new PrismaClient();
34
+ const pgClient = new Client({
35
+ connectionString: process.env.NEXT_PUBLIC_DATABASE_URL,
36
+ });
37
+
38
+ export async function loadMetrics() {
39
+ await pgClient.connect();
40
+ const result = await prisma.user.count();
41
+ return { users: result };
42
+ }
43
+ ```
44
+
45
+ ## Safe Example
46
+ ```ts
47
+ // src/app/dashboard/adminMetrics.tsx
48
+ export async function loadMetrics() {
49
+ const res = await fetch("/api/admin/metrics", { method: "GET" });
50
+ return res.json();
51
+ }
52
+ ```
53
+
54
+ ```ts
55
+ // server/routes/adminMetrics.ts
56
+ import { PrismaClient } from "@prisma/client";
57
+
58
+ const prisma = new PrismaClient();
59
+
60
+ app.get("/api/admin/metrics", async (_req, res) => {
61
+ const users = await prisma.user.count();
62
+ res.json({ users });
63
+ });
64
+ ```
65
+
66
+ ## Remediation (numbered)
67
+ 1. Remove server-only SDK imports from frontend and browser-targeted modules.
68
+ 2. Relocate privileged data access to backend routes, jobs, or server actions.
69
+ 3. Ensure frontend calls authenticated backend endpoints for required data.
70
+ 4. Restrict server-only dependencies to backend package boundaries.
71
+ 5. Configure bundler/lint rules to block admin SDK imports in frontend paths.
72
+ 6. Rotate credentials if admin SDK usage exposed privileged config values.
73
+ 7. Add architecture tests validating strict client/server dependency separation.
74
+
75
+ ## Verification
76
+ - Scan frontend directories for imports of `firebase-admin`, Prisma, and `pg`.
77
+ - Confirm build output excludes server-only database packages in client chunks.
78
+ - Validate admin operations execute only on server infrastructure.
79
+ - Run access-control tests against backend endpoints exposing admin data.
80
+ - Review dependency graphs to ensure no frontend transitive path to admin SDKs.
81
+
82
+ ## False Positives and Exceptions
83
+ - Type-only imports can appear suspicious; verify they are erased at build time.
84
+ - Documentation snippets in markdown are non-runtime and may be acceptable.
85
+ - Server components must be verified carefully to avoid accidental client inclusion.
86
+ - Exceptions require documented risk acceptance and periodic security review.
87
+
88
+ ## Related Rules
89
+ - [TG-DB-001](./TG-DB-001-frontend-database-query.md) - Frontend SQL/query logic anti-pattern
90
+ - [TG-DB-002](./TG-DB-002-privileged-database-credential.md) - Privileged credential exposure in browser
91
+ - [TG-SEC-001](./TG-SEC-001-hardcoded-secrets.md) - Hardcoded sensitive literals in source