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
package/skills/torusguard/payload/rules/csrf/TG-CSRF-002-unsafe-credentialed-cross-origin-request.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# TG-CSRF-002: Unsafe Credentialed Cross-Origin Request
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High by default. Raise to Critical when applicable.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- Relevant endpoints and services
|
|
8
|
+
|
|
9
|
+
## Why It Matters
|
|
10
|
+
Explaining the risk of this vulnerability.
|
|
11
|
+
|
|
12
|
+
## What TorusGuard Looks For
|
|
13
|
+
- Specific code patterns or configurations
|
|
14
|
+
|
|
15
|
+
## Unsafe Example
|
|
16
|
+
```javascript
|
|
17
|
+
// Unsafe code example
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Safe Example
|
|
21
|
+
```javascript
|
|
22
|
+
// Safe code example
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Remediation
|
|
26
|
+
1. Step one
|
|
27
|
+
2. Step two
|
|
28
|
+
|
|
29
|
+
## Verification
|
|
30
|
+
- Test case 1
|
|
31
|
+
- Test case 2
|
|
32
|
+
|
|
33
|
+
## False Positives and Exceptions
|
|
34
|
+
An exception requires documented review.
|
|
35
|
+
|
|
36
|
+
## Related Rules
|
|
37
|
+
- TG-OTHER-001
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Retain custom rules directory
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# TorusGuard Custom Rules Directory
|
|
2
|
+
|
|
3
|
+
Place your custom organization-specific, framework-specific, or proprietary library rules here.
|
|
4
|
+
Any markdown files (`*.md`) or JSON files (`*.json`) placed in this directory will be automatically indexed during `/torusguard-audit` and finding scoring.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Example Custom Rule: `TG-CUSTOM-001.md`
|
|
9
|
+
|
|
10
|
+
```markdown
|
|
11
|
+
# TG-CUSTOM-001: Require Organization UUID on All Multi-Tenant Queries
|
|
12
|
+
|
|
13
|
+
**Rule ID:** TG-CUSTOM-001
|
|
14
|
+
**Severity:** High
|
|
15
|
+
**Category:** database-safety
|
|
16
|
+
**Confidence Base:** 85
|
|
17
|
+
|
|
18
|
+
### Description
|
|
19
|
+
Ensure all database operations on multi-tenant tables enforce explicit `org_id` or `tenant_id` boundaries.
|
|
20
|
+
|
|
21
|
+
### Unsafe Pattern
|
|
22
|
+
```python
|
|
23
|
+
db.execute("SELECT * FROM invoices WHERE status = 'paid'")
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Safe Remediation
|
|
27
|
+
```python
|
|
28
|
+
db.execute("SELECT * FROM invoices WHERE status = 'paid' AND org_id = %s", [current_org_id])
|
|
29
|
+
```
|
|
30
|
+
```
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# TG-EDGE-001: Serverless & Edge Global State Memory Leakage
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High. Global state persistence across warm container or edge worker invocations can lead to cross-request tenant pollution and unauthorized credential disclosure.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- Cloudflare Workers
|
|
8
|
+
- Vercel Edge Functions (Next.js Edge Runtime)
|
|
9
|
+
- AWS Lambda / Netlify Functions
|
|
10
|
+
|
|
11
|
+
## Why It Matters
|
|
12
|
+
In serverless and edge computing architectures:
|
|
13
|
+
1. **Container / Isolate Reuse:** Serverless instances (V8 isolates or MicroVMs) stay warm across sequential invocations to optimize startup latency.
|
|
14
|
+
2. **State Leakage Hazard:** Global variables, module-scoped arrays, singletons, or uncleaned caches persist between subsequent client requests handled by the same warm worker.
|
|
15
|
+
3. **Cross-Tenant Contamination:** If User A's authentication token, tenant ID, or profile data is assigned to a module-level variable, a subsequent request from User B can accidentally read User A's data without authenticating.
|
|
16
|
+
|
|
17
|
+
## What TorusGuard Looks For
|
|
18
|
+
1. Module-scoped or global mutable variables (`let`, `var`, global `Map`, `dict`) storing user-specific context, request headers, or auth tokens.
|
|
19
|
+
2. Singleton database connection pools or client sessions retaining user-specific session state across handler calls.
|
|
20
|
+
3. Lack of explicit request-scoped context initialization.
|
|
21
|
+
|
|
22
|
+
## Unsafe Example
|
|
23
|
+
```typescript
|
|
24
|
+
// UNSAFE: Module-scoped state persists across warm Cloudflare Worker invocations
|
|
25
|
+
let currentSessionUser: { id: string; role: string } | null = null;
|
|
26
|
+
|
|
27
|
+
export default {
|
|
28
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
29
|
+
const token = request.headers.get("Authorization");
|
|
30
|
+
if (token) {
|
|
31
|
+
// Leaks to subsequent requests if not explicitly cleared on every path!
|
|
32
|
+
currentSessionUser = await verifyUser(token);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Danger: If next request lacks Authorization header, currentSessionUser remains set!
|
|
36
|
+
return new Response(JSON.stringify({ user: currentSessionUser }));
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Safe Example
|
|
42
|
+
```typescript
|
|
43
|
+
// SAFE: Strictly request-scoped context; zero mutable global state
|
|
44
|
+
interface RequestContext {
|
|
45
|
+
user: { id: string; role: string } | null;
|
|
46
|
+
requestId: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export default {
|
|
50
|
+
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
|
|
51
|
+
// Context is created fresh per invocation inside the handler scope
|
|
52
|
+
const reqContext: RequestContext = {
|
|
53
|
+
user: null,
|
|
54
|
+
requestId: crypto.randomUUID(),
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const token = request.headers.get("Authorization");
|
|
58
|
+
if (token) {
|
|
59
|
+
reqContext.user = await verifyUser(token, env.JWT_SECRET);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (!reqContext.user) {
|
|
63
|
+
return new Response(JSON.stringify({ error: "Unauthorized" }), { status: 401 });
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return new Response(JSON.stringify({ user: reqContext.user }));
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Remediation
|
|
72
|
+
1. **Enforce Request-Scoped State:** Always declare mutable variables, session holders, and tenant identifiers inside the handler function scope.
|
|
73
|
+
2. **Treat Global Scope as Immutable:** Limit module-level variables strictly to immutable configuration constants, static schemas, or stateless utility functions.
|
|
74
|
+
3. **Isolate Database Clients:** Ensure database connections or ORM instances created globally do not cache user-specific transaction boundaries or credentials.
|
|
75
|
+
|
|
76
|
+
## Verification
|
|
77
|
+
- Unit test sequential simulated requests against the worker ensuring User A's context never appears in an unauthenticated User B invocation.
|
|
78
|
+
- Assert that static linters flag module-scoped mutable assignments in edge handler files.
|
|
79
|
+
|
|
80
|
+
## Related Rules
|
|
81
|
+
- `TG-EDGE-003`: AWS Lambda Ephemeral Execution & Cold Start Security
|
|
82
|
+
- `TG-AUTH-002`: Client-Side Only Authorization
|
|
83
|
+
- `TG-DB-004`: Missing Tenant Query Isolation
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# TG-EDGE-003: AWS Lambda Ephemeral Execution & Cold Start Security
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
Medium by default. Escalate to High if IAM credentials or temporary execution tokens are leaked or indefinitely reused across invocations.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- AWS Lambda (Python, Node.js)
|
|
8
|
+
- Serverless Framework / AWS SAM / AWS CDK
|
|
9
|
+
|
|
10
|
+
## Why It Matters
|
|
11
|
+
AWS Lambda execution environments are frequently reused across invocations. While initializing heavy clients (such as AWS SDK or database pools) outside the handler improves cold start latency:
|
|
12
|
+
1. **Stale Credentials & Leaked Tokens:** Temporary STS session tokens or database auth credentials initialized during cold start can expire or persist between distinct tenants.
|
|
13
|
+
2. **Ephemeral Disk Residue (`/tmp`):** The `/tmp` storage directory is preserved across warm invocations of the same execution environment. Writing unencrypted sensitive files, tokens, or customer exports to `/tmp` can expose data to subsequent requests.
|
|
14
|
+
3. **Execution Timeouts:** Unbounded subrequests without client-side timeouts can consume maximum execution seconds, triggering Denial-of-Wallet.
|
|
15
|
+
|
|
16
|
+
## What TorusGuard Looks For
|
|
17
|
+
1. Writing unencrypted sensitive data or credentials directly to `/tmp` without explicit deletion in a `finally` block.
|
|
18
|
+
2. Global caching of dynamic, tenant-specific STS or database credentials outside the handler.
|
|
19
|
+
3. Outbound network calls inside Lambda handlers lacking explicit connection and read timeouts.
|
|
20
|
+
|
|
21
|
+
## Unsafe Example
|
|
22
|
+
```python
|
|
23
|
+
# UNSAFE: Writing sensitive customer export to /tmp without cleanup
|
|
24
|
+
import os
|
|
25
|
+
import boto3
|
|
26
|
+
|
|
27
|
+
def lambda_handler(event, context):
|
|
28
|
+
user_id = event["userId"]
|
|
29
|
+
temp_path = f"/tmp/export_{user_id}.json"
|
|
30
|
+
|
|
31
|
+
# Writes sensitive data to /tmp; persists across warm invocations!
|
|
32
|
+
with open(temp_path, "w") as f:
|
|
33
|
+
f.write(event["sensitiveUserData"])
|
|
34
|
+
|
|
35
|
+
upload_to_s3(temp_path)
|
|
36
|
+
# Missing cleanup: subsequent invocations can access this file!
|
|
37
|
+
return {"status": "ok"}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Safe Example
|
|
41
|
+
```python
|
|
42
|
+
# SAFE: Ephemeral cleanup guaranteed via try/finally and unique temp storage
|
|
43
|
+
import os
|
|
44
|
+
import tempfile
|
|
45
|
+
import boto3
|
|
46
|
+
|
|
47
|
+
def lambda_handler(event, context):
|
|
48
|
+
user_id = event.get("userId")
|
|
49
|
+
if not user_id:
|
|
50
|
+
return {"statusCode": 400, "body": "Missing userId"}
|
|
51
|
+
|
|
52
|
+
# Use secure tempfile with guaranteed cleanup
|
|
53
|
+
with tempfile.NamedTemporaryFile(mode="w+", delete=False) as temp_file:
|
|
54
|
+
try:
|
|
55
|
+
temp_file.write(event["sensitiveUserData"])
|
|
56
|
+
temp_file.flush()
|
|
57
|
+
upload_to_s3(temp_file.name)
|
|
58
|
+
finally:
|
|
59
|
+
if os.path.exists(temp_file.name):
|
|
60
|
+
os.remove(temp_file.name)
|
|
61
|
+
|
|
62
|
+
return {"statusCode": 200, "body": "Export completed safely"}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Remediation
|
|
66
|
+
1. **Always clean up `/tmp` files:** Use `tempfile.NamedTemporaryFile` with a `finally` block or context manager that guarantees file removal.
|
|
67
|
+
2. **Avoid Global Caching of Tenant Context:** Initialize IAM STS assume-role credentials per request within the handler.
|
|
68
|
+
3. **Configure Timeouts:** Set client connection and read timeouts on all outbound HTTP and AWS SDK clients.
|
|
69
|
+
|
|
70
|
+
## Verification
|
|
71
|
+
- Assert that all `/tmp` file writes are wrapped in cleanup blocks.
|
|
72
|
+
- Test that consecutive invocations with different tenant payloads do not find pre-existing files in `/tmp`.
|
|
73
|
+
|
|
74
|
+
## Related Rules
|
|
75
|
+
- `TG-EDGE-001`: Serverless & Edge Global State Memory Leakage
|
|
76
|
+
- `TG-SEC-001`: Hardcoded Secrets
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# TG-GQL-001: Missing Query Depth or Complexity Limits
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High. Unbounded GraphQL queries allow nested recursive queries (e.g., author $\rightarrow$ books $\rightarrow$ author) that trigger server denial-of-service, CPU saturation, and exponential database query loads.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- Apollo Server, Yoga, GraphQL.js, Strawberry, Graphene (Python), TypeGraphQL
|
|
8
|
+
|
|
9
|
+
## Why It Matters
|
|
10
|
+
GraphQL allows client-controlled response structures. Without depth limiting or cost analysis:
|
|
11
|
+
1. An attacker can submit deeply nested circular queries ($> 100$ levels) that monopolize Node.js or Python event loops.
|
|
12
|
+
2. Batching multiple expensive queries in a single HTTP request bypasses naive rate limiters.
|
|
13
|
+
3. Automated scanners can trigger denial-of-service unless runtime introspection probes are bounded to harmless depth thresholds.
|
|
14
|
+
|
|
15
|
+
## What TorusGuard Looks For
|
|
16
|
+
1. GraphQL server setup lacking query depth validation rules (e.g., `graphql-depth-limit`).
|
|
17
|
+
2. Missing complexity/cost calculation plugins (`graphql-query-complexity`).
|
|
18
|
+
3. Runtime probe: Executing a harmless 3-level bounded query canary; flagging if queries deeper than allowed thresholds execute without validation errors.
|
|
19
|
+
|
|
20
|
+
## Unsafe Example
|
|
21
|
+
```typescript
|
|
22
|
+
// UNSAFE: Apollo Server without query depth or complexity validation
|
|
23
|
+
import { ApolloServer } from "@apollo/server";
|
|
24
|
+
|
|
25
|
+
const server = new ApolloServer({
|
|
26
|
+
typeDefs,
|
|
27
|
+
resolvers,
|
|
28
|
+
// No depth limit or complexity plugins configured!
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Safe Example
|
|
33
|
+
```typescript
|
|
34
|
+
// SAFE: Query depth validation capped at 6 levels and complexity cost limits
|
|
35
|
+
import { ApolloServer } from "@apollo/server";
|
|
36
|
+
import depthLimit from "graphql-depth-limit";
|
|
37
|
+
import { createComplexityLimitRule } from "graphql-validation-complexity";
|
|
38
|
+
|
|
39
|
+
const server = new ApolloServer({
|
|
40
|
+
typeDefs,
|
|
41
|
+
resolvers,
|
|
42
|
+
validationRules: [
|
|
43
|
+
depthLimit(6), // Maximum query nesting depth
|
|
44
|
+
createComplexityLimitRule(1000, {
|
|
45
|
+
onCost: (cost) => console.log(`GraphQL Query Cost: ${cost}`),
|
|
46
|
+
}),
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Bounded Runtime Probe Protocol
|
|
52
|
+
When probing GraphQL endpoints under `/torusguard web-validate`:
|
|
53
|
+
1. Submit a **bounded 3-level canary query** (e.g., `{ __typename, schema: __schema { types { name } } }`).
|
|
54
|
+
2. Submit a single test query exceeding max depth (e.g., 7 levels) with a strict request budget of 1 request.
|
|
55
|
+
3. Assert that the server responds with an HTTP 400 or GraphQL `GRAPHQL_VALIDATION_FAILED` error rather than evaluating resolvers.
|
|
56
|
+
|
|
57
|
+
## Remediation
|
|
58
|
+
1. **Enforce Depth Limiting:** Install `graphql-depth-limit` and cap maximum depth (typically 5–7 levels).
|
|
59
|
+
2. **Implement Query Cost Analysis:** Assign complexity points per field and reject queries exceeding cost thresholds.
|
|
60
|
+
3. **Disable Production Introspection:** Set `introspection: false` in production environments.
|
|
61
|
+
|
|
62
|
+
## Related Rules
|
|
63
|
+
- `TG-GQL-004`: Unnecessary Production Introspection
|
|
64
|
+
- `TG-RATE-003`: Unbounded Resource Consumption
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# TG-GQL-002: Resolver Missing Authorization
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High by default. Raise to Critical when applicable.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- Relevant endpoints and services
|
|
8
|
+
|
|
9
|
+
## Why It Matters
|
|
10
|
+
Explaining the risk of this vulnerability.
|
|
11
|
+
|
|
12
|
+
## What TorusGuard Looks For
|
|
13
|
+
- Specific code patterns or configurations
|
|
14
|
+
|
|
15
|
+
## Unsafe Example
|
|
16
|
+
```javascript
|
|
17
|
+
// Unsafe code example
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Safe Example
|
|
21
|
+
```javascript
|
|
22
|
+
// Safe code example
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Remediation
|
|
26
|
+
1. Step one
|
|
27
|
+
2. Step two
|
|
28
|
+
|
|
29
|
+
## Verification
|
|
30
|
+
- Test case 1
|
|
31
|
+
- Test case 2
|
|
32
|
+
|
|
33
|
+
## False Positives and Exceptions
|
|
34
|
+
An exception requires documented review.
|
|
35
|
+
|
|
36
|
+
## Related Rules
|
|
37
|
+
- TG-OTHER-001
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# TG-GQL-003: Unbounded GraphQL Pagination or Batching
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High by default. Raise to Critical when applicable.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- Relevant endpoints and services
|
|
8
|
+
|
|
9
|
+
## Why It Matters
|
|
10
|
+
Explaining the risk of this vulnerability.
|
|
11
|
+
|
|
12
|
+
## What TorusGuard Looks For
|
|
13
|
+
- Specific code patterns or configurations
|
|
14
|
+
|
|
15
|
+
## Unsafe Example
|
|
16
|
+
```javascript
|
|
17
|
+
// Unsafe code example
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Safe Example
|
|
21
|
+
```javascript
|
|
22
|
+
// Safe code example
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Remediation
|
|
26
|
+
1. Step one
|
|
27
|
+
2. Step two
|
|
28
|
+
|
|
29
|
+
## Verification
|
|
30
|
+
- Test case 1
|
|
31
|
+
- Test case 2
|
|
32
|
+
|
|
33
|
+
## False Positives and Exceptions
|
|
34
|
+
An exception requires documented review.
|
|
35
|
+
|
|
36
|
+
## Related Rules
|
|
37
|
+
- TG-OTHER-001
|
package/skills/torusguard/payload/rules/graphql/TG-GQL-004-unnecessary-production-introspection.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# TG-GQL-004: Unnecessary Production Introspection
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High by default. Raise to Critical when applicable.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- Relevant endpoints and services
|
|
8
|
+
|
|
9
|
+
## Why It Matters
|
|
10
|
+
Explaining the risk of this vulnerability.
|
|
11
|
+
|
|
12
|
+
## What TorusGuard Looks For
|
|
13
|
+
- Specific code patterns or configurations
|
|
14
|
+
|
|
15
|
+
## Unsafe Example
|
|
16
|
+
```javascript
|
|
17
|
+
// Unsafe code example
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Safe Example
|
|
21
|
+
```javascript
|
|
22
|
+
// Safe code example
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Remediation
|
|
26
|
+
1. Step one
|
|
27
|
+
2. Step two
|
|
28
|
+
|
|
29
|
+
## Verification
|
|
30
|
+
- Test case 1
|
|
31
|
+
- Test case 2
|
|
32
|
+
|
|
33
|
+
## False Positives and Exceptions
|
|
34
|
+
An exception requires documented review.
|
|
35
|
+
|
|
36
|
+
## Related Rules
|
|
37
|
+
- TG-OTHER-001
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# TG-SEC-005: Secret in Git History
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High by default. Raise to Critical when applicable.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- Relevant endpoints and services
|
|
8
|
+
|
|
9
|
+
## Why It Matters
|
|
10
|
+
Explaining the risk of this vulnerability.
|
|
11
|
+
|
|
12
|
+
## What TorusGuard Looks For
|
|
13
|
+
- Specific code patterns or configurations
|
|
14
|
+
|
|
15
|
+
## Unsafe Example
|
|
16
|
+
```javascript
|
|
17
|
+
// Unsafe code example
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Safe Example
|
|
21
|
+
```javascript
|
|
22
|
+
// Safe code example
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Remediation
|
|
26
|
+
1. Step one
|
|
27
|
+
2. Step two
|
|
28
|
+
|
|
29
|
+
## Verification
|
|
30
|
+
- Test case 1
|
|
31
|
+
- Test case 2
|
|
32
|
+
|
|
33
|
+
## False Positives and Exceptions
|
|
34
|
+
An exception requires documented review.
|
|
35
|
+
|
|
36
|
+
## Related Rules
|
|
37
|
+
- TG-OTHER-001
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# TG-SEC-006: Secret in Build Artifact
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High by default. Raise to Critical when applicable.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- Relevant endpoints and services
|
|
8
|
+
|
|
9
|
+
## Why It Matters
|
|
10
|
+
Explaining the risk of this vulnerability.
|
|
11
|
+
|
|
12
|
+
## What TorusGuard Looks For
|
|
13
|
+
- Specific code patterns or configurations
|
|
14
|
+
|
|
15
|
+
## Unsafe Example
|
|
16
|
+
```javascript
|
|
17
|
+
// Unsafe code example
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Safe Example
|
|
21
|
+
```javascript
|
|
22
|
+
// Safe code example
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Remediation
|
|
26
|
+
1. Step one
|
|
27
|
+
2. Step two
|
|
28
|
+
|
|
29
|
+
## Verification
|
|
30
|
+
- Test case 1
|
|
31
|
+
- Test case 2
|
|
32
|
+
|
|
33
|
+
## False Positives and Exceptions
|
|
34
|
+
An exception requires documented review.
|
|
35
|
+
|
|
36
|
+
## Related Rules
|
|
37
|
+
- TG-OTHER-001
|
package/skills/torusguard/payload/rules/secrets/TG-SEC-007-secret-in-test-or-example-fixture.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# TG-SEC-007: Secret in Test or Example Fixture
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High by default. Raise to Critical when applicable.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- Relevant endpoints and services
|
|
8
|
+
|
|
9
|
+
## Why It Matters
|
|
10
|
+
Explaining the risk of this vulnerability.
|
|
11
|
+
|
|
12
|
+
## What TorusGuard Looks For
|
|
13
|
+
- Specific code patterns or configurations
|
|
14
|
+
|
|
15
|
+
## Unsafe Example
|
|
16
|
+
```javascript
|
|
17
|
+
// Unsafe code example
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Safe Example
|
|
21
|
+
```javascript
|
|
22
|
+
// Safe code example
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Remediation
|
|
26
|
+
1. Step one
|
|
27
|
+
2. Step two
|
|
28
|
+
|
|
29
|
+
## Verification
|
|
30
|
+
- Test case 1
|
|
31
|
+
- Test case 2
|
|
32
|
+
|
|
33
|
+
## False Positives and Exceptions
|
|
34
|
+
An exception requires documented review.
|
|
35
|
+
|
|
36
|
+
## Related Rules
|
|
37
|
+
- TG-OTHER-001
|
package/skills/torusguard/payload/rules/ssrf/TG-SSRF-001-user-controlled-server-side-url-fetch.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# TG-SSRF-001: User-Controlled Server-Side URL Fetch
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High by default. Raise to Critical when the request can reach internal administrative services, cloud metadata services, or sensitive network assets.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- URL preview APIs
|
|
8
|
+
- Remote image/file importers
|
|
9
|
+
- Webhook testers
|
|
10
|
+
- PDF generation services
|
|
11
|
+
- Server-side integrations
|
|
12
|
+
- Any endpoint that fetches a URL supplied by a user
|
|
13
|
+
|
|
14
|
+
## Why It Matters
|
|
15
|
+
A server that fetches an attacker-controlled URL may be used to access internal systems or send requests from a trusted network location.
|
|
16
|
+
|
|
17
|
+
## What TorusGuard Looks For
|
|
18
|
+
- fetch(), axios, requests, HttpClient, OkHttp, or equivalent calls
|
|
19
|
+
- URL values derived from request body, query, or path parameters
|
|
20
|
+
- Redirect-following enabled without destination validation
|
|
21
|
+
- No domain or IP allowlist
|
|
22
|
+
- No timeout or response-size limit
|
|
23
|
+
|
|
24
|
+
## Unsafe Example
|
|
25
|
+
```javascript
|
|
26
|
+
const response = await fetch(req.body.url);
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Safe Example
|
|
30
|
+
```javascript
|
|
31
|
+
const target = new URL(req.body.url);
|
|
32
|
+
if (target.protocol !== "https:") {
|
|
33
|
+
throw new Error("Only HTTPS URLs are allowed");
|
|
34
|
+
}
|
|
35
|
+
if (!ALLOWED_HOSTS.has(target.hostname)) {
|
|
36
|
+
throw new Error("Destination is not allowed");
|
|
37
|
+
}
|
|
38
|
+
const response = await fetch(target, {
|
|
39
|
+
redirect: "error",
|
|
40
|
+
signal: AbortSignal.timeout(5000)
|
|
41
|
+
});
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Remediation
|
|
45
|
+
1. Parse the URL using a maintained URL parser.
|
|
46
|
+
2. Allow only required schemes.
|
|
47
|
+
3. Prefer an explicit hostname allowlist.
|
|
48
|
+
4. Block private, loopback, link-local, and metadata destinations.
|
|
49
|
+
5. Disable or revalidate redirects.
|
|
50
|
+
6. Apply timeout and response-size limits.
|
|
51
|
+
7. Do not return raw upstream responses.
|
|
52
|
+
|
|
53
|
+
## Verification
|
|
54
|
+
- Test allowed domains.
|
|
55
|
+
- Test localhost and loopback addresses.
|
|
56
|
+
- Test private IP ranges.
|
|
57
|
+
- Test metadata-service addresses.
|
|
58
|
+
- Test file:// and other unsupported schemes.
|
|
59
|
+
- Test redirects to an untrusted or internal destination.
|
|
60
|
+
- Verify timeout and response-size behavior.
|
|
61
|
+
|
|
62
|
+
## False Positives and Exceptions
|
|
63
|
+
An exception requires a documented fixed allowlist, network isolation, timeout, response limit, and review owner.
|
|
64
|
+
|
|
65
|
+
## Related Rules
|
|
66
|
+
- TG-SSRF-002
|
|
67
|
+
- TG-SSRF-003
|
|
68
|
+
- TG-RATE-003
|
package/skills/torusguard/payload/rules/ssrf/TG-SSRF-002-missing-internal-network-protection.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# TG-SSRF-002: Missing Internal Network Protection
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High by default. Raise to Critical when applicable.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- Relevant endpoints and services
|
|
8
|
+
|
|
9
|
+
## Why It Matters
|
|
10
|
+
Explaining the risk of this vulnerability.
|
|
11
|
+
|
|
12
|
+
## What TorusGuard Looks For
|
|
13
|
+
- Specific code patterns or configurations
|
|
14
|
+
|
|
15
|
+
## Unsafe Example
|
|
16
|
+
```javascript
|
|
17
|
+
// Unsafe code example
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Safe Example
|
|
21
|
+
```javascript
|
|
22
|
+
// Safe code example
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Remediation
|
|
26
|
+
1. Step one
|
|
27
|
+
2. Step two
|
|
28
|
+
|
|
29
|
+
## Verification
|
|
30
|
+
- Test case 1
|
|
31
|
+
- Test case 2
|
|
32
|
+
|
|
33
|
+
## False Positives and Exceptions
|
|
34
|
+
An exception requires documented review.
|
|
35
|
+
|
|
36
|
+
## Related Rules
|
|
37
|
+
- TG-OTHER-001
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# TG-SSRF-003: Unsafe Redirect Following
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High by default. Raise to Critical when applicable.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- Relevant endpoints and services
|
|
8
|
+
|
|
9
|
+
## Why It Matters
|
|
10
|
+
Explaining the risk of this vulnerability.
|
|
11
|
+
|
|
12
|
+
## What TorusGuard Looks For
|
|
13
|
+
- Specific code patterns or configurations
|
|
14
|
+
|
|
15
|
+
## Unsafe Example
|
|
16
|
+
```javascript
|
|
17
|
+
// Unsafe code example
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Safe Example
|
|
21
|
+
```javascript
|
|
22
|
+
// Safe code example
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Remediation
|
|
26
|
+
1. Step one
|
|
27
|
+
2. Step two
|
|
28
|
+
|
|
29
|
+
## Verification
|
|
30
|
+
- Test case 1
|
|
31
|
+
- Test case 2
|
|
32
|
+
|
|
33
|
+
## False Positives and Exceptions
|
|
34
|
+
An exception requires documented review.
|
|
35
|
+
|
|
36
|
+
## Related Rules
|
|
37
|
+
- TG-OTHER-001
|