torusguard 1.3.4 → 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-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__/finding_scorer.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/report_sync.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/term_ui.cpython-311.pyc +0 -0
- package/.torusguard/scripts/apply_runner.py +383 -377
- package/.torusguard/scripts/audit_runner.py +1306 -653
- package/.torusguard/scripts/finding_scorer.py +14 -2
- package/.torusguard/scripts/harden_runner.py +628 -455
- package/.torusguard/scripts/recheck_runner.py +248 -238
- package/.torusguard/scripts/recipes_runner.py +137 -137
- package/.torusguard/scripts/report_sync.py +423 -0
- package/.torusguard/scripts/sarif_exporter.py +116 -116
- package/.torusguard/scripts/term_ui.py +162 -162
- 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 -345
- package/bin/torusguard.js +550 -545
- package/package.json +1 -1
- package/skills/torusguard/SKILL.md +73 -72
- 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 -377
- package/skills/torusguard/payload/scripts/audit_runner.py +1306 -653
- package/skills/torusguard/payload/scripts/finding_scorer.py +14 -2
- package/skills/torusguard/payload/scripts/harden_runner.py +628 -455
- package/skills/torusguard/payload/scripts/recheck_runner.py +248 -238
- package/skills/torusguard/payload/scripts/recipes_runner.py +137 -137
- 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 -162
- package/skills/torusguard/payload/skills/torusguard/SKILL.md +75 -72
- package/skills/torusguard/payload/skills/torusguard-apply/SKILL.md +84 -80
- package/skills/torusguard/payload/skills/torusguard-audit/SKILL.md +87 -83
- package/skills/torusguard/payload/skills/torusguard-authorize/SKILL.md +7 -2
- package/skills/torusguard/payload/skills/torusguard-exploit-check/SKILL.md +7 -2
- package/skills/torusguard/payload/skills/torusguard-full/SKILL.md +7 -2
- package/skills/torusguard/payload/skills/torusguard-harden/SKILL.md +98 -94
- package/skills/torusguard/payload/skills/torusguard-init/SKILL.md +68 -64
- package/skills/torusguard/payload/skills/torusguard-recheck/SKILL.md +81 -77
- package/skills/torusguard/payload/skills/torusguard-report/SKILL.md +76 -72
- package/skills/torusguard/payload/skills/torusguard-status/SKILL.md +62 -58
- package/skills/torusguard/payload/skills/torusguard-verify/SKILL.md +7 -2
- package/skills/torusguard/payload/skills/torusguard-web-validate/SKILL.md +7 -2
- 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 +84 -80
- package/skills/torusguard-audit/SKILL.md +87 -83
- 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 +98 -94
- package/skills/torusguard-init/SKILL.md +68 -64
- package/skills/torusguard-recheck/SKILL.md +81 -77
- package/skills/torusguard-report/SKILL.md +76 -72
- package/skills/torusguard-status/SKILL.md +62 -58
- package/skills/torusguard-verify/SKILL.md +7 -2
- package/skills/torusguard-web-validate/SKILL.md +7 -2
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
# TorusGuard Security Audit Findings: run-20260912-214110-audit
|
|
2
|
+
- Target Root: `C:\Users\Admin\Desktop\TorusGuard`
|
|
3
|
+
- Total Scored Findings: `38`
|
|
4
|
+
- Identified Clusters: `9`
|
|
5
|
+
- Generated At: `2026-09-12 21:41:10 IST`
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
## Summary of Findings
|
|
9
|
+
|
|
10
|
+
### [Critical] TG-SEC-001 - Hardcoded Secret or API Key in Tracked Source
|
|
11
|
+
- **Finding ID:** `TG-SEC-001-bb5e4b77`
|
|
12
|
+
- **Location:** `examples/vulnerable-react-express/server/index.js:9`
|
|
13
|
+
- **Confidence Score:** `80/100` (High Confidence)
|
|
14
|
+
- **Cluster:** `cluster-credentials-exposure`
|
|
15
|
+
- **Description:** Hardcoded JWT signing secret
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
// TG-SEC-001: Hardcoded JWT secret
|
|
19
|
+
const JWT_SECRET = 'FAKE_DEMO_JWT_SECRET_NOT_FOR_PRODUCTION';
|
|
20
|
+
|
|
21
|
+
// TG-PLATFORM-001: Wildcard CORS with credentials
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### [Critical] TG-SEC-001 - Hardcoded Secret or API Key in Tracked Source
|
|
25
|
+
- **Finding ID:** `TG-SEC-001-c393d596`
|
|
26
|
+
- **Location:** `examples/vulnerable-react-express/server/index.js:18`
|
|
27
|
+
- **Confidence Score:** `80/100` (High Confidence)
|
|
28
|
+
- **Cluster:** `cluster-credentials-exposure`
|
|
29
|
+
- **Description:** Hardcoded credential or API secret string
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
const users = [
|
|
33
|
+
{ id: '1', email: 'alice@demo.local', password: 'password123', name: 'Alice' },
|
|
34
|
+
{ id: '2', email: 'bob@demo.local', password: 'secret456', name: 'Bob' },
|
|
35
|
+
];
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### [Critical] TG-DB-002 - Privileged Database Credential in Browser Context
|
|
39
|
+
- **Finding ID:** `TG-DB-002-d9bd69df`
|
|
40
|
+
- **Location:** `demo/playground/vulnerable_nextjs/actions.ts:9`
|
|
41
|
+
- **Confidence Score:** `70/100` (High Confidence)
|
|
42
|
+
- **Cluster:** `cluster-client-leak`
|
|
43
|
+
- **Description:** Service role key or raw database connection string reference in frontend code
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
// Finding 1: TG-CLIENT-001 - Backend admin key exposed in client-accessible code
|
|
47
|
+
export const SUPABASE_SERVICE_ROLE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.demo_secret_token_1234567890";
|
|
48
|
+
|
|
49
|
+
interface UserRecord {
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### [Critical] TG-DIFF-001 - Accidental Security Check Bypass in Patch Additions
|
|
53
|
+
- **Finding ID:** `TG-DIFF-001-671d3513`
|
|
54
|
+
- **Location:** `skills/torusguard/payload/scripts/harden_runner.py:246`
|
|
55
|
+
- **Confidence Score:** `70/100` (High Confidence)
|
|
56
|
+
- **Cluster:** `cluster-transport-security`
|
|
57
|
+
- **Description:** Disabled TLS certificate verification (verify=False)
|
|
58
|
+
```
|
|
59
|
+
# Strategy 8: TLS Verification Bypass (TG-DIFF-001)
|
|
60
|
+
elif rule_id == "TG-DIFF-001":
|
|
61
|
+
if "verify=False" in target_line:
|
|
62
|
+
fixed_line = target_line.replace("verify=False", "verify=True")
|
|
63
|
+
new_lines[line_number - 1] = fixed_line
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### [Critical] TG-DIFF-001 - Accidental Security Check Bypass in Patch Additions
|
|
67
|
+
- **Finding ID:** `TG-DIFF-001-b6549484`
|
|
68
|
+
- **Location:** `skills/torusguard/payload/scripts/harden_runner.py:256`
|
|
69
|
+
- **Confidence Score:** `70/100` (High Confidence)
|
|
70
|
+
- **Cluster:** `cluster-transport-security`
|
|
71
|
+
- **Description:** Disabled Go TLS certificate verification (InsecureSkipVerify: true)
|
|
72
|
+
```
|
|
73
|
+
applied_rule = True
|
|
74
|
+
fix_explanation = "Restored TLS certificate authority validation (rejectUnauthorized: true)"
|
|
75
|
+
elif "InsecureSkipVerify: true" in target_line:
|
|
76
|
+
fixed_line = target_line.replace("InsecureSkipVerify: true", "InsecureSkipVerify: false")
|
|
77
|
+
new_lines[line_number - 1] = fixed_line
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### [Critical] TG-DIFF-001 - Accidental Security Check Bypass in Patch Additions
|
|
81
|
+
- **Finding ID:** `TG-DIFF-001-c4cfaa8a`
|
|
82
|
+
- **Location:** `skills/torusguard/payload/scripts/harden_runner.py:251`
|
|
83
|
+
- **Confidence Score:** `70/100` (High Confidence)
|
|
84
|
+
- **Cluster:** `cluster-transport-security`
|
|
85
|
+
- **Description:** Disabled Node.js TLS rejectUnauthorized
|
|
86
|
+
```
|
|
87
|
+
applied_rule = True
|
|
88
|
+
fix_explanation = "Restored mandatory TLS certificate verification (verify=True)"
|
|
89
|
+
elif "rejectUnauthorized: false" in target_line:
|
|
90
|
+
fixed_line = target_line.replace("rejectUnauthorized: false", "rejectUnauthorized: true")
|
|
91
|
+
new_lines[line_number - 1] = fixed_line
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### [Critical] TG-DIFF-001 - Accidental Security Check Bypass in Patch Additions
|
|
95
|
+
- **Finding ID:** `TG-DIFF-001-7db54483`
|
|
96
|
+
- **Location:** `skills/torusguard/payload/scripts/rules_sync.py:180`
|
|
97
|
+
- **Confidence Score:** `70/100` (High Confidence)
|
|
98
|
+
- **Cluster:** `cluster-transport-security`
|
|
99
|
+
- **Description:** Disabled TLS certificate verification (verify=False)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
if not bypass_guards:
|
|
103
|
+
bypass_rule = "4. **No Security Bypasses:** Never insert `# nosec`, `verify=False`, `@csrf_exempt`, or `bypass_auth=True`."
|
|
104
|
+
else:
|
|
105
|
+
bypass_rule = f"4. **No Security Bypasses:** Never insert `# nosec`, `verify=False`, or {', '.join(bypass_guards[:2])}."
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### [Critical] TG-DIFF-001 - Accidental Security Check Bypass in Patch Additions
|
|
109
|
+
- **Finding ID:** `TG-DIFF-001-77bc2f9b`
|
|
110
|
+
- **Location:** `skills/torusguard/payload/scripts/rules_sync.py:157`
|
|
111
|
+
- **Confidence Score:** `70/100` (High Confidence)
|
|
112
|
+
- **Cluster:** `cluster-transport-security`
|
|
113
|
+
- **Description:** Disabled Go TLS certificate verification (InsecureSkipVerify: true)
|
|
114
|
+
```
|
|
115
|
+
if "go" in stack_lower:
|
|
116
|
+
sql_guards.append("`db.Query(..., args)` / GORM")
|
|
117
|
+
bypass_guards.append("`InsecureSkipVerify: true`")
|
|
118
|
+
if "rust" in stack_lower:
|
|
119
|
+
sql_guards.append("`sqlx::query!` / Diesel")
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### [Critical] TG-DIFF-001 - Accidental Security Check Bypass in Patch Additions
|
|
123
|
+
- **Finding ID:** `TG-DIFF-001-cb5ae7e9`
|
|
124
|
+
- **Location:** `skills/torusguard/payload/scripts/rules_sync.py:172`
|
|
125
|
+
- **Confidence Score:** `70/100` (High Confidence)
|
|
126
|
+
- **Cluster:** `cluster-transport-security`
|
|
127
|
+
- **Description:** Disabled Node.js TLS rejectUnauthorized
|
|
128
|
+
```
|
|
129
|
+
if "typescript" in stack_lower or "javascript" in stack_lower or "next" in stack_lower or "express" in stack_lower:
|
|
130
|
+
sql_guards.append("Prisma / Drizzle binders")
|
|
131
|
+
bypass_guards.append("`rejectUnauthorized: false`")
|
|
132
|
+
|
|
133
|
+
if not sql_guards:
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### [Critical] TG-DIFF-001 - Accidental Security Check Bypass in Patch Additions
|
|
137
|
+
- **Finding ID:** `TG-DIFF-001-0e4204af`
|
|
138
|
+
- **Location:** `skills/torusguard/payload/scripts/rules_sync.py:169`
|
|
139
|
+
- **Confidence Score:** `70/100` (High Confidence)
|
|
140
|
+
- **Cluster:** `cluster-transport-security`
|
|
141
|
+
- **Description:** Disabled PHP curl SSL verification
|
|
142
|
+
```
|
|
143
|
+
if "php" in stack_lower:
|
|
144
|
+
sql_guards.append("PDO prepared statements / Eloquent")
|
|
145
|
+
bypass_guards.append("`CURLOPT_SSL_VERIFYPEER => false`")
|
|
146
|
+
if "typescript" in stack_lower or "javascript" in stack_lower or "next" in stack_lower or "express" in stack_lower:
|
|
147
|
+
sql_guards.append("Prisma / Drizzle binders")
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### [Critical] TG-SSRF-002 - Missing Internal Network Protection
|
|
151
|
+
- **Finding ID:** `TG-SSRF-002-8378a839`
|
|
152
|
+
- **Location:** `core/clustering.py:53`
|
|
153
|
+
- **Confidence Score:** `65/100` (Medium Confidence)
|
|
154
|
+
- **Cluster:** `cluster-ssrf`
|
|
155
|
+
- **Description:** Hardcoded internal loopback or cloud metadata endpoint target
|
|
156
|
+
```
|
|
157
|
+
"cluster_id": "cluster-ssrf-network",
|
|
158
|
+
"title": "Unvalidated Outbound HTTP Requests & Network Boundary Leakage",
|
|
159
|
+
"shared_remediation_path": "Validate destination URLs against strict allowlists and block internal IP ranges (127.0.0.1, 169.254.169.254).",
|
|
160
|
+
"shared_verification_plan": "Attempt outbound requests to loopback and link-local metadata endpoints."
|
|
161
|
+
},
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### [Critical] TG-SSRF-002 - Missing Internal Network Protection
|
|
165
|
+
- **Finding ID:** `TG-SSRF-002-d08ed1ca`
|
|
166
|
+
- **Location:** `examples/hardened-react-express/client/vite.config.js:7`
|
|
167
|
+
- **Confidence Score:** `65/100` (Medium Confidence)
|
|
168
|
+
- **Cluster:** `cluster-ssrf`
|
|
169
|
+
- **Description:** Hardcoded internal loopback or cloud metadata endpoint target
|
|
170
|
+
```
|
|
171
|
+
plugins: [react()],
|
|
172
|
+
build: { sourcemap: false },
|
|
173
|
+
server: { port: 5173, proxy: { '/api': 'http://localhost:3001' } },
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### [Critical] TG-SSRF-002 - Missing Internal Network Protection
|
|
178
|
+
- **Finding ID:** `TG-SSRF-002-a79cf464`
|
|
179
|
+
- **Location:** `examples/hardened-react-express/server/index.js:121`
|
|
180
|
+
- **Confidence Score:** `65/100` (Medium Confidence)
|
|
181
|
+
- **Cluster:** `cluster-ssrf`
|
|
182
|
+
- **Description:** Hardcoded internal loopback or cloud metadata endpoint target
|
|
183
|
+
```
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
seed().then(() => app.listen(PORT, () => console.log(`Hardened demo http://localhost:${PORT}`)));
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### [Critical] TG-SSRF-002 - Missing Internal Network Protection
|
|
190
|
+
- **Finding ID:** `TG-SSRF-002-3c5a7c3c`
|
|
191
|
+
- **Location:** `examples/vulnerable-react-express/client/src/App.jsx:42`
|
|
192
|
+
- **Confidence Score:** `65/100` (Medium Confidence)
|
|
193
|
+
- **Cluster:** `cluster-ssrf`
|
|
194
|
+
- **Description:** Hardcoded internal loopback or cloud metadata endpoint target
|
|
195
|
+
```
|
|
196
|
+
<div style={{ maxWidth: 560, margin: '2rem auto', fontFamily: 'sans-serif' }}>
|
|
197
|
+
<h1>Vulnerable Demo</h1>
|
|
198
|
+
<p style={{ color: 'crimson' }}>Intentionally insecure — localhost lab only</p>
|
|
199
|
+
|
|
200
|
+
<form onSubmit={login}>
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### [Critical] TG-SSRF-002 - Missing Internal Network Protection
|
|
204
|
+
- **Finding ID:** `TG-SSRF-002-13c81e3a`
|
|
205
|
+
- **Location:** `examples/vulnerable-react-express/client/src/config.js:5`
|
|
206
|
+
- **Confidence Score:** `65/100` (Medium Confidence)
|
|
207
|
+
- **Cluster:** `cluster-ssrf`
|
|
208
|
+
- **Description:** Hardcoded internal loopback or cloud metadata endpoint target
|
|
209
|
+
```
|
|
210
|
+
apiUrl: import.meta.env.VITE_API_URL,
|
|
211
|
+
// FAKE DEMO ONLY — never put real database URLs in client code
|
|
212
|
+
demoDbUrl: 'postgresql://demo:FAKE_PASSWORD@localhost:5432/demo',
|
|
213
|
+
};
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### [Critical] TG-SSRF-002 - Missing Internal Network Protection
|
|
217
|
+
- **Finding ID:** `TG-SSRF-002-b0f87c06`
|
|
218
|
+
- **Location:** `examples/vulnerable-react-express/client/vite.config.js:10`
|
|
219
|
+
- **Confidence Score:** `65/100` (Medium Confidence)
|
|
220
|
+
- **Cluster:** `cluster-ssrf`
|
|
221
|
+
- **Description:** Hardcoded internal loopback or cloud metadata endpoint target
|
|
222
|
+
```
|
|
223
|
+
server: {
|
|
224
|
+
port: 5173,
|
|
225
|
+
proxy: { '/api': 'http://localhost:3001' },
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### [Critical] TG-SSRF-002 - Missing Internal Network Protection
|
|
231
|
+
- **Finding ID:** `TG-SSRF-002-ee77c629`
|
|
232
|
+
- **Location:** `examples/vulnerable-react-express/server/index.js:82`
|
|
233
|
+
- **Confidence Score:** `65/100` (Medium Confidence)
|
|
234
|
+
- **Cluster:** `cluster-ssrf`
|
|
235
|
+
- **Description:** Hardcoded internal loopback or cloud metadata endpoint target
|
|
236
|
+
```
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
app.listen(PORT, () => console.log(`Vulnerable demo server http://localhost:${PORT}`));
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### [Critical] TG-SSRF-002 - Missing Internal Network Protection
|
|
243
|
+
- **Finding ID:** `TG-SSRF-002-a0d1eac8`
|
|
244
|
+
- **Location:** `skills/torusguard/payload/config/scope.json:4`
|
|
245
|
+
- **Confidence Score:** `65/100` (Medium Confidence)
|
|
246
|
+
- **Cluster:** `cluster-ssrf`
|
|
247
|
+
- **Description:** Hardcoded internal loopback or cloud metadata endpoint target
|
|
248
|
+
```
|
|
249
|
+
"$schema": "../schemas/authorization.schema.json",
|
|
250
|
+
"authorization": {
|
|
251
|
+
"target": "localhost",
|
|
252
|
+
"owner_confirmed": false,
|
|
253
|
+
"scope_type": "source_code_only",
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### [Critical] TG-SSRF-002 - Missing Internal Network Protection
|
|
257
|
+
- **Finding ID:** `TG-SSRF-002-3ead2e3d`
|
|
258
|
+
- **Location:** `skills/torusguard/payload/scripts/harden_runner.py:208`
|
|
259
|
+
- **Confidence Score:** `65/100` (Medium Confidence)
|
|
260
|
+
- **Cluster:** `cluster-ssrf`
|
|
261
|
+
- **Description:** Hardcoded internal loopback or cloud metadata endpoint target
|
|
262
|
+
```
|
|
263
|
+
fix_explanation = "Replaced wildcard CORS configuration with strict origin whitelist environment variable"
|
|
264
|
+
elif "cors(" in target_line and ("origin: '*'" in target_line or 'origin: "*"' in target_line):
|
|
265
|
+
fixed_line = target_line.replace("origin: '*'", "origin: process.env.ALLOWED_ORIGIN || 'http://localhost:5173'")
|
|
266
|
+
fixed_line = fixed_line.replace('origin: "*"', "origin: process.env.ALLOWED_ORIGIN || 'http://localhost:5173'")
|
|
267
|
+
if fixed_line != target_line:
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### [Critical] TG-SSRF-004 - Unbounded Outbound Request Without Timeout
|
|
271
|
+
- **Finding ID:** `TG-SSRF-004-dcf3f71e`
|
|
272
|
+
- **Location:** `examples/python/fastapi-hardened/main.py:30`
|
|
273
|
+
- **Confidence Score:** `55/100` (Medium Confidence)
|
|
274
|
+
- **Cluster:** `cluster-ssrf`
|
|
275
|
+
- **Description:** Python requests call without explicit timeout parameter
|
|
276
|
+
```
|
|
277
|
+
if not is_safe_url(url):
|
|
278
|
+
raise HTTPException(status_code=400, detail="Invalid destination address")
|
|
279
|
+
response = requests.get(url, timeout=5)
|
|
280
|
+
return {"status": response.status_code, "content": response.text}
|
|
281
|
+
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### [Critical] TG-SSRF-004 - Unbounded Outbound Request Without Timeout
|
|
285
|
+
- **Finding ID:** `TG-SSRF-004-d8472223`
|
|
286
|
+
- **Location:** `examples/python/fastapi-vuln/main.py:9`
|
|
287
|
+
- **Confidence Score:** `55/100` (Medium Confidence)
|
|
288
|
+
- **Cluster:** `cluster-ssrf`
|
|
289
|
+
- **Description:** Python requests call without explicit timeout parameter
|
|
290
|
+
```
|
|
291
|
+
@app.get("/fetch")
|
|
292
|
+
def fetch_url(url: str):
|
|
293
|
+
response = requests.get(url)
|
|
294
|
+
return {"status": response.status_code, "content": response.text}
|
|
295
|
+
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### [Critical] TG-SSRF-004 - Unbounded Outbound Request Without Timeout
|
|
299
|
+
- **Finding ID:** `TG-SSRF-004-4ac97262`
|
|
300
|
+
- **Location:** `skills/torusguard/payload/scripts/harden_runner.py:341`
|
|
301
|
+
- **Confidence Score:** `55/100` (Medium Confidence)
|
|
302
|
+
- **Cluster:** `cluster-ssrf`
|
|
303
|
+
- **Description:** Python requests call without explicit timeout parameter
|
|
304
|
+
```
|
|
305
|
+
fix_explanation = "Wrapped outbound URL in validateSafeUrl domain whitelist guard"
|
|
306
|
+
elif "requests.get(" in target_line and "validate_url(" not in target_line:
|
|
307
|
+
fixed_line = re.sub(r'requests\.get\(\s*([^,\)]+)', r'requests.get(validate_safe_url(\1)', target_line)
|
|
308
|
+
if fixed_line != target_line:
|
|
309
|
+
new_lines[line_number - 1] = fixed_line
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### [Critical] TG-GQL-004 - Unnecessary Production Introspection
|
|
313
|
+
- **Finding ID:** `TG-GQL-004-a6ecb0bb`
|
|
314
|
+
- **Location:** `skills/torusguard/payload/scripts/harden_runner.py:365`
|
|
315
|
+
- **Confidence Score:** `55/100` (Medium Confidence)
|
|
316
|
+
- **Cluster:** `cluster-graphql`
|
|
317
|
+
- **Description:** GraphQL schema introspection enabled in configuration
|
|
318
|
+
```
|
|
319
|
+
# Strategy 18: Production Introspection Disablement (TG-GQL-004)
|
|
320
|
+
elif rule_id == "TG-GQL-004":
|
|
321
|
+
if "introspection: true" in target_line or "introspection: True" in target_line:
|
|
322
|
+
fixed_line = re.sub(r'introspection\s*:\s*(?:true|True)', 'introspection: process.env.NODE_ENV !== "production"', target_line)
|
|
323
|
+
new_lines[line_number - 1] = fixed_line
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### [High] TG-INPUT-003 - Unsafe Dynamic Code or HTML Execution
|
|
327
|
+
- **Finding ID:** `TG-INPUT-003-fea9421e`
|
|
328
|
+
- **Location:** `examples/vulnerable-react-express/client/src/App.jsx:53`
|
|
329
|
+
- **Confidence Score:** `80/100` (High Confidence)
|
|
330
|
+
- **Cluster:** `cluster-injection`
|
|
331
|
+
- **Description:** React dangerouslySetInnerHTML rendering raw unescaped HTML
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
{/* TG-INPUT-003: Unsafe HTML rendering */}
|
|
335
|
+
<div dangerouslySetInnerHTML={{ __html: bio }} />
|
|
336
|
+
|
|
337
|
+
<button onClick={fetchUser}>Fetch user (IDOR demo)</button>
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### [High] TG-PLATFORM-001 - Wildcard CORS With Credentials
|
|
341
|
+
- **Finding ID:** `TG-PLATFORM-001-7dd35cb4`
|
|
342
|
+
- **Location:** `examples/vulnerable-react-express/server/index.js:12`
|
|
343
|
+
- **Confidence Score:** `80/100` (High Confidence)
|
|
344
|
+
- **Cluster:** `cluster-auth-bypass`
|
|
345
|
+
- **Description:** Wildcard CORS origin configured in Express middleware
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
// TG-PLATFORM-001: Wildcard CORS with credentials
|
|
349
|
+
app.use(cors({ origin: '*', credentials: true }));
|
|
350
|
+
|
|
351
|
+
// TG-PLATFORM-004: No explicit JSON body size limit
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### [High] TG-PLATFORM-001 - Wildcard CORS With Credentials
|
|
355
|
+
- **Finding ID:** `TG-PLATFORM-001-1a813dde`
|
|
356
|
+
- **Location:** `skills/torusguard/payload/scripts/harden_runner.py:202`
|
|
357
|
+
- **Confidence Score:** `80/100` (High Confidence)
|
|
358
|
+
- **Cluster:** `cluster-auth-bypass`
|
|
359
|
+
- **Description:** Wildcard CORS origin enabled across entire application
|
|
360
|
+
```
|
|
361
|
+
# Strategy 5: Permissive CORS with Credentials (TG-PLATFORM-001)
|
|
362
|
+
elif rule_id == "TG-PLATFORM-001":
|
|
363
|
+
if "CORS_ALLOW_ALL_ORIGINS = True" in target_line:
|
|
364
|
+
replacement = f'{indent}CORS_ALLOWED_ORIGINS = [os.environ.get("ALLOWED_ORIGIN", "https://app.example.com")]'
|
|
365
|
+
new_lines[line_number - 1] = replacement
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### [High] TG-AUTH-004 - Insecure Session Cookie Configuration
|
|
369
|
+
- **Finding ID:** `TG-AUTH-004-f60870ef`
|
|
370
|
+
- **Location:** `skills/torusguard/payload/scripts/rules_sync.py:180`
|
|
371
|
+
- **Confidence Score:** `70/100` (High Confidence)
|
|
372
|
+
- **Cluster:** `cluster-auth-bypass`
|
|
373
|
+
- **Description:** Decorator disabling route-level authentication or CSRF protection
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
if not bypass_guards:
|
|
377
|
+
bypass_rule = "4. **No Security Bypasses:** Never insert `# nosec`, `verify=False`, `@csrf_exempt`, or `bypass_auth=True`."
|
|
378
|
+
else:
|
|
379
|
+
bypass_rule = f"4. **No Security Bypasses:** Never insert `# nosec`, `verify=False`, or {', '.join(bypass_guards[:2])}."
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### [High] TG-AUTH-004 - Insecure Session Cookie Configuration
|
|
383
|
+
- **Finding ID:** `TG-AUTH-004-6b0c7ebf`
|
|
384
|
+
- **Location:** `skills/torusguard/payload/scripts/rules_sync.py:166`
|
|
385
|
+
- **Confidence Score:** `70/100` (High Confidence)
|
|
386
|
+
- **Cluster:** `cluster-auth-bypass`
|
|
387
|
+
- **Description:** Attribute disabling ASP.NET authentication
|
|
388
|
+
```
|
|
389
|
+
if "c#" in stack_lower or "dotnet" in stack_lower:
|
|
390
|
+
sql_guards.append("EF Core LINQ / `FromSqlInterpolated`")
|
|
391
|
+
bypass_guards.append("`[AllowAnonymous]`")
|
|
392
|
+
if "php" in stack_lower:
|
|
393
|
+
sql_guards.append("PDO prepared statements / Eloquent")
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### [High] TG-INPUT-001 - Missing Server-Side Request Validation
|
|
397
|
+
- **Finding ID:** `TG-INPUT-001-c7457f38`
|
|
398
|
+
- **Location:** `examples/vulnerable-react-express/server/index.js:27`
|
|
399
|
+
- **Confidence Score:** `65/100` (Medium Confidence)
|
|
400
|
+
- **Cluster:** `cluster-injection`
|
|
401
|
+
- **Description:** Destructuring unvalidated req.body without schema validation
|
|
402
|
+
```
|
|
403
|
+
// TG-AUTH-004: Insecure cookie (no httpOnly/Secure/SameSite)
|
|
404
|
+
app.post('/api/login', (req, res) => {
|
|
405
|
+
const { email, password } = req.body;
|
|
406
|
+
console.log('Login attempt:', { email, password }); // TG-SEC-004
|
|
407
|
+
const user = users.find((u) => u.email === email && u.password === password);
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### [High] TG-RATE-001 - Unlimited Authentication Endpoint
|
|
411
|
+
- **Finding ID:** `TG-RATE-001-dcd0a3c7`
|
|
412
|
+
- **Location:** `examples/vulnerable-react-express/server/index.js:26`
|
|
413
|
+
- **Confidence Score:** `65/100` (Medium Confidence)
|
|
414
|
+
- **Cluster:** `cluster-rate-limiting`
|
|
415
|
+
- **Description:** Authentication POST endpoint defined without rate-limiting middleware
|
|
416
|
+
```
|
|
417
|
+
// TG-SEC-004: Logs sensitive data
|
|
418
|
+
// TG-AUTH-004: Insecure cookie (no httpOnly/Secure/SameSite)
|
|
419
|
+
app.post('/api/login', (req, res) => {
|
|
420
|
+
const { email, password } = req.body;
|
|
421
|
+
console.log('Login attempt:', { email, password }); // TG-SEC-004
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
### [High] TG-AUTH-003 - Missing Object-Level Authorization (IDOR)
|
|
425
|
+
- **Finding ID:** `TG-AUTH-003-6a05e509`
|
|
426
|
+
- **Location:** `examples/hardened-react-express/server/index.js:49`
|
|
427
|
+
- **Confidence Score:** `55/100` (Medium Confidence)
|
|
428
|
+
- **Cluster:** `cluster-auth-bypass`
|
|
429
|
+
- **Description:** JWT verification missing explicit algorithms restriction parameter
|
|
430
|
+
```
|
|
431
|
+
if (!token) return res.status(401).json({ error: 'Unauthorized' });
|
|
432
|
+
try {
|
|
433
|
+
req.user = jwt.verify(token, process.env.JWT_SECRET);
|
|
434
|
+
next();
|
|
435
|
+
} catch {
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### [Medium] TG-SEC-004 - Sensitive Information in Logs
|
|
439
|
+
- **Finding ID:** `TG-SEC-004-dbbc17f7`
|
|
440
|
+
- **Location:** `examples/vulnerable-react-express/client/src/App.jsx:30`
|
|
441
|
+
- **Confidence Score:** `70/100` (High Confidence)
|
|
442
|
+
- **Cluster:** `cluster-credentials-exposure`
|
|
443
|
+
- **Description:** Plaintext credential or token logged to output sink
|
|
444
|
+
```
|
|
445
|
+
const data = await res.json();
|
|
446
|
+
// TG-CLIENT-002: Sensitive console logging
|
|
447
|
+
console.log('Login token:', data.token, 'config:', clientConfig);
|
|
448
|
+
setMessage(JSON.stringify(data));
|
|
449
|
+
}
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### [Medium] TG-SEC-004 - Sensitive Information in Logs
|
|
453
|
+
- **Finding ID:** `TG-SEC-004-08753da5`
|
|
454
|
+
- **Location:** `examples/vulnerable-react-express/server/index.js:28`
|
|
455
|
+
- **Confidence Score:** `70/100` (High Confidence)
|
|
456
|
+
- **Cluster:** `cluster-credentials-exposure`
|
|
457
|
+
- **Description:** Plaintext credential or token logged to output sink
|
|
458
|
+
```
|
|
459
|
+
app.post('/api/login', (req, res) => {
|
|
460
|
+
const { email, password } = req.body;
|
|
461
|
+
console.log('Login attempt:', { email, password }); // TG-SEC-004
|
|
462
|
+
const user = users.find((u) => u.email === email && u.password === password);
|
|
463
|
+
if (!user) return res.status(401).json({ error: 'User not found' }); // enumeration
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### [Medium] TG-PLATFORM-002 - Missing Security Headers
|
|
467
|
+
- **Finding ID:** `TG-PLATFORM-002-1f383dcf`
|
|
468
|
+
- **Location:** `examples/hardened-react-express/server/index.js:17`
|
|
469
|
+
- **Confidence Score:** `65/100` (Medium Confidence)
|
|
470
|
+
- **Cluster:** `cluster-platform`
|
|
471
|
+
- **Description:** Express application initialized without helmet security headers middleware
|
|
472
|
+
```
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
const app = express();
|
|
476
|
+
const PORT = 3001;
|
|
477
|
+
const isProd = process.env.NODE_ENV === 'production';
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### [Medium] TG-CLIENT-001 - Public Production Source Maps
|
|
481
|
+
- **Finding ID:** `TG-CLIENT-001-1ba4789e`
|
|
482
|
+
- **Location:** `examples/vulnerable-react-express/client/vite.config.js:7`
|
|
483
|
+
- **Confidence Score:** `65/100` (Medium Confidence)
|
|
484
|
+
- **Cluster:** `cluster-client-leak`
|
|
485
|
+
- **Description:** Build config emitting unminified source maps in production output
|
|
486
|
+
```
|
|
487
|
+
export default defineConfig({
|
|
488
|
+
plugins: [react()],
|
|
489
|
+
build: { sourcemap: true },
|
|
490
|
+
server: {
|
|
491
|
+
port: 5173,
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
### [Medium] TG-RATE-002 - Unlimited Public Write Endpoint
|
|
495
|
+
- **Finding ID:** `TG-RATE-002-d67d7c98`
|
|
496
|
+
- **Location:** `examples/vulnerable-react-express/server/index.js:54`
|
|
497
|
+
- **Confidence Score:** `65/100` (Medium Confidence)
|
|
498
|
+
- **Cluster:** `cluster-rate-limiting`
|
|
499
|
+
- **Description:** Public submission endpoint defined without rate-limiting or captcha defense
|
|
500
|
+
```
|
|
501
|
+
// TG-INPUT-001: No validation
|
|
502
|
+
// TG-RATE-002: Unlimited contact endpoint
|
|
503
|
+
app.post('/api/contact', (req, res) => {
|
|
504
|
+
res.json({ received: req.body });
|
|
505
|
+
});
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
### [Medium] TG-PLATFORM-002 - Missing Security Headers
|
|
509
|
+
- **Finding ID:** `TG-PLATFORM-002-eef342ec`
|
|
510
|
+
- **Location:** `examples/vulnerable-react-express/server/index.js:5`
|
|
511
|
+
- **Confidence Score:** `65/100` (Medium Confidence)
|
|
512
|
+
- **Cluster:** `cluster-platform`
|
|
513
|
+
- **Description:** Express application initialized without helmet security headers middleware
|
|
514
|
+
```
|
|
515
|
+
const jwt = require('jsonwebtoken');
|
|
516
|
+
|
|
517
|
+
const app = express();
|
|
518
|
+
const PORT = 3001;
|
|
519
|
+
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
### [Medium] TG-PLATFORM-003 - Production Stack Trace Exposure
|
|
523
|
+
- **Finding ID:** `TG-PLATFORM-003-f5fce823`
|
|
524
|
+
- **Location:** `skills/torusguard/payload/scripts/harden_runner.py:357`
|
|
525
|
+
- **Confidence Score:** `55/100` (Medium Confidence)
|
|
526
|
+
- **Cluster:** `cluster-platform`
|
|
527
|
+
- **Description:** Django DEBUG mode enabled in configuration
|
|
528
|
+
```
|
|
529
|
+
# Strategy 17: Production Debug Mode Disablement (TG-PLATFORM-003)
|
|
530
|
+
elif rule_id == "TG-PLATFORM-003":
|
|
531
|
+
if "DEBUG = True" in target_line:
|
|
532
|
+
fixed_line = f'{indent}DEBUG = os.environ.get("DJANGO_DEBUG", "False").lower() in ("true", "1")'
|
|
533
|
+
new_lines[line_number - 1] = fixed_line
|
|
534
|
+
```
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"run_id": "run-20260912-214110-audit",
|
|
3
|
+
"command": "audit",
|
|
4
|
+
"target_name": "TorusGuard",
|
|
5
|
+
"created_at": "2026-09-12 21:41:10 IST",
|
|
6
|
+
"created_at_iso": "2026-09-12T21:41:10.189853+05:30",
|
|
7
|
+
"status": "completed",
|
|
8
|
+
"torusguard_version": "1.3.0",
|
|
9
|
+
"findings_count": 38,
|
|
10
|
+
"confirmed_fixed_count": 0,
|
|
11
|
+
"regressed_count": 0
|
|
12
|
+
}
|