torusguard 1.3.3 → 1.3.5
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 +66 -63
- package/.torusguard/rules/business-logic/TG-BIZ-001-client-controlled-sensitive-business-value.md +30 -14
- package/.torusguard/rules/business-logic/TG-BIZ-002-replayable-one-time-operation.md +33 -16
- package/.torusguard/rules/business-logic/TG-BIZ-003-missing-workflow-state-validation.md +31 -15
- package/.torusguard/rules/business-logic/TG-BIZ-004-unrestricted-sensitive-business-flow.md +26 -16
- package/.torusguard/rules/cache/TG-CACHE-001-sensitive-response-publicly-cacheable.md +24 -16
- package/.torusguard/rules/cache/TG-CACHE-002-missing-user-cache-isolation.md +32 -18
- package/.torusguard/rules/cache/TG-CACHE-003-sensitive-data-in-url.md +24 -17
- package/.torusguard/rules/csrf/TG-CSRF-001-missing-csrf-protection.md +31 -18
- package/.torusguard/rules/csrf/TG-CSRF-002-unsafe-credentialed-cross-origin-request.md +28 -17
- package/.torusguard/rules/graphql/TG-GQL-002-resolver-missing-authorization.md +33 -17
- package/.torusguard/rules/graphql/TG-GQL-003-unbounded-graphql-pagination-or-batching.md +31 -16
- package/.torusguard/rules/graphql/TG-GQL-004-unnecessary-production-introspection.md +25 -16
- package/.torusguard/rules/secrets/TG-SEC-005-secret-in-git-history.md +24 -19
- package/.torusguard/rules/secrets/TG-SEC-006-secret-in-build-artifact.md +36 -19
- package/.torusguard/rules/secrets/TG-SEC-007-secret-in-test-or-example-fixture.md +21 -16
- package/.torusguard/rules/ssrf/TG-SSRF-002-missing-internal-network-protection.md +45 -18
- package/.torusguard/rules/ssrf/TG-SSRF-003-unsafe-redirect-following.md +20 -16
- package/.torusguard/rules/ssrf/TG-SSRF-004-unbounded-outbound-request.md +28 -19
- package/.torusguard/rules/supply-chain/TG-SUPPLY-001-missing-or-ignored-dependency-lockfile.md +25 -18
- package/.torusguard/rules/supply-chain/TG-SUPPLY-003-unsafe-ci-cd-secret-exposure.md +29 -19
- package/.torusguard/rules/supply-chain/TG-SUPPLY-004-unpinned-ci-action.md +23 -18
- package/.torusguard/rules/supply-chain/TG-SUPPLY-005-unsafe-dependency-install-script.md +23 -18
- package/.torusguard/rules/webhook/TG-WEBHOOK-001-missing-webhook-signature-verification.md +36 -16
- package/.torusguard/rules/webhook/TG-WEBHOOK-002-replayable-webhook.md +26 -17
- package/.torusguard/rules/webhook/TG-WEBHOOK-003-missing-webhook-idempotency.md +30 -16
- package/.torusguard/rules/webhook/TG-WEBHOOK-004-unvalidated-webhook-event-type.md +25 -16
- package/.torusguard/rules/websocket/TG-WS-002-missing-channel-level-authorization.md +28 -17
- package/.torusguard/rules/websocket/TG-WS-003-unvalidated-websocket-message.md +31 -17
- package/.torusguard/rules/websocket/TG-WS-004-unbounded-websocket-connections.md +31 -17
- package/.torusguard/rules_catalog.json +520 -0
- package/.torusguard/runs/report-latest.html +93 -7
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-db-004-115-9a059e/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-db-004-115-9a059e/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-db-004-115-9a059e/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-db-004-119-61557c/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-db-004-119-61557c/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-db-004-119-61557c/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-db-004-265-996ca3/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-db-004-265-996ca3/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-db-004-265-996ca3/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-db-004-503-d11cf8/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-db-004-503-d11cf8/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-db-004-503-d11cf8/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-db-004-79-91f41f/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-db-004-79-91f41f/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-db-004-79-91f41f/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-input-002-107-516a40/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-input-002-107-516a40/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-input-002-107-516a40/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-input-002-128-7809a1/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-input-002-128-7809a1/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-input-002-128-7809a1/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-input-002-256-c8a22e/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-input-002-256-c8a22e/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-input-002-256-c8a22e/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-input-003-53-d167b4/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-input-003-53-d167b4/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-input-003-53-d167b4/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-platform-001-183-47fd5e/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-platform-001-183-47fd5e/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-platform-001-183-47fd5e/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-209-4f6424/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-209-4f6424/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-209-4f6424/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-257-89bf34/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-257-89bf34/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-257-89bf34/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-341-ce228c/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-341-ce228c/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-341-ce228c/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-355-7b190b/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-355-7b190b/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-355-7b190b/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-64-5af31a/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-64-5af31a/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-64-5af31a/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-9-f51467/metadata.json +15 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-9-f51467/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260910-120238-audit/bundles/bnd-tg-sec-001-9-f51467/patch.diff +9 -0
- package/.torusguard/runs/run-20260910-120238-audit/findings.json +1520 -0
- package/.torusguard/runs/run-20260910-120238-audit/findings.md +560 -0
- package/.torusguard/runs/run-20260910-120238-audit/manifest.json +13 -0
- package/.torusguard/runs/run-20260910-120238-audit/recheck.md +86 -0
- package/.torusguard/runs/run-20260910-120238-audit/remediation.md +262 -0
- package/.torusguard/runs/run-20260910-120238-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260910-121238-audit/findings.json +794 -0
- package/.torusguard/runs/run-20260910-121238-audit/findings.md +344 -0
- package/.torusguard/runs/run-20260910-121238-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260910-121238-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260910-130454-audit/findings.json +893 -0
- package/.torusguard/runs/run-20260910-130454-audit/findings.md +386 -0
- package/.torusguard/runs/run-20260910-130454-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260910-130454-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260910-130519-audit/findings.json +563 -0
- package/.torusguard/runs/run-20260910-130519-audit/findings.md +246 -0
- package/.torusguard/runs/run-20260910-130519-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260910-130519-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260912-214110-audit/findings.json +1256 -0
- package/.torusguard/runs/run-20260912-214110-audit/findings.md +534 -0
- package/.torusguard/runs/run-20260912-214110-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260912-214110-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260912-214813-audit/findings.json +992 -0
- package/.torusguard/runs/run-20260912-214813-audit/findings.md +422 -0
- package/.torusguard/runs/run-20260912-214813-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260912-214813-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-auth-003-49-7c96f3/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-auth-003-49-7c96f3/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-auth-003-49-7c96f3/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-input-003-53-d167b4/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-input-003-53-d167b4/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-input-003-53-d167b4/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-platform-001-12-cf8156/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-platform-001-12-cf8156/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-platform-001-12-cf8156/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-rate-001-26-affcfa/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-rate-001-26-affcfa/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-rate-001-26-affcfa/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-sec-001-9-e22e50/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-sec-001-9-e22e50/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-sec-001-9-e22e50/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-ssrf-004-9-9803ad/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-ssrf-004-9-9803ad/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-ssrf-004-9-9803ad/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215555-audit/findings.json +530 -0
- package/.torusguard/runs/run-20260912-215555-audit/findings.md +232 -0
- package/.torusguard/runs/run-20260912-215555-audit/manifest.json +13 -0
- package/.torusguard/runs/run-20260912-215555-audit/remediation.md +102 -0
- package/.torusguard/runs/run-20260912-215555-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260912-215731-audit/apply_plan.md +6 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-client-001-7-587129/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-client-001-7-587129/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-client-001-7-587129/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-db-002-9-5f7850/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-db-002-9-5f7850/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-db-002-9-5f7850/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-001-27-2486f1/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-001-27-2486f1/minimal_patch_plan.md +22 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-001-27-2486f1/patch.diff +10 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-003-53-d167b4/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-003-53-d167b4/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-003-53-d167b4/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-001-12-cf8156/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-001-12-cf8156/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-001-12-cf8156/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-17-876973/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-17-876973/minimal_patch_plan.md +23 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-17-876973/patch.diff +11 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-5-40c794/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-5-40c794/minimal_patch_plan.md +23 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-5-40c794/patch.diff +11 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-001-26-affcfa/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-001-26-affcfa/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-001-26-affcfa/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-002-54-0b38d2/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-002-54-0b38d2/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-002-54-0b38d2/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-18-a3c1e8/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-18-a3c1e8/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-18-a3c1e8/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-9-e22e50/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-9-e22e50/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-9-e22e50/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-28-a1a0a1/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-28-a1a0a1/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-28-a1a0a1/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-30-00569e/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-30-00569e/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-30-00569e/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-ssrf-004-9-9803ad/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-ssrf-004-9-9803ad/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-ssrf-004-9-9803ad/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/diff_summary.md +186 -0
- package/.torusguard/runs/run-20260912-215731-audit/findings.json +497 -0
- package/.torusguard/runs/run-20260912-215731-audit/findings.md +218 -0
- package/.torusguard/runs/run-20260912-215731-audit/manifest.json +14 -0
- package/.torusguard/runs/run-20260912-215731-audit/recheck.md +76 -0
- package/.torusguard/runs/run-20260912-215731-audit/remediation.md +234 -0
- package/.torusguard/runs/run-20260912-215731-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260912-220134-audit/findings.json +68 -0
- package/.torusguard/runs/run-20260912-220134-audit/findings.md +36 -0
- package/.torusguard/runs/run-20260912-220134-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260912-220134-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260912-220200-audit/findings.json +1 -0
- package/.torusguard/runs/run-20260912-220200-audit/findings.md +8 -0
- package/.torusguard/runs/run-20260912-220200-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260912-220200-audit/recheck.md +6 -0
- package/.torusguard/runs/run-20260912-220200-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260912-220227-audit/findings.json +1 -0
- package/.torusguard/runs/run-20260912-220227-audit/findings.md +8 -0
- package/.torusguard/runs/run-20260912-220227-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260912-220227-audit/recheck.md +6 -0
- package/.torusguard/runs/run-20260912-220227-audit/summary.md +5 -0
- package/.torusguard/scripts/__pycache__/audit_runner.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/diff_guard.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/finding_scorer.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/html_reporter.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/report_sync.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/rules_sync.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/stack_detect.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/term_ui.cpython-311.pyc +0 -0
- package/.torusguard/scripts/apply_runner.py +383 -339
- package/.torusguard/scripts/audit_runner.py +1306 -550
- package/.torusguard/scripts/finding_scorer.py +14 -2
- package/.torusguard/scripts/harden_runner.py +628 -375
- package/.torusguard/scripts/recheck_runner.py +248 -221
- package/.torusguard/scripts/recipes_runner.py +137 -130
- package/.torusguard/scripts/report_sync.py +423 -0
- package/.torusguard/scripts/sarif_exporter.py +116 -116
- package/.torusguard/scripts/term_ui.py +162 -0
- package/.torusguard/skills/torusguard/SKILL.md +61 -31
- package/.torusguard/skills/torusguard-apply/SKILL.md +80 -46
- package/.torusguard/skills/torusguard-audit/SKILL.md +83 -70
- package/.torusguard/skills/torusguard-authorize/SKILL.md +5 -4
- package/.torusguard/skills/torusguard-exploit-check/SKILL.md +6 -5
- package/.torusguard/skills/torusguard-full/SKILL.md +1 -1
- package/.torusguard/skills/torusguard-harden/SKILL.md +94 -63
- package/.torusguard/skills/torusguard-init/SKILL.md +64 -52
- package/.torusguard/skills/torusguard-recheck/SKILL.md +77 -53
- package/.torusguard/skills/torusguard-report/SKILL.md +72 -54
- package/.torusguard/skills/torusguard-status/SKILL.md +58 -42
- package/.torusguard/skills/torusguard-verify/SKILL.md +8 -7
- package/.torusguard/skills/torusguard-web-validate/SKILL.md +8 -7
- package/.torusguard/snapshots/run-20260912-215731-audit/demo/playground/vulnerable_nextjs/actions.ts.bak +24 -0
- package/.torusguard/snapshots/run-20260912-215731-audit/examples/hardened-react-express/server/index.js.bak +121 -0
- package/.torusguard/snapshots/run-20260912-215731-audit/examples/python/fastapi-vuln/main.py.bak +20 -0
- package/.torusguard/snapshots/run-20260912-215731-audit/examples/vulnerable-react-express/client/src/App.jsx.bak +63 -0
- package/.torusguard/snapshots/run-20260912-215731-audit/examples/vulnerable-react-express/client/vite.config.js.bak +12 -0
- package/.torusguard/snapshots/run-20260912-215731-audit/examples/vulnerable-react-express/server/index.js.bak +82 -0
- package/.torusguard/workflows/apply.md +11 -4
- package/.torusguard/workflows/audit.md +7 -1
- package/.torusguard/workflows/authorize.md +2 -1
- package/.torusguard/workflows/exploit-check.md +2 -1
- package/.torusguard/workflows/harden.md +7 -1
- package/.torusguard/workflows/init.md +6 -1
- package/.torusguard/workflows/memory.md +2 -1
- package/.torusguard/workflows/recheck.md +7 -1
- package/.torusguard/workflows/report.md +7 -1
- package/.torusguard/workflows/status.md +6 -1
- package/.torusguard/workflows/verify.md +6 -1
- package/.torusguard/workflows/web-validate.md +2 -1
- package/README.md +470 -344
- package/bin/torusguard.js +209 -97
- package/package.json +1 -1
- package/skills/torusguard/SKILL.md +73 -42
- package/skills/torusguard/payload/.manifest.json +66 -63
- package/skills/torusguard/payload/rules/business-logic/TG-BIZ-001-client-controlled-sensitive-business-value.md +30 -14
- package/skills/torusguard/payload/rules/business-logic/TG-BIZ-002-replayable-one-time-operation.md +33 -16
- package/skills/torusguard/payload/rules/business-logic/TG-BIZ-003-missing-workflow-state-validation.md +31 -15
- package/skills/torusguard/payload/rules/business-logic/TG-BIZ-004-unrestricted-sensitive-business-flow.md +26 -16
- package/skills/torusguard/payload/rules/cache/TG-CACHE-001-sensitive-response-publicly-cacheable.md +24 -16
- package/skills/torusguard/payload/rules/cache/TG-CACHE-002-missing-user-cache-isolation.md +32 -18
- package/skills/torusguard/payload/rules/cache/TG-CACHE-003-sensitive-data-in-url.md +24 -17
- package/skills/torusguard/payload/rules/csrf/TG-CSRF-001-missing-csrf-protection.md +31 -18
- package/skills/torusguard/payload/rules/csrf/TG-CSRF-002-unsafe-credentialed-cross-origin-request.md +28 -17
- package/skills/torusguard/payload/rules/graphql/TG-GQL-002-resolver-missing-authorization.md +33 -17
- package/skills/torusguard/payload/rules/graphql/TG-GQL-003-unbounded-graphql-pagination-or-batching.md +31 -16
- package/skills/torusguard/payload/rules/graphql/TG-GQL-004-unnecessary-production-introspection.md +25 -16
- package/skills/torusguard/payload/rules/secrets/TG-SEC-005-secret-in-git-history.md +24 -19
- package/skills/torusguard/payload/rules/secrets/TG-SEC-006-secret-in-build-artifact.md +36 -19
- package/skills/torusguard/payload/rules/secrets/TG-SEC-007-secret-in-test-or-example-fixture.md +21 -16
- package/skills/torusguard/payload/rules/ssrf/TG-SSRF-002-missing-internal-network-protection.md +45 -18
- package/skills/torusguard/payload/rules/ssrf/TG-SSRF-003-unsafe-redirect-following.md +20 -16
- package/skills/torusguard/payload/rules/ssrf/TG-SSRF-004-unbounded-outbound-request.md +28 -19
- package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-001-missing-or-ignored-dependency-lockfile.md +25 -18
- package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-003-unsafe-ci-cd-secret-exposure.md +29 -19
- package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-004-unpinned-ci-action.md +23 -18
- package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-005-unsafe-dependency-install-script.md +23 -18
- package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-001-missing-webhook-signature-verification.md +36 -16
- package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-002-replayable-webhook.md +26 -17
- package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-003-missing-webhook-idempotency.md +30 -16
- package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-004-unvalidated-webhook-event-type.md +25 -16
- package/skills/torusguard/payload/rules/websocket/TG-WS-002-missing-channel-level-authorization.md +28 -17
- package/skills/torusguard/payload/rules/websocket/TG-WS-003-unvalidated-websocket-message.md +31 -17
- package/skills/torusguard/payload/rules/websocket/TG-WS-004-unbounded-websocket-connections.md +31 -17
- package/skills/torusguard/payload/rules_catalog.json +520 -0
- package/skills/torusguard/payload/scripts/apply_runner.py +383 -339
- package/skills/torusguard/payload/scripts/audit_runner.py +1306 -550
- package/skills/torusguard/payload/scripts/finding_scorer.py +14 -2
- package/skills/torusguard/payload/scripts/harden_runner.py +628 -375
- package/skills/torusguard/payload/scripts/recheck_runner.py +248 -221
- package/skills/torusguard/payload/scripts/recipes_runner.py +137 -130
- package/skills/torusguard/payload/scripts/report_sync.py +423 -0
- package/skills/torusguard/payload/scripts/sarif_exporter.py +116 -116
- package/skills/torusguard/payload/scripts/term_ui.py +162 -0
- package/skills/torusguard/payload/skills/torusguard/SKILL.md +75 -42
- package/skills/torusguard/payload/skills/torusguard-apply/SKILL.md +63 -25
- package/skills/torusguard/payload/skills/torusguard-audit/SKILL.md +62 -45
- package/skills/torusguard/payload/skills/torusguard-authorize/SKILL.md +11 -5
- package/skills/torusguard/payload/skills/torusguard-exploit-check/SKILL.md +12 -6
- package/skills/torusguard/payload/skills/torusguard-full/SKILL.md +7 -2
- package/skills/torusguard/payload/skills/torusguard-harden/SKILL.md +71 -36
- package/skills/torusguard/payload/skills/torusguard-init/SKILL.md +45 -29
- package/skills/torusguard/payload/skills/torusguard-recheck/SKILL.md +59 -31
- package/skills/torusguard/payload/skills/torusguard-report/SKILL.md +52 -30
- package/skills/torusguard/payload/skills/torusguard-status/SKILL.md +40 -20
- package/skills/torusguard/payload/skills/torusguard-verify/SKILL.md +14 -8
- package/skills/torusguard/payload/skills/torusguard-web-validate/SKILL.md +14 -8
- package/skills/torusguard/payload/workflows/apply.md +11 -4
- package/skills/torusguard/payload/workflows/audit.md +7 -1
- package/skills/torusguard/payload/workflows/authorize.md +2 -1
- package/skills/torusguard/payload/workflows/exploit-check.md +2 -1
- package/skills/torusguard/payload/workflows/harden.md +7 -1
- package/skills/torusguard/payload/workflows/init.md +6 -1
- package/skills/torusguard/payload/workflows/memory.md +2 -1
- package/skills/torusguard/payload/workflows/recheck.md +7 -1
- package/skills/torusguard/payload/workflows/report.md +7 -1
- package/skills/torusguard/payload/workflows/status.md +6 -1
- package/skills/torusguard/payload/workflows/verify.md +6 -1
- package/skills/torusguard/payload/workflows/web-validate.md +2 -1
- package/skills/torusguard-apply/SKILL.md +63 -27
- package/skills/torusguard-audit/SKILL.md +62 -50
- package/skills/torusguard-authorize/SKILL.md +7 -2
- package/skills/torusguard-exploit-check/SKILL.md +7 -2
- package/skills/torusguard-full/SKILL.md +7 -2
- package/skills/torusguard-harden/SKILL.md +71 -40
- package/skills/torusguard-init/SKILL.md +45 -30
- package/skills/torusguard-recheck/SKILL.md +59 -32
- package/skills/torusguard-report/SKILL.md +52 -31
- package/skills/torusguard-status/SKILL.md +40 -21
- package/skills/torusguard-verify/SKILL.md +7 -2
- package/skills/torusguard-web-validate/SKILL.md +7 -2
|
@@ -1,42 +1,58 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: torusguard-status
|
|
3
|
-
description: Display current TorusGuard security posture, active configuration, rules catalog, and run history.
|
|
4
|
-
version:
|
|
5
|
-
workflow: .torusguard/workflows/status.md
|
|
6
|
-
tools: Read, Grep, Glob
|
|
7
|
-
scripts-binding:
|
|
8
|
-
- .torusguard/scripts/run_manager.py
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
1
|
+
---
|
|
2
|
+
name: torusguard-status
|
|
3
|
+
description: Display current TorusGuard security posture, active configuration, rules catalog, and run history via CLI or AI Agent.
|
|
4
|
+
version: 1.3.4
|
|
5
|
+
workflow: .torusguard/workflows/status.md
|
|
6
|
+
tools: Read, Grep, Glob, run_command
|
|
7
|
+
scripts-binding:
|
|
8
|
+
- .torusguard/scripts/run_manager.py
|
|
9
|
+
- .torusguard/scripts/term_ui.py
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# TorusGuard Status — Workspace Security Posture & Diagnostic Overview
|
|
13
|
+
|
|
14
|
+
## Objective
|
|
15
|
+
Provide an instant diagnostic summary of the repository's security state, active framework rules, historical run results, and runtime scope validity.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Two Execution Modes
|
|
20
|
+
|
|
21
|
+
### Mode A: Automated CLI Execution
|
|
22
|
+
Run the diagnostic overview from your terminal:
|
|
23
|
+
```bash
|
|
24
|
+
# Display 75-column status cards
|
|
25
|
+
npx torusguard status
|
|
26
|
+
|
|
27
|
+
# Check status of specific project directory
|
|
28
|
+
npx torusguard status ./examples/vulnerable-react-express
|
|
29
|
+
|
|
30
|
+
# Output machine-readable JSON
|
|
31
|
+
npx torusguard status --json
|
|
32
|
+
```
|
|
33
|
+
**Under the Hood:**
|
|
34
|
+
- Evaluates `.torusguard/config/torusguard.json` for initialized status and detected stack.
|
|
35
|
+
- Enumerates active rules in `.torusguard/rules/active/` (or canonical 71 rules).
|
|
36
|
+
- Scans `.torusguard/runs/` for run history, finding counts, and verified fixes.
|
|
37
|
+
- Inspects `.torusguard/config/scope.json` for authorized runtime validation targets.
|
|
38
|
+
- Displays mathematically aligned 75-column terminal cards.
|
|
39
|
+
|
|
40
|
+
### Mode B: In-Session AI Chat Agent Status Check
|
|
41
|
+
When checking workspace status in AI chat:
|
|
42
|
+
1. **Verify Workspace Setup:** Check if `.torusguard/` exists on disk.
|
|
43
|
+
2. **Inspect Active Config:** Read `.torusguard/config/torusguard.json` for detected stack, framework, and rules.
|
|
44
|
+
3. **Inspect Latest Run:** Find the latest run directory under `.torusguard/runs/` and read `manifest.json`.
|
|
45
|
+
4. **Inspect Memory Engine:** Check `.torusguard/memory/patterns.json` for captured Golden Fix Recipes.
|
|
46
|
+
5. **Render Diagnostic Card:** Present an overview of posture, stack, and recommended next steps.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Output Card Format
|
|
51
|
+
```markdown
|
|
52
|
+
### 🛡️ TorusGuard Workspace Status Overview
|
|
53
|
+
- **Version:** v1.3.3 | **Stack:** Node.js / React / Express
|
|
54
|
+
- **Active Rules:** 71 canonical security rules enabled
|
|
55
|
+
- **Historical Runs:** 3 runs recorded
|
|
56
|
+
- **Golden Recipes:** 4 distilled into persistent memory
|
|
57
|
+
- **Overall Posture:** SECURE (All targeted vulnerabilities verified closed)
|
|
58
|
+
```
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: torusguard-verify
|
|
3
3
|
description: Verify finding evidence sufficiency, audit live code line matches, and calibrate 0–100 confidence scores.
|
|
4
|
-
version:
|
|
4
|
+
version: 1.3.4
|
|
5
5
|
workflow: .torusguard/workflows/verify.md
|
|
6
6
|
tools: Read, Grep, Glob, Write
|
|
7
7
|
scripts-binding:
|
|
@@ -18,14 +18,15 @@ Audit the evidence sufficiency of candidate findings by reading current disk lin
|
|
|
18
18
|
## Execution Steps
|
|
19
19
|
|
|
20
20
|
1. **Locate Target Findings:** Load active findings from `.torusguard/runs/<latest-run>/findings.md`.
|
|
21
|
-
2. **
|
|
22
|
-
3. **
|
|
23
|
-
4. **
|
|
21
|
+
2. **Handle CLI Failures:** If `python .torusguard/scripts/finding_scorer.py` or the verify workflow fails, YOU must manually read the code and calibrate the score based on the evidence parameters.
|
|
22
|
+
3. **Live Disk Line Match:** Inspect exact cited lines using `view_file` to confirm code presence.
|
|
23
|
+
4. **Audit Evidence Sufficiency:** Verify source-to-sink flow against criteria below.
|
|
24
|
+
5. **Calibrate Confidence Score:**
|
|
24
25
|
```bash
|
|
25
26
|
python .torusguard/scripts/finding_scorer.py --run <run_dir> --verify
|
|
26
27
|
```
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
6. **Update State:** Mark finding as `Confirmed`, `Needs Review`, or `False Positive`.
|
|
29
|
+
7. **Emit Verified Evidence:** Save report in `.torusguard/runs/<run_id>/verified-evidence.md`.
|
|
29
30
|
|
|
30
31
|
---
|
|
31
32
|
|
|
@@ -47,7 +48,7 @@ A finding is verified as sufficient when:
|
|
|
47
48
|
|
|
48
49
|
## Output Format
|
|
49
50
|
```markdown
|
|
50
|
-
🧪 [TorusGuard] Finding Verification Complete
|
|
51
|
+
🧪 [TorusGuard] Finding Verification Complete (AI Assisted)
|
|
51
52
|
- Findings Audited: <Count> | Confirmed Real: <Count>
|
|
52
53
|
- False Positives Filtered: <Count> | Refined Mean Score: <Score>/100
|
|
53
54
|
- Artifact: `.torusguard/runs/<run_id>/verified-evidence.md`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: torusguard-web-validate
|
|
3
3
|
description: Execute authorized HTTP probing against local/staging web applications — session capture, transparent audit headers, and secret redaction.
|
|
4
|
-
version:
|
|
4
|
+
version: 1.3.4
|
|
5
5
|
workflow: .torusguard/workflows/web-validate.md
|
|
6
6
|
tools: Read, Grep, Glob, Bash, Write
|
|
7
7
|
scripts-binding:
|
|
@@ -34,11 +34,12 @@ All requests pass through `.torusguard/scripts/safety_gate.py`:
|
|
|
34
34
|
## Execution Steps
|
|
35
35
|
|
|
36
36
|
1. **Gate Check:** Validate scope in `scope.json` and query `safety_gate.py`.
|
|
37
|
-
2. **
|
|
38
|
-
3. **
|
|
39
|
-
4. **
|
|
40
|
-
5. **
|
|
41
|
-
6. **
|
|
37
|
+
2. **Handle Automation Failure:** If automated web validation scripts fail, YOU must manually construct the HTTP requests (using `curl` or `fetch`) and inspect the responses.
|
|
38
|
+
3. **Inject Audit Header:** Attach `X-TorusGuard-AuthID: <auth_id>` to all outbound requests.
|
|
39
|
+
4. **Dispatch Bounded Probe:** Send single non-destructive HTTP request.
|
|
40
|
+
5. **Validate Security Headers:** Check for CSP, HSTS, X-Content-Type-Options, and CORS configurations.
|
|
41
|
+
6. **Audit Cookie Flags:** Verify `HttpOnly`, `Secure`, and `SameSite` on session cookies.
|
|
42
|
+
7. **Capture Replay Trace:** Save sanitized trace in `.torusguard/runs/<run_id>/requests.json`.
|
|
42
43
|
|
|
43
44
|
---
|
|
44
45
|
|
|
@@ -56,7 +57,7 @@ All Bearer tokens, cookies, passwords, and API keys are redacted prior to disk s
|
|
|
56
57
|
|
|
57
58
|
## Output Format
|
|
58
59
|
```markdown
|
|
59
|
-
🌐 [TorusGuard] Web Validation Completed
|
|
60
|
+
🌐 [TorusGuard] Web Validation Completed (AI Assisted)
|
|
60
61
|
- Target: <Host URL> | Endpoints Tested: <Count>
|
|
61
62
|
- Header Posture: <CSP/HSTS Status> | Cookies: <Flags Status>
|
|
62
63
|
- Replay Trace: `.torusguard/runs/<run_id>/requests.json`
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TorusGuard Playground: Vulnerable Next.js Server Action Fixture
|
|
3
|
+
* Contains 2 intentional security findings for demonstration purposes:
|
|
4
|
+
* - TG-CLIENT-001 (Leaked Service Role Key)
|
|
5
|
+
* - TG-AUTH-003 (Unauthenticated Server Action Mutation)
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Finding 1: TG-CLIENT-001 - Backend admin key exposed in client-accessible code
|
|
9
|
+
export const SUPABASE_SERVICE_ROLE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.demo_secret_token_1234567890";
|
|
10
|
+
|
|
11
|
+
interface UserRecord {
|
|
12
|
+
id: string;
|
|
13
|
+
role: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Finding 2: TG-AUTH-003 - Server Action performing state change without session check
|
|
17
|
+
export async function updateUserRole(userId: string, newRole: string): Promise<{ success: boolean }> {
|
|
18
|
+
"use server";
|
|
19
|
+
|
|
20
|
+
// VULNERABLE: Lacks auth session check e.g. const session = await auth(); if (!session?.user?.isAdmin) throw ...
|
|
21
|
+
console.log(`[VULNERABLE] Updating user ${userId} to role ${newRole} without authentication check`);
|
|
22
|
+
|
|
23
|
+
return { success: true };
|
|
24
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
require('dotenv').config();
|
|
2
|
+
const express = require('express');
|
|
3
|
+
const helmet = require('helmet');
|
|
4
|
+
const cors = require('cors');
|
|
5
|
+
const cookieParser = require('cookie-parser');
|
|
6
|
+
const rateLimit = require('express-rate-limit');
|
|
7
|
+
const bcrypt = require('bcrypt');
|
|
8
|
+
const jwt = require('jsonwebtoken');
|
|
9
|
+
const crypto = require('crypto');
|
|
10
|
+
const { z } = require('zod');
|
|
11
|
+
|
|
12
|
+
if (!process.env.JWT_SECRET) {
|
|
13
|
+
console.error('Missing JWT_SECRET');
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const app = express();
|
|
18
|
+
const PORT = 3001;
|
|
19
|
+
const isProd = process.env.NODE_ENV === 'production';
|
|
20
|
+
|
|
21
|
+
app.use(helmet());
|
|
22
|
+
app.use(cors({ origin: process.env.CLIENT_ORIGIN, credentials: true }));
|
|
23
|
+
app.use(express.json({ limit: '100kb' }));
|
|
24
|
+
app.use(cookieParser());
|
|
25
|
+
|
|
26
|
+
const loginLimiter = rateLimit({ windowMs: 15 * 60 * 1000, max: 5 });
|
|
27
|
+
const resetLimiter = rateLimit({ windowMs: 60 * 60 * 1000, max: 3 });
|
|
28
|
+
const publicWriteLimiter = rateLimit({ windowMs: 60 * 60 * 1000, max: 10 });
|
|
29
|
+
|
|
30
|
+
const users = [];
|
|
31
|
+
const resetTokens = new Map();
|
|
32
|
+
|
|
33
|
+
async function seed() {
|
|
34
|
+
if (users.length) return;
|
|
35
|
+
const hash = await bcrypt.hash('DemoPass123!', 12);
|
|
36
|
+
users.push({ id: '1', email: 'alice@demo.local', passwordHash: hash, name: 'Alice', role: 'user' });
|
|
37
|
+
users.push({ id: '2', email: 'bob@demo.local', passwordHash: hash, name: 'Bob', role: 'user' });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const loginSchema = z.object({
|
|
41
|
+
email: z.string().email().max(255),
|
|
42
|
+
password: z.string().min(8).max(128),
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
function auth(req, res, next) {
|
|
46
|
+
const token = req.cookies.token;
|
|
47
|
+
if (!token) return res.status(401).json({ error: 'Unauthorized' });
|
|
48
|
+
try {
|
|
49
|
+
req.user = jwt.verify(token, process.env.JWT_SECRET, { algorithms: ['HS256'] });
|
|
50
|
+
next();
|
|
51
|
+
} catch {
|
|
52
|
+
return res.status(401).json({ error: 'Unauthorized' });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
app.post('/api/login', loginLimiter, async (req, res) => {
|
|
57
|
+
const parsed = loginSchema.safeParse(req.body);
|
|
58
|
+
if (!parsed.success) return res.status(400).json({ error: 'Invalid input' });
|
|
59
|
+
const { email, password } = parsed.data;
|
|
60
|
+
const user = users.find((u) => u.email === email);
|
|
61
|
+
if (!user || !(await bcrypt.compare(password, user.passwordHash))) {
|
|
62
|
+
return res.status(401).json({ error: 'Invalid email or password' });
|
|
63
|
+
}
|
|
64
|
+
const token = jwt.sign({ id: user.id, role: user.role }, process.env.JWT_SECRET, { expiresIn: '1h' });
|
|
65
|
+
res.cookie('token', token, {
|
|
66
|
+
httpOnly: true,
|
|
67
|
+
secure: isProd,
|
|
68
|
+
sameSite: 'lax',
|
|
69
|
+
maxAge: 3600000,
|
|
70
|
+
});
|
|
71
|
+
res.json({ message: 'Login successful' });
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
app.get('/api/users/me', auth, (req, res) => {
|
|
75
|
+
const user = users.find((u) => u.id === req.user.id);
|
|
76
|
+
if (!user) return res.status(404).json({ error: 'Not found' });
|
|
77
|
+
res.json({ id: user.id, email: user.email, name: user.name });
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
app.get('/api/search', auth, (req, res) => {
|
|
81
|
+
const q = String(req.query.q || '').slice(0, 100);
|
|
82
|
+
const results = users
|
|
83
|
+
.filter((u) => u.email.includes(q))
|
|
84
|
+
.slice(0, 20)
|
|
85
|
+
.map(({ id, email, name }) => ({ id, email, name }));
|
|
86
|
+
res.json({ results });
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
const contactSchema = z.object({ message: z.string().min(1).max(2000) });
|
|
90
|
+
app.post('/api/contact', publicWriteLimiter, (req, res) => {
|
|
91
|
+
const parsed = contactSchema.safeParse(req.body);
|
|
92
|
+
if (!parsed.success) return res.status(400).json({ error: 'Invalid input' });
|
|
93
|
+
res.json({ ok: true });
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
app.post('/api/ai', auth, publicWriteLimiter, (req, res) => {
|
|
97
|
+
const prompt = String(req.body.prompt || '').slice(0, 4000);
|
|
98
|
+
res.json({ reply: 'demo response', length: prompt.length });
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
app.post('/api/reset', resetLimiter, (req, res) => {
|
|
102
|
+
const email = String(req.body.email || '');
|
|
103
|
+
const user = users.find((u) => u.email === email);
|
|
104
|
+
if (user) {
|
|
105
|
+
const token = crypto.randomBytes(32).toString('hex');
|
|
106
|
+
resetTokens.set(token, { userId: user.id, expires: Date.now() + 900000 });
|
|
107
|
+
}
|
|
108
|
+
res.json({ message: 'If an account exists, a reset link was sent.' });
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
app.get('/api/admin/stats', auth, (req, res) => {
|
|
112
|
+
if (req.user.role !== 'admin') return res.status(403).json({ error: 'Forbidden' });
|
|
113
|
+
res.json({ users: users.length });
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
app.use((err, req, res, next) => {
|
|
117
|
+
console.error('Error', { message: err.message });
|
|
118
|
+
res.status(500).json({ error: isProd ? 'Internal server error' : err.message });
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
seed().then(() => app.listen(PORT, () => console.log(`Hardened demo http://localhost:${PORT}`)));
|
package/.torusguard/snapshots/run-20260912-215731-audit/examples/python/fastapi-vuln/main.py.bak
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from fastapi import FastAPI
|
|
2
|
+
import requests
|
|
3
|
+
|
|
4
|
+
app = FastAPI()
|
|
5
|
+
|
|
6
|
+
# ❌ TG-SSRF-001: Unvalidated outbound URL fetching
|
|
7
|
+
@app.get("/fetch")
|
|
8
|
+
def fetch_url(url: str):
|
|
9
|
+
response = requests.get(url)
|
|
10
|
+
return {"status": response.status_code, "content": response.text}
|
|
11
|
+
|
|
12
|
+
# ❌ TG-WEBHOOK-001: Unverified webhook payload
|
|
13
|
+
@app.post("/webhook")
|
|
14
|
+
def receive_webhook(payload: dict):
|
|
15
|
+
return {"status": "success", "data": payload}
|
|
16
|
+
|
|
17
|
+
# ❌ TG-AUTH-006: Unfiltered dict mass assignment
|
|
18
|
+
@app.post("/update_profile")
|
|
19
|
+
def update_profile(user_id: int, updates: dict):
|
|
20
|
+
return {"status": "updated", "user_id": user_id, "updates": updates}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import { clientConfig } from './config';
|
|
3
|
+
|
|
4
|
+
// TG-DB-001: SQL query construction in frontend (never do this)
|
|
5
|
+
function buildSearchQuery(email) {
|
|
6
|
+
return `SELECT id, email FROM users WHERE email LIKE '%${email}%'`;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// TG-DB-003: Documented anti-pattern — Prisma must never run in browser
|
|
10
|
+
// import { PrismaClient } from '@prisma/client'; // FORBIDDEN in client
|
|
11
|
+
|
|
12
|
+
export default function App() {
|
|
13
|
+
const [email, setEmail] = useState('');
|
|
14
|
+
const [password, setPassword] = useState('');
|
|
15
|
+
const [bio, setBio] = useState('<img src=x onerror=alert(1)>');
|
|
16
|
+
const [userId, setUserId] = useState('1');
|
|
17
|
+
const [isAdmin] = useState(localStorage.getItem('role') === 'admin'); // TG-AUTH-002
|
|
18
|
+
const [message, setMessage] = useState('');
|
|
19
|
+
|
|
20
|
+
async function login(e) {
|
|
21
|
+
e.preventDefault();
|
|
22
|
+
const res = await fetch('/api/login', {
|
|
23
|
+
method: 'POST',
|
|
24
|
+
headers: { 'Content-Type': 'application/json' },
|
|
25
|
+
credentials: 'include',
|
|
26
|
+
body: JSON.stringify({ email, password }),
|
|
27
|
+
});
|
|
28
|
+
const data = await res.json();
|
|
29
|
+
// TG-CLIENT-002: Sensitive console logging
|
|
30
|
+
console.log('Login token:', data.token, 'config:', clientConfig);
|
|
31
|
+
setMessage(JSON.stringify(data));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function fetchUser() {
|
|
35
|
+
const res = await fetch(`/api/users/${userId}`);
|
|
36
|
+
setMessage(await res.text());
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<div style={{ maxWidth: 560, margin: '2rem auto', fontFamily: 'sans-serif' }}>
|
|
41
|
+
<h1>Vulnerable Demo</h1>
|
|
42
|
+
<p style={{ color: 'crimson' }}>Intentionally insecure — localhost lab only</p>
|
|
43
|
+
|
|
44
|
+
<form onSubmit={login}>
|
|
45
|
+
<input value={email} onChange={(e) => setEmail(e.target.value)} placeholder="email" />
|
|
46
|
+
<input value={password} onChange={(e) => setPassword(e.target.value)} placeholder="password" type="password" />
|
|
47
|
+
<button type="submit">Login</button>
|
|
48
|
+
</form>
|
|
49
|
+
|
|
50
|
+
<p>Frontend SQL preview: {buildSearchQuery(email)}</p>
|
|
51
|
+
|
|
52
|
+
{/* TG-INPUT-003: Unsafe HTML rendering */}
|
|
53
|
+
<div dangerouslySetInnerHTML={{ __html: bio }} />
|
|
54
|
+
|
|
55
|
+
<button onClick={fetchUser}>Fetch user (IDOR demo)</button>
|
|
56
|
+
|
|
57
|
+
{/* TG-AUTH-002: Client-only admin gate */}
|
|
58
|
+
{isAdmin && <section><h2>Admin Panel</h2><p>Visible if localStorage role=admin — not real security</p></section>}
|
|
59
|
+
|
|
60
|
+
{message && <pre>{message}</pre>}
|
|
61
|
+
</div>
|
|
62
|
+
);
|
|
63
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
import react from '@vitejs/plugin-react';
|
|
3
|
+
|
|
4
|
+
// TG-CLIENT-001: Public production source maps enabled
|
|
5
|
+
export default defineConfig({
|
|
6
|
+
plugins: [react()],
|
|
7
|
+
build: { sourcemap: true },
|
|
8
|
+
server: {
|
|
9
|
+
port: 5173,
|
|
10
|
+
proxy: { '/api': 'http://localhost:3001' },
|
|
11
|
+
},
|
|
12
|
+
});
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
const express = require('express');
|
|
2
|
+
const cors = require('cors');
|
|
3
|
+
const jwt = require('jsonwebtoken');
|
|
4
|
+
|
|
5
|
+
const app = express();
|
|
6
|
+
const PORT = 3001;
|
|
7
|
+
|
|
8
|
+
// TG-SEC-001: Hardcoded JWT secret
|
|
9
|
+
const JWT_SECRET = 'FAKE_DEMO_JWT_SECRET_NOT_FOR_PRODUCTION';
|
|
10
|
+
|
|
11
|
+
// TG-PLATFORM-001: Wildcard CORS with credentials
|
|
12
|
+
app.use(cors({ origin: '*', credentials: true }));
|
|
13
|
+
|
|
14
|
+
// TG-PLATFORM-004: No explicit JSON body size limit
|
|
15
|
+
app.use(express.json());
|
|
16
|
+
|
|
17
|
+
const users = [
|
|
18
|
+
{ id: '1', email: 'alice@demo.local', password: 'password123', name: 'Alice' },
|
|
19
|
+
{ id: '2', email: 'bob@demo.local', password: 'secret456', name: 'Bob' },
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
// TG-RATE-001: No rate limit on login
|
|
23
|
+
// TG-AUTH-001: Plaintext password comparison
|
|
24
|
+
// TG-SEC-004: Logs sensitive data
|
|
25
|
+
// TG-AUTH-004: Insecure cookie (no httpOnly/Secure/SameSite)
|
|
26
|
+
app.post('/api/login', (req, res) => {
|
|
27
|
+
const { email, password } = req.body;
|
|
28
|
+
console.log('Login attempt:', { email, password }); // TG-SEC-004
|
|
29
|
+
const user = users.find((u) => u.email === email && u.password === password);
|
|
30
|
+
if (!user) return res.status(401).json({ error: 'User not found' }); // enumeration
|
|
31
|
+
const token = jwt.sign({ id: user.id }, JWT_SECRET);
|
|
32
|
+
res.cookie('token', token);
|
|
33
|
+
res.json({ message: 'ok', token, user });
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// TG-AUTH-003: IDOR — no ownership check
|
|
37
|
+
app.get('/api/users/:id', (req, res) => {
|
|
38
|
+
const user = users.find((u) => u.id === req.params.id);
|
|
39
|
+
if (!user) return res.status(404).json({ error: 'Not found' });
|
|
40
|
+
res.json(user);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// TG-INPUT-002: SQL concatenation (simulated query string)
|
|
44
|
+
// TG-RATE-003: Unbounded results
|
|
45
|
+
app.get('/api/search', (req, res) => {
|
|
46
|
+
const q = req.query.q || '';
|
|
47
|
+
const fakeSql = `SELECT * FROM users WHERE email LIKE '%${q}%'`;
|
|
48
|
+
const results = users.filter((u) => u.email.includes(q));
|
|
49
|
+
res.json({ query: fakeSql, results });
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// TG-INPUT-001: No validation
|
|
53
|
+
// TG-RATE-002: Unlimited contact endpoint
|
|
54
|
+
app.post('/api/contact', (req, res) => {
|
|
55
|
+
res.json({ received: req.body });
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// TG-RATE-002: Unlimited AI endpoint
|
|
59
|
+
app.post('/api/ai', (req, res) => {
|
|
60
|
+
res.json({ reply: 'demo', prompt: req.body.prompt });
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// TG-INPUT-004: Unrestricted upload (stub)
|
|
64
|
+
app.post('/api/upload', (req, res) => {
|
|
65
|
+
res.json({ saved: req.body.filename });
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// TG-AUTH-005: Unsafe password reset
|
|
69
|
+
app.post('/api/reset', (req, res) => {
|
|
70
|
+
const { email } = req.body;
|
|
71
|
+
const user = users.find((u) => u.email === email);
|
|
72
|
+
if (!user) return res.status(404).json({ error: 'Email not registered' }); // enumeration
|
|
73
|
+
const token = `reset-${user.id}-12345`; // predictable
|
|
74
|
+
res.json({ resetToken: token });
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
app.use((err, req, res, next) => {
|
|
78
|
+
// TG-PLATFORM-003: Stack trace exposed
|
|
79
|
+
res.status(500).json({ error: err.message, stack: err.stack });
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
app.listen(PORT, () => console.log(`Vulnerable demo server http://localhost:${PORT}`));
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Governed patch application with pre-apply rollback snapshots and Human Gate authorization.
|
|
3
3
|
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
4
|
-
version:
|
|
4
|
+
version: 1.3.5
|
|
5
5
|
agent: remediator
|
|
6
6
|
lifecycle-phase: Phase 5 (Patch Application)
|
|
7
7
|
required-skills:
|
|
8
8
|
- torusguard-apply
|
|
9
9
|
scripts-binding:
|
|
10
|
+
- .torusguard/scripts/apply_runner.py
|
|
11
|
+
- .torusguard/scripts/report_sync.py
|
|
10
12
|
- .torusguard/scripts/run_manager.py
|
|
11
13
|
- .torusguard/scripts/diff_guard.py
|
|
12
14
|
---
|
|
@@ -26,7 +28,7 @@ Governed patch application with pre-apply rollback snapshots and Human Gate auth
|
|
|
26
28
|
|
|
27
29
|
Inspect bundle validity and file safety before modifying disk code:
|
|
28
30
|
1. **Bundle Verification:** Assert `patch.diff` exists in active run's remediation folder.
|
|
29
|
-
2. **Pre-Apply Snapshot:** Save a byte-for-byte backup copy (`.bak` or
|
|
31
|
+
2. **Pre-Apply Snapshot:** Save a byte-for-byte backup copy (`.bak` or `.torusguard/snapshots/<run_id>/`) prior to editing.
|
|
30
32
|
3. **Uncommitted Changes:** Check git status; ensure target file has clean baseline.
|
|
31
33
|
4. **Ponytail Check:** Re-verify that patch additions $\le 35$ and deletions $\le 25$.
|
|
32
34
|
5. **Human Gate:** Confirm operator approval before committing edits to disk.
|
|
@@ -47,11 +49,16 @@ Inspect bundle validity and file safety before modifying disk code:
|
|
|
47
49
|
|
|
48
50
|
---
|
|
49
51
|
|
|
52
|
+
## Living Report Invariant
|
|
53
|
+
- Applied patches create pre-apply `.bak` snapshots in `.torusguard/snapshots/<run_id>/`.
|
|
54
|
+
- Finding statuses transition in `security_report.md` to `APPLIED 🔵`.
|
|
55
|
+
- Instant rollback available via `npx torusguard rollback`.
|
|
56
|
+
|
|
50
57
|
## Execution Steps
|
|
51
58
|
|
|
52
59
|
1. **Load Remediation Bundle:** Read `patch.diff` and metadata from active run directory.
|
|
53
60
|
2. **Audit Patch Invariants:** Run `python .torusguard/scripts/diff_guard.py <patch.diff>`.
|
|
54
|
-
3. **Create Rollback Backup:** Copy target file to `.torusguard/runs/<run_id
|
|
61
|
+
3. **Create Rollback Backup:** Copy target file to `.torusguard/runs/<run_id>/.torusguard/snapshots/<run_id>/<filename>.bak`.
|
|
55
62
|
4. **Apply Minimal Diff:** Execute precise surgical edit using `replace_file_content` or `patch`.
|
|
56
63
|
5. **Assert Syntax & Integrity:** Check that modified file compiles cleanly without syntax errors.
|
|
57
64
|
6. **Log Application Ledger:** Record timestamp, original SHA-256, and patched SHA-256 in `apply-log.json`.
|
|
@@ -81,7 +88,7 @@ Inspect bundle validity and file safety before modifying disk code:
|
|
|
81
88
|
### 🚀 TorusGuard Patch Application
|
|
82
89
|
- **Finding Addressed:** `TG-XXX-HASH`
|
|
83
90
|
- **File Patched:** `src/path/to/file.py`
|
|
84
|
-
- **Rollback Backup:** `.torusguard/runs/<run_id
|
|
91
|
+
- **Rollback Backup:** `.torusguard/runs/<run_id>/.torusguard/snapshots/<run_id>/<file>.bak`
|
|
85
92
|
- **Churn Applied:** +[Additions] / -[Deletions] lines
|
|
86
93
|
- **Syntax Check:** PASSED (clean compile)
|
|
87
94
|
- **Status:** APPLIED — run `/torusguard recheck` to verify fix
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Static security AST scanning, stable line-shift invariant fingerprinting, root-cause clustering, and 0-100 confidence scoring.
|
|
3
3
|
tools: Read, Grep, Glob, Bash, Write
|
|
4
|
-
version:
|
|
4
|
+
version: 1.3.5
|
|
5
5
|
agent: auditor
|
|
6
6
|
lifecycle-phase: Phase 2 (Static Audit & Clustering)
|
|
7
7
|
required-skills:
|
|
8
8
|
- torusguard-audit
|
|
9
9
|
scripts-binding:
|
|
10
|
+
- .torusguard/scripts/audit_runner.py
|
|
11
|
+
- .torusguard/scripts/report_sync.py
|
|
10
12
|
- .torusguard/scripts/run_manager.py
|
|
11
13
|
- .torusguard/scripts/finding_scorer.py
|
|
12
14
|
---
|
|
@@ -45,6 +47,10 @@ Inspect workspace prerequisites before launching static audit:
|
|
|
45
47
|
|
|
46
48
|
---
|
|
47
49
|
|
|
50
|
+
## Living Report Invariant
|
|
51
|
+
- Audit discoveries automatically synchronize to `security_report.md` at workspace root.
|
|
52
|
+
- Findings transition into `OPEN 🔴` status with stable invariant fingerprints.
|
|
53
|
+
|
|
48
54
|
## Execution Steps
|
|
49
55
|
|
|
50
56
|
1. **Allocate Run Folder:** Run `python .torusguard/scripts/run_manager.py create audit`.
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Legal scope definition, target ownership proof verification, and safety boundary enforcement for runtime validation.
|
|
3
3
|
tools: Read, Grep, Glob, Bash, Write
|
|
4
|
-
version:
|
|
4
|
+
version: 1.3.5
|
|
5
5
|
agent: reviewer
|
|
6
6
|
lifecycle-phase: Phase 1 (Authorization Gate)
|
|
7
7
|
required-skills:
|
|
8
8
|
- torusguard-authorize
|
|
9
9
|
scripts-binding:
|
|
10
|
+
- .torusguard/scripts/report_sync.py
|
|
10
11
|
- .torusguard/scripts/safety_gate.py
|
|
11
12
|
---
|
|
12
13
|
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Safe, bounded, single-step exploitability confirmation across 5 standard verification statuses.
|
|
3
3
|
tools: Read, Grep, Glob, Bash, Write
|
|
4
|
-
version:
|
|
4
|
+
version: 1.3.5
|
|
5
5
|
agent: validator
|
|
6
6
|
lifecycle-phase: Phase 3c (Exploitability Check)
|
|
7
7
|
required-skills:
|
|
8
8
|
- torusguard-exploit-check
|
|
9
9
|
scripts-binding:
|
|
10
|
+
- .torusguard/scripts/report_sync.py
|
|
10
11
|
- .torusguard/scripts/safety_gate.py
|
|
11
12
|
- .torusguard/scripts/finding_scorer.py
|
|
12
13
|
---
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Governed remediation formulation under strict Ponytail Protocol bounds (<= 35 additions, <= 25 deletions) and bundle packaging.
|
|
3
3
|
tools: Read, Grep, Glob, Bash, Write
|
|
4
|
-
version:
|
|
4
|
+
version: 1.3.5
|
|
5
5
|
agent: remediator
|
|
6
6
|
lifecycle-phase: Phase 4 (Remediation Formulation)
|
|
7
7
|
required-skills:
|
|
8
8
|
- torusguard-harden
|
|
9
9
|
scripts-binding:
|
|
10
|
+
- .torusguard/scripts/harden_runner.py
|
|
11
|
+
- .torusguard/scripts/report_sync.py
|
|
10
12
|
- .torusguard/scripts/run_manager.py
|
|
11
13
|
- .torusguard/scripts/diff_guard.py
|
|
12
14
|
---
|
|
@@ -46,6 +48,10 @@ Inspect finding targets and patch constraints before generating diffs:
|
|
|
46
48
|
|
|
47
49
|
---
|
|
48
50
|
|
|
51
|
+
## Living Report Invariant
|
|
52
|
+
- Candidate patches transition findings in `security_report.md` into `CANDIDATE 🟡` status.
|
|
53
|
+
- Every patch strictly conforms to Ponytail bounds (<= 35 additions, <= 25 deletions).
|
|
54
|
+
|
|
49
55
|
## Execution Steps
|
|
50
56
|
|
|
51
57
|
1. **Select Target Finding:** Choose verified flaw from active run directory.
|