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,53 @@
|
|
|
1
|
+
# TG-AGENT-003: Overly Broad MCP Tool Scoping & Credential Access
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High. Granting Model Context Protocol (MCP) servers or autonomous agents unbounded filesystem or database access violates the principle of least privilege.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- Model Context Protocol (MCP) Configurations (`mcp_config.json`, `.agent/mcp.json`)
|
|
8
|
+
- AI Coding Agent Plugins & Tool Connectors
|
|
9
|
+
|
|
10
|
+
## Why It Matters
|
|
11
|
+
MCP servers bridge LLMs to local filesystems, git repositories, and external APIs. When MCP configurations grant broad root filesystem access (`/`) or pass unrestricted service-role database keys:
|
|
12
|
+
1. A compromised or hallucinating agent can read SSH keys, browser cookies, and bash histories.
|
|
13
|
+
2. Destructive SQL operations (`DROP TABLE`, `DELETE FROM`) can be triggered through tool calls without human confirmation.
|
|
14
|
+
|
|
15
|
+
## What TorusGuard Looks For
|
|
16
|
+
1. MCP server configurations mounting root directories (`/`, `C:\`, `~`) instead of project-specific subdirectories.
|
|
17
|
+
2. Unrestricted write and delete permissions on production databases passed to agent tools.
|
|
18
|
+
3. Lack of Human-in-the-Loop confirmation gates for destructive actions.
|
|
19
|
+
|
|
20
|
+
## Unsafe Example
|
|
21
|
+
```json
|
|
22
|
+
// UNSAFE: MCP configuration granting full user home directory access
|
|
23
|
+
{
|
|
24
|
+
"mcpServers": {
|
|
25
|
+
"filesystem": {
|
|
26
|
+
"command": "npx",
|
|
27
|
+
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/user"]
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Safe Example
|
|
34
|
+
```json
|
|
35
|
+
// SAFE: Least privilege directory scoping restricted to active project workspace
|
|
36
|
+
{
|
|
37
|
+
"mcpServers": {
|
|
38
|
+
"filesystem": {
|
|
39
|
+
"command": "npx",
|
|
40
|
+
"args": ["-y", "@modelcontextprotocol/server-filesystem", "./src", "./docs"]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Remediation
|
|
47
|
+
1. **Scope to Project Root:** Restrict filesystem MCP servers to explicit project workspaces. Never mount user home directories or sensitive system paths.
|
|
48
|
+
2. **Read-Only by Default:** Configure tools with read-only modes unless write access is explicitly justified.
|
|
49
|
+
3. **Human Gate for Destructive Actions:** Require explicit user approval before executing file deletions or destructive database queries.
|
|
50
|
+
|
|
51
|
+
## Related Rules
|
|
52
|
+
- `TG-AGENT-002`: Unsafe Tool Dispatch & Shell Execution without Sandboxing
|
|
53
|
+
- `TG-SEC-001`: Hardcoded Secrets
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# TG-AGENT-004: Persistent Memory & Cross-Session Information Leakage
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High. Storing unredacted sensitive session data, tokens, or personal information in long-term vector memory stores causes cross-session data leakage.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- Agent Long-Term Memory, RAG Vector Stores, ChromaDB, Pinecone, LangChain Memory
|
|
8
|
+
- Multi-Tenant AI Assistants & Support Bots
|
|
9
|
+
|
|
10
|
+
## Why It Matters
|
|
11
|
+
Autonomous agents increasingly use vector embeddings and episodic memory databases to remember user preferences across sessions. If multi-tenant agents store memories without tenant isolation:
|
|
12
|
+
1. User A's API tokens, medical history, or confidential notes can be indexed into vector search.
|
|
13
|
+
2. When User B queries the agent, vector similarity search can retrieve User A's private context and inject it into the prompt.
|
|
14
|
+
|
|
15
|
+
## What TorusGuard Looks For
|
|
16
|
+
1. Ingesting raw user messages containing credentials, tokens, or PII into persistent vector databases without automated secret scrubbing.
|
|
17
|
+
2. Vector database queries lacking mandatory `tenant_id` metadata filtering.
|
|
18
|
+
3. Cross-user shared memory caches in multi-user AI services.
|
|
19
|
+
|
|
20
|
+
## Unsafe Example
|
|
21
|
+
```python
|
|
22
|
+
# UNSAFE: Storing raw user messages in shared vector memory without tenant isolation
|
|
23
|
+
def save_agent_memory(vector_store, user_id: str, message: str):
|
|
24
|
+
# Missing credential scrub & missing tenant namespace
|
|
25
|
+
vector_store.add_texts(
|
|
26
|
+
texts=[message],
|
|
27
|
+
metadatas=[{"source": "chat"}] # Danger: Searchable across all users!
|
|
28
|
+
)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Safe Example
|
|
32
|
+
```python
|
|
33
|
+
# SAFE: Secret redaction and mandatory tenant metadata isolation
|
|
34
|
+
from core.runtime_evidence import mask_sensitive_data
|
|
35
|
+
|
|
36
|
+
def save_agent_memory(vector_store, tenant_id: str, user_id: str, message: str):
|
|
37
|
+
# 1. Scrub credentials and tokens prior to indexing
|
|
38
|
+
clean_message = mask_sensitive_data(message)
|
|
39
|
+
|
|
40
|
+
# 2. Store with strict tenant metadata
|
|
41
|
+
vector_store.add_texts(
|
|
42
|
+
texts=[clean_message],
|
|
43
|
+
metadatas=[{
|
|
44
|
+
"tenant_id": tenant_id,
|
|
45
|
+
"user_id": user_id,
|
|
46
|
+
"source": "chat"
|
|
47
|
+
}]
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
def query_agent_memory(vector_store, tenant_id: str, query: str):
|
|
51
|
+
# Mandatory tenant filter prevents cross-tenant memory leakage
|
|
52
|
+
return vector_store.similarity_search(
|
|
53
|
+
query,
|
|
54
|
+
k=4,
|
|
55
|
+
filter={"tenant_id": tenant_id}
|
|
56
|
+
)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Remediation
|
|
60
|
+
1. **Always Sanitize Before Storing:** Run credential masking over all text before saving to memory databases.
|
|
61
|
+
2. **Strict Tenant Filtering:** Enforce hard metadata filters (`filter={"tenant_id": ...}`) on every vector search query.
|
|
62
|
+
3. **Session Cleansing:** Provide users with clear commands to clear and audit persistent memory.
|
|
63
|
+
|
|
64
|
+
## Related Rules
|
|
65
|
+
- `TG-AGENT-001`: Prompt Injection in System Context Files
|
|
66
|
+
- `TG-DB-004`: Missing Tenant Query Isolation
|
|
67
|
+
- `TG-SEC-004`: Sensitive Logging
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# TG-AUTH-006: Mass Assignment & Privilege Escalation via Payloads
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High by default. Raise to Critical when client payloads can alter administrative roles (`is_staff`, `is_superuser`, `role`), account status, or billing tiers.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- Form handlers, model binders, ORM update operations, DRF serializers, and FastAPI/Pydantic ingestion schemas.
|
|
8
|
+
|
|
9
|
+
## Why It Matters
|
|
10
|
+
When server code automatically binds arbitrary client JSON/form keys to internal database models without field-level allowlists, clients can inject sensitive attributes (e.g. `{"role": "admin", "is_verified": true}`) to elevate their privileges.
|
|
11
|
+
|
|
12
|
+
## What TorusGuard Looks For
|
|
13
|
+
- Django `ModelForm` classes declaring `fields = '__all__'`.
|
|
14
|
+
- DRF serializers without `read_only_fields` on privilege or system columns.
|
|
15
|
+
- FastAPI/Pydantic schemas omitting `extra="forbid"` or binding directly to ORM models.
|
|
16
|
+
- SQLAlchemy `.update(request_data)` executing raw untrusted dictionaries.
|
|
17
|
+
|
|
18
|
+
## Evidence & Classification Standards
|
|
19
|
+
- **`Confirmed`:** `fields = '__all__'` in Django ModelForms or raw `.update(payload)` without allowlists on models containing privilege fields.
|
|
20
|
+
- **`Safe`:** Serializers using explicit `read_only_fields = ['role', 'is_staff']` or Pydantic models using `ConfigDict(extra="forbid")`.
|
|
21
|
+
|
|
22
|
+
## Unsafe Examples
|
|
23
|
+
|
|
24
|
+
### Django ModelForm
|
|
25
|
+
```python
|
|
26
|
+
# VULNERABLE: Binds all model fields to form
|
|
27
|
+
class UserProfileForm(forms.ModelForm):
|
|
28
|
+
class Meta:
|
|
29
|
+
model = User
|
|
30
|
+
fields = '__all__' # ❌ Allows user to submit is_staff=True
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### DRF Serializer
|
|
34
|
+
```python
|
|
35
|
+
# VULNERABLE: Missing read_only_fields
|
|
36
|
+
class UserSerializer(serializers.ModelSerializer):
|
|
37
|
+
class Meta:
|
|
38
|
+
model = User
|
|
39
|
+
fields = ['id', 'username', 'email', 'role', 'is_staff'] # ❌ role & is_staff are writable
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Safe Examples
|
|
43
|
+
|
|
44
|
+
### Django ModelForm
|
|
45
|
+
```python
|
|
46
|
+
# SAFE: Explicit editable fields whitelist
|
|
47
|
+
class UserProfileForm(forms.ModelForm):
|
|
48
|
+
class Meta:
|
|
49
|
+
model = User
|
|
50
|
+
fields = ['display_name', 'bio', 'avatar_url'] # ✅ Only safe fields exposed
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### DRF Serializer
|
|
54
|
+
```python
|
|
55
|
+
# SAFE: Explicit read_only_fields
|
|
56
|
+
class UserSerializer(serializers.ModelSerializer):
|
|
57
|
+
class Meta:
|
|
58
|
+
model = User
|
|
59
|
+
fields = ['id', 'username', 'email', 'role', 'is_staff']
|
|
60
|
+
read_only_fields = ['id', 'role', 'is_staff'] # ✅ System fields protected
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Remediation
|
|
64
|
+
1. Use explicit field allowlists rather than wildcard binds.
|
|
65
|
+
2. In DRF serializers, declare `read_only_fields` for all privilege, status, and financial properties.
|
|
66
|
+
3. In Pydantic v2 schemas, configure `model_config = ConfigDict(extra="forbid")`.
|
|
67
|
+
|
|
68
|
+
## Related Rules
|
|
69
|
+
- `TG-AUTH-007`: Missing Property-Level Authorization
|
|
70
|
+
- `TG-INPUT-001`: Unvalidated Client Input
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# TG-AUTH-007: Missing Object-Level and Property-Level Authorization (IDOR)
|
|
2
|
+
|
|
3
|
+
## Severity
|
|
4
|
+
High by default. Raise to Critical when financial, healthcare, or administrative records are exposed without tenant boundaries.
|
|
5
|
+
|
|
6
|
+
## Applies To
|
|
7
|
+
- Database query handlers, REST API endpoints, GraphQL resolvers, RPC methods, and service layers across Node.js, Express, Django, DRF, FastAPI, Flask, and SQLAlchemy.
|
|
8
|
+
|
|
9
|
+
## Why It Matters
|
|
10
|
+
When an application retrieves, modifies, or deletes an object using a client-supplied identifier (`id`, `order_id`, `invoice_id`) without verifying that the requesting user owns or has legitimate access to that specific object, attackers can perform Insecure Direct Object References (IDOR) to access records belonging to other tenants.
|
|
11
|
+
|
|
12
|
+
## What TorusGuard Looks For
|
|
13
|
+
- Query lookups using solely URL parameters or payload primary keys (e.g. `Model.objects.get(id=pk)`, `session.query(Order).filter(Order.id == order_id)`) without tenant/user ownership criteria.
|
|
14
|
+
- Serializers and API endpoints that expose or mutate private sub-resources without validating the parent-child tenant relationship.
|
|
15
|
+
|
|
16
|
+
## Evidence & Classification Standards
|
|
17
|
+
- **`Confirmed`:** The query or view directly executes database lookups using an unsanitized client identifier with zero user/tenant filter criteria in the same module.
|
|
18
|
+
- **`Manual Review`:** The view delegates fetching to a separate domain or service layer (e.g. `InvoiceService.get_invoice(id, request.user)`). The reviewer must inspect the service layer to confirm tenant enforcement.
|
|
19
|
+
- **`Informational`:** Read-only queries against intentionally public or catalog records.
|
|
20
|
+
|
|
21
|
+
## Unsafe Examples
|
|
22
|
+
|
|
23
|
+
### Python (Django / DRF)
|
|
24
|
+
```python
|
|
25
|
+
# VULNERABLE: Direct lookup without owner filter
|
|
26
|
+
class InvoiceViewSet(viewsets.ModelViewSet):
|
|
27
|
+
queryset = Invoice.objects.all() # ❌ Exposes all invoices to any user
|
|
28
|
+
serializer_class = InvoiceSerializer
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Python (SQLAlchemy)
|
|
32
|
+
```python
|
|
33
|
+
# VULNERABLE: Direct primary key filter
|
|
34
|
+
def get_order(session, order_id: int):
|
|
35
|
+
return session.query(Order).filter(Order.id == order_id).first() # ❌ Missing user_id
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Safe Examples
|
|
39
|
+
|
|
40
|
+
### Python (Django / DRF)
|
|
41
|
+
```python
|
|
42
|
+
# SAFE: Scope queryset to authenticated user
|
|
43
|
+
class InvoiceViewSet(viewsets.ModelViewSet):
|
|
44
|
+
serializer_class = InvoiceSerializer
|
|
45
|
+
permission_classes = [permissions.IsAuthenticated]
|
|
46
|
+
|
|
47
|
+
def get_queryset(self):
|
|
48
|
+
return Invoice.objects.filter(owner=self.request.user) # ✅ Scoped
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Python (SQLAlchemy)
|
|
52
|
+
```python
|
|
53
|
+
# SAFE: Scoped query
|
|
54
|
+
def get_order(session, order_id: int, current_user_id: int):
|
|
55
|
+
return session.query(Order).filter(
|
|
56
|
+
Order.id == order_id,
|
|
57
|
+
Order.user_id == current_user_id
|
|
58
|
+
).first() # ✅ Scoped to user
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Remediation
|
|
62
|
+
1. Ensure all object lookups include the current user/tenant ID in the database query (`filter(user_id=request.user.id)`).
|
|
63
|
+
2. For DRF ViewSets, override `get_queryset()` to filter by `self.request.user`.
|
|
64
|
+
3. In service-layer architectures, pass the authenticated user identity explicitly into domain methods.
|
|
65
|
+
|
|
66
|
+
## Verification
|
|
67
|
+
- Run authenticated test requests using User A's credentials against User B's resource IDs and assert `404 Not Found` or `403 Forbidden`.
|
|
68
|
+
|
|
69
|
+
## Related Rules
|
|
70
|
+
- `TG-AUTH-006`: Mass Assignment
|
|
71
|
+
- `TG-AUTH-001`: Unauthenticated Endpoints
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: TG-AUTH-008
|
|
3
|
+
title: Untrusted Role or Tenant Header Injection
|
|
4
|
+
category: authentication-authorization
|
|
5
|
+
severity: Critical
|
|
6
|
+
confidence: Confirmed
|
|
7
|
+
frameworks:
|
|
8
|
+
- django
|
|
9
|
+
- drf
|
|
10
|
+
- fastapi
|
|
11
|
+
- flask
|
|
12
|
+
- express
|
|
13
|
+
- nextjs
|
|
14
|
+
cwe: CWE-284
|
|
15
|
+
asvs_v4: V4.1.1
|
|
16
|
+
nist_ssdf: PW.5.1
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# TG-AUTH-008: Untrusted Role or Tenant Header Injection
|
|
20
|
+
|
|
21
|
+
## 🚨 Problem Statement
|
|
22
|
+
Applications that extract user roles, permissions, or tenant identifiers directly from client-supplied HTTP request headers (e.g. `X-User-Role`, `X-Tenant-ID`, `X-Is-Admin`, `X-Authenticated-User`) without cryptographic verification or a trusted API gateway boundary allow attackers to elevate privileges or access arbitrary tenant data simply by injecting custom header values.
|
|
23
|
+
|
|
24
|
+
> **Tuning Guardrails (v0.5.6):**
|
|
25
|
+
> - **DO NOT flag** a header merely because it is read (e.g., for logging or non-authoritative metadata).
|
|
26
|
+
> - **ESCALATE** only if client-controlled role/tenant data influences authorization, identity, tenant selection, or privileged database scope without verified server-side binding.
|
|
27
|
+
> - **DOWNGRADE** to `Needs Review` if authorization context is resolved elsewhere (e.g., API gateway, mTLS, service mesh) and cannot be proven vulnerable from local source alone.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 💥 Adversarial Threat & Exploitation
|
|
32
|
+
An attacker sends a request with crafted HTTP headers:
|
|
33
|
+
```http
|
|
34
|
+
GET /api/v1/admin/users HTTP/1.1
|
|
35
|
+
Host: api.example.com
|
|
36
|
+
X-User-Role: superadmin
|
|
37
|
+
X-Tenant-ID: victim-tenant-uuid
|
|
38
|
+
```
|
|
39
|
+
If the backend application assigns permissions based on `request.headers.get("X-User-Role")` without verifying that the request originated from an internal gateway with a signed cryptographic token (or mTLS), the attacker completely bypasses authorization checks.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 🛠️ Framework-Native Remediations
|
|
44
|
+
|
|
45
|
+
### 🐍 FastAPI (Dependency Injection & Signed JWT Extraction)
|
|
46
|
+
|
|
47
|
+
#### ❌ Unsafe Pattern
|
|
48
|
+
```python
|
|
49
|
+
# Unsafe: Trusting client-supplied header directly
|
|
50
|
+
@app.get("/admin/metrics")
|
|
51
|
+
async def get_metrics(x_user_role: str = Header(None)):
|
|
52
|
+
if x_user_role != "admin":
|
|
53
|
+
raise HTTPException(status_code=403, detail="Forbidden")
|
|
54
|
+
return {"metrics": "sensitive_admin_data"}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
#### ✅ Safe Remediation
|
|
58
|
+
```python
|
|
59
|
+
# Safe: Extracting authenticated user and roles from cryptographically verified token
|
|
60
|
+
from fastapi import Depends, HTTPException, status
|
|
61
|
+
from fastapi.security import OAuth2PasswordBearer
|
|
62
|
+
import jwt
|
|
63
|
+
|
|
64
|
+
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
|
|
65
|
+
|
|
66
|
+
async def get_current_user_roles(token: str = Depends(oauth2_scheme)) -> list[str]:
|
|
67
|
+
try:
|
|
68
|
+
payload = jwt.decode(token, settings.JWT_SECRET_KEY, algorithms=["HS256"])
|
|
69
|
+
return payload.get("roles", [])
|
|
70
|
+
except jwt.PyJWTError:
|
|
71
|
+
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token")
|
|
72
|
+
|
|
73
|
+
@app.get("/admin/metrics")
|
|
74
|
+
async def get_metrics(roles: list[str] = Depends(get_current_user_roles)):
|
|
75
|
+
if "admin" not in roles:
|
|
76
|
+
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Forbidden")
|
|
77
|
+
return {"metrics": "sensitive_admin_data"}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
### 🐍 Django / DRF (Session & Verified Token Authorization)
|
|
83
|
+
|
|
84
|
+
#### ❌ Unsafe Pattern
|
|
85
|
+
```python
|
|
86
|
+
# Unsafe: Using request header in ViewSet or middleware for tenant scoping
|
|
87
|
+
class DocumentViewSet(viewsets.ModelViewSet):
|
|
88
|
+
def get_queryset(self):
|
|
89
|
+
tenant_id = self.request.headers.get("X-Tenant-ID")
|
|
90
|
+
return Document.objects.filter(tenant_id=tenant_id)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
#### ✅ Safe Remediation
|
|
94
|
+
```python
|
|
95
|
+
# Safe: Deriving tenant isolation from authenticated user session or token claim
|
|
96
|
+
class DocumentViewSet(viewsets.ModelViewSet):
|
|
97
|
+
permission_classes = [permissions.IsAuthenticated]
|
|
98
|
+
|
|
99
|
+
def get_queryset(self):
|
|
100
|
+
# Derive tenant strictly from the server-authenticated user profile
|
|
101
|
+
user_tenant = self.request.user.profile.tenant
|
|
102
|
+
return Document.objects.filter(tenant=user_tenant)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 🧪 Verification & Reproduction
|
|
108
|
+
1. Execute request with header override:
|
|
109
|
+
```bash
|
|
110
|
+
curl -H "X-User-Role: admin" -H "X-Tenant-ID: victim-tenant" http://localhost:8000/api/admin/metrics
|
|
111
|
+
```
|
|
112
|
+
2. **Assertion:** Unauthenticated request must return `401 Unauthorized` or `403 Forbidden`, ignoring unverified header overrides.
|
package/.torusguard/rules/business-logic/TG-BIZ-001-client-controlled-sensitive-business-value.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# TG-BIZ-001: Client-Controlled Sensitive Business Value
|
|
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-BIZ-002: Replayable One-Time Operation
|
|
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-BIZ-003: Missing Workflow-State Validation
|
|
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-BIZ-004: Unrestricted Sensitive Business Flow
|
|
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-CACHE-001: Sensitive Response Publicly Cacheable
|
|
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-CACHE-002: Missing User Cache Isolation
|
|
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-CACHE-003: Sensitive Data in URL
|
|
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-CSRF-001: Missing CSRF 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
|