@oculum/scanner 1.0.11 → 1.0.13
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/dist/ai-context/index.d.ts +6 -0
- package/dist/ai-context/index.d.ts.map +1 -0
- package/dist/ai-context/index.js +13 -0
- package/dist/ai-context/index.js.map +1 -0
- package/dist/ai-context/manager.d.ts +67 -0
- package/dist/ai-context/manager.d.ts.map +1 -0
- package/dist/ai-context/manager.js +104 -0
- package/dist/ai-context/manager.js.map +1 -0
- package/dist/category-filter.d.ts +125 -0
- package/dist/category-filter.d.ts.map +1 -0
- package/dist/category-filter.js +360 -0
- package/dist/category-filter.js.map +1 -0
- package/dist/detect/ai-code/agent-tools.d.ts +22 -0
- package/dist/detect/ai-code/agent-tools.d.ts.map +1 -0
- package/dist/detect/ai-code/agent-tools.js +1509 -0
- package/dist/detect/ai-code/agent-tools.js.map +1 -0
- package/dist/detect/ai-code/byok-patterns.d.ts +15 -0
- package/dist/detect/ai-code/byok-patterns.d.ts.map +1 -0
- package/dist/detect/ai-code/byok-patterns.js +313 -0
- package/dist/detect/ai-code/byok-patterns.js.map +1 -0
- package/dist/detect/ai-code/endpoint-protection.d.ts +38 -0
- package/dist/detect/ai-code/endpoint-protection.d.ts.map +1 -0
- package/dist/detect/ai-code/endpoint-protection.js +349 -0
- package/dist/detect/ai-code/endpoint-protection.js.map +1 -0
- package/dist/detect/ai-code/execution-sinks.d.ts +21 -0
- package/dist/detect/ai-code/execution-sinks.d.ts.map +1 -0
- package/dist/detect/ai-code/execution-sinks.js +1158 -0
- package/dist/detect/ai-code/execution-sinks.js.map +1 -0
- package/dist/detect/ai-code/fingerprinting.d.ts +10 -0
- package/dist/detect/ai-code/fingerprinting.d.ts.map +1 -0
- package/dist/detect/ai-code/fingerprinting.js +665 -0
- package/dist/detect/ai-code/fingerprinting.js.map +1 -0
- package/dist/detect/ai-code/index.d.ts +12 -0
- package/dist/detect/ai-code/index.d.ts.map +1 -0
- package/dist/detect/ai-code/index.js +26 -0
- package/dist/detect/ai-code/index.js.map +1 -0
- package/dist/detect/ai-code/mcp-security.d.ts +20 -0
- package/dist/detect/ai-code/mcp-security.d.ts.map +1 -0
- package/dist/detect/ai-code/mcp-security.js +880 -0
- package/dist/detect/ai-code/mcp-security.js.map +1 -0
- package/dist/detect/ai-code/model-supply-chain.d.ts +23 -0
- package/dist/detect/ai-code/model-supply-chain.d.ts.map +1 -0
- package/dist/detect/ai-code/model-supply-chain.js +447 -0
- package/dist/detect/ai-code/model-supply-chain.js.map +1 -0
- package/dist/detect/ai-code/package-hallucination.d.ts +22 -0
- package/dist/detect/ai-code/package-hallucination.d.ts.map +1 -0
- package/dist/detect/ai-code/package-hallucination.js +841 -0
- package/dist/detect/ai-code/package-hallucination.js.map +1 -0
- package/dist/detect/ai-code/prompt-hygiene.d.ts +22 -0
- package/dist/detect/ai-code/prompt-hygiene.d.ts.map +1 -0
- package/dist/detect/ai-code/prompt-hygiene.js +1177 -0
- package/dist/detect/ai-code/prompt-hygiene.js.map +1 -0
- package/dist/detect/ai-code/rag-safety.d.ts +24 -0
- package/dist/detect/ai-code/rag-safety.d.ts.map +1 -0
- package/dist/detect/ai-code/rag-safety.js +913 -0
- package/dist/detect/ai-code/rag-safety.js.map +1 -0
- package/dist/detect/ai-code/schema-validation.d.ts +28 -0
- package/dist/detect/ai-code/schema-validation.d.ts.map +1 -0
- package/dist/detect/ai-code/schema-validation.js +378 -0
- package/dist/detect/ai-code/schema-validation.js.map +1 -0
- package/dist/detect/config/agent-skill-injection.d.ts +27 -0
- package/dist/detect/config/agent-skill-injection.d.ts.map +1 -0
- package/dist/detect/config/agent-skill-injection.js +472 -0
- package/dist/detect/config/agent-skill-injection.js.map +1 -0
- package/dist/detect/config/comments.d.ts +11 -0
- package/dist/detect/config/comments.d.ts.map +1 -0
- package/dist/detect/config/comments.js +206 -0
- package/dist/detect/config/comments.js.map +1 -0
- package/dist/detect/config/file-flags.d.ts +10 -0
- package/dist/detect/config/file-flags.d.ts.map +1 -0
- package/dist/detect/config/file-flags.js +124 -0
- package/dist/detect/config/file-flags.js.map +1 -0
- package/dist/detect/config/index.d.ts +7 -0
- package/dist/detect/config/index.d.ts.map +1 -0
- package/dist/detect/config/index.js +17 -0
- package/dist/detect/config/index.js.map +1 -0
- package/dist/detect/config/osv-check.d.ts +75 -0
- package/dist/detect/config/osv-check.d.ts.map +1 -0
- package/dist/detect/config/osv-check.js +309 -0
- package/dist/detect/config/osv-check.js.map +1 -0
- package/dist/detect/config/package-check.d.ts +63 -0
- package/dist/detect/config/package-check.d.ts.map +1 -0
- package/dist/detect/config/package-check.js +509 -0
- package/dist/detect/config/package-check.js.map +1 -0
- package/dist/detect/config/urls.d.ts +11 -0
- package/dist/detect/config/urls.d.ts.map +1 -0
- package/dist/detect/config/urls.js +450 -0
- package/dist/detect/config/urls.js.map +1 -0
- package/dist/detect/index.d.ts +37 -0
- package/dist/detect/index.d.ts.map +1 -0
- package/dist/detect/index.js +77 -0
- package/dist/detect/index.js.map +1 -0
- package/dist/detect/secrets/config-audit.d.ts +11 -0
- package/dist/detect/secrets/config-audit.d.ts.map +1 -0
- package/dist/detect/secrets/config-audit.js +315 -0
- package/dist/detect/secrets/config-audit.js.map +1 -0
- package/dist/detect/secrets/config-mcp-audit.d.ts +23 -0
- package/dist/detect/secrets/config-mcp-audit.d.ts.map +1 -0
- package/dist/detect/secrets/config-mcp-audit.js +243 -0
- package/dist/detect/secrets/config-mcp-audit.js.map +1 -0
- package/dist/detect/secrets/entropy.d.ts +11 -0
- package/dist/detect/secrets/entropy.d.ts.map +1 -0
- package/dist/detect/secrets/entropy.js +751 -0
- package/dist/detect/secrets/entropy.js.map +1 -0
- package/dist/detect/secrets/index.d.ts +36 -0
- package/dist/detect/secrets/index.d.ts.map +1 -0
- package/dist/detect/secrets/index.js +174 -0
- package/dist/detect/secrets/index.js.map +1 -0
- package/dist/detect/secrets/patterns.d.ts +11 -0
- package/dist/detect/secrets/patterns.d.ts.map +1 -0
- package/dist/detect/secrets/patterns.js +518 -0
- package/dist/detect/secrets/patterns.js.map +1 -0
- package/dist/detect/secrets/weak-crypto.d.ts +10 -0
- package/dist/detect/secrets/weak-crypto.d.ts.map +1 -0
- package/dist/detect/secrets/weak-crypto.js +432 -0
- package/dist/detect/secrets/weak-crypto.js.map +1 -0
- package/dist/detect/structural/auth-patterns.d.ts +22 -0
- package/dist/detect/structural/auth-patterns.d.ts.map +1 -0
- package/dist/detect/structural/auth-patterns.js +533 -0
- package/dist/detect/structural/auth-patterns.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/child-process.d.ts +16 -0
- package/dist/detect/structural/dangerous-functions/child-process.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/child-process.js +74 -0
- package/dist/detect/structural/dangerous-functions/child-process.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/dom-xss.d.ts +34 -0
- package/dist/detect/structural/dangerous-functions/dom-xss.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/dom-xss.js +230 -0
- package/dist/detect/structural/dangerous-functions/dom-xss.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/index.d.ts +16 -0
- package/dist/detect/structural/dangerous-functions/index.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/index.js +1193 -0
- package/dist/detect/structural/dangerous-functions/index.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/json-parse.d.ts +31 -0
- package/dist/detect/structural/dangerous-functions/json-parse.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/json-parse.js +326 -0
- package/dist/detect/structural/dangerous-functions/json-parse.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/math-random.d.ts +111 -0
- package/dist/detect/structural/dangerous-functions/math-random.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/math-random.js +684 -0
- package/dist/detect/structural/dangerous-functions/math-random.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/patterns.d.ts +21 -0
- package/dist/detect/structural/dangerous-functions/patterns.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/patterns.js +163 -0
- package/dist/detect/structural/dangerous-functions/patterns.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/request-validation.d.ts +13 -0
- package/dist/detect/structural/dangerous-functions/request-validation.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/request-validation.js +126 -0
- package/dist/detect/structural/dangerous-functions/request-validation.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/control-flow.d.ts +24 -0
- package/dist/detect/structural/dangerous-functions/utils/control-flow.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/control-flow.js +70 -0
- package/dist/detect/structural/dangerous-functions/utils/control-flow.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/helpers.d.ts +31 -0
- package/dist/detect/structural/dangerous-functions/utils/helpers.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/helpers.js +147 -0
- package/dist/detect/structural/dangerous-functions/utils/helpers.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/index.d.ts +9 -0
- package/dist/detect/structural/dangerous-functions/utils/index.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/index.js +23 -0
- package/dist/detect/structural/dangerous-functions/utils/index.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/schema-validation.d.ts +22 -0
- package/dist/detect/structural/dangerous-functions/utils/schema-validation.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/schema-validation.js +102 -0
- package/dist/detect/structural/dangerous-functions/utils/schema-validation.js.map +1 -0
- package/dist/detect/structural/data-exposure.d.ts +19 -0
- package/dist/detect/structural/data-exposure.d.ts.map +1 -0
- package/dist/detect/structural/data-exposure.js +262 -0
- package/dist/detect/structural/data-exposure.js.map +1 -0
- package/dist/detect/structural/framework-checks.d.ts +10 -0
- package/dist/detect/structural/framework-checks.d.ts.map +1 -0
- package/dist/detect/structural/framework-checks.js +389 -0
- package/dist/detect/structural/framework-checks.js.map +1 -0
- package/dist/detect/structural/index.d.ts +71 -0
- package/dist/detect/structural/index.d.ts.map +1 -0
- package/dist/detect/structural/index.js +510 -0
- package/dist/detect/structural/index.js.map +1 -0
- package/dist/detect/structural/log-injection.d.ts +18 -0
- package/dist/detect/structural/log-injection.d.ts.map +1 -0
- package/dist/detect/structural/log-injection.js +217 -0
- package/dist/detect/structural/log-injection.js.map +1 -0
- package/dist/detect/structural/logic-gates.d.ts +10 -0
- package/dist/detect/structural/logic-gates.d.ts.map +1 -0
- package/dist/detect/structural/logic-gates.js +227 -0
- package/dist/detect/structural/logic-gates.js.map +1 -0
- package/dist/detect/structural/risky-imports.d.ts +10 -0
- package/dist/detect/structural/risky-imports.d.ts.map +1 -0
- package/dist/detect/structural/risky-imports.js +168 -0
- package/dist/detect/structural/risky-imports.js.map +1 -0
- package/dist/detect/structural/security-headers.d.ts +18 -0
- package/dist/detect/structural/security-headers.d.ts.map +1 -0
- package/dist/detect/structural/security-headers.js +196 -0
- package/dist/detect/structural/security-headers.js.map +1 -0
- package/dist/detect/structural/ssrf-detection.d.ts +18 -0
- package/dist/detect/structural/ssrf-detection.d.ts.map +1 -0
- package/dist/detect/structural/ssrf-detection.js +263 -0
- package/dist/detect/structural/ssrf-detection.js.map +1 -0
- package/dist/detect/structural/variables.d.ts +11 -0
- package/dist/detect/structural/variables.d.ts.map +1 -0
- package/dist/detect/structural/variables.js +159 -0
- package/dist/detect/structural/variables.js.map +1 -0
- package/dist/detect/structural/xxe-detection.d.ts +18 -0
- package/dist/detect/structural/xxe-detection.d.ts.map +1 -0
- package/dist/detect/structural/xxe-detection.js +245 -0
- package/dist/detect/structural/xxe-detection.js.map +1 -0
- package/dist/filtering/context-adjustments.d.ts +23 -0
- package/dist/filtering/context-adjustments.d.ts.map +1 -0
- package/dist/filtering/context-adjustments.js +100 -0
- package/dist/filtering/context-adjustments.js.map +1 -0
- package/dist/filtering/index.d.ts +3 -0
- package/dist/filtering/index.d.ts.map +1 -0
- package/dist/filtering/index.js +8 -0
- package/dist/filtering/index.js.map +1 -0
- package/dist/filtering/pipeline.d.ts +48 -0
- package/dist/filtering/pipeline.d.ts.map +1 -0
- package/dist/filtering/pipeline.js +76 -0
- package/dist/filtering/pipeline.js.map +1 -0
- package/dist/formatters/ai-context.d.ts +23 -0
- package/dist/formatters/ai-context.d.ts.map +1 -0
- package/dist/formatters/ai-context.js +238 -0
- package/dist/formatters/ai-context.js.map +1 -0
- package/dist/formatters/github-comment.d.ts +1 -1
- package/dist/formatters/github-comment.d.ts.map +1 -1
- package/dist/formatters/github-comment.js +2 -2
- package/dist/formatters/github-comment.js.map +1 -1
- package/dist/formatters/ide/claude-code.d.ts +17 -0
- package/dist/formatters/ide/claude-code.d.ts.map +1 -0
- package/dist/formatters/ide/claude-code.js +94 -0
- package/dist/formatters/ide/claude-code.js.map +1 -0
- package/dist/formatters/ide/cursor.d.ts +13 -0
- package/dist/formatters/ide/cursor.d.ts.map +1 -0
- package/dist/formatters/ide/cursor.js +125 -0
- package/dist/formatters/ide/cursor.js.map +1 -0
- package/dist/formatters/ide/index.d.ts +62 -0
- package/dist/formatters/ide/index.d.ts.map +1 -0
- package/dist/formatters/ide/index.js +184 -0
- package/dist/formatters/ide/index.js.map +1 -0
- package/dist/formatters/ide/windsurf.d.ts +13 -0
- package/dist/formatters/ide/windsurf.d.ts.map +1 -0
- package/dist/formatters/ide/windsurf.js +117 -0
- package/dist/formatters/ide/windsurf.js.map +1 -0
- package/dist/formatters/index.d.ts +2 -0
- package/dist/formatters/index.d.ts.map +1 -1
- package/dist/formatters/index.js +17 -1
- package/dist/formatters/index.js.map +1 -1
- package/dist/index.d.ts +17 -60
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +67 -824
- package/dist/index.js.map +1 -1
- package/dist/layer1/comments.d.ts +4 -1
- package/dist/layer1/comments.d.ts.map +1 -1
- package/dist/layer1/comments.js +1 -1
- package/dist/layer1/comments.js.map +1 -1
- package/dist/layer1/config-audit.d.ts +4 -1
- package/dist/layer1/config-audit.d.ts.map +1 -1
- package/dist/layer1/config-audit.js +45 -11
- package/dist/layer1/config-audit.js.map +1 -1
- package/dist/layer1/config-mcp-audit.d.ts +4 -1
- package/dist/layer1/config-mcp-audit.d.ts.map +1 -1
- package/dist/layer1/config-mcp-audit.js +2 -2
- package/dist/layer1/config-mcp-audit.js.map +1 -1
- package/dist/layer1/entropy.d.ts +4 -1
- package/dist/layer1/entropy.d.ts.map +1 -1
- package/dist/layer1/entropy.js +212 -1
- package/dist/layer1/entropy.js.map +1 -1
- package/dist/layer1/file-flags.d.ts +4 -1
- package/dist/layer1/file-flags.d.ts.map +1 -1
- package/dist/layer1/file-flags.js +12 -5
- package/dist/layer1/file-flags.js.map +1 -1
- package/dist/layer1/index.d.ts.map +1 -1
- package/dist/layer1/index.js +14 -19
- package/dist/layer1/index.js.map +1 -1
- package/dist/layer1/patterns.d.ts +4 -1
- package/dist/layer1/patterns.d.ts.map +1 -1
- package/dist/layer1/patterns.js +34 -4
- package/dist/layer1/patterns.js.map +1 -1
- package/dist/layer1/urls.d.ts +4 -1
- package/dist/layer1/urls.d.ts.map +1 -1
- package/dist/layer1/urls.js +162 -14
- package/dist/layer1/urls.js.map +1 -1
- package/dist/layer1/weak-crypto.d.ts +4 -1
- package/dist/layer1/weak-crypto.d.ts.map +1 -1
- package/dist/layer1/weak-crypto.js +144 -7
- package/dist/layer1/weak-crypto.js.map +1 -1
- package/dist/layer2/ai-agent-tools.d.ts +4 -1
- package/dist/layer2/ai-agent-tools.d.ts.map +1 -1
- package/dist/layer2/ai-agent-tools.js +661 -2
- package/dist/layer2/ai-agent-tools.js.map +1 -1
- package/dist/layer2/ai-endpoint-protection.d.ts +2 -0
- package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -1
- package/dist/layer2/ai-endpoint-protection.js +1 -1
- package/dist/layer2/ai-endpoint-protection.js.map +1 -1
- package/dist/layer2/ai-execution-sinks.d.ts +4 -1
- package/dist/layer2/ai-execution-sinks.d.ts.map +1 -1
- package/dist/layer2/ai-execution-sinks.js +252 -43
- package/dist/layer2/ai-execution-sinks.js.map +1 -1
- package/dist/layer2/ai-fingerprinting.d.ts +4 -1
- package/dist/layer2/ai-fingerprinting.d.ts.map +1 -1
- package/dist/layer2/ai-fingerprinting.js +25 -32
- package/dist/layer2/ai-fingerprinting.js.map +1 -1
- package/dist/layer2/ai-mcp-security.d.ts +4 -1
- package/dist/layer2/ai-mcp-security.d.ts.map +1 -1
- package/dist/layer2/ai-mcp-security.js +200 -2
- package/dist/layer2/ai-mcp-security.js.map +1 -1
- package/dist/layer2/ai-package-hallucination.d.ts +4 -1
- package/dist/layer2/ai-package-hallucination.d.ts.map +1 -1
- package/dist/layer2/ai-package-hallucination.js +136 -4
- package/dist/layer2/ai-package-hallucination.js.map +1 -1
- package/dist/layer2/ai-prompt-hygiene.d.ts +4 -1
- package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -1
- package/dist/layer2/ai-prompt-hygiene.js +342 -28
- package/dist/layer2/ai-prompt-hygiene.js.map +1 -1
- package/dist/layer2/ai-rag-safety.d.ts +4 -1
- package/dist/layer2/ai-rag-safety.d.ts.map +1 -1
- package/dist/layer2/ai-rag-safety.js +82 -2
- package/dist/layer2/ai-rag-safety.js.map +1 -1
- package/dist/layer2/ai-schema-validation.d.ts +4 -1
- package/dist/layer2/ai-schema-validation.d.ts.map +1 -1
- package/dist/layer2/ai-schema-validation.js +2 -2
- package/dist/layer2/ai-schema-validation.js.map +1 -1
- package/dist/layer2/auth-antipatterns.d.ts +2 -0
- package/dist/layer2/auth-antipatterns.d.ts.map +1 -1
- package/dist/layer2/auth-antipatterns.js +205 -20
- package/dist/layer2/auth-antipatterns.js.map +1 -1
- package/dist/layer2/byok-patterns.d.ts +4 -1
- package/dist/layer2/byok-patterns.d.ts.map +1 -1
- package/dist/layer2/byok-patterns.js +2 -2
- package/dist/layer2/byok-patterns.js.map +1 -1
- package/dist/layer2/dangerous-functions/dom-xss.d.ts +9 -4
- package/dist/layer2/dangerous-functions/dom-xss.d.ts.map +1 -1
- package/dist/layer2/dangerous-functions/dom-xss.js +73 -22
- package/dist/layer2/dangerous-functions/dom-xss.js.map +1 -1
- package/dist/layer2/dangerous-functions/index.d.ts +4 -1
- package/dist/layer2/dangerous-functions/index.d.ts.map +1 -1
- package/dist/layer2/dangerous-functions/index.js +551 -20
- package/dist/layer2/dangerous-functions/index.js.map +1 -1
- package/dist/layer2/dangerous-functions/math-random.d.ts +54 -4
- package/dist/layer2/dangerous-functions/math-random.d.ts.map +1 -1
- package/dist/layer2/dangerous-functions/math-random.js +241 -16
- package/dist/layer2/dangerous-functions/math-random.js.map +1 -1
- package/dist/layer2/dangerous-functions/patterns.d.ts.map +1 -1
- package/dist/layer2/dangerous-functions/patterns.js +3 -1
- package/dist/layer2/dangerous-functions/patterns.js.map +1 -1
- package/dist/layer2/dangerous-functions/utils/control-flow.d.ts +3 -2
- package/dist/layer2/dangerous-functions/utils/control-flow.d.ts.map +1 -1
- package/dist/layer2/dangerous-functions/utils/control-flow.js +41 -120
- package/dist/layer2/dangerous-functions/utils/control-flow.js.map +1 -1
- package/dist/layer2/dangerous-functions/utils/helpers.d.ts.map +1 -1
- package/dist/layer2/dangerous-functions/utils/helpers.js +26 -3
- package/dist/layer2/dangerous-functions/utils/helpers.js.map +1 -1
- package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts.map +1 -1
- package/dist/layer2/dangerous-functions/utils/schema-validation.js +14 -1
- package/dist/layer2/dangerous-functions/utils/schema-validation.js.map +1 -1
- package/dist/layer2/data-exposure.d.ts +4 -1
- package/dist/layer2/data-exposure.d.ts.map +1 -1
- package/dist/layer2/data-exposure.js +11 -38
- package/dist/layer2/data-exposure.js.map +1 -1
- package/dist/layer2/framework-checks.d.ts +4 -1
- package/dist/layer2/framework-checks.d.ts.map +1 -1
- package/dist/layer2/framework-checks.js +3 -10
- package/dist/layer2/framework-checks.js.map +1 -1
- package/dist/layer2/index.d.ts +13 -1
- package/dist/layer2/index.d.ts.map +1 -1
- package/dist/layer2/index.js +107 -52
- package/dist/layer2/index.js.map +1 -1
- package/dist/layer2/log-injection.d.ts +18 -0
- package/dist/layer2/log-injection.d.ts.map +1 -0
- package/dist/layer2/log-injection.js +214 -0
- package/dist/layer2/log-injection.js.map +1 -0
- package/dist/layer2/logic-gates.d.ts +4 -1
- package/dist/layer2/logic-gates.d.ts.map +1 -1
- package/dist/layer2/logic-gates.js +54 -20
- package/dist/layer2/logic-gates.js.map +1 -1
- package/dist/layer2/model-supply-chain.d.ts +4 -1
- package/dist/layer2/model-supply-chain.d.ts.map +1 -1
- package/dist/layer2/model-supply-chain.js +72 -4
- package/dist/layer2/model-supply-chain.js.map +1 -1
- package/dist/layer2/risky-imports.d.ts +4 -1
- package/dist/layer2/risky-imports.d.ts.map +1 -1
- package/dist/layer2/risky-imports.js +2 -2
- package/dist/layer2/risky-imports.js.map +1 -1
- package/dist/layer2/security-headers.d.ts +18 -0
- package/dist/layer2/security-headers.d.ts.map +1 -0
- package/dist/layer2/security-headers.js +187 -0
- package/dist/layer2/security-headers.js.map +1 -0
- package/dist/layer2/ssrf-detection.d.ts +18 -0
- package/dist/layer2/ssrf-detection.d.ts.map +1 -0
- package/dist/layer2/ssrf-detection.js +252 -0
- package/dist/layer2/ssrf-detection.js.map +1 -0
- package/dist/layer2/variables.d.ts +4 -1
- package/dist/layer2/variables.d.ts.map +1 -1
- package/dist/layer2/variables.js +2 -2
- package/dist/layer2/variables.js.map +1 -1
- package/dist/layer2/xxe-detection.d.ts +18 -0
- package/dist/layer2/xxe-detection.d.ts.map +1 -0
- package/dist/layer2/xxe-detection.js +242 -0
- package/dist/layer2/xxe-detection.js.map +1 -0
- package/dist/layer3/anthropic/auto-dismiss.d.ts.map +1 -1
- package/dist/layer3/anthropic/auto-dismiss.js +11 -0
- package/dist/layer3/anthropic/auto-dismiss.js.map +1 -1
- package/dist/layer3/anthropic/prompts/index.d.ts +1 -1
- package/dist/layer3/anthropic/prompts/index.d.ts.map +1 -1
- package/dist/layer3/anthropic/prompts/index.js +3 -1
- package/dist/layer3/anthropic/prompts/index.js.map +1 -1
- package/dist/layer3/anthropic/prompts/modules/ai-patterns.d.ts +19 -0
- package/dist/layer3/anthropic/prompts/modules/ai-patterns.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/ai-patterns.js +156 -0
- package/dist/layer3/anthropic/prompts/modules/ai-patterns.js.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/auth-access.d.ts +9 -0
- package/dist/layer3/anthropic/prompts/modules/auth-access.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/auth-access.js +25 -0
- package/dist/layer3/anthropic/prompts/modules/auth-access.js.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/common.d.ts +11 -0
- package/dist/layer3/anthropic/prompts/modules/common.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/common.js +152 -0
- package/dist/layer3/anthropic/prompts/modules/common.js.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/index.d.ts +54 -0
- package/dist/layer3/anthropic/prompts/modules/index.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/index.js +185 -0
- package/dist/layer3/anthropic/prompts/modules/index.js.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/owasp-classic.d.ts +8 -0
- package/dist/layer3/anthropic/prompts/modules/owasp-classic.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/owasp-classic.js +84 -0
- package/dist/layer3/anthropic/prompts/modules/owasp-classic.js.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/secrets-crypto.d.ts +8 -0
- package/dist/layer3/anthropic/prompts/modules/secrets-crypto.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/secrets-crypto.js +68 -0
- package/dist/layer3/anthropic/prompts/modules/secrets-crypto.js.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/xss-prompt.d.ts +8 -0
- package/dist/layer3/anthropic/prompts/modules/xss-prompt.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/xss-prompt.js +22 -0
- package/dist/layer3/anthropic/prompts/modules/xss-prompt.js.map +1 -0
- package/dist/layer3/anthropic/prompts/validation.d.ts +9 -3
- package/dist/layer3/anthropic/prompts/validation.d.ts.map +1 -1
- package/dist/layer3/anthropic/prompts/validation.js +14 -410
- package/dist/layer3/anthropic/prompts/validation.js.map +1 -1
- package/dist/layer3/anthropic/providers/anthropic.d.ts.map +1 -1
- package/dist/layer3/anthropic/providers/anthropic.js +6 -3
- package/dist/layer3/anthropic/providers/anthropic.js.map +1 -1
- package/dist/layer3/anthropic/providers/openai.d.ts.map +1 -1
- package/dist/layer3/anthropic/providers/openai.js +6 -3
- package/dist/layer3/anthropic/providers/openai.js.map +1 -1
- package/dist/layer3/anthropic/request-builder.d.ts +11 -4
- package/dist/layer3/anthropic/request-builder.d.ts.map +1 -1
- package/dist/layer3/anthropic/request-builder.js +32 -16
- package/dist/layer3/anthropic/request-builder.js.map +1 -1
- package/dist/layer3/anthropic/utils/context-extractor.d.ts +55 -0
- package/dist/layer3/anthropic/utils/context-extractor.d.ts.map +1 -0
- package/dist/layer3/anthropic/utils/context-extractor.js +161 -0
- package/dist/layer3/anthropic/utils/context-extractor.js.map +1 -0
- package/dist/layer3/anthropic/utils/index.d.ts +2 -0
- package/dist/layer3/anthropic/utils/index.d.ts.map +1 -1
- package/dist/layer3/anthropic/utils/index.js +4 -1
- package/dist/layer3/anthropic/utils/index.js.map +1 -1
- package/dist/model/auth-helper-detector.d.ts +56 -0
- package/dist/model/auth-helper-detector.d.ts.map +1 -0
- package/dist/model/auth-helper-detector.js +360 -0
- package/dist/model/auth-helper-detector.js.map +1 -0
- package/dist/model/cross-file-taint.d.ts +40 -0
- package/dist/model/cross-file-taint.d.ts.map +1 -0
- package/dist/model/cross-file-taint.js +290 -0
- package/dist/model/cross-file-taint.js.map +1 -0
- package/dist/model/framework-models/django.d.ts +9 -0
- package/dist/model/framework-models/django.d.ts.map +1 -0
- package/dist/model/framework-models/django.js +82 -0
- package/dist/model/framework-models/django.js.map +1 -0
- package/dist/model/framework-models/express.d.ts +9 -0
- package/dist/model/framework-models/express.d.ts.map +1 -0
- package/dist/model/framework-models/express.js +52 -0
- package/dist/model/framework-models/express.js.map +1 -0
- package/dist/model/framework-models/index.d.ts +20 -0
- package/dist/model/framework-models/index.d.ts.map +1 -0
- package/dist/model/framework-models/index.js +102 -0
- package/dist/model/framework-models/index.js.map +1 -0
- package/dist/model/framework-models/nextjs.d.ts +9 -0
- package/dist/model/framework-models/nextjs.d.ts.map +1 -0
- package/dist/model/framework-models/nextjs.js +71 -0
- package/dist/model/framework-models/nextjs.js.map +1 -0
- package/dist/model/framework-models/prisma.d.ts +10 -0
- package/dist/model/framework-models/prisma.d.ts.map +1 -0
- package/dist/model/framework-models/prisma.js +54 -0
- package/dist/model/framework-models/prisma.js.map +1 -0
- package/dist/model/framework-models/react.d.ts +9 -0
- package/dist/model/framework-models/react.d.ts.map +1 -0
- package/dist/model/framework-models/react.js +67 -0
- package/dist/model/framework-models/react.js.map +1 -0
- package/dist/model/framework-models/sequelize.d.ts +9 -0
- package/dist/model/framework-models/sequelize.d.ts.map +1 -0
- package/dist/model/framework-models/sequelize.js +62 -0
- package/dist/model/framework-models/sequelize.js.map +1 -0
- package/dist/model/framework-models/types.d.ts +43 -0
- package/dist/model/framework-models/types.d.ts.map +1 -0
- package/dist/model/framework-models/types.js +10 -0
- package/dist/model/framework-models/types.js.map +1 -0
- package/dist/model/function-classifier.d.ts +32 -0
- package/dist/model/function-classifier.d.ts.map +1 -0
- package/dist/model/function-classifier.js +143 -0
- package/dist/model/function-classifier.js.map +1 -0
- package/dist/model/import-resolver.d.ts +45 -0
- package/dist/model/import-resolver.d.ts.map +1 -0
- package/dist/model/import-resolver.js +410 -0
- package/dist/model/import-resolver.js.map +1 -0
- package/dist/model/imported-auth-detector.d.ts +38 -0
- package/dist/model/imported-auth-detector.d.ts.map +1 -0
- package/dist/model/imported-auth-detector.js +199 -0
- package/dist/model/imported-auth-detector.js.map +1 -0
- package/dist/model/index.d.ts +63 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +272 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/middleware-detector.d.ts +55 -0
- package/dist/model/middleware-detector.d.ts.map +1 -0
- package/dist/model/middleware-detector.js +382 -0
- package/dist/model/middleware-detector.js.map +1 -0
- package/dist/model/module-graph.d.ts +46 -0
- package/dist/model/module-graph.d.ts.map +1 -0
- package/dist/model/module-graph.js +187 -0
- package/dist/model/module-graph.js.map +1 -0
- package/dist/model/oauth-flow-detector.d.ts +41 -0
- package/dist/model/oauth-flow-detector.d.ts.map +1 -0
- package/dist/model/oauth-flow-detector.js +202 -0
- package/dist/model/oauth-flow-detector.js.map +1 -0
- package/dist/model/project-context.d.ts +119 -0
- package/dist/model/project-context.d.ts.map +1 -0
- package/dist/model/project-context.js +534 -0
- package/dist/model/project-context.js.map +1 -0
- package/dist/model/route-auth-resolver.d.ts +27 -0
- package/dist/model/route-auth-resolver.d.ts.map +1 -0
- package/dist/model/route-auth-resolver.js +182 -0
- package/dist/model/route-auth-resolver.js.map +1 -0
- package/dist/model/route-discovery/express.d.ts +25 -0
- package/dist/model/route-discovery/express.d.ts.map +1 -0
- package/dist/model/route-discovery/express.js +225 -0
- package/dist/model/route-discovery/express.js.map +1 -0
- package/dist/model/route-discovery/index.d.ts +21 -0
- package/dist/model/route-discovery/index.d.ts.map +1 -0
- package/dist/model/route-discovery/index.js +67 -0
- package/dist/model/route-discovery/index.js.map +1 -0
- package/dist/model/route-discovery/nextjs.d.ts +16 -0
- package/dist/model/route-discovery/nextjs.d.ts.map +1 -0
- package/dist/model/route-discovery/nextjs.js +179 -0
- package/dist/model/route-discovery/nextjs.js.map +1 -0
- package/dist/model/route-discovery/python.d.ts +16 -0
- package/dist/model/route-discovery/python.d.ts.map +1 -0
- package/dist/model/route-discovery/python.js +181 -0
- package/dist/model/route-discovery/python.js.map +1 -0
- package/dist/model/route-discovery/types.d.ts +36 -0
- package/dist/model/route-discovery/types.d.ts.map +1 -0
- package/dist/model/route-discovery/types.js +16 -0
- package/dist/model/route-discovery/types.js.map +1 -0
- package/dist/model/route-discovery/utils.d.ts +18 -0
- package/dist/model/route-discovery/utils.d.ts.map +1 -0
- package/dist/model/route-discovery/utils.js +55 -0
- package/dist/model/route-discovery/utils.js.map +1 -0
- package/dist/model/route-hierarchy.d.ts +50 -0
- package/dist/model/route-hierarchy.d.ts.map +1 -0
- package/dist/model/route-hierarchy.js +226 -0
- package/dist/model/route-hierarchy.js.map +1 -0
- package/dist/model/sanitiser-detection.d.ts +27 -0
- package/dist/model/sanitiser-detection.d.ts.map +1 -0
- package/dist/model/sanitiser-detection.js +224 -0
- package/dist/model/sanitiser-detection.js.map +1 -0
- package/dist/model/sink-matcher.d.ts +17 -0
- package/dist/model/sink-matcher.d.ts.map +1 -0
- package/dist/model/sink-matcher.js +141 -0
- package/dist/model/sink-matcher.js.map +1 -0
- package/dist/model/sink-patterns.d.ts +19 -0
- package/dist/model/sink-patterns.d.ts.map +1 -0
- package/dist/model/sink-patterns.js +88 -0
- package/dist/model/sink-patterns.js.map +1 -0
- package/dist/model/source-discovery.d.ts +15 -0
- package/dist/model/source-discovery.d.ts.map +1 -0
- package/dist/model/source-discovery.js +170 -0
- package/dist/model/source-discovery.js.map +1 -0
- package/dist/model/taint-tracker.d.ts +21 -0
- package/dist/model/taint-tracker.d.ts.map +1 -0
- package/dist/model/taint-tracker.js +281 -0
- package/dist/model/taint-tracker.js.map +1 -0
- package/dist/model/taint-types.d.ts +74 -0
- package/dist/model/taint-types.d.ts.map +1 -0
- package/dist/model/taint-types.js +9 -0
- package/dist/model/taint-types.js.map +1 -0
- package/dist/model/trpc-analyzer.d.ts +78 -0
- package/dist/model/trpc-analyzer.d.ts.map +1 -0
- package/dist/model/trpc-analyzer.js +297 -0
- package/dist/model/trpc-analyzer.js.map +1 -0
- package/dist/modes/incremental.js +1 -1
- package/dist/parse/file-classifier.d.ts +228 -0
- package/dist/parse/file-classifier.d.ts.map +1 -0
- package/dist/parse/file-classifier.js +933 -0
- package/dist/parse/file-classifier.js.map +1 -0
- package/dist/parse/path-exclusions.d.ts +55 -0
- package/dist/parse/path-exclusions.d.ts.map +1 -0
- package/dist/parse/path-exclusions.js +224 -0
- package/dist/parse/path-exclusions.js.map +1 -0
- package/dist/pipeline/config.d.ts +39 -0
- package/dist/pipeline/config.d.ts.map +1 -0
- package/dist/pipeline/config.js +46 -0
- package/dist/pipeline/config.js.map +1 -0
- package/dist/pipeline/index.d.ts +34 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +377 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/modes/incremental.d.ts +66 -0
- package/dist/pipeline/modes/incremental.d.ts.map +1 -0
- package/dist/pipeline/modes/incremental.js +200 -0
- package/dist/pipeline/modes/incremental.js.map +1 -0
- package/dist/postprocess/aggregation.d.ts +14 -0
- package/dist/postprocess/aggregation.d.ts.map +1 -0
- package/dist/postprocess/aggregation.js +63 -0
- package/dist/postprocess/aggregation.js.map +1 -0
- package/dist/postprocess/contradictions.d.ts +18 -0
- package/dist/postprocess/contradictions.d.ts.map +1 -0
- package/dist/postprocess/contradictions.js +99 -0
- package/dist/postprocess/contradictions.js.map +1 -0
- package/dist/postprocess/dedup.d.ts +13 -0
- package/dist/postprocess/dedup.d.ts.map +1 -0
- package/dist/postprocess/dedup.js +58 -0
- package/dist/postprocess/dedup.js.map +1 -0
- package/dist/postprocess/filtering/context-adjustments.d.ts +23 -0
- package/dist/postprocess/filtering/context-adjustments.d.ts.map +1 -0
- package/dist/postprocess/filtering/context-adjustments.js +100 -0
- package/dist/postprocess/filtering/context-adjustments.js.map +1 -0
- package/dist/postprocess/filtering/index.d.ts +3 -0
- package/dist/postprocess/filtering/index.d.ts.map +1 -0
- package/dist/postprocess/filtering/index.js +8 -0
- package/dist/postprocess/filtering/index.js.map +1 -0
- package/dist/postprocess/filtering/pipeline.d.ts +48 -0
- package/dist/postprocess/filtering/pipeline.d.ts.map +1 -0
- package/dist/postprocess/filtering/pipeline.js +76 -0
- package/dist/postprocess/filtering/pipeline.js.map +1 -0
- package/dist/postprocess/index.d.ts +41 -0
- package/dist/postprocess/index.d.ts.map +1 -0
- package/dist/postprocess/index.js +85 -0
- package/dist/postprocess/index.js.map +1 -0
- package/dist/postprocess/suppression/config-loader.d.ts +74 -0
- package/dist/postprocess/suppression/config-loader.d.ts.map +1 -0
- package/dist/postprocess/suppression/config-loader.js +424 -0
- package/dist/postprocess/suppression/config-loader.js.map +1 -0
- package/dist/postprocess/suppression/hash.d.ts +48 -0
- package/dist/postprocess/suppression/hash.d.ts.map +1 -0
- package/dist/postprocess/suppression/hash.js +88 -0
- package/dist/postprocess/suppression/hash.js.map +1 -0
- package/dist/postprocess/suppression/index.d.ts +11 -0
- package/dist/postprocess/suppression/index.d.ts.map +1 -0
- package/dist/postprocess/suppression/index.js +39 -0
- package/dist/postprocess/suppression/index.js.map +1 -0
- package/dist/postprocess/suppression/inline-parser.d.ts +39 -0
- package/dist/postprocess/suppression/inline-parser.d.ts.map +1 -0
- package/dist/postprocess/suppression/inline-parser.js +218 -0
- package/dist/postprocess/suppression/inline-parser.js.map +1 -0
- package/dist/postprocess/suppression/manager.d.ts +94 -0
- package/dist/postprocess/suppression/manager.d.ts.map +1 -0
- package/dist/postprocess/suppression/manager.js +292 -0
- package/dist/postprocess/suppression/manager.js.map +1 -0
- package/dist/postprocess/suppression/types.d.ts +151 -0
- package/dist/postprocess/suppression/types.d.ts.map +1 -0
- package/dist/postprocess/suppression/types.js +28 -0
- package/dist/postprocess/suppression/types.js.map +1 -0
- package/dist/postprocess/validation-cap.d.ts +17 -0
- package/dist/postprocess/validation-cap.d.ts.map +1 -0
- package/dist/postprocess/validation-cap.js +64 -0
- package/dist/postprocess/validation-cap.js.map +1 -0
- package/dist/report/build-result.d.ts +33 -0
- package/dist/report/build-result.d.ts.map +1 -0
- package/dist/report/build-result.js +59 -0
- package/dist/report/build-result.js.map +1 -0
- package/dist/report/enrichment.d.ts +19 -0
- package/dist/report/enrichment.d.ts.map +1 -0
- package/dist/report/enrichment.js +44 -0
- package/dist/report/enrichment.js.map +1 -0
- package/dist/report/formatters/ai-context.d.ts +23 -0
- package/dist/report/formatters/ai-context.d.ts.map +1 -0
- package/dist/report/formatters/ai-context.js +238 -0
- package/dist/report/formatters/ai-context.js.map +1 -0
- package/dist/report/formatters/cli-terminal.d.ts +65 -0
- package/dist/report/formatters/cli-terminal.d.ts.map +1 -0
- package/dist/report/formatters/cli-terminal.js +735 -0
- package/dist/report/formatters/cli-terminal.js.map +1 -0
- package/dist/report/formatters/github-comment.d.ts +41 -0
- package/dist/report/formatters/github-comment.d.ts.map +1 -0
- package/dist/report/formatters/github-comment.js +370 -0
- package/dist/report/formatters/github-comment.js.map +1 -0
- package/dist/report/formatters/grouping.d.ts +52 -0
- package/dist/report/formatters/grouping.d.ts.map +1 -0
- package/dist/report/formatters/grouping.js +152 -0
- package/dist/report/formatters/grouping.js.map +1 -0
- package/dist/report/formatters/ide/claude-code.d.ts +17 -0
- package/dist/report/formatters/ide/claude-code.d.ts.map +1 -0
- package/dist/report/formatters/ide/claude-code.js +94 -0
- package/dist/report/formatters/ide/claude-code.js.map +1 -0
- package/dist/report/formatters/ide/cursor.d.ts +13 -0
- package/dist/report/formatters/ide/cursor.d.ts.map +1 -0
- package/dist/report/formatters/ide/cursor.js +125 -0
- package/dist/report/formatters/ide/cursor.js.map +1 -0
- package/dist/report/formatters/ide/index.d.ts +62 -0
- package/dist/report/formatters/ide/index.d.ts.map +1 -0
- package/dist/report/formatters/ide/index.js +184 -0
- package/dist/report/formatters/ide/index.js.map +1 -0
- package/dist/report/formatters/ide/windsurf.d.ts +13 -0
- package/dist/report/formatters/ide/windsurf.d.ts.map +1 -0
- package/dist/report/formatters/ide/windsurf.js +117 -0
- package/dist/report/formatters/ide/windsurf.js.map +1 -0
- package/dist/report/formatters/index.d.ts +11 -0
- package/dist/report/formatters/index.d.ts.map +1 -0
- package/dist/report/formatters/index.js +54 -0
- package/dist/report/formatters/index.js.map +1 -0
- package/dist/report/formatters/vscode-diagnostic.d.ts +103 -0
- package/dist/report/formatters/vscode-diagnostic.d.ts.map +1 -0
- package/dist/report/formatters/vscode-diagnostic.js +151 -0
- package/dist/report/formatters/vscode-diagnostic.js.map +1 -0
- package/dist/report/summary.d.ts +27 -0
- package/dist/report/summary.d.ts.map +1 -0
- package/dist/report/summary.js +57 -0
- package/dist/report/summary.js.map +1 -0
- package/dist/rules/metadata.d.ts.map +1 -1
- package/dist/rules/metadata.js +66 -0
- package/dist/rules/metadata.js.map +1 -1
- package/dist/score/adjustments.d.ts +22 -0
- package/dist/score/adjustments.d.ts.map +1 -0
- package/dist/score/adjustments.js +373 -0
- package/dist/score/adjustments.js.map +1 -0
- package/dist/score/auto-dismiss.d.ts +28 -0
- package/dist/score/auto-dismiss.d.ts.map +1 -0
- package/dist/score/auto-dismiss.js +200 -0
- package/dist/score/auto-dismiss.js.map +1 -0
- package/dist/score/confidence.d.ts +19 -0
- package/dist/score/confidence.d.ts.map +1 -0
- package/dist/score/confidence.js +52 -0
- package/dist/score/confidence.js.map +1 -0
- package/dist/score/index.d.ts +61 -0
- package/dist/score/index.d.ts.map +1 -0
- package/dist/score/index.js +250 -0
- package/dist/score/index.js.map +1 -0
- package/dist/score/types.d.ts +160 -0
- package/dist/score/types.d.ts.map +1 -0
- package/dist/score/types.js +14 -0
- package/dist/score/types.js.map +1 -0
- package/dist/shared/ai-context/index.d.ts +6 -0
- package/dist/shared/ai-context/index.d.ts.map +1 -0
- package/dist/shared/ai-context/index.js +13 -0
- package/dist/shared/ai-context/index.js.map +1 -0
- package/dist/shared/ai-context/manager.d.ts +67 -0
- package/dist/shared/ai-context/manager.d.ts.map +1 -0
- package/dist/shared/ai-context/manager.js +104 -0
- package/dist/shared/ai-context/manager.js.map +1 -0
- package/dist/shared/baseline/diff.d.ts +32 -0
- package/dist/shared/baseline/diff.d.ts.map +1 -0
- package/dist/shared/baseline/diff.js +119 -0
- package/dist/shared/baseline/diff.js.map +1 -0
- package/dist/shared/baseline/index.d.ts +9 -0
- package/dist/shared/baseline/index.d.ts.map +1 -0
- package/dist/shared/baseline/index.js +19 -0
- package/dist/shared/baseline/index.js.map +1 -0
- package/dist/shared/baseline/manager.d.ts +67 -0
- package/dist/shared/baseline/manager.d.ts.map +1 -0
- package/dist/shared/baseline/manager.js +180 -0
- package/dist/shared/baseline/manager.js.map +1 -0
- package/dist/shared/baseline/types.d.ts +91 -0
- package/dist/shared/baseline/types.d.ts.map +1 -0
- package/dist/shared/baseline/types.js +12 -0
- package/dist/shared/baseline/types.js.map +1 -0
- package/dist/shared/category-filter.d.ts +125 -0
- package/dist/shared/category-filter.d.ts.map +1 -0
- package/dist/shared/category-filter.js +360 -0
- package/dist/shared/category-filter.js.map +1 -0
- package/dist/shared/code-analysis.d.ts +39 -0
- package/dist/shared/code-analysis.d.ts.map +1 -0
- package/dist/shared/code-analysis.js +159 -0
- package/dist/shared/code-analysis.js.map +1 -0
- package/dist/shared/comment-analyzer.d.ts +38 -0
- package/dist/shared/comment-analyzer.d.ts.map +1 -0
- package/dist/shared/comment-analyzer.js +218 -0
- package/dist/shared/comment-analyzer.js.map +1 -0
- package/dist/shared/diff-detector.d.ts +53 -0
- package/dist/shared/diff-detector.d.ts.map +1 -0
- package/dist/shared/diff-detector.js +104 -0
- package/dist/shared/diff-detector.js.map +1 -0
- package/dist/shared/diff-parser.d.ts +80 -0
- package/dist/shared/diff-parser.d.ts.map +1 -0
- package/dist/shared/diff-parser.js +202 -0
- package/dist/shared/diff-parser.js.map +1 -0
- package/dist/shared/environment-context.d.ts +76 -0
- package/dist/shared/environment-context.d.ts.map +1 -0
- package/dist/shared/environment-context.js +271 -0
- package/dist/shared/environment-context.js.map +1 -0
- package/dist/shared/intent-detector.d.ts +66 -0
- package/dist/shared/intent-detector.d.ts.map +1 -0
- package/dist/shared/intent-detector.js +282 -0
- package/dist/shared/intent-detector.js.map +1 -0
- package/dist/shared/parsed-file.d.ts +51 -0
- package/dist/shared/parsed-file.d.ts.map +1 -0
- package/dist/shared/parsed-file.js +95 -0
- package/dist/shared/parsed-file.js.map +1 -0
- package/dist/shared/registry-clients.d.ts +93 -0
- package/dist/shared/registry-clients.d.ts.map +1 -0
- package/dist/shared/registry-clients.js +273 -0
- package/dist/shared/registry-clients.js.map +1 -0
- package/dist/shared/rules/framework-fixes.d.ts +48 -0
- package/dist/shared/rules/framework-fixes.d.ts.map +1 -0
- package/dist/shared/rules/framework-fixes.js +439 -0
- package/dist/shared/rules/framework-fixes.js.map +1 -0
- package/dist/shared/rules/index.d.ts +8 -0
- package/dist/shared/rules/index.d.ts.map +1 -0
- package/dist/shared/rules/index.js +18 -0
- package/dist/shared/rules/index.js.map +1 -0
- package/dist/shared/rules/metadata.d.ts +43 -0
- package/dist/shared/rules/metadata.d.ts.map +1 -0
- package/dist/shared/rules/metadata.js +819 -0
- package/dist/shared/rules/metadata.js.map +1 -0
- package/dist/shared/schema-semantics.d.ts +45 -0
- package/dist/shared/schema-semantics.d.ts.map +1 -0
- package/dist/shared/schema-semantics.js +193 -0
- package/dist/shared/schema-semantics.js.map +1 -0
- package/dist/shared/types.d.ts +337 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +126 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/tiers.d.ts +4 -4
- package/dist/tiers.d.ts.map +1 -1
- package/dist/tiers.js +17 -7
- package/dist/tiers.js.map +1 -1
- package/dist/types.d.ts +79 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +34 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/code-analysis.d.ts +39 -0
- package/dist/utils/code-analysis.d.ts.map +1 -0
- package/dist/utils/code-analysis.js +159 -0
- package/dist/utils/code-analysis.js.map +1 -0
- package/dist/utils/comment-analyzer.d.ts +38 -0
- package/dist/utils/comment-analyzer.d.ts.map +1 -0
- package/dist/utils/comment-analyzer.js +218 -0
- package/dist/utils/comment-analyzer.js.map +1 -0
- package/dist/utils/context-helpers.d.ts +108 -1
- package/dist/utils/context-helpers.d.ts.map +1 -1
- package/dist/utils/context-helpers.js +351 -2
- package/dist/utils/context-helpers.js.map +1 -1
- package/dist/utils/environment-context.d.ts +76 -0
- package/dist/utils/environment-context.d.ts.map +1 -0
- package/dist/utils/environment-context.js +271 -0
- package/dist/utils/environment-context.js.map +1 -0
- package/dist/utils/intent-detector.d.ts +66 -0
- package/dist/utils/intent-detector.d.ts.map +1 -0
- package/dist/utils/intent-detector.js +282 -0
- package/dist/utils/intent-detector.js.map +1 -0
- package/dist/utils/parsed-file.d.ts +51 -0
- package/dist/utils/parsed-file.d.ts.map +1 -0
- package/dist/utils/parsed-file.js +95 -0
- package/dist/utils/parsed-file.js.map +1 -0
- package/dist/utils/route-hierarchy.d.ts +50 -0
- package/dist/utils/route-hierarchy.d.ts.map +1 -0
- package/dist/utils/route-hierarchy.js +226 -0
- package/dist/utils/route-hierarchy.js.map +1 -0
- package/dist/utils/schema-semantics.d.ts +45 -0
- package/dist/utils/schema-semantics.d.ts.map +1 -0
- package/dist/utils/schema-semantics.js +193 -0
- package/dist/utils/schema-semantics.js.map +1 -0
- package/dist/validate/clients.d.ts +44 -0
- package/dist/validate/clients.d.ts.map +1 -0
- package/dist/validate/clients.js +81 -0
- package/dist/validate/clients.js.map +1 -0
- package/dist/validate/index.d.ts +41 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +141 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/validate/prompts/index.d.ts +8 -0
- package/dist/validate/prompts/index.d.ts.map +1 -0
- package/dist/validate/prompts/index.js +16 -0
- package/dist/validate/prompts/index.js.map +1 -0
- package/dist/validate/prompts/modules/ai-patterns.d.ts +19 -0
- package/dist/validate/prompts/modules/ai-patterns.d.ts.map +1 -0
- package/dist/validate/prompts/modules/ai-patterns.js +156 -0
- package/dist/validate/prompts/modules/ai-patterns.js.map +1 -0
- package/dist/validate/prompts/modules/auth-access.d.ts +9 -0
- package/dist/validate/prompts/modules/auth-access.d.ts.map +1 -0
- package/dist/validate/prompts/modules/auth-access.js +25 -0
- package/dist/validate/prompts/modules/auth-access.js.map +1 -0
- package/dist/validate/prompts/modules/common.d.ts +11 -0
- package/dist/validate/prompts/modules/common.d.ts.map +1 -0
- package/dist/validate/prompts/modules/common.js +186 -0
- package/dist/validate/prompts/modules/common.js.map +1 -0
- package/dist/validate/prompts/modules/index.d.ts +54 -0
- package/dist/validate/prompts/modules/index.d.ts.map +1 -0
- package/dist/validate/prompts/modules/index.js +186 -0
- package/dist/validate/prompts/modules/index.js.map +1 -0
- package/dist/validate/prompts/modules/owasp-classic.d.ts +8 -0
- package/dist/validate/prompts/modules/owasp-classic.d.ts.map +1 -0
- package/dist/validate/prompts/modules/owasp-classic.js +84 -0
- package/dist/validate/prompts/modules/owasp-classic.js.map +1 -0
- package/dist/validate/prompts/modules/secrets-crypto.d.ts +8 -0
- package/dist/validate/prompts/modules/secrets-crypto.d.ts.map +1 -0
- package/dist/validate/prompts/modules/secrets-crypto.js +68 -0
- package/dist/validate/prompts/modules/secrets-crypto.js.map +1 -0
- package/dist/validate/prompts/modules/xss-prompt.d.ts +8 -0
- package/dist/validate/prompts/modules/xss-prompt.d.ts.map +1 -0
- package/dist/validate/prompts/modules/xss-prompt.js +22 -0
- package/dist/validate/prompts/modules/xss-prompt.js.map +1 -0
- package/dist/validate/prompts/semantic-analysis.d.ts +15 -0
- package/dist/validate/prompts/semantic-analysis.d.ts.map +1 -0
- package/dist/validate/prompts/semantic-analysis.js +169 -0
- package/dist/validate/prompts/semantic-analysis.js.map +1 -0
- package/dist/validate/prompts/validation.d.ts +18 -0
- package/dist/validate/prompts/validation.d.ts.map +1 -0
- package/dist/validate/prompts/validation.js +25 -0
- package/dist/validate/prompts/validation.js.map +1 -0
- package/dist/validate/providers/anthropic.d.ts +17 -0
- package/dist/validate/providers/anthropic.d.ts.map +1 -0
- package/dist/validate/providers/anthropic.js +260 -0
- package/dist/validate/providers/anthropic.js.map +1 -0
- package/dist/validate/providers/index.d.ts +8 -0
- package/dist/validate/providers/index.d.ts.map +1 -0
- package/dist/validate/providers/index.js +13 -0
- package/dist/validate/providers/index.js.map +1 -0
- package/dist/validate/providers/openai.d.ts +14 -0
- package/dist/validate/providers/openai.d.ts.map +1 -0
- package/dist/validate/providers/openai.js +336 -0
- package/dist/validate/providers/openai.js.map +1 -0
- package/dist/validate/request-builder.d.ts +61 -0
- package/dist/validate/request-builder.d.ts.map +1 -0
- package/dist/validate/request-builder.js +346 -0
- package/dist/validate/request-builder.js.map +1 -0
- package/dist/validate/types.d.ts +88 -0
- package/dist/validate/types.d.ts.map +1 -0
- package/dist/validate/types.js +38 -0
- package/dist/validate/types.js.map +1 -0
- package/dist/validate/utils/context-extractor.d.ts +55 -0
- package/dist/validate/utils/context-extractor.d.ts.map +1 -0
- package/dist/validate/utils/context-extractor.js +161 -0
- package/dist/validate/utils/context-extractor.js.map +1 -0
- package/dist/validate/utils/index.d.ts +11 -0
- package/dist/validate/utils/index.d.ts.map +1 -0
- package/dist/validate/utils/index.js +27 -0
- package/dist/validate/utils/index.js.map +1 -0
- package/dist/validate/utils/path-helpers.d.ts +21 -0
- package/dist/validate/utils/path-helpers.d.ts.map +1 -0
- package/dist/validate/utils/path-helpers.js +69 -0
- package/dist/validate/utils/path-helpers.js.map +1 -0
- package/dist/validate/utils/response-parser.d.ts +40 -0
- package/dist/validate/utils/response-parser.d.ts.map +1 -0
- package/dist/validate/utils/response-parser.js +286 -0
- package/dist/validate/utils/response-parser.js.map +1 -0
- package/dist/validate/utils/retry.d.ts +15 -0
- package/dist/validate/utils/retry.d.ts.map +1 -0
- package/dist/validate/utils/retry.js +62 -0
- package/dist/validate/utils/retry.js.map +1 -0
- package/package.json +8 -7
- package/src/__tests__/benchmark/fixtures/layer1/agent-skill-injection.ts +204 -0
- package/src/__tests__/benchmark/fixtures/layer1/index.ts +3 -0
- package/src/__tests__/benchmark/fixtures/layer2/index.ts +27 -0
- package/src/__tests__/benchmark/fixtures/layer2/log-injection.ts +147 -0
- package/src/__tests__/benchmark/fixtures/layer2/phase5-excessive-agency.ts +580 -0
- package/src/__tests__/benchmark/fixtures/layer2/security-headers.ts +197 -0
- package/src/__tests__/benchmark/fixtures/layer2/sprint6-ai-enhancements.ts +515 -0
- package/src/__tests__/benchmark/fixtures/layer2/ssrf-detection.ts +210 -0
- package/src/__tests__/benchmark/fixtures/layer2/xxe-detection.ts +195 -0
- package/src/__tests__/benchmark/run-depth-validation.ts +12 -12
- package/src/__tests__/benchmark/run-real-world-test.ts +4 -4
- package/src/__tests__/benchmark/types.ts +1 -1
- package/src/__tests__/benchmark/utils/test-runner.ts +3 -3
- package/src/__tests__/category-filter.test.ts +478 -0
- package/src/__tests__/context-engine/cross-file-taint.test.ts +284 -0
- package/src/__tests__/context-engine/framework-models.test.ts +457 -0
- package/src/__tests__/context-engine/function-classifier.test.ts +146 -0
- package/src/__tests__/context-engine/import-resolver.test.ts +328 -0
- package/src/__tests__/context-engine/integration.test.ts +320 -0
- package/src/__tests__/context-engine/module-graph.test.ts +159 -0
- package/src/__tests__/context-engine/route-discovery/auth-resolver.test.ts +353 -0
- package/src/__tests__/context-engine/route-discovery/express.test.ts +150 -0
- package/src/__tests__/context-engine/route-discovery/nextjs.test.ts +138 -0
- package/src/__tests__/context-engine/route-discovery/python.test.ts +95 -0
- package/src/__tests__/context-engine/sanitiser-detection.test.ts +187 -0
- package/src/__tests__/context-engine/sink-matcher.test.ts +251 -0
- package/src/__tests__/context-engine/source-discovery.test.ts +186 -0
- package/src/__tests__/context-engine/taint-tracker.test.ts +182 -0
- package/src/__tests__/regression/agent-skill-benign.test.ts +174 -0
- package/src/__tests__/regression/known-false-positives.test.ts +801 -3
- package/src/__tests__/score/adjustments.test.ts +385 -0
- package/src/__tests__/score/confidence.test.ts +283 -0
- package/src/__tests__/score/framework-scoring.test.ts +275 -0
- package/src/__tests__/score/route-scoring.test.ts +156 -0
- package/src/__tests__/score/scoring-integration.test.ts +165 -0
- package/src/__tests__/score/taint-adjustments.test.ts +244 -0
- package/src/__tests__/snapshots/__snapshots__/anthropic-validation-refactor.test.ts.snap +50 -58
- package/src/__tests__/snapshots/__snapshots__/dangerous-functions-refactor.test.ts.snap +52 -0
- package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +3 -12
- package/src/__tests__/snapshots/anthropic-validation-refactor.test.ts +3 -3
- package/src/__tests__/snapshots/dangerous-functions-refactor.test.ts +1 -1
- package/src/__tests__/snapshots/scan-depth.test.ts +3 -3
- package/src/__tests__/validate/route-annotations.test.ts +138 -0
- package/src/__tests__/validation/analyze-results.ts +1 -1
- package/src/__tests__/validation/extract-for-triage.ts +1 -1
- package/src/__tests__/validation/fp-deep-analysis.ts +1 -1
- package/src/__tests__/validation/run-validation.ts +7 -7
- package/src/{layer2/ai-agent-tools.ts → detect/ai-code/agent-tools.ts} +729 -4
- package/src/{layer2 → detect/ai-code}/byok-patterns.ts +20 -6
- package/src/{layer2/ai-endpoint-protection.ts → detect/ai-code/endpoint-protection.ts} +10 -4
- package/src/{layer2/ai-execution-sinks.ts → detect/ai-code/execution-sinks.ts} +272 -46
- package/src/{layer2/ai-fingerprinting.ts → detect/ai-code/fingerprinting.ts} +46 -34
- package/src/detect/ai-code/index.ts +11 -0
- package/src/{layer2/ai-mcp-security.ts → detect/ai-code/mcp-security.ts} +212 -5
- package/src/{layer2 → detect/ai-code}/model-supply-chain.ts +85 -6
- package/src/{layer2/ai-package-hallucination.ts → detect/ai-code/package-hallucination.ts} +170 -6
- package/src/{layer2/ai-prompt-hygiene.ts → detect/ai-code/prompt-hygiene.ts} +393 -28
- package/src/{layer2/ai-rag-safety.ts → detect/ai-code/rag-safety.ts} +91 -4
- package/src/{layer2/ai-schema-validation.ts → detect/ai-code/schema-validation.ts} +10 -4
- package/src/detect/config/agent-skill-injection.ts +551 -0
- package/src/{layer1 → detect/config}/comments.ts +8 -2
- package/src/{layer1 → detect/config}/file-flags.ts +23 -6
- package/src/detect/config/index.ts +6 -0
- package/src/{layer3 → detect/config}/osv-check.ts +3 -2
- package/src/{layer3 → detect/config}/package-check.ts +3 -2
- package/src/{layer1 → detect/config}/urls.ts +196 -15
- package/src/detect/index.ts +131 -0
- package/src/{layer1 → detect/secrets}/config-audit.ts +56 -12
- package/src/{layer1 → detect/secrets}/config-mcp-audit.ts +11 -4
- package/src/{layer1 → detect/secrets}/entropy.ts +256 -11
- package/src/{layer1 → detect/secrets}/index.ts +43 -46
- package/src/{layer1 → detect/secrets}/patterns.ts +51 -6
- package/src/{layer1 → detect/secrets}/weak-crypto.ts +174 -17
- package/src/{layer2/auth-antipatterns.ts → detect/structural/auth-patterns.ts} +249 -27
- package/src/{layer2 → detect/structural}/dangerous-functions/dom-xss.ts +94 -22
- package/src/{layer2 → detect/structural}/dangerous-functions/index.ts +672 -65
- package/src/{layer2 → detect/structural}/dangerous-functions/json-parse.ts +10 -2
- package/src/{layer2 → detect/structural}/dangerous-functions/math-random.ts +269 -17
- package/src/{layer2 → detect/structural}/dangerous-functions/patterns.ts +4 -2
- package/src/{layer2 → detect/structural}/dangerous-functions/request-validation.ts +10 -2
- package/src/detect/structural/dangerous-functions/utils/control-flow.ts +35 -0
- package/src/{layer2 → detect/structural}/dangerous-functions/utils/schema-validation.ts +16 -1
- package/src/{layer2 → detect/structural}/data-exposure.ts +23 -40
- package/src/{layer2 → detect/structural}/framework-checks.ts +13 -12
- package/src/{layer2 → detect/structural}/index.ts +144 -122
- package/src/detect/structural/log-injection.ts +254 -0
- package/src/{layer2 → detect/structural}/logic-gates.ts +69 -24
- package/src/{layer2 → detect/structural}/risky-imports.ts +10 -4
- package/src/detect/structural/security-headers.ts +231 -0
- package/src/detect/structural/ssrf-detection.ts +300 -0
- package/src/{layer2 → detect/structural}/variables.ts +10 -4
- package/src/detect/structural/xxe-detection.ts +295 -0
- package/src/index.ts +64 -1038
- package/src/{utils → model}/auth-helper-detector.ts +1 -1
- package/src/model/cross-file-taint.ts +374 -0
- package/src/model/framework-models/django.ts +82 -0
- package/src/model/framework-models/express.ts +54 -0
- package/src/model/framework-models/index.ts +116 -0
- package/src/model/framework-models/nextjs.ts +69 -0
- package/src/model/framework-models/prisma.ts +57 -0
- package/src/model/framework-models/react.ts +63 -0
- package/src/model/framework-models/sequelize.ts +63 -0
- package/src/model/framework-models/types.ts +46 -0
- package/src/model/function-classifier.ts +184 -0
- package/src/model/import-resolver.ts +453 -0
- package/src/{utils → model}/imported-auth-detector.ts +21 -85
- package/src/model/index.ts +353 -0
- package/src/{utils → model}/middleware-detector.ts +156 -17
- package/src/model/module-graph.ts +254 -0
- package/src/{utils → model}/oauth-flow-detector.ts +1 -1
- package/src/{utils/project-context-builder.ts → model/project-context.ts} +1 -1
- package/src/model/route-auth-resolver.ts +216 -0
- package/src/model/route-discovery/express.ts +251 -0
- package/src/model/route-discovery/index.ts +83 -0
- package/src/model/route-discovery/nextjs.ts +216 -0
- package/src/model/route-discovery/python.ts +214 -0
- package/src/model/route-discovery/types.ts +48 -0
- package/src/model/route-discovery/utils.ts +54 -0
- package/src/model/route-hierarchy.ts +250 -0
- package/src/model/sanitiser-detection.ts +268 -0
- package/src/model/sink-matcher.ts +178 -0
- package/src/model/sink-patterns.ts +109 -0
- package/src/model/source-discovery.ts +209 -0
- package/src/model/taint-tracker.ts +333 -0
- package/src/model/taint-types.ts +149 -0
- package/src/{utils → model}/trpc-analyzer.ts +1 -1
- package/src/{utils/context-helpers.ts → parse/file-classifier.ts} +462 -2
- package/src/{utils → parse}/path-exclusions.ts +1 -1
- package/src/pipeline/config.ts +81 -0
- package/src/pipeline/index.ts +437 -0
- package/src/{modes → pipeline/modes}/incremental.ts +6 -6
- package/src/postprocess/aggregation.ts +74 -0
- package/src/postprocess/contradictions.ts +128 -0
- package/src/postprocess/dedup.ts +62 -0
- package/src/postprocess/filtering/__tests__/pipeline.test.ts +134 -0
- package/src/postprocess/filtering/context-adjustments.ts +111 -0
- package/src/postprocess/filtering/index.ts +10 -0
- package/src/postprocess/filtering/pipeline.ts +130 -0
- package/src/postprocess/index.ts +118 -0
- package/src/{suppression → postprocess/suppression}/config-loader.ts +1 -1
- package/src/{suppression → postprocess/suppression}/hash.ts +1 -1
- package/src/{suppression → postprocess/suppression}/inline-parser.ts +1 -1
- package/src/{suppression → postprocess/suppression}/manager.ts +1 -1
- package/src/{suppression → postprocess/suppression}/types.ts +2 -2
- package/src/postprocess/validation-cap.ts +66 -0
- package/src/report/build-result.ts +94 -0
- package/src/report/enrichment.ts +52 -0
- package/src/report/formatters/__tests__/ai-context.test.ts +254 -0
- package/src/report/formatters/ai-context.ts +302 -0
- package/src/{formatters → report/formatters}/cli-terminal.ts +11 -11
- package/src/{formatters → report/formatters}/github-comment.ts +4 -4
- package/src/{formatters → report/formatters}/grouping.ts +8 -8
- package/src/report/formatters/ide/__tests__/ide.test.ts +319 -0
- package/src/report/formatters/ide/claude-code.ts +110 -0
- package/src/report/formatters/ide/cursor.ts +147 -0
- package/src/report/formatters/ide/index.ts +216 -0
- package/src/report/formatters/ide/windsurf.ts +135 -0
- package/src/{formatters → report/formatters}/index.ts +24 -0
- package/src/{formatters → report/formatters}/vscode-diagnostic.ts +1 -1
- package/src/report/summary.ts +70 -0
- package/src/score/adjustments.ts +387 -0
- package/src/{layer3/anthropic → score}/auto-dismiss.ts +26 -14
- package/src/score/confidence.ts +66 -0
- package/src/score/index.ts +316 -0
- package/src/score/types.ts +187 -0
- package/src/shared/__tests__/code-analysis.test.ts +165 -0
- package/src/shared/__tests__/parsed-file.test.ts +124 -0
- package/src/shared/ai-context/__tests__/manager.test.ts +193 -0
- package/src/shared/ai-context/index.ts +15 -0
- package/src/shared/ai-context/manager.ts +145 -0
- package/src/{baseline → shared/baseline}/__tests__/diff.test.ts +2 -2
- package/src/{baseline → shared/baseline}/__tests__/manager.test.ts +2 -2
- package/src/{baseline → shared/baseline}/diff.ts +1 -1
- package/src/{baseline → shared/baseline}/manager.ts +1 -1
- package/src/shared/category-filter.ts +400 -0
- package/src/{layer2/dangerous-functions/utils/control-flow.ts → shared/code-analysis.ts} +56 -39
- package/src/shared/comment-analyzer.ts +249 -0
- package/src/shared/environment-context.ts +304 -0
- package/src/shared/intent-detector.ts +318 -0
- package/src/shared/parsed-file.ts +103 -0
- package/src/{rules → shared/rules}/__tests__/metadata.test.ts +7 -0
- package/src/{rules → shared/rules}/framework-fixes.ts +1 -1
- package/src/{rules → shared/rules}/metadata.ts +94 -0
- package/src/shared/schema-semantics.ts +233 -0
- package/src/{types.ts → shared/types.ts} +142 -11
- package/src/tiers.ts +27 -10
- package/src/validate/__tests__/context-extractor.test.ts +191 -0
- package/src/validate/__tests__/prompt-assembly.test.ts +233 -0
- package/src/validate/__tests__/request-builder.test.ts +347 -0
- package/src/{layer3/anthropic → validate}/index.ts +8 -7
- package/src/{layer3/anthropic → validate}/prompts/index.ts +2 -0
- package/src/validate/prompts/modules/ai-patterns.ts +153 -0
- package/src/validate/prompts/modules/auth-access.ts +22 -0
- package/src/validate/prompts/modules/common.ts +183 -0
- package/src/validate/prompts/modules/index.ts +204 -0
- package/src/validate/prompts/modules/owasp-classic.ts +81 -0
- package/src/validate/prompts/modules/secrets-crypto.ts +65 -0
- package/src/validate/prompts/modules/xss-prompt.ts +19 -0
- package/src/validate/prompts/validation.ts +20 -0
- package/src/{layer3/anthropic → validate}/providers/anthropic.ts +28 -27
- package/src/validate/providers/index.ts +8 -0
- package/src/{layer3/anthropic → validate}/providers/openai.ts +30 -25
- package/src/validate/request-builder.ts +448 -0
- package/src/{layer3/anthropic → validate}/types.ts +1 -1
- package/src/validate/utils/context-extractor.ts +220 -0
- package/src/{layer3/anthropic → validate}/utils/index.ts +10 -0
- package/src/{layer3/anthropic → validate}/utils/response-parser.ts +2 -1
- package/src/layer3/anthropic/prompts/validation.ts +0 -419
- package/src/layer3/anthropic/providers/index.ts +0 -8
- package/src/layer3/anthropic/request-builder.ts +0 -150
- package/src/layer3/index.ts +0 -168
- /package/src/{layer3 → detect/config}/__tests__/osv-check.test.ts +0 -0
- /package/src/{layer2 → detect/structural}/__tests__/math-random-enhanced.test.ts +0 -0
- /package/src/{layer2 → detect/structural}/dangerous-functions/child-process.ts +0 -0
- /package/src/{layer2 → detect/structural}/dangerous-functions/utils/helpers.ts +0 -0
- /package/src/{layer2 → detect/structural}/dangerous-functions/utils/index.ts +0 -0
- /package/src/{suppression → postprocess/suppression}/__tests__/config-loader.test.ts +0 -0
- /package/src/{suppression → postprocess/suppression}/__tests__/hash.test.ts +0 -0
- /package/src/{suppression → postprocess/suppression}/__tests__/inline-parser.test.ts +0 -0
- /package/src/{suppression → postprocess/suppression}/__tests__/manager.test.ts +0 -0
- /package/src/{suppression → postprocess/suppression}/index.ts +0 -0
- /package/src/{baseline → shared/baseline}/index.ts +0 -0
- /package/src/{baseline → shared/baseline}/types.ts +0 -0
- /package/src/{utils → shared}/diff-detector.ts +0 -0
- /package/src/{utils → shared}/diff-parser.ts +0 -0
- /package/src/{utils → shared}/registry-clients.ts +0 -0
- /package/src/{rules → shared/rules}/__tests__/framework-fixes.test.ts +0 -0
- /package/src/{rules → shared/rules}/index.ts +0 -0
- /package/src/{layer3/anthropic → validate}/clients.ts +0 -0
- /package/src/{layer3/anthropic → validate}/prompts/semantic-analysis.ts +0 -0
- /package/src/{layer3/anthropic → validate}/utils/path-helpers.ts +0 -0
- /package/src/{layer3/anthropic → validate}/utils/retry.ts +0 -0
|
@@ -12,14 +12,17 @@
|
|
|
12
12
|
* - Database tools without proper scoping
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
-
import type { Vulnerability, VulnerabilitySeverity } from '
|
|
15
|
+
import type { Vulnerability, VulnerabilitySeverity } from '../../shared/types'
|
|
16
|
+
import type { ParsedFile } from '../../shared/parsed-file'
|
|
16
17
|
import {
|
|
17
18
|
isComment,
|
|
18
19
|
isTestOrMockFile,
|
|
19
20
|
isScannerOrFixtureFile,
|
|
20
21
|
isExampleDirectory,
|
|
21
22
|
isLibraryCode,
|
|
22
|
-
} from '
|
|
23
|
+
} from '../../parse/file-classifier'
|
|
24
|
+
|
|
25
|
+
const BASE_CONFIDENCE = 0.50
|
|
23
26
|
|
|
24
27
|
// ============================================================================
|
|
25
28
|
// Agent/Tool Context Detection
|
|
@@ -536,6 +539,318 @@ function hasBudgetLimits(context: string): boolean {
|
|
|
536
539
|
return budgetPatterns.some(p => p.test(context))
|
|
537
540
|
}
|
|
538
541
|
|
|
542
|
+
/**
|
|
543
|
+
* Phase 5: LLM Output Flow Patterns
|
|
544
|
+
* Detect when LLM-generated content flows into dangerous operations
|
|
545
|
+
*/
|
|
546
|
+
const LLM_OUTPUT_FLOW_PATTERNS: ExcessiveAgencyPattern[] = [
|
|
547
|
+
// ========== LLM Output in Tool Names/Paths ==========
|
|
548
|
+
{
|
|
549
|
+
name: 'LLM output used as tool name',
|
|
550
|
+
pattern: /(?:tools?\[|getTools?\s*\(|callTool\s*\(|invokeTool\s*\(|executeTool\s*\()\s*(?:response|result|output|completion|message|content|llm|ai|model|gpt|claude)\.(?:content|text|tool|toolName|function|name|choice)/gi,
|
|
551
|
+
baseSeverity: 'critical',
|
|
552
|
+
description: 'LLM output used directly as tool name for invocation. An adversarial prompt could cause the agent to call arbitrary tools, bypassing intended restrictions.',
|
|
553
|
+
suggestedFix: 'Validate tool names against a static allowlist: const ALLOWED_TOOLS = [\'read\', \'write\'] as const; if (!ALLOWED_TOOLS.includes(toolName)) throw new Error("Invalid tool")',
|
|
554
|
+
framework: 'generic',
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
name: 'LLM output in file path',
|
|
558
|
+
pattern: /(?:fs|file|path|fsp)\.(?:readFile|writeFile|unlink|rm|mkdir|readdir|access|stat|copyFile|rename)\s*\(\s*(?:response|result|output|completion|message|content|llm|ai|model)\.(?:path|filePath|file|filename|directory|dir)/gi,
|
|
559
|
+
baseSeverity: 'critical',
|
|
560
|
+
description: 'LLM output used directly as file path. Path traversal or arbitrary file access could occur via prompt injection.',
|
|
561
|
+
suggestedFix: 'Validate paths against allowed directories: if (!path.startsWith(ALLOWED_BASE_DIR)) throw new Error("Invalid path"). Use path.resolve() and verify the result stays within bounds.',
|
|
562
|
+
framework: 'generic',
|
|
563
|
+
},
|
|
564
|
+
{
|
|
565
|
+
name: 'LLM output in shell command',
|
|
566
|
+
pattern: /(?:exec|spawn|execFile|execSync|spawnSync)\s*\(\s*(?:response|result|output|completion|message|content|llm|ai|model)\.(?:command|cmd|script|code|executable|program)/gi,
|
|
567
|
+
baseSeverity: 'critical',
|
|
568
|
+
description: 'LLM output used directly as shell command. Remote code execution via prompt injection.',
|
|
569
|
+
suggestedFix: 'Never use LLM output in shell commands. If necessary, use a strict allowlist of permitted commands and validate arguments.',
|
|
570
|
+
framework: 'generic',
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
name: 'LLM output in URL/endpoint',
|
|
574
|
+
pattern: /(?:fetch|axios|http|request|got)\s*\(\s*(?:response|result|output|completion|message|content|llm|ai|model)\.(?:url|endpoint|href|uri|link|host)/gi,
|
|
575
|
+
baseSeverity: 'high',
|
|
576
|
+
description: 'LLM output used directly as URL or endpoint. SSRF risk via prompt injection.',
|
|
577
|
+
suggestedFix: 'Validate URLs against allowed hosts. Use URL allowlists and block internal IP ranges.',
|
|
578
|
+
framework: 'generic',
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
name: 'LLM response destructured into tool call',
|
|
582
|
+
pattern: /(?:const|let|var)\s*\{\s*(?:tool|toolName|function|functionName|action|method)\s*\}\s*=\s*(?:response|result|output|completion|message|llm|ai|model)/gi,
|
|
583
|
+
baseSeverity: 'high',
|
|
584
|
+
description: 'Tool name destructured from LLM response. This pattern suggests dynamic tool selection based on LLM output.',
|
|
585
|
+
suggestedFix: 'Validate extracted tool names against a static allowlist before invocation.',
|
|
586
|
+
framework: 'generic',
|
|
587
|
+
},
|
|
588
|
+
{
|
|
589
|
+
name: 'Dynamic property access with LLM output',
|
|
590
|
+
pattern: /(?:tools|handlers|actions|functions|methods)\s*\[\s*(?:response|result|output|completion|message|content|llm|ai)(?:\.|(?:\s*\[['"`]?(?:tool|name|function|action)))/gi,
|
|
591
|
+
baseSeverity: 'high',
|
|
592
|
+
description: 'Dynamic object property access using LLM output. Could access unintended tools or methods.',
|
|
593
|
+
suggestedFix: 'Use explicit tool dispatch with allowlist validation: if (toolName in SAFE_TOOLS) { SAFE_TOOLS[toolName]() }',
|
|
594
|
+
framework: 'generic',
|
|
595
|
+
},
|
|
596
|
+
]
|
|
597
|
+
|
|
598
|
+
/**
|
|
599
|
+
* Phase 5: Tool Permission Accumulation Patterns
|
|
600
|
+
* Detect unbounded tool registration and permission growth
|
|
601
|
+
*/
|
|
602
|
+
const TOOL_ACCUMULATION_PATTERNS: ExcessiveAgencyPattern[] = [
|
|
603
|
+
// ========== Unbounded Tool Registration ==========
|
|
604
|
+
{
|
|
605
|
+
name: 'Unbounded tool registration',
|
|
606
|
+
pattern: /(?:agent|tools?|registry)\.(?:registerTool|addTool|push|add|set)\s*\(\s*(?:user|request|req|input|body|data|param)\.(?:tool|function|action|capability)/gi,
|
|
607
|
+
baseSeverity: 'high',
|
|
608
|
+
description: 'Tools registered dynamically from user input without bounds. Users could accumulate unlimited capabilities over time.',
|
|
609
|
+
suggestedFix: 'Use a static allowlist: const ALLOWED_TOOLS = [...] and validate against it. Implement tool count limits.',
|
|
610
|
+
framework: 'generic',
|
|
611
|
+
},
|
|
612
|
+
{
|
|
613
|
+
name: 'Tool array push without limit check',
|
|
614
|
+
pattern: /tools\.push\s*\([^)]+\)(?![\s\S]{0,50}(?:length\s*[<>]|limit|max|ALLOWED|whitelist|allowlist))/gi,
|
|
615
|
+
baseSeverity: 'medium',
|
|
616
|
+
description: 'Tools added to array without checking count limits. Tool list could grow unboundedly.',
|
|
617
|
+
suggestedFix: 'Add limit check: if (tools.length >= MAX_TOOLS) throw new Error("Tool limit reached")',
|
|
618
|
+
framework: 'generic',
|
|
619
|
+
},
|
|
620
|
+
{
|
|
621
|
+
name: 'Dynamic tool loading from user config',
|
|
622
|
+
pattern: /(?:require|import|loadModule|dynamicImport)\s*\(\s*(?:user|request|req|input|body|config)\.(?:tool|module|plugin|extension)/gi,
|
|
623
|
+
baseSeverity: 'critical',
|
|
624
|
+
description: 'Tool modules loaded dynamically from user-controlled paths. Could load arbitrary code.',
|
|
625
|
+
suggestedFix: 'Use a static module registry. Validate module paths against an allowlist.',
|
|
626
|
+
framework: 'generic',
|
|
627
|
+
},
|
|
628
|
+
{
|
|
629
|
+
name: 'Permission grant without authorization check',
|
|
630
|
+
pattern: /(?:grant|add|enable)(?:Permission|Capability|Access)\s*\(\s*[^)]*\)(?![\s\S]{0,30}(?:if|auth|permission|role|admin|isAdmin))/gi,
|
|
631
|
+
baseSeverity: 'high',
|
|
632
|
+
description: 'Permissions granted without visible authorization check. Users could escalate their own privileges.',
|
|
633
|
+
suggestedFix: 'Add authorization check: if (!user.hasRole("admin")) throw new Error("Unauthorized")',
|
|
634
|
+
framework: 'generic',
|
|
635
|
+
},
|
|
636
|
+
{
|
|
637
|
+
name: 'Tool inheritance without restriction',
|
|
638
|
+
pattern: /(?:inherit|extend|merge)(?:Tools|Capabilities|Permissions)\s*\(\s*(?:parent|base|source)\.tools/gi,
|
|
639
|
+
baseSeverity: 'medium',
|
|
640
|
+
description: 'Agent inherits tools from parent without filtering. Could inherit more permissions than intended.',
|
|
641
|
+
suggestedFix: 'Explicitly list inherited tools instead of blanket inheritance. Use allowlist for permitted inherited capabilities.',
|
|
642
|
+
framework: 'generic',
|
|
643
|
+
},
|
|
644
|
+
]
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* Phase 5: Database Write Scoping Patterns
|
|
648
|
+
* Detect database writes that may lack proper user scoping
|
|
649
|
+
*/
|
|
650
|
+
const DB_WRITE_SCOPING_PATTERNS: ExcessiveAgencyPattern[] = [
|
|
651
|
+
// ========== Database Writes Without User Scoping ==========
|
|
652
|
+
{
|
|
653
|
+
name: 'DB insert without userId',
|
|
654
|
+
pattern: /(?:db|database|prisma|knex|sequelize|mongoose|supabase|drizzle)\.(?:insert|create|save|add)\s*\(\s*\{(?![^}]*(?:userId|user_id|ownerId|owner_id|createdBy|created_by|authorId|author_id))[^}]*(?:content|data|text|body|message)\s*:/gi,
|
|
655
|
+
baseSeverity: 'high',
|
|
656
|
+
description: 'Database insert with content field but no user ID. AI-generated content may not be properly attributed to user.',
|
|
657
|
+
suggestedFix: 'Add user context: db.insert({ content: aiGenerated, userId: ctx.user.id })',
|
|
658
|
+
framework: 'generic',
|
|
659
|
+
},
|
|
660
|
+
{
|
|
661
|
+
name: 'DB insert with AI content unscopedp',
|
|
662
|
+
pattern: /(?:db|database|prisma|knex|sequelize|mongoose|supabase|drizzle)\.(?:insert|create)\s*\(\s*\{[^}]*:\s*(?:response|result|output|completion|message|ai|llm|model)\.(?:content|text|data|output|result)/gi,
|
|
663
|
+
baseSeverity: 'high',
|
|
664
|
+
description: 'AI-generated content inserted into database. Ensure proper user scoping and content validation.',
|
|
665
|
+
suggestedFix: 'Add user context and validate content: db.insert({ content: validated, userId: ctx.user.id, createdAt: Date.now() })',
|
|
666
|
+
framework: 'generic',
|
|
667
|
+
},
|
|
668
|
+
{
|
|
669
|
+
name: 'Bulk write without tenant filter',
|
|
670
|
+
pattern: /(?:db|database|prisma|knex|sequelize|mongoose|supabase|drizzle)\.(?:insertMany|createMany|bulkCreate|bulkInsert)\s*\([^)]*\)(?![\s\S]{0,50}(?:tenantId|tenant_id|orgId|org_id|organizationId))/gi,
|
|
671
|
+
baseSeverity: 'medium',
|
|
672
|
+
description: 'Bulk database write without visible tenant scoping. Multi-tenant data isolation may be at risk.',
|
|
673
|
+
suggestedFix: 'Add tenant filter to all bulk operations: records.map(r => ({ ...r, tenantId: ctx.tenant.id }))',
|
|
674
|
+
framework: 'generic',
|
|
675
|
+
},
|
|
676
|
+
{
|
|
677
|
+
name: 'Update without ownership check',
|
|
678
|
+
pattern: /(?:db|database|prisma|knex|sequelize|mongoose|supabase|drizzle)\.(?:update|updateOne|updateMany)\s*\(\s*\{[^}]*id\s*:/gi,
|
|
679
|
+
baseSeverity: 'medium',
|
|
680
|
+
description: 'Database update by ID without visible ownership verification. Agent could modify other users\' data.',
|
|
681
|
+
suggestedFix: 'Add ownership check: db.update({ where: { id, userId: ctx.user.id }, data: { ... } })',
|
|
682
|
+
framework: 'generic',
|
|
683
|
+
},
|
|
684
|
+
{
|
|
685
|
+
name: 'Delete without user scoping',
|
|
686
|
+
pattern: /(?:db|database|prisma|knex|sequelize|mongoose|supabase|drizzle)\.(?:delete|deleteOne|deleteMany|destroy|remove)\s*\(\s*\{[^}]*id\s*:/gi,
|
|
687
|
+
baseSeverity: 'high',
|
|
688
|
+
description: 'Database delete by ID without user scoping. Agent could delete other users\' data.',
|
|
689
|
+
suggestedFix: 'Add user scoping: db.delete({ where: { id, userId: ctx.user.id } })',
|
|
690
|
+
framework: 'generic',
|
|
691
|
+
},
|
|
692
|
+
]
|
|
693
|
+
|
|
694
|
+
/**
|
|
695
|
+
* Phase 6 Task 1: Tool Parameter Injection Patterns
|
|
696
|
+
* Detect LLM output flowing to tool parameters (not just tool names)
|
|
697
|
+
*/
|
|
698
|
+
const TOOL_PARAMETER_INJECTION_PATTERNS: ExcessiveAgencyPattern[] = [
|
|
699
|
+
// LLM output in tool parameters
|
|
700
|
+
{
|
|
701
|
+
name: 'LLM output in tool parameters',
|
|
702
|
+
pattern: /tool\s*\(\s*\{[^}]*:\s*(response|output|result|content|message|llmOutput|aiResponse|completion)(\.\w+)*\s*[,}]/gi,
|
|
703
|
+
baseSeverity: 'high',
|
|
704
|
+
description: 'Tool parameters derived from unvalidated LLM output can be manipulated via prompt injection. Attackers could modify tool behavior through crafted responses.',
|
|
705
|
+
suggestedFix: 'Validate and sanitize LLM output before passing as tool parameters. Use schema validation (zod, yup) to ensure expected structure.',
|
|
706
|
+
framework: 'generic',
|
|
707
|
+
},
|
|
708
|
+
// Tool args assigned directly from LLM output
|
|
709
|
+
{
|
|
710
|
+
name: 'Tool args from LLM output',
|
|
711
|
+
pattern: /\bargs\s*=\s*(response|output|result|content|message|llmOutput|aiResponse|completion)(\.\w+)*/gi,
|
|
712
|
+
baseSeverity: 'high',
|
|
713
|
+
description: 'Tool arguments assigned directly from LLM output enable parameter injection. Malicious prompts could inject unexpected arguments.',
|
|
714
|
+
suggestedFix: 'Use schema validation (zod, yup) on LLM output before passing to tools: const validatedArgs = toolArgsSchema.parse(llmOutput)',
|
|
715
|
+
framework: 'generic',
|
|
716
|
+
},
|
|
717
|
+
// Spread LLM output into tool call
|
|
718
|
+
{
|
|
719
|
+
name: 'LLM output spread into tool call',
|
|
720
|
+
pattern: /(?:executeTool|callTool|invokeTool|runTool)\s*\([^)]*\.\.\.(?:response|output|result|content|llmOutput|aiResponse)/gi,
|
|
721
|
+
baseSeverity: 'critical',
|
|
722
|
+
description: 'LLM output spread directly into tool invocation. All LLM-provided fields pass through unvalidated.',
|
|
723
|
+
suggestedFix: 'Destructure and validate specific fields: const { field1, field2 } = schema.parse(llmOutput); executeTool({ field1, field2 })',
|
|
724
|
+
framework: 'generic',
|
|
725
|
+
},
|
|
726
|
+
// Dynamic property access for tool params
|
|
727
|
+
{
|
|
728
|
+
name: 'Dynamic tool param from LLM',
|
|
729
|
+
pattern: /toolParams?\s*\[\s*(response|output|result|llmOutput|aiResponse)\./gi,
|
|
730
|
+
baseSeverity: 'high',
|
|
731
|
+
description: 'Tool parameter accessed dynamically from LLM output. Could access unintended parameters.',
|
|
732
|
+
suggestedFix: 'Use explicit parameter extraction with validation: const param = validateParam(llmOutput.expectedField)',
|
|
733
|
+
framework: 'generic',
|
|
734
|
+
},
|
|
735
|
+
// JSON.parse of LLM output for tool params
|
|
736
|
+
{
|
|
737
|
+
name: 'JSON parsed LLM output as tool params',
|
|
738
|
+
pattern: /JSON\.parse\s*\(\s*(response|output|result|content|llmOutput|aiResponse|completion)(?:\.\w+)?\s*\)[^;]*(?:tool|execute|invoke|call)/gi,
|
|
739
|
+
baseSeverity: 'high',
|
|
740
|
+
description: 'LLM output JSON-parsed and used as tool parameters. Parsed structure could contain malicious fields.',
|
|
741
|
+
suggestedFix: 'Validate parsed JSON against expected schema: const params = toolParamsSchema.parse(JSON.parse(llmOutput))',
|
|
742
|
+
framework: 'generic',
|
|
743
|
+
},
|
|
744
|
+
]
|
|
745
|
+
|
|
746
|
+
/**
|
|
747
|
+
* Phase 6 Task 2: Tool Error Message Injection Patterns
|
|
748
|
+
* Detect raw error exposure to LLM that could leak system information or enable injection
|
|
749
|
+
*/
|
|
750
|
+
const TOOL_ERROR_INJECTION_PATTERNS: ExcessiveAgencyPattern[] = [
|
|
751
|
+
// Raw error message in tool response
|
|
752
|
+
{
|
|
753
|
+
name: 'Raw error in tool response',
|
|
754
|
+
pattern: /catch\s*\([^)]*\)\s*\{[^}]*(return|resolve)\s*\([^)]*error\.(message|stack|toString)/gi,
|
|
755
|
+
baseSeverity: 'medium',
|
|
756
|
+
description: 'Raw error messages returned to LLM could leak system information (paths, credentials, internal state) or be used for prompt injection attacks.',
|
|
757
|
+
suggestedFix: 'Return sanitized, generic error messages to LLM. Log detailed errors server-side: catch (e) { logger.error(e); return { error: "Operation failed" } }',
|
|
758
|
+
framework: 'generic',
|
|
759
|
+
},
|
|
760
|
+
// Error object in tool return
|
|
761
|
+
{
|
|
762
|
+
name: 'Error object in tool return',
|
|
763
|
+
pattern: /return\s*\{[^}]*error\s*:\s*(?:e|err|error)(?:\s*,|\s*\})/gi,
|
|
764
|
+
baseSeverity: 'medium',
|
|
765
|
+
description: 'Error object returned directly to LLM. Full error objects may contain sensitive stack traces or internal details.',
|
|
766
|
+
suggestedFix: 'Return only error message or generic status: return { error: "Failed to process request", code: "OPERATION_FAILED" }',
|
|
767
|
+
framework: 'generic',
|
|
768
|
+
},
|
|
769
|
+
// Stack trace in response
|
|
770
|
+
{
|
|
771
|
+
name: 'Stack trace in tool response',
|
|
772
|
+
pattern: /return\s*\{[^}]*(?:stack|stackTrace|trace)\s*:\s*(?:e|err|error)\./gi,
|
|
773
|
+
baseSeverity: 'high',
|
|
774
|
+
description: 'Stack trace returned to LLM. Stack traces expose internal code paths, file structures, and potentially sensitive data.',
|
|
775
|
+
suggestedFix: 'Never return stack traces to LLM. Log them server-side for debugging: logger.error({ stack: e.stack }); return { error: "Internal error" }',
|
|
776
|
+
framework: 'generic',
|
|
777
|
+
},
|
|
778
|
+
// Exception details in resolve/reject
|
|
779
|
+
{
|
|
780
|
+
name: 'Exception details in promise resolution',
|
|
781
|
+
pattern: /(?:resolve|reject)\s*\(\s*\{[^}]*(?:exception|error|e)\s*:\s*(?:e|err|error)(?:\.message|\.stack)?/gi,
|
|
782
|
+
baseSeverity: 'medium',
|
|
783
|
+
description: 'Exception details passed in promise resolution. Error information flows to LLM context.',
|
|
784
|
+
suggestedFix: 'Sanitize error information before resolving: resolve({ success: false, error: sanitizeError(e) })',
|
|
785
|
+
framework: 'generic',
|
|
786
|
+
},
|
|
787
|
+
// String interpolation with error
|
|
788
|
+
{
|
|
789
|
+
name: 'Error interpolated in response string',
|
|
790
|
+
pattern: /return\s*[`'"].*\$\{(?:e|err|error)(?:\.message|\.stack)?\}.*[`'"]/gi,
|
|
791
|
+
baseSeverity: 'medium',
|
|
792
|
+
description: 'Error details interpolated into response string. Raw error text could contain sensitive information.',
|
|
793
|
+
suggestedFix: 'Use generic error messages: return `Operation failed: ${getGenericErrorMessage(e.code)}`',
|
|
794
|
+
framework: 'generic',
|
|
795
|
+
},
|
|
796
|
+
]
|
|
797
|
+
|
|
798
|
+
/**
|
|
799
|
+
* Phase 5: Recursive Agent Patterns
|
|
800
|
+
* Detect unbounded agent recursion and self-spawning patterns
|
|
801
|
+
*/
|
|
802
|
+
const RECURSIVE_AGENT_PATTERNS: ExcessiveAgencyPattern[] = [
|
|
803
|
+
// ========== Unbounded Agent Recursion ==========
|
|
804
|
+
{
|
|
805
|
+
name: 'Recursive agent call without depth limit',
|
|
806
|
+
pattern: /(?:async\s+)?function\s+(?:run|execute|process|handle)?Agent\s*\([^)]*\)\s*\{[\s\S]{0,200}(?:run|execute|process|handle)?Agent\s*\((?![^)]*depth|[^)]*level|[^)]*recursion)/gi,
|
|
807
|
+
baseSeverity: 'high',
|
|
808
|
+
description: 'Agent function calls itself without visible depth parameter. Could recurse indefinitely.',
|
|
809
|
+
suggestedFix: 'Add depth limit: async function runAgent(task, depth = 0) { if (depth > MAX_DEPTH) throw new Error("Max depth"); await runAgent(subtask, depth + 1) }',
|
|
810
|
+
framework: 'generic',
|
|
811
|
+
},
|
|
812
|
+
{
|
|
813
|
+
name: 'Agent spawns sub-agent without limit',
|
|
814
|
+
pattern: /(?:spawn|create|launch|start)(?:Agent|Worker|Task)\s*\([^)]*\)(?![\s\S]{0,50}(?:depth|level|count|limit|max|MAX))/gi,
|
|
815
|
+
baseSeverity: 'medium',
|
|
816
|
+
description: 'Sub-agent spawned without visible depth or count limit. Could lead to unbounded agent proliferation.',
|
|
817
|
+
suggestedFix: 'Track agent depth/count: if (agentCount >= MAX_AGENTS || depth > MAX_DEPTH) throw new Error("Agent limit reached")',
|
|
818
|
+
framework: 'generic',
|
|
819
|
+
},
|
|
820
|
+
{
|
|
821
|
+
name: 'Recursive task processing without bounds',
|
|
822
|
+
pattern: /(?:result|response|output)\.(?:subtasks?|children|next|followUp)\s*\.(?:forEach|map|for)\s*\([^)]*(?:process|run|execute)(?:Task|Agent)/gi,
|
|
823
|
+
baseSeverity: 'high',
|
|
824
|
+
description: 'Tasks processed recursively based on agent output. Agent could generate unlimited subtasks.',
|
|
825
|
+
suggestedFix: 'Limit subtask count: const subtasks = result.subtasks.slice(0, MAX_SUBTASKS). Track total processed tasks.',
|
|
826
|
+
framework: 'generic',
|
|
827
|
+
},
|
|
828
|
+
{
|
|
829
|
+
name: 'Self-improvement loop without termination',
|
|
830
|
+
pattern: /while\s*\([^)]*(?:improve|optimize|refine|enhance)[^)]*\)\s*\{[\s\S]{0,100}(?:agent|model|llm)/gi,
|
|
831
|
+
baseSeverity: 'high',
|
|
832
|
+
description: 'Agent self-improvement loop without clear termination. Could run indefinitely.',
|
|
833
|
+
suggestedFix: 'Add termination conditions: while (iterations < MAX_ITERATIONS && !satisfactory) { ... iterations++ }',
|
|
834
|
+
framework: 'generic',
|
|
835
|
+
},
|
|
836
|
+
{
|
|
837
|
+
name: 'CrewAI agent delegation without depth',
|
|
838
|
+
pattern: /\.delegate\s*\(\s*[^)]*\)(?![\s\S]{0,30}(?:max_delegation|delegation_limit|depth))/gi,
|
|
839
|
+
baseSeverity: 'medium',
|
|
840
|
+
description: 'CrewAI agent delegation without depth limit. Agents could delegate indefinitely to each other.',
|
|
841
|
+
suggestedFix: 'Set delegation limits in agent config: Agent(..., max_delegation_depth=3)',
|
|
842
|
+
framework: 'crewai',
|
|
843
|
+
},
|
|
844
|
+
{
|
|
845
|
+
name: 'LangGraph recursive edge without limit',
|
|
846
|
+
pattern: /\.add_edge\s*\([^)]*,\s*(?:SAME_NODE|self|current_node)/gi,
|
|
847
|
+
baseSeverity: 'medium',
|
|
848
|
+
description: 'LangGraph edge points back to same node without visible limit. Could create infinite loops.',
|
|
849
|
+
suggestedFix: 'Add iteration tracking and conditional edges with max_iterations check.',
|
|
850
|
+
framework: 'langchain',
|
|
851
|
+
},
|
|
852
|
+
]
|
|
853
|
+
|
|
539
854
|
/**
|
|
540
855
|
* Excessive agency patterns for unbounded agent autonomy
|
|
541
856
|
*/
|
|
@@ -671,7 +986,8 @@ const MISSING_AUTH_PATTERNS: ToolPattern[] = [
|
|
|
671
986
|
*/
|
|
672
987
|
export function detectAIAgentTools(
|
|
673
988
|
content: string,
|
|
674
|
-
filePath: string
|
|
989
|
+
filePath: string,
|
|
990
|
+
options?: { parsed?: ParsedFile }
|
|
675
991
|
): Vulnerability[] {
|
|
676
992
|
const vulnerabilities: Vulnerability[] = []
|
|
677
993
|
|
|
@@ -683,7 +999,7 @@ export function detectAIAgentTools(
|
|
|
683
999
|
return vulnerabilities
|
|
684
1000
|
}
|
|
685
1001
|
|
|
686
|
-
const lines = content.split('\n')
|
|
1002
|
+
const lines = options?.parsed?.lines ?? content.split('\n')
|
|
687
1003
|
const isTestFile = isTestOrMockFile(filePath)
|
|
688
1004
|
const isExample = isExampleDirectory(filePath)
|
|
689
1005
|
const isLibrary = isLibraryCode(filePath)
|
|
@@ -788,7 +1104,9 @@ export function detectAIAgentTools(
|
|
|
788
1104
|
suggestedFix: pattern.suggestedFix,
|
|
789
1105
|
confidence: 'medium',
|
|
790
1106
|
layer: 2,
|
|
1107
|
+
source: 'ai_code' as const,
|
|
791
1108
|
requiresAIValidation: true, // Always validate - context dependent
|
|
1109
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
792
1110
|
})
|
|
793
1111
|
}
|
|
794
1112
|
}
|
|
@@ -834,7 +1152,9 @@ export function detectAIAgentTools(
|
|
|
834
1152
|
suggestedFix: pattern.suggestedFix,
|
|
835
1153
|
confidence: 'low', // Lower confidence - needs context
|
|
836
1154
|
layer: 2,
|
|
1155
|
+
source: 'ai_code' as const,
|
|
837
1156
|
requiresAIValidation: true,
|
|
1157
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
838
1158
|
})
|
|
839
1159
|
}
|
|
840
1160
|
}
|
|
@@ -928,7 +1248,412 @@ export function detectAIAgentTools(
|
|
|
928
1248
|
suggestedFix: pattern.suggestedFix,
|
|
929
1249
|
confidence: severity === 'info' ? 'low' : 'medium',
|
|
930
1250
|
layer: 2,
|
|
1251
|
+
source: 'ai_code' as const,
|
|
1252
|
+
requiresAIValidation: severity !== 'info' && severity !== 'low',
|
|
1253
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
1254
|
+
})
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1257
|
+
|
|
1258
|
+
// Phase 5: Scan for LLM output flow patterns (Task 1)
|
|
1259
|
+
for (const pattern of LLM_OUTPUT_FLOW_PATTERNS) {
|
|
1260
|
+
const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
|
|
1261
|
+
let match
|
|
1262
|
+
|
|
1263
|
+
while ((match = regex.exec(content)) !== null) {
|
|
1264
|
+
const lineNumber = content.substring(0, match.index).split('\n').length
|
|
1265
|
+
const lineContent = lines[lineNumber - 1]?.trim() || ''
|
|
1266
|
+
|
|
1267
|
+
// Skip comments
|
|
1268
|
+
if (isComment(lineContent)) continue
|
|
1269
|
+
|
|
1270
|
+
// Get surrounding context
|
|
1271
|
+
const { context } = findToolDefinitionContext(content, lineNumber)
|
|
1272
|
+
|
|
1273
|
+
// Check for validation/allowlist mitigations
|
|
1274
|
+
const hasValidation = /(?:allowlist|whitelist|ALLOWED_|validTools|VALID_TOOLS|allowedTools|validateTool|isValidTool|includes|has)\s*\(/i.test(context)
|
|
1275
|
+
const hasAllowlistCheck = /if\s*\(\s*!?\s*(?:ALLOWED|VALID|SAFE|permitted).*(?:includes|has|indexOf)/i.test(context)
|
|
1276
|
+
|
|
1277
|
+
let description = pattern.description
|
|
1278
|
+
let severity = pattern.baseSeverity
|
|
1279
|
+
|
|
1280
|
+
if (hasValidation || hasAllowlistCheck) {
|
|
1281
|
+
severity = severity === 'critical' ? 'medium' : 'low'
|
|
1282
|
+
description += ' (Validation/allowlist detected nearby - verify it covers this case.)'
|
|
1283
|
+
}
|
|
1284
|
+
|
|
1285
|
+
if (isTestFile) {
|
|
1286
|
+
severity = 'info'
|
|
1287
|
+
description += ' (In test file.)'
|
|
1288
|
+
} else if (isExample) {
|
|
1289
|
+
severity = 'info'
|
|
1290
|
+
description += ' (In example/demo directory.)'
|
|
1291
|
+
} else if (isLibrary) {
|
|
1292
|
+
severity = 'info'
|
|
1293
|
+
description += ' (Library code.)'
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
vulnerabilities.push({
|
|
1297
|
+
id: `ai-llm-flow-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
|
|
1298
|
+
filePath,
|
|
1299
|
+
lineNumber,
|
|
1300
|
+
lineContent,
|
|
1301
|
+
severity,
|
|
1302
|
+
category: 'ai_excessive_agency',
|
|
1303
|
+
title: pattern.name,
|
|
1304
|
+
description,
|
|
1305
|
+
suggestedFix: pattern.suggestedFix,
|
|
1306
|
+
confidence: severity === 'critical' ? 'high' : 'medium',
|
|
1307
|
+
layer: 2,
|
|
1308
|
+
source: 'ai_code' as const,
|
|
1309
|
+
requiresAIValidation: severity !== 'info',
|
|
1310
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
1311
|
+
})
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
// Phase 5: Scan for tool permission accumulation patterns (Task 2)
|
|
1316
|
+
for (const pattern of TOOL_ACCUMULATION_PATTERNS) {
|
|
1317
|
+
const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
|
|
1318
|
+
let match
|
|
1319
|
+
|
|
1320
|
+
while ((match = regex.exec(content)) !== null) {
|
|
1321
|
+
const lineNumber = content.substring(0, match.index).split('\n').length
|
|
1322
|
+
const lineContent = lines[lineNumber - 1]?.trim() || ''
|
|
1323
|
+
|
|
1324
|
+
// Skip comments
|
|
1325
|
+
if (isComment(lineContent)) continue
|
|
1326
|
+
|
|
1327
|
+
// Skip UI array building patterns (not actual AI tool registration)
|
|
1328
|
+
if (pattern.name === 'Tool array push without limit check') {
|
|
1329
|
+
// Check if this is in a selector or UI configuration builder
|
|
1330
|
+
const isUIPattern =
|
|
1331
|
+
// In selectors (zustand/redux pattern)
|
|
1332
|
+
/selectors?\.ts$/i.test(filePath) ||
|
|
1333
|
+
// In store configuration
|
|
1334
|
+
/store\/.*\/selectors/i.test(filePath) ||
|
|
1335
|
+
// Building manifest/config arrays
|
|
1336
|
+
/manifest\s*:/i.test(lineContent) ||
|
|
1337
|
+
/identifier\s*:/i.test(lineContent) ||
|
|
1338
|
+
// Map/forEach building UI arrays
|
|
1339
|
+
/\.map\s*\([^)]*=>\s*\{[\s\S]{0,100}tools\.push/i.test(content.substring(Math.max(0, match.index - 200), match.index + 100))
|
|
1340
|
+
|
|
1341
|
+
if (isUIPattern) {
|
|
1342
|
+
continue // Skip - this is building a UI configuration array
|
|
1343
|
+
}
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1346
|
+
// Get surrounding context
|
|
1347
|
+
const { context } = findToolDefinitionContext(content, lineNumber)
|
|
1348
|
+
|
|
1349
|
+
// Check for limits and authorization
|
|
1350
|
+
const hasLimits = /(?:max|limit|MAX_|LIMIT_|\.length\s*[<>])/i.test(context)
|
|
1351
|
+
const hasAuthCheck = /(?:if\s*\(.*(?:auth|permission|role|isAdmin|canRegister)|throw.*(?:Unauthorized|Forbidden))/i.test(context)
|
|
1352
|
+
|
|
1353
|
+
let description = pattern.description
|
|
1354
|
+
let severity = pattern.baseSeverity
|
|
1355
|
+
|
|
1356
|
+
if (hasLimits) {
|
|
1357
|
+
severity = severity === 'critical' ? 'high' : severity === 'high' ? 'medium' : 'low'
|
|
1358
|
+
description += ' (Limit check detected nearby.)'
|
|
1359
|
+
}
|
|
1360
|
+
if (hasAuthCheck) {
|
|
1361
|
+
severity = severity === 'critical' ? 'high' : severity === 'high' ? 'medium' : 'low'
|
|
1362
|
+
description += ' (Authorization check detected.)'
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
|
+
if (isTestFile) {
|
|
1366
|
+
severity = 'info'
|
|
1367
|
+
description += ' (In test file.)'
|
|
1368
|
+
} else if (isExample) {
|
|
1369
|
+
severity = 'info'
|
|
1370
|
+
description += ' (In example/demo directory.)'
|
|
1371
|
+
} else if (isLibrary) {
|
|
1372
|
+
severity = 'info'
|
|
1373
|
+
description += ' (Library code.)'
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1376
|
+
vulnerabilities.push({
|
|
1377
|
+
id: `ai-tool-accum-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
|
|
1378
|
+
filePath,
|
|
1379
|
+
lineNumber,
|
|
1380
|
+
lineContent,
|
|
1381
|
+
severity,
|
|
1382
|
+
category: 'ai_excessive_agency',
|
|
1383
|
+
title: pattern.name,
|
|
1384
|
+
description,
|
|
1385
|
+
suggestedFix: pattern.suggestedFix,
|
|
1386
|
+
confidence: 'medium',
|
|
1387
|
+
layer: 2,
|
|
1388
|
+
source: 'ai_code' as const,
|
|
1389
|
+
requiresAIValidation: severity !== 'info' && severity !== 'low',
|
|
1390
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
1391
|
+
})
|
|
1392
|
+
}
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
// Phase 5: Scan for database write scoping patterns (Task 3)
|
|
1396
|
+
for (const pattern of DB_WRITE_SCOPING_PATTERNS) {
|
|
1397
|
+
const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
|
|
1398
|
+
let match
|
|
1399
|
+
|
|
1400
|
+
while ((match = regex.exec(content)) !== null) {
|
|
1401
|
+
const lineNumber = content.substring(0, match.index).split('\n').length
|
|
1402
|
+
const lineContent = lines[lineNumber - 1]?.trim() || ''
|
|
1403
|
+
|
|
1404
|
+
// Skip comments
|
|
1405
|
+
if (isComment(lineContent)) continue
|
|
1406
|
+
|
|
1407
|
+
// Get surrounding context
|
|
1408
|
+
const { context } = findToolDefinitionContext(content, lineNumber)
|
|
1409
|
+
|
|
1410
|
+
// Check for user/tenant scoping
|
|
1411
|
+
const hasUserScoping = hasUserContextVerification(context)
|
|
1412
|
+
const hasTenantScoping = hasTenantContextVerification(context)
|
|
1413
|
+
|
|
1414
|
+
// Skip if properly scoped
|
|
1415
|
+
if (hasUserScoping && hasTenantScoping) continue
|
|
1416
|
+
|
|
1417
|
+
let description = pattern.description
|
|
1418
|
+
let severity = pattern.baseSeverity
|
|
1419
|
+
|
|
1420
|
+
if (hasUserScoping || hasTenantScoping) {
|
|
1421
|
+
severity = severity === 'high' ? 'medium' : 'low'
|
|
1422
|
+
description += hasUserScoping ? ' (User context detected.)' : ' (Tenant context detected.)'
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
if (isTestFile) {
|
|
1426
|
+
severity = 'info'
|
|
1427
|
+
description += ' (In test file.)'
|
|
1428
|
+
} else if (isExample) {
|
|
1429
|
+
severity = 'info'
|
|
1430
|
+
description += ' (In example/demo directory.)'
|
|
1431
|
+
} else if (isLibrary) {
|
|
1432
|
+
severity = 'info'
|
|
1433
|
+
description += ' (Library code.)'
|
|
1434
|
+
}
|
|
1435
|
+
|
|
1436
|
+
vulnerabilities.push({
|
|
1437
|
+
id: `ai-db-scoping-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
|
|
1438
|
+
filePath,
|
|
1439
|
+
lineNumber,
|
|
1440
|
+
lineContent,
|
|
1441
|
+
severity,
|
|
1442
|
+
category: 'ai_excessive_agency',
|
|
1443
|
+
title: pattern.name,
|
|
1444
|
+
description,
|
|
1445
|
+
suggestedFix: pattern.suggestedFix,
|
|
1446
|
+
confidence: 'medium',
|
|
1447
|
+
layer: 2,
|
|
1448
|
+
source: 'ai_code' as const,
|
|
1449
|
+
requiresAIValidation: severity !== 'info',
|
|
1450
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
1451
|
+
})
|
|
1452
|
+
}
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
// Phase 5: Scan for recursive agent patterns (Task 4)
|
|
1456
|
+
for (const pattern of RECURSIVE_AGENT_PATTERNS) {
|
|
1457
|
+
const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
|
|
1458
|
+
let match
|
|
1459
|
+
|
|
1460
|
+
while ((match = regex.exec(content)) !== null) {
|
|
1461
|
+
const lineNumber = content.substring(0, match.index).split('\n').length
|
|
1462
|
+
const lineContent = lines[lineNumber - 1]?.trim() || ''
|
|
1463
|
+
|
|
1464
|
+
// Skip comments
|
|
1465
|
+
if (isComment(lineContent)) continue
|
|
1466
|
+
|
|
1467
|
+
// Skip CRUD/data operations that are NOT AI agent spawning
|
|
1468
|
+
// These are false positives in apps where "agent" means "chat assistant configuration"
|
|
1469
|
+
if (pattern.name === 'Agent spawns sub-agent without limit') {
|
|
1470
|
+
const crudPatterns = [
|
|
1471
|
+
// Service/SDK method calls - database CRUD for agent configurations
|
|
1472
|
+
/(?:service|Service|sdk|SDK|store|Store|runtime|Runtime)\.(?:create|get|update|delete)Agent/i,
|
|
1473
|
+
/\.agents\.createAgent/i, // sdk.agents.createAgent
|
|
1474
|
+
/agentService\.createAgent/i,
|
|
1475
|
+
/agentState\.createAgent/i,
|
|
1476
|
+
/marketSDK\.agents\.createAgent/i,
|
|
1477
|
+
// React event handlers creating UI entities
|
|
1478
|
+
/onClick\s*=\s*\{\s*\(\s*\)\s*=>\s*createAgent/i,
|
|
1479
|
+
// Store action patterns
|
|
1480
|
+
/await\s+(?:state|store)\w*\.createAgent/i,
|
|
1481
|
+
// Builder/Runtime patterns for UI
|
|
1482
|
+
/agentBuilder(?:Runtime)?\.createAgent/i,
|
|
1483
|
+
/groupAgentBuilderRuntime\.createAgent/i,
|
|
1484
|
+
]
|
|
1485
|
+
if (crudPatterns.some(p => p.test(lineContent))) {
|
|
1486
|
+
continue // Skip - this is a data CRUD operation, not AI agent spawning
|
|
1487
|
+
}
|
|
1488
|
+
}
|
|
1489
|
+
|
|
1490
|
+
// Get surrounding context
|
|
1491
|
+
const { context } = findToolDefinitionContext(content, lineNumber)
|
|
1492
|
+
|
|
1493
|
+
// Check for depth/count limits
|
|
1494
|
+
const hasDepthLimit = /(?:depth|level|recursion)\s*[<>]|MAX_DEPTH|maxDepth|max_depth/i.test(context)
|
|
1495
|
+
const hasCountLimit = /(?:count|iterations?)\s*[<>]|MAX_(?:AGENTS|TASKS|ITERATIONS)/i.test(context)
|
|
1496
|
+
|
|
1497
|
+
let description = pattern.description
|
|
1498
|
+
let severity = pattern.baseSeverity
|
|
1499
|
+
|
|
1500
|
+
if (hasDepthLimit || hasCountLimit) {
|
|
1501
|
+
severity = severity === 'high' ? 'medium' : 'low'
|
|
1502
|
+
description += hasDepthLimit ? ' (Depth limit detected.)' : ' (Count limit detected.)'
|
|
1503
|
+
}
|
|
1504
|
+
|
|
1505
|
+
// Check for iteration/timeout limits
|
|
1506
|
+
if (hasIterationLimits(context) || hasTimeoutConfigured(context)) {
|
|
1507
|
+
severity = severity === 'high' ? 'medium' : severity === 'medium' ? 'low' : severity
|
|
1508
|
+
description += ' (Iteration/timeout limits configured.)'
|
|
1509
|
+
}
|
|
1510
|
+
|
|
1511
|
+
if (isTestFile) {
|
|
1512
|
+
severity = 'info'
|
|
1513
|
+
description += ' (In test file.)'
|
|
1514
|
+
} else if (isExample) {
|
|
1515
|
+
severity = 'info'
|
|
1516
|
+
description += ' (In example/demo directory.)'
|
|
1517
|
+
} else if (isLibrary) {
|
|
1518
|
+
severity = 'info'
|
|
1519
|
+
description += ' (Library code.)'
|
|
1520
|
+
}
|
|
1521
|
+
|
|
1522
|
+
vulnerabilities.push({
|
|
1523
|
+
id: `ai-recursive-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
|
|
1524
|
+
filePath,
|
|
1525
|
+
lineNumber,
|
|
1526
|
+
lineContent,
|
|
1527
|
+
severity,
|
|
1528
|
+
category: 'ai_excessive_agency',
|
|
1529
|
+
title: pattern.name,
|
|
1530
|
+
description,
|
|
1531
|
+
suggestedFix: pattern.suggestedFix,
|
|
1532
|
+
confidence: 'medium',
|
|
1533
|
+
layer: 2,
|
|
1534
|
+
source: 'ai_code' as const,
|
|
1535
|
+
requiresAIValidation: severity !== 'info' && severity !== 'low',
|
|
1536
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
1537
|
+
})
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
|
|
1541
|
+
// Phase 6: Scan for tool parameter injection patterns (Task 1)
|
|
1542
|
+
for (const pattern of TOOL_PARAMETER_INJECTION_PATTERNS) {
|
|
1543
|
+
const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
|
|
1544
|
+
let match
|
|
1545
|
+
|
|
1546
|
+
while ((match = regex.exec(content)) !== null) {
|
|
1547
|
+
const lineNumber = content.substring(0, match.index).split('\n').length
|
|
1548
|
+
const lineContent = lines[lineNumber - 1]?.trim() || ''
|
|
1549
|
+
|
|
1550
|
+
// Skip comments
|
|
1551
|
+
if (isComment(lineContent)) continue
|
|
1552
|
+
|
|
1553
|
+
// Get surrounding context
|
|
1554
|
+
const { context } = findToolDefinitionContext(content, lineNumber)
|
|
1555
|
+
|
|
1556
|
+
// Check for validation/schema patterns
|
|
1557
|
+
const hasValidation = /(?:zod|yup|joi|schema|validate|safeParse|\.parse\(|validateSchema)/i.test(context)
|
|
1558
|
+
const hasSanitization = /(?:sanitize|clean|escape|filter|strip)/i.test(context)
|
|
1559
|
+
|
|
1560
|
+
let description = pattern.description
|
|
1561
|
+
let severity = pattern.baseSeverity
|
|
1562
|
+
|
|
1563
|
+
if (hasValidation) {
|
|
1564
|
+
severity = 'low'
|
|
1565
|
+
description += ' (Schema validation detected nearby - verify it covers LLM output.)'
|
|
1566
|
+
} else if (hasSanitization) {
|
|
1567
|
+
severity = severity === 'critical' ? 'high' : severity === 'high' ? 'medium' : 'low'
|
|
1568
|
+
description += ' (Sanitization detected nearby.)'
|
|
1569
|
+
}
|
|
1570
|
+
|
|
1571
|
+
if (isTestFile) {
|
|
1572
|
+
severity = 'info'
|
|
1573
|
+
description += ' (In test file.)'
|
|
1574
|
+
} else if (isExample) {
|
|
1575
|
+
severity = 'info'
|
|
1576
|
+
description += ' (In example/demo directory.)'
|
|
1577
|
+
} else if (isLibrary) {
|
|
1578
|
+
severity = 'info'
|
|
1579
|
+
description += ' (Library code.)'
|
|
1580
|
+
}
|
|
1581
|
+
|
|
1582
|
+
vulnerabilities.push({
|
|
1583
|
+
id: `ai-tool-param-injection-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
|
|
1584
|
+
filePath,
|
|
1585
|
+
lineNumber,
|
|
1586
|
+
lineContent,
|
|
1587
|
+
severity,
|
|
1588
|
+
category: 'ai_excessive_agency',
|
|
1589
|
+
title: pattern.name,
|
|
1590
|
+
description,
|
|
1591
|
+
suggestedFix: pattern.suggestedFix,
|
|
1592
|
+
confidence: severity === 'critical' ? 'high' : 'medium',
|
|
1593
|
+
layer: 2,
|
|
1594
|
+
source: 'ai_code' as const,
|
|
1595
|
+
requiresAIValidation: severity !== 'info' && severity !== 'low',
|
|
1596
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
1597
|
+
})
|
|
1598
|
+
}
|
|
1599
|
+
}
|
|
1600
|
+
|
|
1601
|
+
// Phase 6: Scan for tool error message injection patterns (Task 2)
|
|
1602
|
+
for (const pattern of TOOL_ERROR_INJECTION_PATTERNS) {
|
|
1603
|
+
const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
|
|
1604
|
+
let match
|
|
1605
|
+
|
|
1606
|
+
while ((match = regex.exec(content)) !== null) {
|
|
1607
|
+
const lineNumber = content.substring(0, match.index).split('\n').length
|
|
1608
|
+
const lineContent = lines[lineNumber - 1]?.trim() || ''
|
|
1609
|
+
|
|
1610
|
+
// Skip comments
|
|
1611
|
+
if (isComment(lineContent)) continue
|
|
1612
|
+
|
|
1613
|
+
// Get surrounding context
|
|
1614
|
+
const { context } = findToolDefinitionContext(content, lineNumber)
|
|
1615
|
+
|
|
1616
|
+
// Check for error sanitization patterns
|
|
1617
|
+
const hasSanitizedError = /(?:sanitizeError|genericError|safeError|errorMessage\s*=\s*['"`])/i.test(context)
|
|
1618
|
+
const hasLogging = /(?:logger|console)\.\w+\s*\([^)]*(?:error|err|e)\)/i.test(context)
|
|
1619
|
+
|
|
1620
|
+
let description = pattern.description
|
|
1621
|
+
let severity = pattern.baseSeverity
|
|
1622
|
+
|
|
1623
|
+
if (hasSanitizedError) {
|
|
1624
|
+
severity = 'info'
|
|
1625
|
+
description += ' (Error sanitization detected.)'
|
|
1626
|
+
} else if (hasLogging) {
|
|
1627
|
+
severity = severity === 'high' ? 'medium' : 'low'
|
|
1628
|
+
description += ' (Server-side logging detected - verify error is sanitized in response.)'
|
|
1629
|
+
}
|
|
1630
|
+
|
|
1631
|
+
if (isTestFile) {
|
|
1632
|
+
severity = 'info'
|
|
1633
|
+
description += ' (In test file.)'
|
|
1634
|
+
} else if (isExample) {
|
|
1635
|
+
severity = 'info'
|
|
1636
|
+
description += ' (In example/demo directory.)'
|
|
1637
|
+
} else if (isLibrary) {
|
|
1638
|
+
severity = 'info'
|
|
1639
|
+
description += ' (Library code.)'
|
|
1640
|
+
}
|
|
1641
|
+
|
|
1642
|
+
vulnerabilities.push({
|
|
1643
|
+
id: `ai-tool-error-injection-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
|
|
1644
|
+
filePath,
|
|
1645
|
+
lineNumber,
|
|
1646
|
+
lineContent,
|
|
1647
|
+
severity,
|
|
1648
|
+
category: 'ai_excessive_agency',
|
|
1649
|
+
title: pattern.name,
|
|
1650
|
+
description,
|
|
1651
|
+
suggestedFix: pattern.suggestedFix,
|
|
1652
|
+
confidence: 'medium',
|
|
1653
|
+
layer: 2,
|
|
1654
|
+
source: 'ai_code' as const,
|
|
931
1655
|
requiresAIValidation: severity !== 'info' && severity !== 'low',
|
|
1656
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
932
1657
|
})
|
|
933
1658
|
}
|
|
934
1659
|
}
|