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.
- package/.torusguard/.manifest.json +196 -78
- package/.torusguard/references/csharp-security.md +41 -0
- package/.torusguard/references/go-security.md +41 -0
- package/.torusguard/references/java-security.md +40 -0
- package/.torusguard/references/polyglot-security-matrix.md +25 -0
- package/.torusguard/references/rust-security.md +40 -0
- package/.torusguard/rules/README.md +93 -62
- package/.torusguard/rules/TG-AUTH-001-weak-password-storage.md +103 -0
- package/.torusguard/rules/TG-AUTH-002-client-only-authorization.md +85 -0
- package/.torusguard/rules/TG-AUTH-003-missing-object-authorization.md +85 -0
- package/.torusguard/rules/TG-AUTH-004-insecure-session-cookie.md +96 -0
- package/.torusguard/rules/TG-AUTH-005-unsafe-password-reset.md +104 -0
- package/.torusguard/rules/TG-CLIENT-001-public-production-source-maps.md +102 -0
- package/.torusguard/rules/TG-CLIENT-002-sensitive-client-bundle-content.md +102 -0
- package/.torusguard/rules/TG-DB-001-frontend-database-query.md +83 -0
- package/.torusguard/rules/TG-DB-002-privileged-database-credential.md +86 -0
- package/.torusguard/rules/TG-DB-003-frontend-admin-sdk.md +91 -0
- package/.torusguard/rules/TG-DB-004-missing-tenant-query-isolation.md +103 -0
- package/.torusguard/rules/TG-INPUT-001-missing-server-validation.md +98 -0
- package/.torusguard/rules/TG-INPUT-002-raw-sql-concatenation.md +94 -0
- package/.torusguard/rules/TG-INPUT-003-unsafe-html-or-code-execution.md +102 -0
- package/.torusguard/rules/TG-INPUT-004-unrestricted-file-upload.md +92 -0
- package/.torusguard/rules/TG-INPUT-005-unsafe-template-rendering-and-escaping.md +102 -0
- package/.torusguard/rules/TG-INPUT-006-unsafe-file-path-traversal.md +131 -0
- package/.torusguard/rules/TG-PLATFORM-001-wildcard-cors-with-credentials.md +101 -0
- package/.torusguard/rules/TG-PLATFORM-002-missing-security-headers.md +95 -0
- package/.torusguard/rules/TG-PLATFORM-003-production-stack-trace-exposure.md +94 -0
- package/.torusguard/rules/TG-PLATFORM-004-missing-request-size-limits.md +102 -0
- package/.torusguard/rules/TG-RATE-001-unlimited-auth-endpoint.md +112 -0
- package/.torusguard/rules/TG-RATE-002-unlimited-public-write-endpoint.md +109 -0
- package/.torusguard/rules/TG-RATE-003-unbounded-resource-consumption.md +105 -0
- package/.torusguard/rules/TG-SEC-001-hardcoded-secrets.md +83 -0
- package/.torusguard/rules/TG-SEC-002-public-environment-secrets.md +83 -0
- package/.torusguard/rules/TG-SEC-003-tracked-env-file.md +79 -0
- package/.torusguard/rules/TG-SEC-004-sensitive-logging.md +83 -0
- package/.torusguard/rules/active/TG-AUTH-001-weak-password-storage.md +103 -0
- package/.torusguard/rules/active/TG-AUTH-002-client-only-authorization.md +85 -0
- package/.torusguard/rules/active/TG-AUTH-003-missing-object-authorization.md +85 -0
- package/.torusguard/rules/active/TG-AUTH-004-insecure-session-cookie.md +96 -0
- package/.torusguard/rules/active/TG-AUTH-005-unsafe-password-reset.md +104 -0
- package/.torusguard/rules/active/TG-CLIENT-001-public-production-source-maps.md +102 -0
- package/.torusguard/rules/active/TG-CLIENT-002-sensitive-client-bundle-content.md +102 -0
- package/.torusguard/rules/active/TG-DB-001-frontend-database-query.md +83 -0
- package/.torusguard/rules/active/TG-DB-002-privileged-database-credential.md +86 -0
- package/.torusguard/rules/active/TG-DB-003-frontend-admin-sdk.md +91 -0
- package/.torusguard/rules/active/TG-DB-004-missing-tenant-query-isolation.md +103 -0
- package/.torusguard/rules/active/TG-INPUT-001-missing-server-validation.md +98 -0
- package/.torusguard/rules/active/TG-INPUT-002-raw-sql-concatenation.md +94 -0
- package/.torusguard/rules/active/TG-INPUT-003-unsafe-html-or-code-execution.md +102 -0
- package/.torusguard/rules/active/TG-INPUT-004-unrestricted-file-upload.md +92 -0
- package/.torusguard/rules/active/TG-INPUT-005-unsafe-template-rendering-and-escaping.md +102 -0
- package/.torusguard/rules/active/TG-INPUT-006-unsafe-file-path-traversal.md +131 -0
- package/.torusguard/rules/active/TG-PLATFORM-001-wildcard-cors-with-credentials.md +101 -0
- package/.torusguard/rules/active/TG-PLATFORM-002-missing-security-headers.md +95 -0
- package/.torusguard/rules/active/TG-PLATFORM-003-production-stack-trace-exposure.md +94 -0
- package/.torusguard/rules/active/TG-PLATFORM-004-missing-request-size-limits.md +102 -0
- package/.torusguard/rules/active/TG-RATE-001-unlimited-auth-endpoint.md +112 -0
- package/.torusguard/rules/active/TG-RATE-002-unlimited-public-write-endpoint.md +109 -0
- package/.torusguard/rules/active/TG-RATE-003-unbounded-resource-consumption.md +105 -0
- package/.torusguard/rules/active/TG-SEC-001-hardcoded-secrets.md +83 -0
- package/.torusguard/rules/active/TG-SEC-002-public-environment-secrets.md +83 -0
- package/.torusguard/rules/active/TG-SEC-003-tracked-env-file.md +79 -0
- package/.torusguard/rules/active/TG-SEC-004-sensitive-logging.md +83 -0
- package/.torusguard/rules/agent/TG-AGENT-001-prompt-injection-system-context.md +56 -0
- package/.torusguard/rules/agent/TG-AGENT-002-unsafe-tool-dispatch-unsandboxed-execution.md +68 -0
- package/.torusguard/rules/agent/TG-AGENT-003-broad-mcp-tool-scoping.md +53 -0
- package/.torusguard/rules/agent/TG-AGENT-004-persistent-memory-cross-session-leakage.md +67 -0
- package/.torusguard/rules/authorization/TG-AUTH-006-mass-assignment.md +70 -0
- package/.torusguard/rules/authorization/TG-AUTH-007-missing-property-level-authorization.md +71 -0
- package/.torusguard/rules/authorization/TG-AUTH-008-untrusted-role-header-injection.md +112 -0
- package/.torusguard/rules/business-logic/TG-BIZ-001-client-controlled-sensitive-business-value.md +37 -0
- package/.torusguard/rules/business-logic/TG-BIZ-002-replayable-one-time-operation.md +37 -0
- package/.torusguard/rules/business-logic/TG-BIZ-003-missing-workflow-state-validation.md +37 -0
- package/.torusguard/rules/business-logic/TG-BIZ-004-unrestricted-sensitive-business-flow.md +37 -0
- package/.torusguard/rules/cache/TG-CACHE-001-sensitive-response-publicly-cacheable.md +37 -0
- package/.torusguard/rules/cache/TG-CACHE-002-missing-user-cache-isolation.md +37 -0
- package/.torusguard/rules/cache/TG-CACHE-003-sensitive-data-in-url.md +37 -0
- package/.torusguard/rules/csrf/TG-CSRF-001-missing-csrf-protection.md +37 -0
- package/.torusguard/rules/csrf/TG-CSRF-002-unsafe-credentialed-cross-origin-request.md +37 -0
- package/.torusguard/rules/custom/.gitkeep +1 -0
- package/.torusguard/rules/custom/README.md +30 -0
- package/.torusguard/rules/edge/TG-EDGE-001-serverless-global-state-leak.md +83 -0
- package/.torusguard/rules/edge/TG-EDGE-003-aws-lambda-ephemeral-cold-start.md +76 -0
- package/.torusguard/rules/graphql/TG-GQL-001-missing-query-depth-or-complexity-limits.md +64 -0
- package/.torusguard/rules/graphql/TG-GQL-002-resolver-missing-authorization.md +37 -0
- package/.torusguard/rules/graphql/TG-GQL-003-unbounded-graphql-pagination-or-batching.md +37 -0
- package/.torusguard/rules/graphql/TG-GQL-004-unnecessary-production-introspection.md +37 -0
- package/.torusguard/rules/secrets/TG-SEC-005-secret-in-git-history.md +37 -0
- package/.torusguard/rules/secrets/TG-SEC-006-secret-in-build-artifact.md +37 -0
- package/.torusguard/rules/secrets/TG-SEC-007-secret-in-test-or-example-fixture.md +37 -0
- package/.torusguard/rules/ssrf/TG-SSRF-001-user-controlled-server-side-url-fetch.md +68 -0
- package/.torusguard/rules/ssrf/TG-SSRF-002-missing-internal-network-protection.md +37 -0
- package/.torusguard/rules/ssrf/TG-SSRF-003-unsafe-redirect-following.md +37 -0
- package/.torusguard/rules/ssrf/TG-SSRF-004-unbounded-outbound-request.md +37 -0
- package/.torusguard/rules/supply-chain/TG-SUPPLY-001-missing-or-ignored-dependency-lockfile.md +37 -0
- package/.torusguard/rules/supply-chain/TG-SUPPLY-002-vulnerable-dependency-review-missing.md +94 -0
- package/.torusguard/rules/supply-chain/TG-SUPPLY-003-unsafe-ci-cd-secret-exposure.md +37 -0
- package/.torusguard/rules/supply-chain/TG-SUPPLY-004-unpinned-ci-action.md +37 -0
- package/.torusguard/rules/supply-chain/TG-SUPPLY-005-unsafe-dependency-install-script.md +37 -0
- package/.torusguard/rules/supply-chain/TG-SUPPLY-006-container-build-secret-persistence.md +61 -0
- package/.torusguard/rules/webhook/TG-WEBHOOK-001-missing-webhook-signature-verification.md +37 -0
- package/.torusguard/rules/webhook/TG-WEBHOOK-002-replayable-webhook.md +37 -0
- package/.torusguard/rules/webhook/TG-WEBHOOK-003-missing-webhook-idempotency.md +37 -0
- package/.torusguard/rules/webhook/TG-WEBHOOK-004-unvalidated-webhook-event-type.md +37 -0
- package/.torusguard/rules/websocket/TG-WS-001-unauthenticated-websocket-handshake.md +82 -0
- package/.torusguard/rules/websocket/TG-WS-002-missing-channel-level-authorization.md +37 -0
- package/.torusguard/rules/websocket/TG-WS-003-unvalidated-websocket-message.md +37 -0
- package/.torusguard/rules/websocket/TG-WS-004-unbounded-websocket-connections.md +37 -0
- package/.torusguard/runs/report-latest.html +370 -0
- package/.torusguard/runs/run-20260908-112648-audit/findings.json +1520 -0
- package/.torusguard/runs/run-20260908-112648-audit/findings.md +560 -0
- package/.torusguard/runs/run-20260908-112648-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260908-112648-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260908-112722-audit/findings.json +1520 -0
- package/.torusguard/runs/run-20260908-112722-audit/findings.md +560 -0
- package/.torusguard/runs/run-20260908-112722-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260908-112722-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260908-113004-audit/findings.json +1520 -0
- package/.torusguard/runs/run-20260908-113004-audit/findings.md +560 -0
- package/.torusguard/runs/run-20260908-113004-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260908-113004-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-115-9a059e/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-115-9a059e/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-115-9a059e/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-119-61557c/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-119-61557c/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-119-61557c/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-265-996ca3/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-265-996ca3/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-265-996ca3/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-334-cb819d/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-334-cb819d/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-334-cb819d/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-503-d11cf8/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-503-d11cf8/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-503-d11cf8/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-79-91f41f/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-79-91f41f/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-db-004-79-91f41f/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-107-516a40/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-107-516a40/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-107-516a40/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-128-7809a1/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-128-7809a1/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-128-7809a1/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-232-1b45d1/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-232-1b45d1/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-002-232-1b45d1/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-003-53-d167b4/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-003-53-d167b4/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-input-003-53-d167b4/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-209-4f6424/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-209-4f6424/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-209-4f6424/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-257-89bf34/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-257-89bf34/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-257-89bf34/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-341-ce228c/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-341-ce228c/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-341-ce228c/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-355-7b190b/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-355-7b190b/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-355-7b190b/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-64-5af31a/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-64-5af31a/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-64-5af31a/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-9-f51467/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-9-f51467/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-113127-audit/bundles/bnd-tg-sec-001-9-f51467/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-113127-audit/findings.json +1520 -0
- package/.torusguard/runs/run-20260908-113127-audit/findings.md +560 -0
- package/.torusguard/runs/run-20260908-113127-audit/manifest.json +13 -0
- package/.torusguard/runs/run-20260908-113127-audit/remediation.md +262 -0
- package/.torusguard/runs/run-20260908-113127-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260908-115240-audit/apply_plan.md +6 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-115-9a059e/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-115-9a059e/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-115-9a059e/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-119-61557c/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-119-61557c/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-119-61557c/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-265-996ca3/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-265-996ca3/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-265-996ca3/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-334-cb819d/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-334-cb819d/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-334-cb819d/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-503-d11cf8/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-503-d11cf8/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-503-d11cf8/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-79-91f41f/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-79-91f41f/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-db-004-79-91f41f/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-107-516a40/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-107-516a40/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-107-516a40/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-128-7809a1/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-128-7809a1/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-128-7809a1/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-232-1b45d1/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-232-1b45d1/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-002-232-1b45d1/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-003-53-d167b4/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-003-53-d167b4/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-input-003-53-d167b4/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-platform-001-168-5027cb/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-platform-001-168-5027cb/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-platform-001-168-5027cb/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-209-4f6424/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-209-4f6424/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-209-4f6424/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-257-89bf34/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-257-89bf34/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-257-89bf34/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-341-ce228c/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-341-ce228c/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-341-ce228c/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-355-7b190b/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-355-7b190b/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-355-7b190b/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-64-5af31a/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-64-5af31a/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-64-5af31a/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-9-f51467/metadata.json +15 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-9-f51467/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260908-115240-audit/bundles/bnd-tg-sec-001-9-f51467/patch.diff +9 -0
- package/.torusguard/runs/run-20260908-115240-audit/diff_summary.md +221 -0
- package/.torusguard/runs/run-20260908-115240-audit/findings.json +1553 -0
- package/.torusguard/runs/run-20260908-115240-audit/findings.md +572 -0
- package/.torusguard/runs/run-20260908-115240-audit/manifest.json +14 -0
- package/.torusguard/runs/run-20260908-115240-audit/recheck.md +91 -0
- package/.torusguard/runs/run-20260908-115240-audit/remediation.md +278 -0
- package/.torusguard/runs/run-20260908-115240-audit/summary.md +5 -0
- package/.torusguard/schemas/golden-recipe.schema.json +75 -0
- package/.torusguard/scripts/__pycache__/audit_runner.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/finding_scorer.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/memory_engine.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/monorepo_detector.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/run_manager.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/stack_detect.cpython-311.pyc +0 -0
- package/.torusguard/scripts/apply_runner.py +332 -0
- package/.torusguard/scripts/audit_runner.py +550 -0
- package/.torusguard/scripts/diff_guard.py +183 -8
- package/.torusguard/scripts/finding_scorer.py +91 -5
- package/.torusguard/scripts/harden_runner.py +353 -0
- package/.torusguard/scripts/html_reporter.py +643 -0
- package/.torusguard/scripts/manifest_builder.py +7 -5
- package/.torusguard/scripts/memory_engine.py +525 -99
- package/.torusguard/scripts/monorepo_detector.py +123 -10
- package/.torusguard/scripts/recheck_runner.py +221 -0
- package/.torusguard/scripts/recipes_runner.py +130 -0
- package/.torusguard/scripts/rules_sync.py +321 -0
- package/.torusguard/scripts/run_manager.py +17 -5
- package/.torusguard/scripts/stack_detect.py +458 -26
- package/.torusguard/skills/torusguard/SKILL.md +42 -42
- package/.torusguard/skills/torusguard/references/csharp-security.md +41 -0
- package/.torusguard/skills/torusguard/references/go-security.md +41 -0
- package/.torusguard/skills/torusguard/references/java-security.md +40 -0
- package/.torusguard/skills/torusguard/references/polyglot-security-matrix.md +25 -0
- package/.torusguard/skills/torusguard/references/rust-security.md +40 -0
- package/.torusguard/snapshots/run-20260908-115240-audit/examples/vulnerable-react-express/client/src/App.jsx.bak +63 -0
- package/.torusguard/snapshots/run-20260908-115240-audit/examples/vulnerable-react-express/server/index.js.bak +82 -0
- package/.torusguard/snapshots/run-20260908-115240-audit/harness/engine/fixture_manager.py.bak +245 -0
- package/.torusguard/snapshots/run-20260908-115240-audit/harness/master_validation.py.bak +698 -0
- package/.torusguard/snapshots/run-20260908-115240-audit/harness/runner.py.bak +551 -0
- package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_e2e.py.bak +498 -0
- package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_qa_v0_6_0.py.bak +572 -0
- package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_v0_6_1_scale.py.bak +371 -0
- package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_v0_6_2_modern_stacks.py.bak +462 -0
- package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_v0_6_3_hardening.py.bak +444 -0
- package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_v1_0_0_memory.py.bak +302 -0
- package/.torusguard/snapshots/run-20260908-115240-audit/harness/validate_v1_1_0_advanced_memory.py.bak +342 -0
- package/.torusguard/snapshots/run-20260908-115240-audit/skills/torusguard/payload/scripts/harden_runner.py.bak +353 -0
- package/.torusguard/snapshots/run-20260908-115240-audit/tests/test_v0_6_0_governed_remediation.py.bak +353 -0
- package/README.md +344 -410
- package/bin/torusguard.js +195 -21
- package/package.json +1 -1
- package/skills/torusguard/SKILL.md +42 -42
- package/skills/torusguard/bootstrap.py +149 -70
- package/skills/torusguard/payload/.manifest.json +196 -78
- package/skills/torusguard/payload/references/csharp-security.md +41 -0
- package/skills/torusguard/payload/references/go-security.md +41 -0
- package/skills/torusguard/payload/references/java-security.md +40 -0
- package/skills/torusguard/payload/references/polyglot-security-matrix.md +25 -0
- package/skills/torusguard/payload/references/rust-security.md +40 -0
- package/skills/torusguard/payload/rules/README.md +93 -62
- package/skills/torusguard/payload/rules/TG-AUTH-001-weak-password-storage.md +103 -0
- package/skills/torusguard/payload/rules/TG-AUTH-002-client-only-authorization.md +85 -0
- package/skills/torusguard/payload/rules/TG-AUTH-003-missing-object-authorization.md +85 -0
- package/skills/torusguard/payload/rules/TG-AUTH-004-insecure-session-cookie.md +96 -0
- package/skills/torusguard/payload/rules/TG-AUTH-005-unsafe-password-reset.md +104 -0
- package/skills/torusguard/payload/rules/TG-CLIENT-001-public-production-source-maps.md +102 -0
- package/skills/torusguard/payload/rules/TG-CLIENT-002-sensitive-client-bundle-content.md +102 -0
- package/skills/torusguard/payload/rules/TG-DB-001-frontend-database-query.md +83 -0
- package/skills/torusguard/payload/rules/TG-DB-002-privileged-database-credential.md +86 -0
- package/skills/torusguard/payload/rules/TG-DB-003-frontend-admin-sdk.md +91 -0
- package/skills/torusguard/payload/rules/TG-DB-004-missing-tenant-query-isolation.md +103 -0
- package/skills/torusguard/payload/rules/TG-INPUT-001-missing-server-validation.md +98 -0
- package/skills/torusguard/payload/rules/TG-INPUT-002-raw-sql-concatenation.md +94 -0
- package/skills/torusguard/payload/rules/TG-INPUT-003-unsafe-html-or-code-execution.md +102 -0
- package/skills/torusguard/payload/rules/TG-INPUT-004-unrestricted-file-upload.md +92 -0
- package/skills/torusguard/payload/rules/TG-INPUT-005-unsafe-template-rendering-and-escaping.md +102 -0
- package/skills/torusguard/payload/rules/TG-INPUT-006-unsafe-file-path-traversal.md +131 -0
- package/skills/torusguard/payload/rules/TG-PLATFORM-001-wildcard-cors-with-credentials.md +101 -0
- package/skills/torusguard/payload/rules/TG-PLATFORM-002-missing-security-headers.md +95 -0
- package/skills/torusguard/payload/rules/TG-PLATFORM-003-production-stack-trace-exposure.md +94 -0
- package/skills/torusguard/payload/rules/TG-PLATFORM-004-missing-request-size-limits.md +102 -0
- package/skills/torusguard/payload/rules/TG-RATE-001-unlimited-auth-endpoint.md +112 -0
- package/skills/torusguard/payload/rules/TG-RATE-002-unlimited-public-write-endpoint.md +109 -0
- package/skills/torusguard/payload/rules/TG-RATE-003-unbounded-resource-consumption.md +105 -0
- package/skills/torusguard/payload/rules/TG-SEC-001-hardcoded-secrets.md +83 -0
- package/skills/torusguard/payload/rules/TG-SEC-002-public-environment-secrets.md +83 -0
- package/skills/torusguard/payload/rules/TG-SEC-003-tracked-env-file.md +79 -0
- package/skills/torusguard/payload/rules/TG-SEC-004-sensitive-logging.md +83 -0
- package/skills/torusguard/payload/rules/active/TG-AUTH-001-weak-password-storage.md +103 -0
- package/skills/torusguard/payload/rules/active/TG-AUTH-002-client-only-authorization.md +85 -0
- package/skills/torusguard/payload/rules/active/TG-AUTH-003-missing-object-authorization.md +85 -0
- package/skills/torusguard/payload/rules/active/TG-AUTH-004-insecure-session-cookie.md +96 -0
- package/skills/torusguard/payload/rules/active/TG-AUTH-005-unsafe-password-reset.md +104 -0
- package/skills/torusguard/payload/rules/active/TG-CLIENT-001-public-production-source-maps.md +102 -0
- package/skills/torusguard/payload/rules/active/TG-CLIENT-002-sensitive-client-bundle-content.md +102 -0
- package/skills/torusguard/payload/rules/active/TG-DB-001-frontend-database-query.md +83 -0
- package/skills/torusguard/payload/rules/active/TG-DB-002-privileged-database-credential.md +86 -0
- package/skills/torusguard/payload/rules/active/TG-DB-003-frontend-admin-sdk.md +91 -0
- package/skills/torusguard/payload/rules/active/TG-DB-004-missing-tenant-query-isolation.md +103 -0
- package/skills/torusguard/payload/rules/active/TG-INPUT-001-missing-server-validation.md +98 -0
- package/skills/torusguard/payload/rules/active/TG-INPUT-002-raw-sql-concatenation.md +94 -0
- package/skills/torusguard/payload/rules/active/TG-INPUT-003-unsafe-html-or-code-execution.md +102 -0
- package/skills/torusguard/payload/rules/active/TG-INPUT-004-unrestricted-file-upload.md +92 -0
- package/skills/torusguard/payload/rules/active/TG-INPUT-005-unsafe-template-rendering-and-escaping.md +102 -0
- package/skills/torusguard/payload/rules/active/TG-INPUT-006-unsafe-file-path-traversal.md +131 -0
- package/skills/torusguard/payload/rules/active/TG-PLATFORM-001-wildcard-cors-with-credentials.md +101 -0
- package/skills/torusguard/payload/rules/active/TG-PLATFORM-002-missing-security-headers.md +95 -0
- package/skills/torusguard/payload/rules/active/TG-PLATFORM-003-production-stack-trace-exposure.md +94 -0
- package/skills/torusguard/payload/rules/active/TG-PLATFORM-004-missing-request-size-limits.md +102 -0
- package/skills/torusguard/payload/rules/active/TG-RATE-001-unlimited-auth-endpoint.md +112 -0
- package/skills/torusguard/payload/rules/active/TG-RATE-002-unlimited-public-write-endpoint.md +109 -0
- package/skills/torusguard/payload/rules/active/TG-RATE-003-unbounded-resource-consumption.md +105 -0
- package/skills/torusguard/payload/rules/active/TG-SEC-001-hardcoded-secrets.md +83 -0
- package/skills/torusguard/payload/rules/active/TG-SEC-002-public-environment-secrets.md +83 -0
- package/skills/torusguard/payload/rules/active/TG-SEC-003-tracked-env-file.md +79 -0
- package/skills/torusguard/payload/rules/active/TG-SEC-004-sensitive-logging.md +83 -0
- package/skills/torusguard/payload/rules/agent/TG-AGENT-001-prompt-injection-system-context.md +56 -0
- package/skills/torusguard/payload/rules/agent/TG-AGENT-002-unsafe-tool-dispatch-unsandboxed-execution.md +68 -0
- package/skills/torusguard/payload/rules/agent/TG-AGENT-003-broad-mcp-tool-scoping.md +53 -0
- package/skills/torusguard/payload/rules/agent/TG-AGENT-004-persistent-memory-cross-session-leakage.md +67 -0
- package/skills/torusguard/payload/rules/authorization/TG-AUTH-006-mass-assignment.md +70 -0
- package/skills/torusguard/payload/rules/authorization/TG-AUTH-007-missing-property-level-authorization.md +71 -0
- package/skills/torusguard/payload/rules/authorization/TG-AUTH-008-untrusted-role-header-injection.md +112 -0
- package/skills/torusguard/payload/rules/business-logic/TG-BIZ-001-client-controlled-sensitive-business-value.md +37 -0
- package/skills/torusguard/payload/rules/business-logic/TG-BIZ-002-replayable-one-time-operation.md +37 -0
- package/skills/torusguard/payload/rules/business-logic/TG-BIZ-003-missing-workflow-state-validation.md +37 -0
- package/skills/torusguard/payload/rules/business-logic/TG-BIZ-004-unrestricted-sensitive-business-flow.md +37 -0
- package/skills/torusguard/payload/rules/cache/TG-CACHE-001-sensitive-response-publicly-cacheable.md +37 -0
- package/skills/torusguard/payload/rules/cache/TG-CACHE-002-missing-user-cache-isolation.md +37 -0
- package/skills/torusguard/payload/rules/cache/TG-CACHE-003-sensitive-data-in-url.md +37 -0
- package/skills/torusguard/payload/rules/csrf/TG-CSRF-001-missing-csrf-protection.md +37 -0
- package/skills/torusguard/payload/rules/csrf/TG-CSRF-002-unsafe-credentialed-cross-origin-request.md +37 -0
- package/skills/torusguard/payload/rules/custom/.gitkeep +1 -0
- package/skills/torusguard/payload/rules/custom/README.md +30 -0
- package/skills/torusguard/payload/rules/edge/TG-EDGE-001-serverless-global-state-leak.md +83 -0
- package/skills/torusguard/payload/rules/edge/TG-EDGE-003-aws-lambda-ephemeral-cold-start.md +76 -0
- package/skills/torusguard/payload/rules/graphql/TG-GQL-001-missing-query-depth-or-complexity-limits.md +64 -0
- package/skills/torusguard/payload/rules/graphql/TG-GQL-002-resolver-missing-authorization.md +37 -0
- package/skills/torusguard/payload/rules/graphql/TG-GQL-003-unbounded-graphql-pagination-or-batching.md +37 -0
- package/skills/torusguard/payload/rules/graphql/TG-GQL-004-unnecessary-production-introspection.md +37 -0
- package/skills/torusguard/payload/rules/secrets/TG-SEC-005-secret-in-git-history.md +37 -0
- package/skills/torusguard/payload/rules/secrets/TG-SEC-006-secret-in-build-artifact.md +37 -0
- package/skills/torusguard/payload/rules/secrets/TG-SEC-007-secret-in-test-or-example-fixture.md +37 -0
- package/skills/torusguard/payload/rules/ssrf/TG-SSRF-001-user-controlled-server-side-url-fetch.md +68 -0
- package/skills/torusguard/payload/rules/ssrf/TG-SSRF-002-missing-internal-network-protection.md +37 -0
- package/skills/torusguard/payload/rules/ssrf/TG-SSRF-003-unsafe-redirect-following.md +37 -0
- package/skills/torusguard/payload/rules/ssrf/TG-SSRF-004-unbounded-outbound-request.md +37 -0
- package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-001-missing-or-ignored-dependency-lockfile.md +37 -0
- package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-002-vulnerable-dependency-review-missing.md +94 -0
- package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-003-unsafe-ci-cd-secret-exposure.md +37 -0
- package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-004-unpinned-ci-action.md +37 -0
- package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-005-unsafe-dependency-install-script.md +37 -0
- package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-006-container-build-secret-persistence.md +61 -0
- package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-001-missing-webhook-signature-verification.md +37 -0
- package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-002-replayable-webhook.md +37 -0
- package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-003-missing-webhook-idempotency.md +37 -0
- package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-004-unvalidated-webhook-event-type.md +37 -0
- package/skills/torusguard/payload/rules/websocket/TG-WS-001-unauthenticated-websocket-handshake.md +82 -0
- package/skills/torusguard/payload/rules/websocket/TG-WS-002-missing-channel-level-authorization.md +37 -0
- package/skills/torusguard/payload/rules/websocket/TG-WS-003-unvalidated-websocket-message.md +37 -0
- package/skills/torusguard/payload/rules/websocket/TG-WS-004-unbounded-websocket-connections.md +37 -0
- package/skills/torusguard/payload/schemas/golden-recipe.schema.json +75 -0
- package/skills/torusguard/payload/scripts/apply_runner.py +332 -0
- package/skills/torusguard/payload/scripts/audit_runner.py +550 -0
- package/skills/torusguard/payload/scripts/diff_guard.py +183 -8
- package/skills/torusguard/payload/scripts/finding_scorer.py +91 -5
- package/skills/torusguard/payload/scripts/harden_runner.py +353 -0
- package/skills/torusguard/payload/scripts/html_reporter.py +643 -0
- package/skills/torusguard/payload/scripts/manifest_builder.py +7 -5
- package/skills/torusguard/payload/scripts/memory_engine.py +525 -99
- package/skills/torusguard/payload/scripts/monorepo_detector.py +123 -10
- package/skills/torusguard/payload/scripts/recheck_runner.py +221 -0
- package/skills/torusguard/payload/scripts/recipes_runner.py +130 -0
- package/skills/torusguard/payload/scripts/rules_sync.py +321 -0
- package/skills/torusguard/payload/scripts/run_manager.py +17 -5
- package/skills/torusguard/payload/scripts/stack_detect.py +458 -26
- package/skills/torusguard/payload/skills/torusguard/SKILL.md +42 -42
- package/skills/torusguard/payload/skills/torusguard/bootstrap.py +149 -70
- package/skills/torusguard/payload/skills/torusguard/references/csharp-security.md +41 -0
- package/skills/torusguard/payload/skills/torusguard/references/go-security.md +41 -0
- package/skills/torusguard/payload/skills/torusguard/references/java-security.md +40 -0
- package/skills/torusguard/payload/skills/torusguard/references/polyglot-security-matrix.md +25 -0
- package/skills/torusguard/payload/skills/torusguard/references/rust-security.md +40 -0
- package/.torusguard/scripts/__pycache__/diff_guard.cpython-311.pyc +0 -0
- 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`
|