torusguard 1.0.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 (411) hide show
  1. package/.torusguard/.manifest.json +196 -78
  2. package/.torusguard/references/csharp-security.md +41 -0
  3. package/.torusguard/references/go-security.md +41 -0
  4. package/.torusguard/references/java-security.md +40 -0
  5. package/.torusguard/references/polyglot-security-matrix.md +25 -0
  6. package/.torusguard/references/rust-security.md +40 -0
  7. package/.torusguard/rules/README.md +93 -62
  8. package/.torusguard/rules/TG-AUTH-001-weak-password-storage.md +103 -0
  9. package/.torusguard/rules/TG-AUTH-002-client-only-authorization.md +85 -0
  10. package/.torusguard/rules/TG-AUTH-003-missing-object-authorization.md +85 -0
  11. package/.torusguard/rules/TG-AUTH-004-insecure-session-cookie.md +96 -0
  12. package/.torusguard/rules/TG-AUTH-005-unsafe-password-reset.md +104 -0
  13. package/.torusguard/rules/TG-CLIENT-001-public-production-source-maps.md +102 -0
  14. package/.torusguard/rules/TG-CLIENT-002-sensitive-client-bundle-content.md +102 -0
  15. package/.torusguard/rules/TG-DB-001-frontend-database-query.md +83 -0
  16. package/.torusguard/rules/TG-DB-002-privileged-database-credential.md +86 -0
  17. package/.torusguard/rules/TG-DB-003-frontend-admin-sdk.md +91 -0
  18. package/.torusguard/rules/TG-DB-004-missing-tenant-query-isolation.md +103 -0
  19. package/.torusguard/rules/TG-INPUT-001-missing-server-validation.md +98 -0
  20. package/.torusguard/rules/TG-INPUT-002-raw-sql-concatenation.md +94 -0
  21. package/.torusguard/rules/TG-INPUT-003-unsafe-html-or-code-execution.md +102 -0
  22. package/.torusguard/rules/TG-INPUT-004-unrestricted-file-upload.md +92 -0
  23. package/.torusguard/rules/TG-INPUT-005-unsafe-template-rendering-and-escaping.md +102 -0
  24. package/.torusguard/rules/TG-INPUT-006-unsafe-file-path-traversal.md +131 -0
  25. package/.torusguard/rules/TG-PLATFORM-001-wildcard-cors-with-credentials.md +101 -0
  26. package/.torusguard/rules/TG-PLATFORM-002-missing-security-headers.md +95 -0
  27. package/.torusguard/rules/TG-PLATFORM-003-production-stack-trace-exposure.md +94 -0
  28. package/.torusguard/rules/TG-PLATFORM-004-missing-request-size-limits.md +102 -0
  29. package/.torusguard/rules/TG-RATE-001-unlimited-auth-endpoint.md +112 -0
  30. package/.torusguard/rules/TG-RATE-002-unlimited-public-write-endpoint.md +109 -0
  31. package/.torusguard/rules/TG-RATE-003-unbounded-resource-consumption.md +105 -0
  32. package/.torusguard/rules/TG-SEC-001-hardcoded-secrets.md +83 -0
  33. package/.torusguard/rules/TG-SEC-002-public-environment-secrets.md +83 -0
  34. package/.torusguard/rules/TG-SEC-003-tracked-env-file.md +79 -0
  35. package/.torusguard/rules/TG-SEC-004-sensitive-logging.md +83 -0
  36. package/.torusguard/rules/active/TG-AUTH-001-weak-password-storage.md +103 -0
  37. package/.torusguard/rules/active/TG-AUTH-002-client-only-authorization.md +85 -0
  38. package/.torusguard/rules/active/TG-AUTH-003-missing-object-authorization.md +85 -0
  39. package/.torusguard/rules/active/TG-AUTH-004-insecure-session-cookie.md +96 -0
  40. package/.torusguard/rules/active/TG-AUTH-005-unsafe-password-reset.md +104 -0
  41. package/.torusguard/rules/active/TG-CLIENT-001-public-production-source-maps.md +102 -0
  42. package/.torusguard/rules/active/TG-CLIENT-002-sensitive-client-bundle-content.md +102 -0
  43. package/.torusguard/rules/active/TG-DB-001-frontend-database-query.md +83 -0
  44. package/.torusguard/rules/active/TG-DB-002-privileged-database-credential.md +86 -0
  45. package/.torusguard/rules/active/TG-DB-003-frontend-admin-sdk.md +91 -0
  46. package/.torusguard/rules/active/TG-DB-004-missing-tenant-query-isolation.md +103 -0
  47. package/.torusguard/rules/active/TG-INPUT-001-missing-server-validation.md +98 -0
  48. package/.torusguard/rules/active/TG-INPUT-002-raw-sql-concatenation.md +94 -0
  49. package/.torusguard/rules/active/TG-INPUT-003-unsafe-html-or-code-execution.md +102 -0
  50. package/.torusguard/rules/active/TG-INPUT-004-unrestricted-file-upload.md +92 -0
  51. package/.torusguard/rules/active/TG-INPUT-005-unsafe-template-rendering-and-escaping.md +102 -0
  52. package/.torusguard/rules/active/TG-INPUT-006-unsafe-file-path-traversal.md +131 -0
  53. package/.torusguard/rules/active/TG-PLATFORM-001-wildcard-cors-with-credentials.md +101 -0
  54. package/.torusguard/rules/active/TG-PLATFORM-002-missing-security-headers.md +95 -0
  55. package/.torusguard/rules/active/TG-PLATFORM-003-production-stack-trace-exposure.md +94 -0
  56. package/.torusguard/rules/active/TG-PLATFORM-004-missing-request-size-limits.md +102 -0
  57. package/.torusguard/rules/active/TG-RATE-001-unlimited-auth-endpoint.md +112 -0
  58. package/.torusguard/rules/active/TG-RATE-002-unlimited-public-write-endpoint.md +109 -0
  59. package/.torusguard/rules/active/TG-RATE-003-unbounded-resource-consumption.md +105 -0
  60. package/.torusguard/rules/active/TG-SEC-001-hardcoded-secrets.md +83 -0
  61. package/.torusguard/rules/active/TG-SEC-002-public-environment-secrets.md +83 -0
  62. package/.torusguard/rules/active/TG-SEC-003-tracked-env-file.md +79 -0
  63. package/.torusguard/rules/active/TG-SEC-004-sensitive-logging.md +83 -0
  64. package/.torusguard/rules/agent/TG-AGENT-001-prompt-injection-system-context.md +56 -0
  65. package/.torusguard/rules/agent/TG-AGENT-002-unsafe-tool-dispatch-unsandboxed-execution.md +68 -0
  66. package/.torusguard/rules/agent/TG-AGENT-003-broad-mcp-tool-scoping.md +53 -0
  67. package/.torusguard/rules/agent/TG-AGENT-004-persistent-memory-cross-session-leakage.md +67 -0
  68. package/.torusguard/rules/authorization/TG-AUTH-006-mass-assignment.md +70 -0
  69. package/.torusguard/rules/authorization/TG-AUTH-007-missing-property-level-authorization.md +71 -0
  70. package/.torusguard/rules/authorization/TG-AUTH-008-untrusted-role-header-injection.md +112 -0
  71. package/.torusguard/rules/business-logic/TG-BIZ-001-client-controlled-sensitive-business-value.md +37 -0
  72. package/.torusguard/rules/business-logic/TG-BIZ-002-replayable-one-time-operation.md +37 -0
  73. package/.torusguard/rules/business-logic/TG-BIZ-003-missing-workflow-state-validation.md +37 -0
  74. package/.torusguard/rules/business-logic/TG-BIZ-004-unrestricted-sensitive-business-flow.md +37 -0
  75. package/.torusguard/rules/cache/TG-CACHE-001-sensitive-response-publicly-cacheable.md +37 -0
  76. package/.torusguard/rules/cache/TG-CACHE-002-missing-user-cache-isolation.md +37 -0
  77. package/.torusguard/rules/cache/TG-CACHE-003-sensitive-data-in-url.md +37 -0
  78. package/.torusguard/rules/csrf/TG-CSRF-001-missing-csrf-protection.md +37 -0
  79. package/.torusguard/rules/csrf/TG-CSRF-002-unsafe-credentialed-cross-origin-request.md +37 -0
  80. package/.torusguard/rules/custom/.gitkeep +1 -0
  81. package/.torusguard/rules/custom/README.md +30 -0
  82. package/.torusguard/rules/edge/TG-EDGE-001-serverless-global-state-leak.md +83 -0
  83. package/.torusguard/rules/edge/TG-EDGE-003-aws-lambda-ephemeral-cold-start.md +76 -0
  84. package/.torusguard/rules/graphql/TG-GQL-001-missing-query-depth-or-complexity-limits.md +64 -0
  85. package/.torusguard/rules/graphql/TG-GQL-002-resolver-missing-authorization.md +37 -0
  86. package/.torusguard/rules/graphql/TG-GQL-003-unbounded-graphql-pagination-or-batching.md +37 -0
  87. package/.torusguard/rules/graphql/TG-GQL-004-unnecessary-production-introspection.md +37 -0
  88. package/.torusguard/rules/secrets/TG-SEC-005-secret-in-git-history.md +37 -0
  89. package/.torusguard/rules/secrets/TG-SEC-006-secret-in-build-artifact.md +37 -0
  90. package/.torusguard/rules/secrets/TG-SEC-007-secret-in-test-or-example-fixture.md +37 -0
  91. package/.torusguard/rules/ssrf/TG-SSRF-001-user-controlled-server-side-url-fetch.md +68 -0
  92. package/.torusguard/rules/ssrf/TG-SSRF-002-missing-internal-network-protection.md +37 -0
  93. package/.torusguard/rules/ssrf/TG-SSRF-003-unsafe-redirect-following.md +37 -0
  94. package/.torusguard/rules/ssrf/TG-SSRF-004-unbounded-outbound-request.md +37 -0
  95. package/.torusguard/rules/supply-chain/TG-SUPPLY-001-missing-or-ignored-dependency-lockfile.md +37 -0
  96. package/.torusguard/rules/supply-chain/TG-SUPPLY-002-vulnerable-dependency-review-missing.md +94 -0
  97. package/.torusguard/rules/supply-chain/TG-SUPPLY-003-unsafe-ci-cd-secret-exposure.md +37 -0
  98. package/.torusguard/rules/supply-chain/TG-SUPPLY-004-unpinned-ci-action.md +37 -0
  99. package/.torusguard/rules/supply-chain/TG-SUPPLY-005-unsafe-dependency-install-script.md +37 -0
  100. package/.torusguard/rules/supply-chain/TG-SUPPLY-006-container-build-secret-persistence.md +61 -0
  101. package/.torusguard/rules/webhook/TG-WEBHOOK-001-missing-webhook-signature-verification.md +37 -0
  102. package/.torusguard/rules/webhook/TG-WEBHOOK-002-replayable-webhook.md +37 -0
  103. package/.torusguard/rules/webhook/TG-WEBHOOK-003-missing-webhook-idempotency.md +37 -0
  104. package/.torusguard/rules/webhook/TG-WEBHOOK-004-unvalidated-webhook-event-type.md +37 -0
  105. package/.torusguard/rules/websocket/TG-WS-001-unauthenticated-websocket-handshake.md +82 -0
  106. package/.torusguard/rules/websocket/TG-WS-002-missing-channel-level-authorization.md +37 -0
  107. package/.torusguard/rules/websocket/TG-WS-003-unvalidated-websocket-message.md +37 -0
  108. package/.torusguard/rules/websocket/TG-WS-004-unbounded-websocket-connections.md +37 -0
  109. package/.torusguard/runs/report-latest.html +370 -0
  110. package/.torusguard/runs/run-20260908-112648-audit/findings.json +1520 -0
  111. package/.torusguard/runs/run-20260908-112648-audit/findings.md +560 -0
  112. package/.torusguard/runs/run-20260908-112648-audit/manifest.json +12 -0
  113. package/.torusguard/runs/run-20260908-112648-audit/summary.md +5 -0
  114. package/.torusguard/runs/run-20260908-112722-audit/findings.json +1520 -0
  115. package/.torusguard/runs/run-20260908-112722-audit/findings.md +560 -0
  116. package/.torusguard/runs/run-20260908-112722-audit/manifest.json +12 -0
  117. package/.torusguard/runs/run-20260908-112722-audit/summary.md +5 -0
  118. package/.torusguard/runs/run-20260908-113004-audit/findings.json +1520 -0
  119. package/.torusguard/runs/run-20260908-113004-audit/findings.md +560 -0
  120. package/.torusguard/runs/run-20260908-113004-audit/manifest.json +12 -0
  121. package/.torusguard/runs/run-20260908-113004-audit/summary.md +5 -0
  122. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-115-9a059e/metadata.json +15 -0
  123. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-115-9a059e/minimal_patch_plan.md +21 -0
  124. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-115-9a059e/patch.diff +9 -0
  125. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-119-61557c/metadata.json +15 -0
  126. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-119-61557c/minimal_patch_plan.md +21 -0
  127. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-119-61557c/patch.diff +9 -0
  128. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-265-996ca3/metadata.json +15 -0
  129. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-265-996ca3/minimal_patch_plan.md +21 -0
  130. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-265-996ca3/patch.diff +9 -0
  131. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-334-cb819d/metadata.json +15 -0
  132. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-334-cb819d/minimal_patch_plan.md +21 -0
  133. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-334-cb819d/patch.diff +9 -0
  134. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-503-d11cf8/metadata.json +15 -0
  135. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-503-d11cf8/minimal_patch_plan.md +21 -0
  136. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-503-d11cf8/patch.diff +9 -0
  137. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-79-91f41f/metadata.json +15 -0
  138. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-79-91f41f/minimal_patch_plan.md +21 -0
  139. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-79-91f41f/patch.diff +9 -0
  140. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-107-516a40/metadata.json +15 -0
  141. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-107-516a40/minimal_patch_plan.md +21 -0
  142. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-107-516a40/patch.diff +9 -0
  143. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-128-7809a1/metadata.json +15 -0
  144. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-128-7809a1/minimal_patch_plan.md +21 -0
  145. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-128-7809a1/patch.diff +9 -0
  146. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-232-1b45d1/metadata.json +15 -0
  147. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-232-1b45d1/minimal_patch_plan.md +21 -0
  148. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-232-1b45d1/patch.diff +9 -0
  149. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-003-53-d167b4/metadata.json +15 -0
  150. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-003-53-d167b4/minimal_patch_plan.md +21 -0
  151. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-003-53-d167b4/patch.diff +9 -0
  152. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-209-4f6424/metadata.json +15 -0
  153. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-209-4f6424/minimal_patch_plan.md +21 -0
  154. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-209-4f6424/patch.diff +9 -0
  155. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-257-89bf34/metadata.json +15 -0
  156. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-257-89bf34/minimal_patch_plan.md +21 -0
  157. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-257-89bf34/patch.diff +9 -0
  158. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-341-ce228c/metadata.json +15 -0
  159. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-341-ce228c/minimal_patch_plan.md +21 -0
  160. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-341-ce228c/patch.diff +9 -0
  161. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-355-7b190b/metadata.json +15 -0
  162. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-355-7b190b/minimal_patch_plan.md +21 -0
  163. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-355-7b190b/patch.diff +9 -0
  164. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-64-5af31a/metadata.json +15 -0
  165. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-64-5af31a/minimal_patch_plan.md +21 -0
  166. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-64-5af31a/patch.diff +9 -0
  167. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-9-f51467/metadata.json +15 -0
  168. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-9-f51467/minimal_patch_plan.md +21 -0
  169. package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-9-f51467/patch.diff +9 -0
  170. package/.torusguard/runs/run-20260908-113127-audit/findings.json +1520 -0
  171. package/.torusguard/runs/run-20260908-113127-audit/findings.md +560 -0
  172. package/.torusguard/runs/run-20260908-113127-audit/manifest.json +13 -0
  173. package/.torusguard/runs/run-20260908-113127-audit/remediation.md +262 -0
  174. package/.torusguard/runs/run-20260908-113127-audit/summary.md +5 -0
  175. package/.torusguard/runs/run-20260908-115240-audit/apply_plan.md +6 -0
  176. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-115-9a059e/metadata.json +15 -0
  177. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-115-9a059e/minimal_patch_plan.md +21 -0
  178. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-115-9a059e/patch.diff +9 -0
  179. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-119-61557c/metadata.json +15 -0
  180. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-119-61557c/minimal_patch_plan.md +21 -0
  181. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-119-61557c/patch.diff +9 -0
  182. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-265-996ca3/metadata.json +15 -0
  183. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-265-996ca3/minimal_patch_plan.md +21 -0
  184. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-265-996ca3/patch.diff +9 -0
  185. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-334-cb819d/metadata.json +15 -0
  186. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-334-cb819d/minimal_patch_plan.md +21 -0
  187. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-334-cb819d/patch.diff +9 -0
  188. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-503-d11cf8/metadata.json +15 -0
  189. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-503-d11cf8/minimal_patch_plan.md +21 -0
  190. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-503-d11cf8/patch.diff +9 -0
  191. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-79-91f41f/metadata.json +15 -0
  192. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-79-91f41f/minimal_patch_plan.md +21 -0
  193. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-79-91f41f/patch.diff +9 -0
  194. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-107-516a40/metadata.json +15 -0
  195. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-107-516a40/minimal_patch_plan.md +21 -0
  196. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-107-516a40/patch.diff +9 -0
  197. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-128-7809a1/metadata.json +15 -0
  198. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-128-7809a1/minimal_patch_plan.md +21 -0
  199. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-128-7809a1/patch.diff +9 -0
  200. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-232-1b45d1/metadata.json +15 -0
  201. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-232-1b45d1/minimal_patch_plan.md +21 -0
  202. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-232-1b45d1/patch.diff +9 -0
  203. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-003-53-d167b4/metadata.json +15 -0
  204. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-003-53-d167b4/minimal_patch_plan.md +21 -0
  205. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-003-53-d167b4/patch.diff +9 -0
  206. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-platform-001-168-5027cb/metadata.json +15 -0
  207. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-platform-001-168-5027cb/minimal_patch_plan.md +21 -0
  208. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-platform-001-168-5027cb/patch.diff +9 -0
  209. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-209-4f6424/metadata.json +15 -0
  210. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-209-4f6424/minimal_patch_plan.md +21 -0
  211. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-209-4f6424/patch.diff +9 -0
  212. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-257-89bf34/metadata.json +15 -0
  213. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-257-89bf34/minimal_patch_plan.md +21 -0
  214. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-257-89bf34/patch.diff +9 -0
  215. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-341-ce228c/metadata.json +15 -0
  216. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-341-ce228c/minimal_patch_plan.md +21 -0
  217. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-341-ce228c/patch.diff +9 -0
  218. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-355-7b190b/metadata.json +15 -0
  219. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-355-7b190b/minimal_patch_plan.md +21 -0
  220. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-355-7b190b/patch.diff +9 -0
  221. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-64-5af31a/metadata.json +15 -0
  222. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-64-5af31a/minimal_patch_plan.md +21 -0
  223. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-64-5af31a/patch.diff +9 -0
  224. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-9-f51467/metadata.json +15 -0
  225. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-9-f51467/minimal_patch_plan.md +21 -0
  226. package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-9-f51467/patch.diff +9 -0
  227. package/.torusguard/runs/run-20260908-115240-audit/diff_summary.md +221 -0
  228. package/.torusguard/runs/run-20260908-115240-audit/findings.json +1553 -0
  229. package/.torusguard/runs/run-20260908-115240-audit/findings.md +572 -0
  230. package/.torusguard/runs/run-20260908-115240-audit/manifest.json +14 -0
  231. package/.torusguard/runs/run-20260908-115240-audit/recheck.md +91 -0
  232. package/.torusguard/runs/run-20260908-115240-audit/remediation.md +278 -0
  233. package/.torusguard/runs/run-20260908-115240-audit/summary.md +5 -0
  234. package/.torusguard/schemas/golden-recipe.schema.json +75 -0
  235. package/.torusguard/scripts/__pycache__/audit_runner.cpython-311.pyc +0 -0
  236. package/.torusguard/scripts/__pycache__/finding_scorer.cpython-311.pyc +0 -0
  237. package/.torusguard/scripts/__pycache__/memory_engine.cpython-311.pyc +0 -0
  238. package/.torusguard/scripts/__pycache__/monorepo_detector.cpython-311.pyc +0 -0
  239. package/.torusguard/scripts/__pycache__/run_manager.cpython-311.pyc +0 -0
  240. package/.torusguard/scripts/__pycache__/stack_detect.cpython-311.pyc +0 -0
  241. package/.torusguard/scripts/apply_runner.py +332 -0
  242. package/.torusguard/scripts/audit_runner.py +550 -0
  243. package/.torusguard/scripts/diff_guard.py +183 -8
  244. package/.torusguard/scripts/finding_scorer.py +91 -5
  245. package/.torusguard/scripts/harden_runner.py +353 -0
  246. package/.torusguard/scripts/html_reporter.py +643 -0
  247. package/.torusguard/scripts/manifest_builder.py +7 -5
  248. package/.torusguard/scripts/memory_engine.py +525 -99
  249. package/.torusguard/scripts/monorepo_detector.py +123 -10
  250. package/.torusguard/scripts/recheck_runner.py +221 -0
  251. package/.torusguard/scripts/recipes_runner.py +130 -0
  252. package/.torusguard/scripts/rules_sync.py +321 -0
  253. package/.torusguard/scripts/run_manager.py +17 -5
  254. package/.torusguard/scripts/stack_detect.py +458 -26
  255. package/.torusguard/skills/torusguard/SKILL.md +42 -42
  256. package/.torusguard/skills/torusguard/references/csharp-security.md +41 -0
  257. package/.torusguard/skills/torusguard/references/go-security.md +41 -0
  258. package/.torusguard/skills/torusguard/references/java-security.md +40 -0
  259. package/.torusguard/skills/torusguard/references/polyglot-security-matrix.md +25 -0
  260. package/.torusguard/skills/torusguard/references/rust-security.md +40 -0
  261. package/.torusguard/snapshots/run-20260908-115240-audit/examples/vulnerable-react-express/client/src/App.jsx.bak +63 -0
  262. package/.torusguard/snapshots/run-20260908-115240-audit/examples/vulnerable-react-express/server/index.js.bak +82 -0
  263. package/.torusguard/snapshots/run-20260908-115240-audit/harness/engine/fixture_manager.py.bak +245 -0
  264. package/.torusguard/snapshots/run-20260908-115240-audit/harness/master_validation.py.bak +698 -0
  265. package/.torusguard/snapshots/run-20260908-115240-audit/harness/runner.py.bak +551 -0
  266. package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_e2e.py.bak +498 -0
  267. package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_qa_v0_6_0.py.bak +572 -0
  268. package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_v0_6_1_scale.py.bak +371 -0
  269. package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_v0_6_2_modern_stacks.py.bak +462 -0
  270. package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_v0_6_3_hardening.py.bak +444 -0
  271. package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_v1_0_0_memory.py.bak +302 -0
  272. package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_v1_1_0_advanced_memory.py.bak +342 -0
  273. package/.torusguard/snapshots/run-20260908-115240-audit/skills/torusguard/payload/scripts/harden_runner.py.bak +353 -0
  274. package/.torusguard/snapshots/run-20260908-115240-audit/tests/test_v0_6_0_governed_remediation.py.bak +353 -0
  275. package/README.md +344 -410
  276. package/bin/torusguard.js +195 -21
  277. package/package.json +1 -1
  278. package/skills/torusguard/SKILL.md +42 -42
  279. package/skills/torusguard/bootstrap.py +149 -70
  280. package/skills/torusguard/payload/.manifest.json +196 -78
  281. package/skills/torusguard/payload/references/csharp-security.md +41 -0
  282. package/skills/torusguard/payload/references/go-security.md +41 -0
  283. package/skills/torusguard/payload/references/java-security.md +40 -0
  284. package/skills/torusguard/payload/references/polyglot-security-matrix.md +25 -0
  285. package/skills/torusguard/payload/references/rust-security.md +40 -0
  286. package/skills/torusguard/payload/rules/README.md +93 -62
  287. package/skills/torusguard/payload/rules/TG-AUTH-001-weak-password-storage.md +103 -0
  288. package/skills/torusguard/payload/rules/TG-AUTH-002-client-only-authorization.md +85 -0
  289. package/skills/torusguard/payload/rules/TG-AUTH-003-missing-object-authorization.md +85 -0
  290. package/skills/torusguard/payload/rules/TG-AUTH-004-insecure-session-cookie.md +96 -0
  291. package/skills/torusguard/payload/rules/TG-AUTH-005-unsafe-password-reset.md +104 -0
  292. package/skills/torusguard/payload/rules/TG-CLIENT-001-public-production-source-maps.md +102 -0
  293. package/skills/torusguard/payload/rules/TG-CLIENT-002-sensitive-client-bundle-content.md +102 -0
  294. package/skills/torusguard/payload/rules/TG-DB-001-frontend-database-query.md +83 -0
  295. package/skills/torusguard/payload/rules/TG-DB-002-privileged-database-credential.md +86 -0
  296. package/skills/torusguard/payload/rules/TG-DB-003-frontend-admin-sdk.md +91 -0
  297. package/skills/torusguard/payload/rules/TG-DB-004-missing-tenant-query-isolation.md +103 -0
  298. package/skills/torusguard/payload/rules/TG-INPUT-001-missing-server-validation.md +98 -0
  299. package/skills/torusguard/payload/rules/TG-INPUT-002-raw-sql-concatenation.md +94 -0
  300. package/skills/torusguard/payload/rules/TG-INPUT-003-unsafe-html-or-code-execution.md +102 -0
  301. package/skills/torusguard/payload/rules/TG-INPUT-004-unrestricted-file-upload.md +92 -0
  302. package/skills/torusguard/payload/rules/TG-INPUT-005-unsafe-template-rendering-and-escaping.md +102 -0
  303. package/skills/torusguard/payload/rules/TG-INPUT-006-unsafe-file-path-traversal.md +131 -0
  304. package/skills/torusguard/payload/rules/TG-PLATFORM-001-wildcard-cors-with-credentials.md +101 -0
  305. package/skills/torusguard/payload/rules/TG-PLATFORM-002-missing-security-headers.md +95 -0
  306. package/skills/torusguard/payload/rules/TG-PLATFORM-003-production-stack-trace-exposure.md +94 -0
  307. package/skills/torusguard/payload/rules/TG-PLATFORM-004-missing-request-size-limits.md +102 -0
  308. package/skills/torusguard/payload/rules/TG-RATE-001-unlimited-auth-endpoint.md +112 -0
  309. package/skills/torusguard/payload/rules/TG-RATE-002-unlimited-public-write-endpoint.md +109 -0
  310. package/skills/torusguard/payload/rules/TG-RATE-003-unbounded-resource-consumption.md +105 -0
  311. package/skills/torusguard/payload/rules/TG-SEC-001-hardcoded-secrets.md +83 -0
  312. package/skills/torusguard/payload/rules/TG-SEC-002-public-environment-secrets.md +83 -0
  313. package/skills/torusguard/payload/rules/TG-SEC-003-tracked-env-file.md +79 -0
  314. package/skills/torusguard/payload/rules/TG-SEC-004-sensitive-logging.md +83 -0
  315. package/skills/torusguard/payload/rules/active/TG-AUTH-001-weak-password-storage.md +103 -0
  316. package/skills/torusguard/payload/rules/active/TG-AUTH-002-client-only-authorization.md +85 -0
  317. package/skills/torusguard/payload/rules/active/TG-AUTH-003-missing-object-authorization.md +85 -0
  318. package/skills/torusguard/payload/rules/active/TG-AUTH-004-insecure-session-cookie.md +96 -0
  319. package/skills/torusguard/payload/rules/active/TG-AUTH-005-unsafe-password-reset.md +104 -0
  320. package/skills/torusguard/payload/rules/active/TG-CLIENT-001-public-production-source-maps.md +102 -0
  321. package/skills/torusguard/payload/rules/active/TG-CLIENT-002-sensitive-client-bundle-content.md +102 -0
  322. package/skills/torusguard/payload/rules/active/TG-DB-001-frontend-database-query.md +83 -0
  323. package/skills/torusguard/payload/rules/active/TG-DB-002-privileged-database-credential.md +86 -0
  324. package/skills/torusguard/payload/rules/active/TG-DB-003-frontend-admin-sdk.md +91 -0
  325. package/skills/torusguard/payload/rules/active/TG-DB-004-missing-tenant-query-isolation.md +103 -0
  326. package/skills/torusguard/payload/rules/active/TG-INPUT-001-missing-server-validation.md +98 -0
  327. package/skills/torusguard/payload/rules/active/TG-INPUT-002-raw-sql-concatenation.md +94 -0
  328. package/skills/torusguard/payload/rules/active/TG-INPUT-003-unsafe-html-or-code-execution.md +102 -0
  329. package/skills/torusguard/payload/rules/active/TG-INPUT-004-unrestricted-file-upload.md +92 -0
  330. package/skills/torusguard/payload/rules/active/TG-INPUT-005-unsafe-template-rendering-and-escaping.md +102 -0
  331. package/skills/torusguard/payload/rules/active/TG-INPUT-006-unsafe-file-path-traversal.md +131 -0
  332. package/skills/torusguard/payload/rules/active/TG-PLATFORM-001-wildcard-cors-with-credentials.md +101 -0
  333. package/skills/torusguard/payload/rules/active/TG-PLATFORM-002-missing-security-headers.md +95 -0
  334. package/skills/torusguard/payload/rules/active/TG-PLATFORM-003-production-stack-trace-exposure.md +94 -0
  335. package/skills/torusguard/payload/rules/active/TG-PLATFORM-004-missing-request-size-limits.md +102 -0
  336. package/skills/torusguard/payload/rules/active/TG-RATE-001-unlimited-auth-endpoint.md +112 -0
  337. package/skills/torusguard/payload/rules/active/TG-RATE-002-unlimited-public-write-endpoint.md +109 -0
  338. package/skills/torusguard/payload/rules/active/TG-RATE-003-unbounded-resource-consumption.md +105 -0
  339. package/skills/torusguard/payload/rules/active/TG-SEC-001-hardcoded-secrets.md +83 -0
  340. package/skills/torusguard/payload/rules/active/TG-SEC-002-public-environment-secrets.md +83 -0
  341. package/skills/torusguard/payload/rules/active/TG-SEC-003-tracked-env-file.md +79 -0
  342. package/skills/torusguard/payload/rules/active/TG-SEC-004-sensitive-logging.md +83 -0
  343. package/skills/torusguard/payload/rules/agent/TG-AGENT-001-prompt-injection-system-context.md +56 -0
  344. package/skills/torusguard/payload/rules/agent/TG-AGENT-002-unsafe-tool-dispatch-unsandboxed-execution.md +68 -0
  345. package/skills/torusguard/payload/rules/agent/TG-AGENT-003-broad-mcp-tool-scoping.md +53 -0
  346. package/skills/torusguard/payload/rules/agent/TG-AGENT-004-persistent-memory-cross-session-leakage.md +67 -0
  347. package/skills/torusguard/payload/rules/authorization/TG-AUTH-006-mass-assignment.md +70 -0
  348. package/skills/torusguard/payload/rules/authorization/TG-AUTH-007-missing-property-level-authorization.md +71 -0
  349. package/skills/torusguard/payload/rules/authorization/TG-AUTH-008-untrusted-role-header-injection.md +112 -0
  350. package/skills/torusguard/payload/rules/business-logic/TG-BIZ-001-client-controlled-sensitive-business-value.md +37 -0
  351. package/skills/torusguard/payload/rules/business-logic/TG-BIZ-002-replayable-one-time-operation.md +37 -0
  352. package/skills/torusguard/payload/rules/business-logic/TG-BIZ-003-missing-workflow-state-validation.md +37 -0
  353. package/skills/torusguard/payload/rules/business-logic/TG-BIZ-004-unrestricted-sensitive-business-flow.md +37 -0
  354. package/skills/torusguard/payload/rules/cache/TG-CACHE-001-sensitive-response-publicly-cacheable.md +37 -0
  355. package/skills/torusguard/payload/rules/cache/TG-CACHE-002-missing-user-cache-isolation.md +37 -0
  356. package/skills/torusguard/payload/rules/cache/TG-CACHE-003-sensitive-data-in-url.md +37 -0
  357. package/skills/torusguard/payload/rules/csrf/TG-CSRF-001-missing-csrf-protection.md +37 -0
  358. package/skills/torusguard/payload/rules/csrf/TG-CSRF-002-unsafe-credentialed-cross-origin-request.md +37 -0
  359. package/skills/torusguard/payload/rules/custom/.gitkeep +1 -0
  360. package/skills/torusguard/payload/rules/custom/README.md +30 -0
  361. package/skills/torusguard/payload/rules/edge/TG-EDGE-001-serverless-global-state-leak.md +83 -0
  362. package/skills/torusguard/payload/rules/edge/TG-EDGE-003-aws-lambda-ephemeral-cold-start.md +76 -0
  363. package/skills/torusguard/payload/rules/graphql/TG-GQL-001-missing-query-depth-or-complexity-limits.md +64 -0
  364. package/skills/torusguard/payload/rules/graphql/TG-GQL-002-resolver-missing-authorization.md +37 -0
  365. package/skills/torusguard/payload/rules/graphql/TG-GQL-003-unbounded-graphql-pagination-or-batching.md +37 -0
  366. package/skills/torusguard/payload/rules/graphql/TG-GQL-004-unnecessary-production-introspection.md +37 -0
  367. package/skills/torusguard/payload/rules/secrets/TG-SEC-005-secret-in-git-history.md +37 -0
  368. package/skills/torusguard/payload/rules/secrets/TG-SEC-006-secret-in-build-artifact.md +37 -0
  369. package/skills/torusguard/payload/rules/secrets/TG-SEC-007-secret-in-test-or-example-fixture.md +37 -0
  370. package/skills/torusguard/payload/rules/ssrf/TG-SSRF-001-user-controlled-server-side-url-fetch.md +68 -0
  371. package/skills/torusguard/payload/rules/ssrf/TG-SSRF-002-missing-internal-network-protection.md +37 -0
  372. package/skills/torusguard/payload/rules/ssrf/TG-SSRF-003-unsafe-redirect-following.md +37 -0
  373. package/skills/torusguard/payload/rules/ssrf/TG-SSRF-004-unbounded-outbound-request.md +37 -0
  374. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-001-missing-or-ignored-dependency-lockfile.md +37 -0
  375. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-002-vulnerable-dependency-review-missing.md +94 -0
  376. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-003-unsafe-ci-cd-secret-exposure.md +37 -0
  377. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-004-unpinned-ci-action.md +37 -0
  378. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-005-unsafe-dependency-install-script.md +37 -0
  379. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-006-container-build-secret-persistence.md +61 -0
  380. package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-001-missing-webhook-signature-verification.md +37 -0
  381. package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-002-replayable-webhook.md +37 -0
  382. package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-003-missing-webhook-idempotency.md +37 -0
  383. package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-004-unvalidated-webhook-event-type.md +37 -0
  384. package/skills/torusguard/payload/rules/websocket/TG-WS-001-unauthenticated-websocket-handshake.md +82 -0
  385. package/skills/torusguard/payload/rules/websocket/TG-WS-002-missing-channel-level-authorization.md +37 -0
  386. package/skills/torusguard/payload/rules/websocket/TG-WS-003-unvalidated-websocket-message.md +37 -0
  387. package/skills/torusguard/payload/rules/websocket/TG-WS-004-unbounded-websocket-connections.md +37 -0
  388. package/skills/torusguard/payload/schemas/golden-recipe.schema.json +75 -0
  389. package/skills/torusguard/payload/scripts/apply_runner.py +332 -0
  390. package/skills/torusguard/payload/scripts/audit_runner.py +550 -0
  391. package/skills/torusguard/payload/scripts/diff_guard.py +183 -8
  392. package/skills/torusguard/payload/scripts/finding_scorer.py +91 -5
  393. package/skills/torusguard/payload/scripts/harden_runner.py +353 -0
  394. package/skills/torusguard/payload/scripts/html_reporter.py +643 -0
  395. package/skills/torusguard/payload/scripts/manifest_builder.py +7 -5
  396. package/skills/torusguard/payload/scripts/memory_engine.py +525 -99
  397. package/skills/torusguard/payload/scripts/monorepo_detector.py +123 -10
  398. package/skills/torusguard/payload/scripts/recheck_runner.py +221 -0
  399. package/skills/torusguard/payload/scripts/recipes_runner.py +130 -0
  400. package/skills/torusguard/payload/scripts/rules_sync.py +321 -0
  401. package/skills/torusguard/payload/scripts/run_manager.py +17 -5
  402. package/skills/torusguard/payload/scripts/stack_detect.py +458 -26
  403. package/skills/torusguard/payload/skills/torusguard/SKILL.md +42 -42
  404. package/skills/torusguard/payload/skills/torusguard/bootstrap.py +149 -70
  405. package/skills/torusguard/payload/skills/torusguard/references/csharp-security.md +41 -0
  406. package/skills/torusguard/payload/skills/torusguard/references/go-security.md +41 -0
  407. package/skills/torusguard/payload/skills/torusguard/references/java-security.md +40 -0
  408. package/skills/torusguard/payload/skills/torusguard/references/polyglot-security-matrix.md +25 -0
  409. package/skills/torusguard/payload/skills/torusguard/references/rust-security.md +40 -0
  410. package/.torusguard/scripts/__pycache__/diff_guard.cpython-311.pyc +0 -0
  411. package/skills/torusguard/__pycache__/bootstrap.cpython-311.pyc +0 -0
