vaspera 2.9.2 → 2.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +68 -0
- package/README.md +58 -1
- package/dist/__tests__/autofix/branch-manager.test.d.ts +2 -0
- package/dist/__tests__/autofix/branch-manager.test.d.ts.map +1 -0
- package/dist/__tests__/autofix/branch-manager.test.js +60 -0
- package/dist/__tests__/autofix/branch-manager.test.js.map +1 -0
- package/dist/__tests__/autofix/commit-generator.test.d.ts +2 -0
- package/dist/__tests__/autofix/commit-generator.test.d.ts.map +1 -0
- package/dist/__tests__/autofix/commit-generator.test.js +147 -0
- package/dist/__tests__/autofix/commit-generator.test.js.map +1 -0
- package/dist/__tests__/autofix/constitution.test.d.ts +9 -0
- package/dist/__tests__/autofix/constitution.test.d.ts.map +1 -0
- package/dist/__tests__/autofix/constitution.test.js +421 -0
- package/dist/__tests__/autofix/constitution.test.js.map +1 -0
- package/dist/__tests__/autofix/pr-generator.test.d.ts +2 -0
- package/dist/__tests__/autofix/pr-generator.test.d.ts.map +1 -0
- package/dist/__tests__/autofix/pr-generator.test.js +152 -0
- package/dist/__tests__/autofix/pr-generator.test.js.map +1 -0
- package/dist/__tests__/property-test-helpers.d.ts +87 -0
- package/dist/__tests__/property-test-helpers.d.ts.map +1 -0
- package/dist/__tests__/property-test-helpers.js +136 -0
- package/dist/__tests__/property-test-helpers.js.map +1 -0
- package/dist/__tests__/scanners/ai-code/ai-detector.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/ai-detector.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/ai-detector.test.js +188 -0
- package/dist/__tests__/scanners/ai-code/ai-detector.test.js.map +1 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.js +363 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.js.map +1 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.js +226 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.js.map +1 -0
- package/dist/__tests__/scanners/ai-code/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/index.test.js +214 -0
- package/dist/__tests__/scanners/ai-code/index.test.js.map +1 -0
- package/dist/__tests__/scanners/dast/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/dast/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/dast/index.test.js +183 -0
- package/dist/__tests__/scanners/dast/index.test.js.map +1 -0
- package/dist/__tests__/scanners/dast/nuclei.test.d.ts +2 -0
- package/dist/__tests__/scanners/dast/nuclei.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/dast/nuclei.test.js +166 -0
- package/dist/__tests__/scanners/dast/nuclei.test.js.map +1 -0
- package/dist/__tests__/scanners/dast/zap.test.d.ts +2 -0
- package/dist/__tests__/scanners/dast/zap.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/dast/zap.test.js +158 -0
- package/dist/__tests__/scanners/dast/zap.test.js.map +1 -0
- package/dist/__tests__/scanners/deploy/health-checker.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/health-checker.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/health-checker.test.js +67 -0
- package/dist/__tests__/scanners/deploy/health-checker.test.js.map +1 -0
- package/dist/__tests__/scanners/deploy/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/index.test.js +84 -0
- package/dist/__tests__/scanners/deploy/index.test.js.map +1 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.js +88 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.js.map +1 -0
- package/dist/__tests__/scanners/deploy/types.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/types.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/types.test.js +126 -0
- package/dist/__tests__/scanners/deploy/types.test.js.map +1 -0
- package/dist/__tests__/scanners/fp-feedback.test.d.ts +2 -0
- package/dist/__tests__/scanners/fp-feedback.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/fp-feedback.test.js +202 -0
- package/dist/__tests__/scanners/fp-feedback.test.js.map +1 -0
- package/dist/__tests__/scanners/fp-filter.property.test.d.ts +9 -0
- package/dist/__tests__/scanners/fp-filter.property.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/fp-filter.property.test.js +253 -0
- package/dist/__tests__/scanners/fp-filter.property.test.js.map +1 -0
- package/dist/__tests__/scanners/fp-filter.test.d.ts +2 -0
- package/dist/__tests__/scanners/fp-filter.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/fp-filter.test.js +234 -0
- package/dist/__tests__/scanners/fp-filter.test.js.map +1 -0
- package/dist/__tests__/scanners/fp-tracker.test.d.ts +2 -0
- package/dist/__tests__/scanners/fp-tracker.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/fp-tracker.test.js +262 -0
- package/dist/__tests__/scanners/fp-tracker.test.js.map +1 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.d.ts +10 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.js +238 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.js.map +1 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.test.d.ts +2 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.test.js +55 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.test.js.map +1 -0
- package/dist/__tests__/scanners/logic/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/logic/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/logic/index.test.js +165 -0
- package/dist/__tests__/scanners/logic/index.test.js.map +1 -0
- package/dist/__tests__/scanners/logic/types.test.d.ts +2 -0
- package/dist/__tests__/scanners/logic/types.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/logic/types.test.js +85 -0
- package/dist/__tests__/scanners/logic/types.test.js.map +1 -0
- package/dist/__tests__/scanners/runtime/app-launcher.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/app-launcher.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/app-launcher.test.js +94 -0
- package/dist/__tests__/scanners/runtime/app-launcher.test.js.map +1 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.js +195 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.js.map +1 -0
- package/dist/__tests__/scanners/runtime/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/index.test.js +120 -0
- package/dist/__tests__/scanners/runtime/index.test.js.map +1 -0
- package/dist/__tests__/scanners/runtime/types.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/types.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/types.test.js +126 -0
- package/dist/__tests__/scanners/runtime/types.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.js +187 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/index.test.js +87 -0
- package/dist/__tests__/scanners/scale/index.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.js +122 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/types.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/types.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/types.test.js +129 -0
- package/dist/__tests__/scanners/scale/types.test.js.map +1 -0
- package/dist/action/pr-comment.test.js +4 -0
- package/dist/action/pr-comment.test.js.map +1 -1
- package/dist/action/sarif-upload.test.js +4 -0
- package/dist/action/sarif-upload.test.js.map +1 -1
- package/dist/autofix/branch-manager.d.ts +115 -0
- package/dist/autofix/branch-manager.d.ts.map +1 -0
- package/dist/autofix/branch-manager.js +308 -0
- package/dist/autofix/branch-manager.js.map +1 -0
- package/dist/autofix/commit-generator.d.ts +55 -0
- package/dist/autofix/commit-generator.d.ts.map +1 -0
- package/dist/autofix/commit-generator.js +277 -0
- package/dist/autofix/commit-generator.js.map +1 -0
- package/dist/autofix/constitution.d.ts +77 -0
- package/dist/autofix/constitution.d.ts.map +1 -0
- package/dist/autofix/constitution.js +261 -0
- package/dist/autofix/constitution.js.map +1 -0
- package/dist/autofix/constitution.schema.d.ts +441 -0
- package/dist/autofix/constitution.schema.d.ts.map +1 -0
- package/dist/autofix/constitution.schema.js +144 -0
- package/dist/autofix/constitution.schema.js.map +1 -0
- package/dist/autofix/index.d.ts +13 -0
- package/dist/autofix/index.d.ts.map +1 -0
- package/dist/autofix/index.js +15 -0
- package/dist/autofix/index.js.map +1 -0
- package/dist/autofix/pr-generator.d.ts +57 -0
- package/dist/autofix/pr-generator.d.ts.map +1 -0
- package/dist/autofix/pr-generator.js +597 -0
- package/dist/autofix/pr-generator.js.map +1 -0
- package/dist/autofix/types.d.ts +151 -0
- package/dist/autofix/types.d.ts.map +1 -0
- package/dist/autofix/types.js +22 -0
- package/dist/autofix/types.js.map +1 -0
- package/dist/eval/fixtures.d.ts +20 -0
- package/dist/eval/fixtures.d.ts.map +1 -1
- package/dist/eval/fixtures.js +430 -0
- package/dist/eval/fixtures.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +874 -0
- package/dist/index.js.map +1 -1
- package/dist/install-skills.d.ts +11 -0
- package/dist/install-skills.d.ts.map +1 -0
- package/dist/install-skills.js +81 -0
- package/dist/install-skills.js.map +1 -0
- package/dist/scanners/ai-code/ai-detector.d.ts +25 -0
- package/dist/scanners/ai-code/ai-detector.d.ts.map +1 -0
- package/dist/scanners/ai-code/ai-detector.js +192 -0
- package/dist/scanners/ai-code/ai-detector.js.map +1 -0
- package/dist/scanners/ai-code/confidence-scorer.d.ts +40 -0
- package/dist/scanners/ai-code/confidence-scorer.d.ts.map +1 -0
- package/dist/scanners/ai-code/confidence-scorer.js +148 -0
- package/dist/scanners/ai-code/confidence-scorer.js.map +1 -0
- package/dist/scanners/ai-code/hallucination-checker.d.ts +36 -0
- package/dist/scanners/ai-code/hallucination-checker.d.ts.map +1 -0
- package/dist/scanners/ai-code/hallucination-checker.js +298 -0
- package/dist/scanners/ai-code/hallucination-checker.js.map +1 -0
- package/dist/scanners/ai-code/index.d.ts +30 -0
- package/dist/scanners/ai-code/index.d.ts.map +1 -0
- package/dist/scanners/ai-code/index.js +224 -0
- package/dist/scanners/ai-code/index.js.map +1 -0
- package/dist/scanners/ai-code/types.d.ts +192 -0
- package/dist/scanners/ai-code/types.d.ts.map +1 -0
- package/dist/scanners/ai-code/types.js +37 -0
- package/dist/scanners/ai-code/types.js.map +1 -0
- package/dist/scanners/cache.d.ts.map +1 -1
- package/dist/scanners/cache.js +4 -0
- package/dist/scanners/cache.js.map +1 -1
- package/dist/scanners/dast/index.d.ts +39 -0
- package/dist/scanners/dast/index.d.ts.map +1 -0
- package/dist/scanners/dast/index.js +259 -0
- package/dist/scanners/dast/index.js.map +1 -0
- package/dist/scanners/dast/nuclei.d.ts +26 -0
- package/dist/scanners/dast/nuclei.d.ts.map +1 -0
- package/dist/scanners/dast/nuclei.js +354 -0
- package/dist/scanners/dast/nuclei.js.map +1 -0
- package/dist/scanners/dast/types.d.ts +306 -0
- package/dist/scanners/dast/types.d.ts.map +1 -0
- package/dist/scanners/dast/types.js +52 -0
- package/dist/scanners/dast/types.js.map +1 -0
- package/dist/scanners/dast/zap.d.ts +26 -0
- package/dist/scanners/dast/zap.d.ts.map +1 -0
- package/dist/scanners/dast/zap.js +453 -0
- package/dist/scanners/dast/zap.js.map +1 -0
- package/dist/scanners/deploy/health-checker.d.ts +38 -0
- package/dist/scanners/deploy/health-checker.d.ts.map +1 -0
- package/dist/scanners/deploy/health-checker.js +272 -0
- package/dist/scanners/deploy/health-checker.js.map +1 -0
- package/dist/scanners/deploy/index.d.ts +44 -0
- package/dist/scanners/deploy/index.d.ts.map +1 -0
- package/dist/scanners/deploy/index.js +208 -0
- package/dist/scanners/deploy/index.js.map +1 -0
- package/dist/scanners/deploy/provider-detector.d.ts +25 -0
- package/dist/scanners/deploy/provider-detector.d.ts.map +1 -0
- package/dist/scanners/deploy/provider-detector.js +177 -0
- package/dist/scanners/deploy/provider-detector.js.map +1 -0
- package/dist/scanners/deploy/types.d.ts +406 -0
- package/dist/scanners/deploy/types.d.ts.map +1 -0
- package/dist/scanners/deploy/types.js +58 -0
- package/dist/scanners/deploy/types.js.map +1 -0
- package/dist/scanners/deploy/vercel-integration.d.ts +52 -0
- package/dist/scanners/deploy/vercel-integration.d.ts.map +1 -0
- package/dist/scanners/deploy/vercel-integration.js +280 -0
- package/dist/scanners/deploy/vercel-integration.js.map +1 -0
- package/dist/scanners/fp-feedback.d.ts +140 -0
- package/dist/scanners/fp-feedback.d.ts.map +1 -0
- package/dist/scanners/fp-feedback.js +292 -0
- package/dist/scanners/fp-feedback.js.map +1 -0
- package/dist/scanners/fp-filter.d.ts +94 -0
- package/dist/scanners/fp-filter.d.ts.map +1 -0
- package/dist/scanners/fp-filter.js +397 -0
- package/dist/scanners/fp-filter.js.map +1 -0
- package/dist/scanners/fp-tracker.d.ts +125 -0
- package/dist/scanners/fp-tracker.d.ts.map +1 -0
- package/dist/scanners/fp-tracker.js +330 -0
- package/dist/scanners/fp-tracker.js.map +1 -0
- package/dist/scanners/index.d.ts.map +1 -1
- package/dist/scanners/index.js +56 -0
- package/dist/scanners/index.js.map +1 -1
- package/dist/scanners/index.test.js +6 -6
- package/dist/scanners/index.test.js.map +1 -1
- package/dist/scanners/logic/auth-flow-analyzer.d.ts +18 -0
- package/dist/scanners/logic/auth-flow-analyzer.d.ts.map +1 -0
- package/dist/scanners/logic/auth-flow-analyzer.js +384 -0
- package/dist/scanners/logic/auth-flow-analyzer.js.map +1 -0
- package/dist/scanners/logic/endpoint-analyzer.d.ts +29 -0
- package/dist/scanners/logic/endpoint-analyzer.d.ts.map +1 -0
- package/dist/scanners/logic/endpoint-analyzer.js +528 -0
- package/dist/scanners/logic/endpoint-analyzer.js.map +1 -0
- package/dist/scanners/logic/index.d.ts +41 -0
- package/dist/scanners/logic/index.d.ts.map +1 -0
- package/dist/scanners/logic/index.js +268 -0
- package/dist/scanners/logic/index.js.map +1 -0
- package/dist/scanners/logic/types.d.ts +254 -0
- package/dist/scanners/logic/types.d.ts.map +1 -0
- package/dist/scanners/logic/types.js +142 -0
- package/dist/scanners/logic/types.js.map +1 -0
- package/dist/scanners/runtime/app-launcher.d.ts +33 -0
- package/dist/scanners/runtime/app-launcher.d.ts.map +1 -0
- package/dist/scanners/runtime/app-launcher.js +419 -0
- package/dist/scanners/runtime/app-launcher.js.map +1 -0
- package/dist/scanners/runtime/golden-path-runner.d.ts +48 -0
- package/dist/scanners/runtime/golden-path-runner.d.ts.map +1 -0
- package/dist/scanners/runtime/golden-path-runner.js +373 -0
- package/dist/scanners/runtime/golden-path-runner.js.map +1 -0
- package/dist/scanners/runtime/index.d.ts +41 -0
- package/dist/scanners/runtime/index.d.ts.map +1 -0
- package/dist/scanners/runtime/index.js +164 -0
- package/dist/scanners/runtime/index.js.map +1 -0
- package/dist/scanners/runtime/playwright-executor.d.ts +50 -0
- package/dist/scanners/runtime/playwright-executor.d.ts.map +1 -0
- package/dist/scanners/runtime/playwright-executor.js +387 -0
- package/dist/scanners/runtime/playwright-executor.js.map +1 -0
- package/dist/scanners/runtime/types.d.ts +215 -0
- package/dist/scanners/runtime/types.d.ts.map +1 -0
- package/dist/scanners/runtime/types.js +40 -0
- package/dist/scanners/runtime/types.js.map +1 -0
- package/dist/scanners/scale/bottleneck-detector.d.ts +17 -0
- package/dist/scanners/scale/bottleneck-detector.d.ts.map +1 -0
- package/dist/scanners/scale/bottleneck-detector.js +250 -0
- package/dist/scanners/scale/bottleneck-detector.js.map +1 -0
- package/dist/scanners/scale/capacity-estimator.d.ts +17 -0
- package/dist/scanners/scale/capacity-estimator.d.ts.map +1 -0
- package/dist/scanners/scale/capacity-estimator.js +197 -0
- package/dist/scanners/scale/capacity-estimator.js.map +1 -0
- package/dist/scanners/scale/index.d.ts +37 -0
- package/dist/scanners/scale/index.d.ts.map +1 -0
- package/dist/scanners/scale/index.js +101 -0
- package/dist/scanners/scale/index.js.map +1 -0
- package/dist/scanners/scale/load-profiler.d.ts +48 -0
- package/dist/scanners/scale/load-profiler.d.ts.map +1 -0
- package/dist/scanners/scale/load-profiler.js +377 -0
- package/dist/scanners/scale/load-profiler.js.map +1 -0
- package/dist/scanners/scale/types.d.ts +529 -0
- package/dist/scanners/scale/types.d.ts.map +1 -0
- package/dist/scanners/scale/types.js +57 -0
- package/dist/scanners/scale/types.js.map +1 -0
- package/dist/scanners/secrets.d.ts.map +1 -1
- package/dist/scanners/secrets.js +13 -2
- package/dist/scanners/secrets.js.map +1 -1
- package/dist/scanners/types.d.ts +1 -1
- package/dist/scanners/types.d.ts.map +1 -1
- package/dist/scanners/types.js +4 -0
- package/dist/scanners/types.js.map +1 -1
- package/package.json +8 -4
- package/skills/vaspera-add-tests/SKILL.md +102 -0
- package/skills/vaspera-ai-verify/SKILL.md +166 -0
- package/skills/vaspera-audit/SKILL.md +67 -0
- package/skills/vaspera-certify/SKILL.md +130 -0
- package/skills/vaspera-deploy/SKILL.md +152 -0
- package/skills/vaspera-fix-critical/SKILL.md +52 -0
- package/skills/vaspera-fix-high/SKILL.md +81 -0
- package/skills/vaspera-fix-medium/SKILL.md +56 -0
- package/skills/vaspera-fix-rls/SKILL.md +85 -0
- package/skills/vaspera-harden/SKILL.md +102 -0
- package/skills/vaspera-help/SKILL.md +61 -0
- package/skills/vaspera-load-test/SKILL.md +167 -0
- package/skills/vaspera-verify/SKILL.md +70 -0
- package/skills/vaspera-verify-e2e/SKILL.md +117 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Business Logic Scanner Module
|
|
3
|
+
*
|
|
4
|
+
* Detects BOLA, IDOR, BFLA, and other authorization vulnerabilities
|
|
5
|
+
* through static analysis of API endpoints.
|
|
6
|
+
*
|
|
7
|
+
* @module scanners/logic
|
|
8
|
+
*/
|
|
9
|
+
import { logger } from "../../logger.js";
|
|
10
|
+
import { LOGIC_VULN_CWE_MAP, LOGIC_VULN_OWASP_MAP, LOGIC_VULN_SEVERITY_MAP, } from "./types.js";
|
|
11
|
+
import { extractEndpoints, detectFramework, } from "./endpoint-analyzer.js";
|
|
12
|
+
import { analyzeEndpoints, } from "./auth-flow-analyzer.js";
|
|
13
|
+
// Re-export types
|
|
14
|
+
export * from "./types.js";
|
|
15
|
+
// Re-export analyzer functions
|
|
16
|
+
export { extractEndpoints, detectFramework, extractPathParams, inferResourceType, } from "./endpoint-analyzer.js";
|
|
17
|
+
export { analyzeAuthorizationFlow, analyzeEndpoints, } from "./auth-flow-analyzer.js";
|
|
18
|
+
/**
|
|
19
|
+
* Convert logic vulnerability to finding format
|
|
20
|
+
*/
|
|
21
|
+
function vulnerabilityToFinding(vuln) {
|
|
22
|
+
return {
|
|
23
|
+
scanner: "logic",
|
|
24
|
+
ruleId: `logic-${vuln.vulnType}`,
|
|
25
|
+
file: vuln.file,
|
|
26
|
+
line: vuln.line,
|
|
27
|
+
message: vuln.description,
|
|
28
|
+
severity: vuln.severity,
|
|
29
|
+
confidence: vuln.confidence,
|
|
30
|
+
category: vuln.vulnType,
|
|
31
|
+
vulnType: vuln.vulnType,
|
|
32
|
+
affectedEndpoint: vuln.endpoint,
|
|
33
|
+
httpMethod: vuln.method,
|
|
34
|
+
authCheck: vuln.authCheck,
|
|
35
|
+
resourceAccess: vuln.resourceAccess,
|
|
36
|
+
cweIds: vuln.cweIds,
|
|
37
|
+
owaspRefs: vuln.owaspRefs,
|
|
38
|
+
remediation: vuln.remediation,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Run logic vulnerability scan
|
|
43
|
+
*/
|
|
44
|
+
export async function runLogicScan(projectPath, options = {}) {
|
|
45
|
+
const startTime = Date.now();
|
|
46
|
+
logger.info("logic_scan.start", {
|
|
47
|
+
projectPath,
|
|
48
|
+
framework: options.framework || "auto",
|
|
49
|
+
focusAreas: options.focusAreas,
|
|
50
|
+
});
|
|
51
|
+
try {
|
|
52
|
+
// Detect framework if not specified
|
|
53
|
+
const framework = options.framework || (await detectFramework(projectPath));
|
|
54
|
+
// Extract endpoints
|
|
55
|
+
const endpoints = await extractEndpoints(projectPath, {
|
|
56
|
+
framework,
|
|
57
|
+
include: options.include,
|
|
58
|
+
exclude: options.exclude,
|
|
59
|
+
});
|
|
60
|
+
// Limit files if specified
|
|
61
|
+
const limitedEndpoints = options.maxFiles
|
|
62
|
+
? endpoints.slice(0, options.maxFiles)
|
|
63
|
+
: endpoints;
|
|
64
|
+
// Analyze authorization flows
|
|
65
|
+
const analyses = await analyzeEndpoints(limitedEndpoints, projectPath);
|
|
66
|
+
// Collect all vulnerabilities
|
|
67
|
+
let allVulnerabilities = [];
|
|
68
|
+
for (const analysis of analyses) {
|
|
69
|
+
allVulnerabilities.push(...analysis.vulnerabilities);
|
|
70
|
+
}
|
|
71
|
+
// Filter by focus areas if specified
|
|
72
|
+
if (options.focusAreas && options.focusAreas.length > 0) {
|
|
73
|
+
allVulnerabilities = allVulnerabilities.filter((v) => options.focusAreas.includes(v.vulnType));
|
|
74
|
+
}
|
|
75
|
+
// Convert to findings
|
|
76
|
+
const findings = allVulnerabilities.map(vulnerabilityToFinding);
|
|
77
|
+
// Calculate stats
|
|
78
|
+
const bySeverity = {};
|
|
79
|
+
const byVulnType = {};
|
|
80
|
+
for (const vuln of allVulnerabilities) {
|
|
81
|
+
bySeverity[vuln.severity] = (bySeverity[vuln.severity] || 0) + 1;
|
|
82
|
+
byVulnType[vuln.vulnType] = (byVulnType[vuln.vulnType] || 0) + 1;
|
|
83
|
+
}
|
|
84
|
+
const duration = Date.now() - startTime;
|
|
85
|
+
logger.info("logic_scan.complete", {
|
|
86
|
+
endpoints: endpoints.length,
|
|
87
|
+
vulnerabilities: allVulnerabilities.length,
|
|
88
|
+
duration,
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
projectPath,
|
|
92
|
+
framework,
|
|
93
|
+
endpoints: limitedEndpoints,
|
|
94
|
+
vulnerabilities: allVulnerabilities,
|
|
95
|
+
findings,
|
|
96
|
+
stats: {
|
|
97
|
+
filesAnalyzed: new Set(endpoints.map((e) => e.file)).size,
|
|
98
|
+
endpointsFound: endpoints.length,
|
|
99
|
+
vulnerabilitiesFound: allVulnerabilities.length,
|
|
100
|
+
bySeverity,
|
|
101
|
+
byVulnType,
|
|
102
|
+
},
|
|
103
|
+
duration,
|
|
104
|
+
success: true,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
const duration = Date.now() - startTime;
|
|
109
|
+
logger.error("logic_scan.failed", { error: String(error) });
|
|
110
|
+
return {
|
|
111
|
+
projectPath,
|
|
112
|
+
framework: options.framework || "auto",
|
|
113
|
+
endpoints: [],
|
|
114
|
+
vulnerabilities: [],
|
|
115
|
+
findings: [],
|
|
116
|
+
stats: {
|
|
117
|
+
filesAnalyzed: 0,
|
|
118
|
+
endpointsFound: 0,
|
|
119
|
+
vulnerabilitiesFound: 0,
|
|
120
|
+
bySeverity: {},
|
|
121
|
+
byVulnType: {},
|
|
122
|
+
},
|
|
123
|
+
duration,
|
|
124
|
+
success: false,
|
|
125
|
+
error: String(error),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Format logic scan results for display
|
|
131
|
+
*/
|
|
132
|
+
export function formatLogicResults(result) {
|
|
133
|
+
const lines = [
|
|
134
|
+
"# Business Logic Security Scan",
|
|
135
|
+
"",
|
|
136
|
+
`**Framework**: ${result.framework}`,
|
|
137
|
+
`**Endpoints Analyzed**: ${result.stats.endpointsFound}`,
|
|
138
|
+
`**Vulnerabilities Found**: ${result.stats.vulnerabilitiesFound}`,
|
|
139
|
+
`**Duration**: ${Math.round(result.duration / 1000)}s`,
|
|
140
|
+
"",
|
|
141
|
+
];
|
|
142
|
+
if (!result.success) {
|
|
143
|
+
lines.push(`**Error**: ${result.error}`);
|
|
144
|
+
return lines.join("\n");
|
|
145
|
+
}
|
|
146
|
+
if (result.vulnerabilities.length === 0) {
|
|
147
|
+
lines.push("✅ No authorization vulnerabilities detected.");
|
|
148
|
+
return lines.join("\n");
|
|
149
|
+
}
|
|
150
|
+
// Group by severity
|
|
151
|
+
const severityOrder = ["critical", "high", "medium", "low", "info"];
|
|
152
|
+
const grouped = new Map();
|
|
153
|
+
for (const vuln of result.vulnerabilities) {
|
|
154
|
+
const existing = grouped.get(vuln.severity) || [];
|
|
155
|
+
existing.push(vuln);
|
|
156
|
+
grouped.set(vuln.severity, existing);
|
|
157
|
+
}
|
|
158
|
+
for (const severity of severityOrder) {
|
|
159
|
+
const vulns = grouped.get(severity);
|
|
160
|
+
if (!vulns || vulns.length === 0)
|
|
161
|
+
continue;
|
|
162
|
+
const emoji = {
|
|
163
|
+
critical: "🔴",
|
|
164
|
+
high: "🟠",
|
|
165
|
+
medium: "🟡",
|
|
166
|
+
low: "🔵",
|
|
167
|
+
info: "⚪",
|
|
168
|
+
}[severity];
|
|
169
|
+
lines.push(`## ${emoji} ${severity.toUpperCase()} (${vulns.length})`, "");
|
|
170
|
+
for (const vuln of vulns) {
|
|
171
|
+
lines.push(`### ${vuln.name}`);
|
|
172
|
+
lines.push(`- **Endpoint**: \`${Array.isArray(vuln.method) ? vuln.method.join("/") : vuln.method} ${vuln.endpoint}\``);
|
|
173
|
+
lines.push(`- **File**: ${vuln.file}:${vuln.line}`);
|
|
174
|
+
lines.push(`- **Description**: ${vuln.description}`);
|
|
175
|
+
if (vuln.cweIds.length > 0) {
|
|
176
|
+
lines.push(`- **CWE**: ${vuln.cweIds.join(", ")}`);
|
|
177
|
+
}
|
|
178
|
+
if (vuln.owaspRefs.length > 0) {
|
|
179
|
+
lines.push(`- **OWASP**: ${vuln.owaspRefs.join(", ")}`);
|
|
180
|
+
}
|
|
181
|
+
lines.push(`- **Remediation**: ${vuln.remediation}`);
|
|
182
|
+
lines.push("");
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Summary by type
|
|
186
|
+
if (Object.keys(result.stats.byVulnType).length > 0) {
|
|
187
|
+
lines.push("## Summary by Vulnerability Type", "");
|
|
188
|
+
lines.push("| Type | Count |");
|
|
189
|
+
lines.push("|------|-------|");
|
|
190
|
+
for (const [type, count] of Object.entries(result.stats.byVulnType)) {
|
|
191
|
+
if (count && count > 0) {
|
|
192
|
+
lines.push(`| ${type} | ${count} |`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return lines.join("\n");
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get vulnerability description
|
|
200
|
+
*/
|
|
201
|
+
export function getVulnerabilityDescription(vulnType) {
|
|
202
|
+
const descriptions = {
|
|
203
|
+
"bola": "Broken Object Level Authorization occurs when an API does not properly validate that a user has permission to access a specific object.",
|
|
204
|
+
"idor": "Insecure Direct Object Reference allows attackers to access objects directly by manipulating input parameters containing object IDs.",
|
|
205
|
+
"bfla": "Broken Function Level Authorization occurs when users can access administrative or privileged functions without proper permission checks.",
|
|
206
|
+
"mass-assignment": "Mass Assignment allows attackers to modify object properties they shouldn't have access to by manipulating request parameters.",
|
|
207
|
+
"race-condition-auth": "Race Condition in Authorization occurs when concurrent requests can bypass authorization checks.",
|
|
208
|
+
"privilege-escalation": "Privilege Escalation allows users to gain elevated access rights beyond what was intended.",
|
|
209
|
+
"missing-auth": "Missing Authentication occurs when sensitive endpoints do not require user authentication.",
|
|
210
|
+
"missing-authz": "Missing Authorization occurs when authenticated users can perform actions without proper permission checks.",
|
|
211
|
+
"direct-db-access": "Direct Database Access without Authorization allows unvalidated access to data through unprotected database queries.",
|
|
212
|
+
"horizontal-priv-esc": "Horizontal Privilege Escalation allows users to access resources belonging to other users at the same privilege level.",
|
|
213
|
+
"vertical-priv-esc": "Vertical Privilege Escalation allows users to elevate their privileges to a higher access level.",
|
|
214
|
+
};
|
|
215
|
+
const names = {
|
|
216
|
+
"bola": "Broken Object Level Authorization",
|
|
217
|
+
"idor": "Insecure Direct Object Reference",
|
|
218
|
+
"bfla": "Broken Function Level Authorization",
|
|
219
|
+
"mass-assignment": "Mass Assignment",
|
|
220
|
+
"race-condition-auth": "Race Condition in Authorization",
|
|
221
|
+
"privilege-escalation": "Privilege Escalation",
|
|
222
|
+
"missing-auth": "Missing Authentication",
|
|
223
|
+
"missing-authz": "Missing Authorization",
|
|
224
|
+
"direct-db-access": "Direct Database Access",
|
|
225
|
+
"horizontal-priv-esc": "Horizontal Privilege Escalation",
|
|
226
|
+
"vertical-priv-esc": "Vertical Privilege Escalation",
|
|
227
|
+
};
|
|
228
|
+
return {
|
|
229
|
+
name: names[vulnType],
|
|
230
|
+
description: descriptions[vulnType],
|
|
231
|
+
cweIds: LOGIC_VULN_CWE_MAP[vulnType],
|
|
232
|
+
owaspRefs: LOGIC_VULN_OWASP_MAP[vulnType],
|
|
233
|
+
severity: LOGIC_VULN_SEVERITY_MAP[vulnType],
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Quick check for common authorization issues
|
|
238
|
+
*/
|
|
239
|
+
export async function quickAuthCheck(projectPath) {
|
|
240
|
+
const endpoints = await extractEndpoints(projectPath);
|
|
241
|
+
const analyses = await analyzeEndpoints(endpoints, projectPath);
|
|
242
|
+
let hasAuthMiddleware = false;
|
|
243
|
+
let hasOwnershipChecks = false;
|
|
244
|
+
let hasRoleChecks = false;
|
|
245
|
+
const potentialIssues = [];
|
|
246
|
+
for (const analysis of analyses) {
|
|
247
|
+
if (analysis.requiresAuth)
|
|
248
|
+
hasAuthMiddleware = true;
|
|
249
|
+
for (const check of analysis.authzChecks) {
|
|
250
|
+
if (check.type === "ownership")
|
|
251
|
+
hasOwnershipChecks = true;
|
|
252
|
+
if (check.type === "role" || check.type === "admin")
|
|
253
|
+
hasRoleChecks = true;
|
|
254
|
+
}
|
|
255
|
+
for (const vuln of analysis.vulnerabilities) {
|
|
256
|
+
if (!potentialIssues.includes(vuln.vulnType)) {
|
|
257
|
+
potentialIssues.push(vuln.vulnType);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
hasAuthMiddleware,
|
|
263
|
+
hasOwnershipChecks,
|
|
264
|
+
hasRoleChecks,
|
|
265
|
+
potentialIssues,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanners/logic/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Business Logic Vulnerability Types
|
|
3
|
+
*
|
|
4
|
+
* Types for detecting BOLA, IDOR, BFLA, and other
|
|
5
|
+
* authorization/business logic vulnerabilities.
|
|
6
|
+
*
|
|
7
|
+
* @module scanners/logic/types
|
|
8
|
+
*/
|
|
9
|
+
import type { Severity } from "../../certification/types.js";
|
|
10
|
+
import type { DeterministicFinding } from "../types.js";
|
|
11
|
+
/**
|
|
12
|
+
* Business logic vulnerability types
|
|
13
|
+
*/
|
|
14
|
+
export type LogicVulnType = "bola" | "idor" | "bfla" | "mass-assignment" | "race-condition-auth" | "privilege-escalation" | "missing-auth" | "missing-authz" | "direct-db-access" | "horizontal-priv-esc" | "vertical-priv-esc";
|
|
15
|
+
/**
|
|
16
|
+
* HTTP methods for API endpoints
|
|
17
|
+
*/
|
|
18
|
+
export type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS";
|
|
19
|
+
/**
|
|
20
|
+
* Web framework types
|
|
21
|
+
*/
|
|
22
|
+
export type WebFramework = "nextjs" | "express" | "fastify" | "koa" | "hapi" | "nestjs" | "django" | "flask" | "fastapi" | "rails" | "spring" | "laravel" | "gin" | "echo" | "fiber" | "auto";
|
|
23
|
+
/**
|
|
24
|
+
* Detected API endpoint
|
|
25
|
+
*/
|
|
26
|
+
export interface APIEndpoint {
|
|
27
|
+
/** File where the endpoint is defined */
|
|
28
|
+
file: string;
|
|
29
|
+
/** Line number */
|
|
30
|
+
line: number;
|
|
31
|
+
/** HTTP method */
|
|
32
|
+
method: HttpMethod | HttpMethod[];
|
|
33
|
+
/** Route path (e.g., /api/users/:id) */
|
|
34
|
+
path: string;
|
|
35
|
+
/** Function/handler name */
|
|
36
|
+
handler?: string;
|
|
37
|
+
/** Framework that defines this endpoint */
|
|
38
|
+
framework: WebFramework;
|
|
39
|
+
/** Parameters extracted from path */
|
|
40
|
+
pathParams: string[];
|
|
41
|
+
/** Whether authentication middleware is applied */
|
|
42
|
+
hasAuth: boolean;
|
|
43
|
+
/** Authorization checks detected */
|
|
44
|
+
authzChecks: AuthorizationCheck[];
|
|
45
|
+
/** Resource type being accessed (e.g., "user", "order") */
|
|
46
|
+
resourceType?: string;
|
|
47
|
+
/** Whether endpoint accesses database */
|
|
48
|
+
hasDbAccess: boolean;
|
|
49
|
+
/** Database queries in this endpoint */
|
|
50
|
+
dbQueries: DatabaseQuery[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Authorization check detected in code
|
|
54
|
+
*/
|
|
55
|
+
export interface AuthorizationCheck {
|
|
56
|
+
/** Type of check */
|
|
57
|
+
type: "ownership" | "role" | "permission" | "admin" | "custom";
|
|
58
|
+
/** Where the check is performed */
|
|
59
|
+
location: {
|
|
60
|
+
file: string;
|
|
61
|
+
line: number;
|
|
62
|
+
};
|
|
63
|
+
/** Code snippet of the check */
|
|
64
|
+
snippet: string;
|
|
65
|
+
/** Whether check appears to be bypassable */
|
|
66
|
+
potentiallyBypassable: boolean;
|
|
67
|
+
/** Reason for bypass concern */
|
|
68
|
+
bypassReason?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Database query detected in endpoint
|
|
72
|
+
*/
|
|
73
|
+
export interface DatabaseQuery {
|
|
74
|
+
/** Query type */
|
|
75
|
+
type: "select" | "insert" | "update" | "delete" | "raw";
|
|
76
|
+
/** Table/collection being accessed */
|
|
77
|
+
table?: string;
|
|
78
|
+
/** Whether query includes ownership filter */
|
|
79
|
+
hasOwnershipFilter: boolean;
|
|
80
|
+
/** Location in code */
|
|
81
|
+
location: {
|
|
82
|
+
file: string;
|
|
83
|
+
line: number;
|
|
84
|
+
};
|
|
85
|
+
/** Code snippet */
|
|
86
|
+
snippet: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Resource access pattern
|
|
90
|
+
*/
|
|
91
|
+
export interface ResourceAccess {
|
|
92
|
+
/** Resource type (e.g., "user", "order", "file") */
|
|
93
|
+
resource: string;
|
|
94
|
+
/** Operation being performed */
|
|
95
|
+
operation: "read" | "create" | "update" | "delete";
|
|
96
|
+
/** Whether ownership is verified */
|
|
97
|
+
ownershipCheck: boolean;
|
|
98
|
+
/** How the resource ID is obtained */
|
|
99
|
+
idSource: "path" | "query" | "body" | "header" | "session";
|
|
100
|
+
/** File location */
|
|
101
|
+
file: string;
|
|
102
|
+
/** Line number */
|
|
103
|
+
line: number;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Authorization flow analysis result
|
|
107
|
+
*/
|
|
108
|
+
export interface AuthorizationAnalysis {
|
|
109
|
+
/** Endpoint being analyzed */
|
|
110
|
+
endpoint: APIEndpoint;
|
|
111
|
+
/** Whether authentication is required */
|
|
112
|
+
requiresAuth: boolean;
|
|
113
|
+
/** Authentication method detected */
|
|
114
|
+
authMethod?: "jwt" | "session" | "api-key" | "oauth" | "basic" | "custom";
|
|
115
|
+
/** Authorization checks found */
|
|
116
|
+
authzChecks: AuthorizationCheck[];
|
|
117
|
+
/** Resources accessed */
|
|
118
|
+
resourceAccesses: ResourceAccess[];
|
|
119
|
+
/** Potential vulnerabilities */
|
|
120
|
+
vulnerabilities: LogicVulnerability[];
|
|
121
|
+
/** Confidence score (0-100) */
|
|
122
|
+
confidence: number;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* A business logic vulnerability finding
|
|
126
|
+
*/
|
|
127
|
+
export interface LogicVulnerability {
|
|
128
|
+
/** Vulnerability type */
|
|
129
|
+
vulnType: LogicVulnType;
|
|
130
|
+
/** Human-readable name */
|
|
131
|
+
name: string;
|
|
132
|
+
/** Description */
|
|
133
|
+
description: string;
|
|
134
|
+
/** Severity */
|
|
135
|
+
severity: Severity;
|
|
136
|
+
/** Confidence (0-100) */
|
|
137
|
+
confidence: number;
|
|
138
|
+
/** Affected endpoint */
|
|
139
|
+
endpoint: string;
|
|
140
|
+
/** HTTP method */
|
|
141
|
+
method: HttpMethod | HttpMethod[];
|
|
142
|
+
/** File location */
|
|
143
|
+
file: string;
|
|
144
|
+
/** Line number */
|
|
145
|
+
line: number;
|
|
146
|
+
/** Code snippet showing the issue */
|
|
147
|
+
snippet?: string;
|
|
148
|
+
/** Authentication check status */
|
|
149
|
+
authCheck: {
|
|
150
|
+
present: boolean;
|
|
151
|
+
location?: string;
|
|
152
|
+
bypassable: boolean;
|
|
153
|
+
bypassReason?: string;
|
|
154
|
+
};
|
|
155
|
+
/** Resource access details */
|
|
156
|
+
resourceAccess?: ResourceAccess;
|
|
157
|
+
/** CWE IDs */
|
|
158
|
+
cweIds: string[];
|
|
159
|
+
/** OWASP references */
|
|
160
|
+
owaspRefs: string[];
|
|
161
|
+
/** Suggested remediation */
|
|
162
|
+
remediation: string;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Logic finding extends DeterministicFinding with logic-specific fields
|
|
166
|
+
*/
|
|
167
|
+
export interface LogicFinding extends DeterministicFinding {
|
|
168
|
+
/** Vulnerability type */
|
|
169
|
+
vulnType: LogicVulnType;
|
|
170
|
+
/** Affected endpoint path */
|
|
171
|
+
affectedEndpoint: string;
|
|
172
|
+
/** HTTP method */
|
|
173
|
+
httpMethod?: HttpMethod | HttpMethod[];
|
|
174
|
+
/** Auth check details */
|
|
175
|
+
authCheck?: {
|
|
176
|
+
present: boolean;
|
|
177
|
+
location?: string;
|
|
178
|
+
bypassable: boolean;
|
|
179
|
+
bypassReason?: string;
|
|
180
|
+
};
|
|
181
|
+
/** Resource access details */
|
|
182
|
+
resourceAccess?: ResourceAccess;
|
|
183
|
+
/** OWASP references */
|
|
184
|
+
owaspRefs?: string[];
|
|
185
|
+
/** Suggested remediation */
|
|
186
|
+
remediation?: string;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Scan options for logic analysis
|
|
190
|
+
*/
|
|
191
|
+
export interface LogicScanOptions {
|
|
192
|
+
/** Framework to use (auto-detect if not specified) */
|
|
193
|
+
framework?: WebFramework;
|
|
194
|
+
/** Specific vulnerability types to focus on */
|
|
195
|
+
focusAreas?: LogicVulnType[];
|
|
196
|
+
/** Include LLM-powered semantic analysis */
|
|
197
|
+
includeLLMAnalysis?: boolean;
|
|
198
|
+
/** Maximum files to analyze */
|
|
199
|
+
maxFiles?: number;
|
|
200
|
+
/** File patterns to include */
|
|
201
|
+
include?: string[];
|
|
202
|
+
/** File patterns to exclude */
|
|
203
|
+
exclude?: string[];
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Result from logic vulnerability scan
|
|
207
|
+
*/
|
|
208
|
+
export interface LogicScanResult {
|
|
209
|
+
/** Project path */
|
|
210
|
+
projectPath: string;
|
|
211
|
+
/** Framework detected */
|
|
212
|
+
framework: WebFramework;
|
|
213
|
+
/** All endpoints found */
|
|
214
|
+
endpoints: APIEndpoint[];
|
|
215
|
+
/** Logic vulnerabilities found */
|
|
216
|
+
vulnerabilities: LogicVulnerability[];
|
|
217
|
+
/** Findings in standard format */
|
|
218
|
+
findings: LogicFinding[];
|
|
219
|
+
/** Scan statistics */
|
|
220
|
+
stats: {
|
|
221
|
+
filesAnalyzed: number;
|
|
222
|
+
endpointsFound: number;
|
|
223
|
+
vulnerabilitiesFound: number;
|
|
224
|
+
bySeverity: Partial<Record<Severity, number>>;
|
|
225
|
+
byVulnType: Partial<Record<LogicVulnType, number>>;
|
|
226
|
+
};
|
|
227
|
+
/** Scan duration */
|
|
228
|
+
duration: number;
|
|
229
|
+
/** Whether scan completed successfully */
|
|
230
|
+
success: boolean;
|
|
231
|
+
/** Error message if failed */
|
|
232
|
+
error?: string;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* CWE mappings for logic vulnerabilities
|
|
236
|
+
*/
|
|
237
|
+
export declare const LOGIC_VULN_CWE_MAP: Record<LogicVulnType, string[]>;
|
|
238
|
+
/**
|
|
239
|
+
* OWASP references for logic vulnerabilities
|
|
240
|
+
*/
|
|
241
|
+
export declare const LOGIC_VULN_OWASP_MAP: Record<LogicVulnType, string[]>;
|
|
242
|
+
/**
|
|
243
|
+
* Default severity for each vulnerability type
|
|
244
|
+
*/
|
|
245
|
+
export declare const LOGIC_VULN_SEVERITY_MAP: Record<LogicVulnType, Severity>;
|
|
246
|
+
/**
|
|
247
|
+
* Patterns for detecting framework types
|
|
248
|
+
*/
|
|
249
|
+
export declare const FRAMEWORK_DETECTION_PATTERNS: Record<WebFramework, {
|
|
250
|
+
packageNames: string[];
|
|
251
|
+
filePatterns: RegExp[];
|
|
252
|
+
codePatterns: RegExp[];
|
|
253
|
+
}>;
|
|
254
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/scanners/logic/types.ts"],"names":[],"mappings":"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"}
|