@@ -0,0 +1,95 @@
1
+ # TG-PLATFORM-002: Missing Security Headers
2
+
3
+ ## Severity
4
+
5
+ Medium
6
+
7
+ ## Applies To
8
+
9
+ - Node/Express/Nest/Fastify web apps serving browser traffic
10
+ - Reverse proxies and CDN layers terminating TLS
11
+ - SSR frontends and static sites with custom response headers
12
+ - APIs returning HTML, login pages, docs portals, or admin consoles
13
+ - Deployments expected to enforce baseline browser hardening
14
+
15
+ ## Why It Matters
16
+
17
+ Security headers reduce exploitability of common web attack classes.
18
+ Missing headers increase risk from XSS, clickjacking, protocol downgrade, and data leakage.
19
+ Headers are not complete protection, but are critical platform defense-in-depth.
20
+ Gaps often appear during framework migrations or proxy reconfiguration.
21
+ A weak default posture compounds impact of unrelated code bugs.
22
+
23
+ ## What TorusGuard Looks For
24
+
25
+ - Absent or weak `Content-Security-Policy` on HTML responses
26
+ - Missing `Strict-Transport-Security` on HTTPS production domains
27
+ - Missing `X-Frame-Options` or equivalent `frame-ancestors` directive
28
+ - Missing `X-Content-Type-Options: nosniff`
29
+ - No `Referrer-Policy` or overly permissive values
30
+ - Express apps not using Helmet (or equivalent explicit header strategy)
31
+
32
+ ## Unsafe Example
33
+
34
+ ```ts
35
+ import express from "express";
36
+ const app = express();
37
+
38
+ app.get("/", (_req, res) => {
39
+ res.sendFile("index.html");
40
+ });
41
+ ```
42
+
43
+ ## Safe Example
44
+
45
+ ```ts
46
+ import express from "express";
47
+ import helmet from "helmet";
48
+
49
+ const app = express();
50
+
51
+ app.use(helmet({
52
+ contentSecurityPolicy: {
53
+ directives: {
54
+ defaultSrc: ["'self'"],
55
+ scriptSrc: ["'self'"],
56
+ objectSrc: ["'none'"],
57
+ frameAncestors: ["'none'"],
58
+ upgradeInsecureRequests: []
59
+ }
60
+ },
61
+ hsts: { maxAge: 31536000, includeSubDomains: true, preload: true }
62
+ }));
63
+ ```
64
+
65
+ ## Remediation
66
+
67
+ 1. Define a minimum security header baseline for all browser-facing responses.
68
+ 2. Enable `helmet` (or equivalent) and customize CSP for app-specific needs.
69
+ 3. Enforce HSTS only on HTTPS production domains with rollout planning.
70
+ 4. Add `X-Content-Type-Options`, frame protections, and sane referrer policy.
71
+ 5. Move inline scripts/styles to nonce/hash-based CSP-compatible patterns.
72
+ 6. Validate header behavior at proxy/CDN and app layers to avoid overwrites.
73
+ 7. Add automated tests or synthetic checks for required headers per route type.
74
+ 8. Document approved exceptions for legacy integrations and review periodically.
75
+
76
+ ## Verification
77
+
78
+ - Inspect response headers on HTML routes in production.
79
+ - Confirm CSP blocks inline/eval behavior unless explicitly allowed.
80
+ - Validate HSTS appears only on HTTPS and matches intended max-age/preload policy.
81
+ - Test clickjacking protections with iframe embedding attempts.
82
+ - Run security scanner checks and verify no regressions after deploy.
83
+
84
+ ## False Positives and Exceptions
85
+
86
+ - Pure JSON internal APIs not rendered in browsers (still consider baseline headers)
87
+ - Development environments where CSP is relaxed for hot reload tooling
88
+ - Legacy pages requiring transitional CSP policies during migration windows
89
+ - Routes intentionally embeddable by trusted partners with explicit frame policy docs
90
+
91
+ ## Related Rules
92
+
93
+ - `TG-PLATFORM-001-wildcard-cors-with-credentials.md`
94
+ - `TG-PLATFORM-003-production-stack-trace-exposure.md`
95
+ - `TG-INPUT-003-unsafe-html-or-code-execution.md`
@@ -0,0 +1,94 @@
1
+ # TG-PLATFORM-003: Production Stack Trace Exposure
2
+
3
+ ## Severity
4
+
5
+ Medium
6
+
7
+ ## Applies To
8
+
9
+ - API error handlers and exception middleware
10
+ - SSR frameworks rendering error pages
11
+ - Reverse proxies returning upstream crash output
12
+ - Serverless functions with default runtime error responses
13
+ - Any production system handling untrusted request input
14
+
15
+ ## Why It Matters
16
+
17
+ Verbose errors leak internal details useful to attackers.
18
+ Stack traces can expose file paths, package versions, SQL snippets, and infrastructure hints.
19
+ These details speed exploitation and reduce attacker guesswork.
20
+ Operationally, noisy error disclosures also increase user confusion.
21
+ Secure systems return minimal client-facing errors while preserving server-side diagnostics.
22
+
23
+ ## What TorusGuard Looks For
24
+
25
+ - `res.status(500).send(err.stack)` or equivalent direct stack output
26
+ - Framework debug mode enabled in production (`NODE_ENV` misconfiguration)
27
+ - Error pages rendering exception messages and traces to all users
28
+ - Serialized internal exception objects returned in JSON responses
29
+ - Unhandled promise rejections bubbling raw runtime traces to clients
30
+ - Proxy settings forwarding upstream debug bodies externally
31
+
32
+ ## Unsafe Example
33
+
34
+ ```ts
35
+ app.use((err, _req, res, _next) => {
36
+ console.error(err);
37
+ res.status(500).json({
38
+ message: err.message,
39
+ stack: err.stack,
40
+ details: err
41
+ });
42
+ });
43
+ ```
44
+
45
+ ## Safe Example
46
+
47
+ ```ts
48
+ app.use((err, req, res, _next) => {
49
+ logger.error({
50
+ path: req.path,
51
+ method: req.method,
52
+ errorName: err.name,
53
+ message: err.message,
54
+ stack: err.stack
55
+ });
56
+
57
+ res.status(500).json({
58
+ error: "Internal server error",
59
+ requestId: req.id
60
+ });
61
+ });
62
+ ```
63
+
64
+ ## Remediation
65
+
66
+ 1. Implement centralized error handling that returns generic client messages.
67
+ 2. Log full diagnostics server-side only, including correlation IDs.
68
+ 3. Disable framework debug/error overlays in production builds.
69
+ 4. Normalize known operational errors to safe, minimal response schemas.
70
+ 5. Ensure proxies and serverless gateways do not leak upstream traces.
71
+ 6. Add secure defaults for unhandled rejections and uncaught exceptions.
72
+ 7. Review third-party middleware for verbose error serialization behavior.
73
+ 8. Include incident drill checks for accidental debug-mode deployment.
74
+
75
+ ## Verification
76
+
77
+ - Trigger representative 500 errors and inspect client responses for leakage.
78
+ - Confirm stack traces appear in structured logs, not in API bodies.
79
+ - Validate production config disables debug pages/overlays.
80
+ - Test SSR routes and static error pages for internal path/version exposure.
81
+ - Run dynamic scans searching for stack signatures in responses.
82
+
83
+ ## False Positives and Exceptions
84
+
85
+ - Authenticated internal observability endpoints restricted to operators
86
+ - Short-lived canary diagnostics behind strict access controls
87
+ - Non-production environments clearly isolated from public traffic
88
+ - Sanitized error messages that include only non-sensitive validation metadata
89
+
90
+ ## Related Rules
91
+
92
+ - `TG-PLATFORM-002-missing-security-headers.md`
93
+ - `TG-INPUT-001-missing-server-validation.md`
94
+ - `TG-SEC-004-sensitive-logging.md`
@@ -0,0 +1,102 @@
1
+ # TG-PLATFORM-004: Missing Request Size Limits
2
+
3
+ ## Severity
4
+
5
+ Medium
6
+
7
+ ## Applies To
8
+
9
+ - JSON body parsers in API servers
10
+ - Multipart upload handlers (`multer`, `busboy`, `formidable`)
11
+ - Reverse proxies and gateways handling inbound body buffering
12
+ - GraphQL endpoints accepting deeply nested or large payloads
13
+ - Webhook endpoints receiving internet-originated request bodies
14
+
15
+ ## Why It Matters
16
+
17
+ Unlimited request body size enables straightforward resource exhaustion.
18
+ Attackers can submit oversized payloads to consume memory, CPU, and I/O.
19
+ Large bodies also amplify parser overhead before business logic runs.
20
+ This can degrade service availability and increase infrastructure cost.
21
+ Body limits are a foundational availability control.
22
+
23
+ ## What TorusGuard Looks For
24
+
25
+ - `express.json()` or equivalent parser used without `limit`
26
+ - Multipart middleware configured without `fileSize`/part-count constraints
27
+ - Reverse proxy body size defaults left unconfigured for production
28
+ - Endpoints accepting large payloads without authentication or quotas
29
+ - Missing early rejection behavior (`413 Payload Too Large`)
30
+ - No per-route differentiation (tiny webhook route shares unlimited global limits)
31
+
32
+ ## Unsafe Example
33
+
34
+ ```ts
35
+ import express from "express";
36
+ import multer from "multer";
37
+
38
+ const app = express();
39
+ const upload = multer(); // no limits
40
+
41
+ app.use(express.json()); // no limit
42
+ app.post("/api/upload", upload.single("file"), async (req, res) => {
43
+ await storeFile(req.file);
44
+ res.json({ ok: true });
45
+ });
46
+ ```
47
+
48
+ ## Safe Example
49
+
50
+ ```ts
51
+ import express from "express";
52
+ import multer from "multer";
53
+
54
+ const app = express();
55
+ const upload = multer({
56
+ limits: {
57
+ fileSize: 5 * 1024 * 1024,
58
+ files: 1,
59
+ fields: 20
60
+ }
61
+ });
62
+
63
+ app.use(express.json({ limit: "1mb" }));
64
+ app.use(express.urlencoded({ extended: false, limit: "256kb" }));
65
+
66
+ app.post("/api/upload", upload.single("file"), async (req, res) => {
67
+ await storeFile(req.file);
68
+ res.json({ ok: true });
69
+ });
70
+ ```
71
+
72
+ ## Remediation
73
+
74
+ 1. Set explicit global parser limits for JSON, form, and text payloads.
75
+ 2. Apply stricter route-level limits for sensitive or low-bandwidth endpoints.
76
+ 3. Configure multipart middleware with file size, file count, and field limits.
77
+ 4. Mirror limits at gateway/proxy layer for early rejection and cost control.
78
+ 5. Return consistent `413` responses and avoid expensive post-parse handling.
79
+ 6. Require auth and quotas for routes that legitimately need larger bodies.
80
+ 7. Add depth/complexity controls for GraphQL or nested JSON structures.
81
+ 8. Monitor rejected payload metrics and adjust limits based on observed traffic.
82
+
83
+ ## Verification
84
+
85
+ - Submit oversized JSON/form/multipart payloads and confirm `413` behavior.
86
+ - Verify limits are enforced consistently across app and edge layers.
87
+ - Confirm normal legitimate payloads still succeed.
88
+ - Stress-test endpoints to ensure parser memory remains bounded.
89
+ - Validate logs and metrics capture payload-limit rejections cleanly.
90
+
91
+ ## False Positives and Exceptions
92
+
93
+ - Internal batch ingestion endpoints on private networks with strict contracts
94
+ - Dedicated large-upload services with chunked protocols and isolated capacity
95
+ - Temporary migration windows requiring higher limits with compensating controls
96
+ - Routes where limits are enforced upstream and app parser never sees large bodies
97
+
98
+ ## Related Rules
99
+
100
+ - `TG-RATE-003-unbounded-resource-consumption.md`
101
+ - `TG-RATE-002-unlimited-public-write-endpoint.md`
102
+ - `TG-INPUT-004-unrestricted-file-upload.md`
@@ -0,0 +1,112 @@
1
+ # TG-RATE-001: Unlimited Authentication Endpoint
2
+
3
+ ## Severity
4
+
5
+ High
6
+
7
+ ## Applies To
8
+
9
+ - Login endpoints (`/login`, `/signin`, `/api/auth/login`)
10
+ - Password reset request endpoints
11
+ - OTP and magic-link request endpoints
12
+ - Token exchange and refresh endpoints exposed to internet clients
13
+
14
+ ## Why It Matters
15
+
16
+ Authentication surfaces are high-value brute-force targets.
17
+ Without request throttling, attackers can attempt large credential lists quickly.
18
+ Even with strong password hashing, unlimited retries can cause account takeover.
19
+ Unauthenticated auth endpoints are also cheap to hit from botnets.
20
+ Excessive failures can degrade performance and create noisy logs.
21
+ Credential stuffing campaigns usually start here before lateral abuse.
22
+
23
+ ## What TorusGuard Looks For
24
+
25
+ - Auth route handlers with no middleware or logic that tracks attempts
26
+ - No dependency usage for rate limiting (`express-rate-limit`, Redis counters, gateway policies)
27
+ - Missing per-identity or per-IP backoff decisions on failed auth
28
+ - Password reset or OTP endpoints callable repeatedly without cooldown
29
+ - Comments or TODOs that acknowledge rate limiting is not implemented
30
+ - Reverse proxy configs that do not define request limits for auth paths
31
+
32
+ ## Unsafe Example
33
+
34
+ ```ts
35
+ import express from "express";
36
+ import { verifyPassword } from "./auth";
37
+
38
+ const app = express();
39
+ app.use(express.json());
40
+
41
+ app.post("/api/auth/login", async (req, res) => {
42
+ const { email, password } = req.body;
43
+ const user = await db.user.findUnique({ where: { email } });
44
+
45
+ if (!user || !(await verifyPassword(password, user.passwordHash))) {
46
+ return res.status(401).json({ error: "Invalid credentials" });
47
+ }
48
+
49
+ return res.json({ token: signJwt({ sub: user.id }) });
50
+ });
51
+ ```
52
+
53
+ ## Safe Example
54
+
55
+ ```ts
56
+ import express from "express";
57
+ import rateLimit from "express-rate-limit";
58
+ import { verifyPassword } from "./auth";
59
+
60
+ const app = express();
61
+ app.use(express.json());
62
+
63
+ const authLimiter = rateLimit({
64
+ windowMs: 15 * 60 * 1000,
65
+ max: 10,
66
+ standardHeaders: true,
67
+ legacyHeaders: false,
68
+ message: { error: "Too many authentication attempts. Try later." }
69
+ });
70
+
71
+ app.post("/api/auth/login", authLimiter, async (req, res) => {
72
+ const { email, password } = req.body;
73
+ const user = await db.user.findUnique({ where: { email } });
74
+ if (!user || !(await verifyPassword(password, user.passwordHash))) {
75
+ return res.status(401).json({ error: "Invalid credentials" });
76
+ }
77
+ return res.json({ token: signJwt({ sub: user.id }) });
78
+ });
79
+ ```
80
+
81
+ ## Remediation
82
+
83
+ 1. Identify every internet-facing authentication and account-recovery endpoint.
84
+ 2. Apply a rate limiter at app, gateway, or CDN edge for those routes.
85
+ 3. Add tighter thresholds for auth than for generic API traffic.
86
+ 4. Layer controls: per-IP + per-account/email counters when possible.
87
+ 5. Introduce cooldown/backoff after repeated failures.
88
+ 6. Return uniform auth errors to avoid account enumeration.
89
+ 7. Ensure limits are distributed (Redis or gateway), not in-process only.
90
+ 8. Alert on sustained throttling spikes as potential credential-stuffing.
91
+
92
+ ## Verification
93
+
94
+ - Trigger more than allowed login failures from a single source and confirm `429`.
95
+ - Confirm `Retry-After` or equivalent response hints are present.
96
+ - Validate successful logins still work under normal user behavior.
97
+ - Verify limits apply to reset, OTP, and magic-link request endpoints too.
98
+ - Inspect deployment gateway/WAF config to ensure parity with app behavior.
99
+
100
+ ## False Positives and Exceptions
101
+
102
+ - Internal service-to-service auth endpoints behind private network controls only
103
+ - Endpoints already protected by managed API gateway quotas with strict scopes
104
+ - Staging environments used only in private CI where public traffic is impossible
105
+ - Temporary elevated limits during controlled load tests (must be time-boxed)
106
+
107
+ ## Related Rules
108
+
109
+ - `TG-AUTH-005-unsafe-password-reset.md`
110
+ - `TG-AUTH-001-weak-password-storage.md`
111
+ - `TG-RATE-002-unlimited-public-write-endpoint.md`
112
+ - `TG-RATE-003-unbounded-resource-consumption.md`
@@ -0,0 +1,109 @@
1
+ # TG-RATE-002: Unlimited Public Write Endpoint
2
+
3
+ ## Severity
4
+
5
+ Medium
6
+
7
+ ## Applies To
8
+
9
+ - Contact forms and feedback submission routes
10
+ - Newsletter signup and waitlist endpoints
11
+ - Anonymous content creation or comment endpoints
12
+ - Webhooks that accept unauthenticated internet traffic
13
+ - Any expensive POST/PUT/PATCH endpoint callable pre-auth
14
+
15
+ ## Why It Matters
16
+
17
+ Public write endpoints are common abuse entry points.
18
+ Attackers can flood storage, queues, email providers, and notification systems.
19
+ Abuse may not be data theft, but can still create real cost and downtime.
20
+ Spam and bot traffic can also degrade analytics and operational trust.
21
+ Unchecked write volume becomes an easy denial-of-wallet vector.
22
+
23
+ ## What TorusGuard Looks For
24
+
25
+ - Unauthenticated write handlers without route-level throttling
26
+ - Missing CAPTCHA or bot challenge on high-abuse forms
27
+ - No IP, device, or fingerprint-based submission controls
28
+ - No duplicate submission detection for identical payloads
29
+ - Lack of queue depth or outbound provider safeguards after intake
30
+ - Public webhooks with no signature check plus no request limits
31
+
32
+ ## Unsafe Example
33
+
34
+ ```ts
35
+ app.post("/api/contact", async (req, res) => {
36
+ await db.contactMessage.create({
37
+ data: {
38
+ email: req.body.email,
39
+ message: req.body.message
40
+ }
41
+ });
42
+
43
+ await mailer.send({
44
+ to: "support@example.com",
45
+ subject: "New contact request",
46
+ text: req.body.message
47
+ });
48
+
49
+ res.status(201).json({ ok: true });
50
+ });
51
+ ```
52
+
53
+ ## Safe Example
54
+
55
+ ```ts
56
+ import rateLimit from "express-rate-limit";
57
+
58
+ const publicWriteLimiter = rateLimit({
59
+ windowMs: 10 * 60 * 1000,
60
+ max: 20,
61
+ message: { error: "Too many submissions. Please retry later." },
62
+ standardHeaders: true,
63
+ legacyHeaders: false
64
+ });
65
+
66
+ app.post("/api/contact", publicWriteLimiter, async (req, res) => {
67
+ if (!req.body.captchaToken || !(await captcha.verify(req.body.captchaToken))) {
68
+ return res.status(400).json({ error: "Bot challenge failed" });
69
+ }
70
+
71
+ await db.contactMessage.create({
72
+ data: { email: req.body.email, message: req.body.message }
73
+ });
74
+ res.status(201).json({ ok: true });
75
+ });
76
+ ```
77
+
78
+ ## Remediation
79
+
80
+ 1. Inventory all anonymous or pre-auth write endpoints.
81
+ 2. Add route-specific rate limits with lower thresholds than authenticated APIs.
82
+ 3. Add anti-automation controls (CAPTCHA, proof-of-work, or managed bot defense).
83
+ 4. Deduplicate repeated payloads to reduce spam amplification.
84
+ 5. Gate downstream expensive actions (email, SMS, AI calls) with quotas.
85
+ 6. Enforce signed webhooks where feasible and rate-limit unsigned traffic heavily.
86
+ 7. Add abuse monitoring dashboards for submission spikes and block decisions.
87
+ 8. Define an incident playbook for emergency tightening of public write limits.
88
+
89
+ ## Verification
90
+
91
+ - Send more than allowed form submissions and confirm throttling responses.
92
+ - Confirm bot challenge is required and invalid tokens are rejected.
93
+ - Verify normal user submission paths remain functional.
94
+ - Test downstream providers are not called when requests are throttled.
95
+ - Review logs to ensure abuse signals are observable and actionable.
96
+
97
+ ## False Positives and Exceptions
98
+
99
+ - Endpoint is private behind VPN and not internet-reachable
100
+ - Strict gateway quota exists with documented ownership and alerts
101
+ - Endpoint is read-mostly and mislabeled as write by route naming only
102
+ - Temporary load-test bypass with approved window and post-test rollback
103
+
104
+ ## Related Rules
105
+
106
+ - `TG-RATE-001-unlimited-auth-endpoint.md`
107
+ - `TG-RATE-003-unbounded-resource-consumption.md`
108
+ - `TG-INPUT-001-missing-server-validation.md`
109
+ - `TG-INPUT-004-unrestricted-file-upload.md`
@@ -0,0 +1,105 @@
1
+ # TG-RATE-003: Unbounded Resource Consumption
2
+
3
+ ## Severity
4
+
5
+ High
6
+
7
+ ## Applies To
8
+
9
+ - Search and reporting endpoints with user-controlled pagination or filters
10
+ - File generation/export endpoints (CSV, PDF, ZIP)
11
+ - Media processing, image transforms, and AI inference routes
12
+ - Query parameters controlling recursion depth, fan-out, or batch size
13
+ - Any endpoint that triggers heavy DB, CPU, memory, or outbound calls
14
+
15
+ ## Why It Matters
16
+
17
+ Not all abuse is about raw request count.
18
+ A single request can be dangerously expensive when workload is unbounded.
19
+ Attackers can force large scans, huge responses, or runaway processing jobs.
20
+ This can produce denial-of-service and significant infrastructure cost.
21
+ Legitimate users also suffer from latency and instability during abuse events.
22
+
23
+ ## What TorusGuard Looks For
24
+
25
+ - Missing upper bounds on `limit`, `pageSize`, `depth`, `expand`, or `batchSize`
26
+ - Export endpoints that allow entire dataset extraction in one request
27
+ - Image/AI endpoints with unrestricted dimensions, duration, or token budgets
28
+ - No request timeouts, execution budgets, or cancellation support
29
+ - DB queries lacking pagination while returning client-controlled result sizes
30
+ - Loops over user-provided ranges without hard caps
31
+
32
+ ## Unsafe Example
33
+
34
+ ```ts
35
+ app.get("/api/reports/users", async (req, res) => {
36
+ const limit = Number(req.query.limit ?? 1000);
37
+ const users = await db.user.findMany({
38
+ where: { active: true },
39
+ take: limit
40
+ });
41
+ res.json({ users });
42
+ });
43
+
44
+ app.post("/api/export", async (req, res) => {
45
+ const rows = await db.orders.findMany(); // full table scan/export
46
+ const csv = await toCsv(rows);
47
+ res.type("text/csv").send(csv);
48
+ });
49
+ ```
50
+
51
+ ## Safe Example
52
+
53
+ ```ts
54
+ const MAX_REPORT_LIMIT = 100;
55
+ const MAX_EXPORT_ROWS = 5000;
56
+
57
+ app.get("/api/reports/users", async (req, res) => {
58
+ const requested = Number(req.query.limit ?? 25);
59
+ const limit = Math.min(Math.max(requested, 1), MAX_REPORT_LIMIT);
60
+ const users = await db.user.findMany({
61
+ where: { active: true },
62
+ take: limit
63
+ });
64
+ res.json({ users, limit });
65
+ });
66
+
67
+ app.post("/api/export", async (req, res) => {
68
+ const rows = await db.orders.findMany({ take: MAX_EXPORT_ROWS });
69
+ const csv = await toCsv(rows);
70
+ res.type("text/csv").send(csv);
71
+ });
72
+ ```
73
+
74
+ ## Remediation
75
+
76
+ 1. Define explicit upper bounds for all user-controlled workload parameters.
77
+ 2. Clamp values server-side even when frontend already validates inputs.
78
+ 3. Require pagination for list endpoints and deny unbounded bulk reads.
79
+ 4. Add compute and execution guardrails (timeouts, cancellation, queue budgets).
80
+ 5. Cap export size and move large jobs to async pipelines with quotas.
81
+ 6. Set sane payload and response size thresholds per route type.
82
+ 7. Add observability for p95/p99 cost, timeout, and reject rates by endpoint.
83
+ 8. Load-test abuse scenarios and tune bounds before production rollout.
84
+
85
+ ## Verification
86
+
87
+ - Request extreme `limit`/`depth` values and verify clamping behavior.
88
+ - Confirm oversized exports are blocked or converted to queued async jobs.
89
+ - Measure endpoint latency under stress and verify no runaway degradation.
90
+ - Validate timeout and cancellation behavior for long-running workloads.
91
+ - Ensure alerting fires when expensive request patterns spike.
92
+
93
+ ## False Positives and Exceptions
94
+
95
+ - Internal analytics jobs running on private networks with dedicated quotas
96
+ - One-off administrative endpoints gated by strong auth and network controls
97
+ - Batch endpoints with strict signed-client access and audited operator use
98
+ - Synthetic benchmarks intentionally disabling caps in isolated environments
99
+
100
+ ## Related Rules
101
+
102
+ - `TG-RATE-001-unlimited-auth-endpoint.md`
103
+ - `TG-RATE-002-unlimited-public-write-endpoint.md`
104
+ - `TG-PLATFORM-004-missing-request-size-limits.md`
105
+ - `TG-INPUT-001-missing-server-validation.md`