@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
|
@@ -4,10 +4,14 @@
|
|
|
4
4
|
* BYOK is often a feature, not a vulnerability - severity depends on context
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import type { Vulnerability, VulnerabilitySeverity } from '
|
|
8
|
-
import type {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
7
|
+
import type { Vulnerability, VulnerabilitySeverity } from '../../shared/types'
|
|
8
|
+
import type { ParsedFile } from '../../shared/parsed-file'
|
|
9
|
+
import type { MiddlewareAuthConfig } from '../../model/middleware-detector'
|
|
10
|
+
import { isComment, isTestOrMockFile, isExampleFile, isPlaceholderValue, isScannerOrFixtureFile } from '../../parse/file-classifier'
|
|
11
|
+
import { isRouteProtectedByMiddleware, getRoutePathFromFile, detectUserScopingPatterns } from '../../model/middleware-detector'
|
|
12
|
+
|
|
13
|
+
const BASE_CONFIDENCE_STORAGE = 0.50
|
|
14
|
+
const BASE_CONFIDENCE_TRANSIENT = 0.25
|
|
11
15
|
|
|
12
16
|
/**
|
|
13
17
|
* Check if line contains example/placeholder API key patterns
|
|
@@ -221,14 +225,15 @@ function isKeyLogged(content: string, lineNumber: number): boolean {
|
|
|
221
225
|
export function detectBYOKPatterns(
|
|
222
226
|
content: string,
|
|
223
227
|
filePath: string,
|
|
224
|
-
middlewareConfig?: MiddlewareAuthConfig
|
|
228
|
+
middlewareConfig?: MiddlewareAuthConfig,
|
|
229
|
+
options?: { parsed?: ParsedFile }
|
|
225
230
|
): Vulnerability[] {
|
|
226
231
|
const vulnerabilities: Vulnerability[] = []
|
|
227
232
|
|
|
228
233
|
// Skip scanner/fixture files to avoid self-detection
|
|
229
234
|
if (isScannerOrFixtureFile(filePath)) return vulnerabilities
|
|
230
235
|
|
|
231
|
-
const lines = content.split('\n')
|
|
236
|
+
const lines = options?.parsed?.lines ?? content.split('\n')
|
|
232
237
|
const isTestFile = isTestOrMockFile(filePath)
|
|
233
238
|
|
|
234
239
|
// Skip example/demo files entirely - they contain placeholder credentials by design
|
|
@@ -270,6 +275,7 @@ export function detectBYOKPatterns(
|
|
|
270
275
|
let severity: VulnerabilitySeverity
|
|
271
276
|
let description: string
|
|
272
277
|
let suggestedFix: string
|
|
278
|
+
let baseConfidence: number
|
|
273
279
|
|
|
274
280
|
if (isAuthenticated && isTransient) {
|
|
275
281
|
// Authenticated and transient - this is the IDEAL BYOK pattern
|
|
@@ -279,6 +285,7 @@ export function detectBYOKPatterns(
|
|
|
279
285
|
severity = 'low'
|
|
280
286
|
description = `BYOK feature detected: ${pattern.description}. Keys are used transiently (good!) but appear to be logged (avoid logging API keys, even in debug).`
|
|
281
287
|
suggestedFix = 'Remove logging of API keys. Best practices: (1) Validate API key format, (2) Add per-user rate limiting.'
|
|
288
|
+
baseConfidence = BASE_CONFIDENCE_STORAGE
|
|
282
289
|
} else {
|
|
283
290
|
// IDEAL PATTERN: Authenticated + transient + no logging = no issue
|
|
284
291
|
// Skip emitting a finding entirely for the ideal case
|
|
@@ -289,26 +296,31 @@ export function detectBYOKPatterns(
|
|
|
289
296
|
severity = 'low'
|
|
290
297
|
description = `BYOK feature detected: ${pattern.description}. Keys are used transiently (not stored). Consider adding authentication or rate limiting.`
|
|
291
298
|
suggestedFix = 'Consider adding authentication. If intentionally public: add rate limiting, key format validation, and usage tracking.'
|
|
299
|
+
baseConfidence = BASE_CONFIDENCE_TRANSIENT
|
|
292
300
|
} else if (!isAuthenticated && isStoredCentrally) {
|
|
293
301
|
// Unauthenticated AND storing keys - this is the real risk
|
|
294
302
|
severity = 'medium'
|
|
295
303
|
description = `${pattern.description}. This endpoint appears to lack authentication AND stores keys. This could allow unauthorized key storage.`
|
|
296
304
|
suggestedFix = 'Add authentication. Ensure stored keys are scoped by user_id with proper access controls.'
|
|
305
|
+
baseConfidence = BASE_CONFIDENCE_STORAGE
|
|
297
306
|
} else if (isStoredCentrally && !isUserScoped) {
|
|
298
307
|
// Authenticated but keys stored without user scoping - medium risk
|
|
299
308
|
severity = 'medium'
|
|
300
309
|
description = `${pattern.description}. Keys appear to be stored centrally without user-scoping, which could lead to cross-tenant key access.`
|
|
301
310
|
suggestedFix = 'Ensure stored keys are scoped by user_id. Add proper access controls to prevent users from accessing other users\' keys.'
|
|
311
|
+
baseConfidence = BASE_CONFIDENCE_STORAGE
|
|
302
312
|
} else if (isAuthenticated && isUserScoped) {
|
|
303
313
|
// Authenticated and user-scoped with storage - generally okay
|
|
304
314
|
severity = 'info'
|
|
305
315
|
description = `${pattern.description}. Route is authenticated and operations appear user-scoped. If keys are stored, consider encryption at rest.`
|
|
306
316
|
suggestedFix = 'If storing keys: consider encryption at rest. Add rate limiting to prevent cost abuse.'
|
|
317
|
+
baseConfidence = BASE_CONFIDENCE_STORAGE
|
|
307
318
|
} else {
|
|
308
319
|
// Authenticated but unclear scoping - needs review, but low priority
|
|
309
320
|
severity = 'info'
|
|
310
321
|
description = `${pattern.description}. Route is authenticated. This appears to be a BYOK feature.`
|
|
311
322
|
suggestedFix = 'Verify user-scoping for stored keys. Add rate limiting for cost control.'
|
|
323
|
+
baseConfidence = BASE_CONFIDENCE_TRANSIENT
|
|
312
324
|
}
|
|
313
325
|
|
|
314
326
|
// Downgrade test files
|
|
@@ -329,6 +341,8 @@ export function detectBYOKPatterns(
|
|
|
329
341
|
suggestedFix,
|
|
330
342
|
confidence: isTestFile ? 'low' : 'medium',
|
|
331
343
|
layer: 2,
|
|
344
|
+
source: 'ai_code' as const,
|
|
345
|
+
baseConfidence,
|
|
332
346
|
})
|
|
333
347
|
|
|
334
348
|
break // One finding per line
|
|
@@ -8,15 +8,18 @@
|
|
|
8
8
|
* - Missing rate limiting on AI routes
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import type { Vulnerability, VulnerabilitySeverity } from '
|
|
12
|
-
import type {
|
|
11
|
+
import type { Vulnerability, VulnerabilitySeverity } from '../../shared/types'
|
|
12
|
+
import type { ParsedFile } from '../../shared/parsed-file'
|
|
13
|
+
import type { MiddlewareAuthConfig } from '../../model/middleware-detector'
|
|
13
14
|
import {
|
|
14
15
|
isComment,
|
|
15
16
|
isTestOrMockFile,
|
|
16
17
|
isDocumentationFile,
|
|
17
18
|
isScannerOrFixtureFile,
|
|
18
19
|
isExampleDirectory,
|
|
19
|
-
} from '
|
|
20
|
+
} from '../../parse/file-classifier'
|
|
21
|
+
|
|
22
|
+
const BASE_CONFIDENCE = 0.50
|
|
20
23
|
|
|
21
24
|
// ============================================================================
|
|
22
25
|
// Context Detection
|
|
@@ -255,6 +258,7 @@ const ROUTE_HANDLER_PATTERNS: EndpointProtectionPattern[] = [
|
|
|
255
258
|
|
|
256
259
|
export interface EndpointProtectionOptions {
|
|
257
260
|
middlewareConfig?: MiddlewareAuthConfig
|
|
261
|
+
parsed?: ParsedFile
|
|
258
262
|
}
|
|
259
263
|
|
|
260
264
|
/**
|
|
@@ -276,7 +280,7 @@ export function detectAIEndpointProtection(
|
|
|
276
280
|
return vulnerabilities
|
|
277
281
|
}
|
|
278
282
|
|
|
279
|
-
const lines = content.split('\n')
|
|
283
|
+
const lines = options?.parsed?.lines ?? content.split('\n')
|
|
280
284
|
const isTestFile = isTestOrMockFile(filePath)
|
|
281
285
|
const isExample = isExampleDirectory(filePath)
|
|
282
286
|
|
|
@@ -382,7 +386,9 @@ export function detectAIEndpointProtection(
|
|
|
382
386
|
suggestedFix,
|
|
383
387
|
confidence: severity === 'info' ? 'low' : 'medium',
|
|
384
388
|
layer: 2,
|
|
389
|
+
source: 'ai_code' as const,
|
|
385
390
|
requiresAIValidation: severity !== 'info',
|
|
391
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
386
392
|
})
|
|
387
393
|
|
|
388
394
|
// Only report one finding per file (file-level issue)
|
|
@@ -11,15 +11,18 @@
|
|
|
11
11
|
* - Template rendering: innerHTML, dangerouslySetInnerHTML
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import type { Vulnerability, VulnerabilitySeverity } from '
|
|
14
|
+
import type { Vulnerability, VulnerabilitySeverity } from '../../shared/types'
|
|
15
|
+
import type { ParsedFile } from '../../shared/parsed-file'
|
|
15
16
|
import {
|
|
16
17
|
isComment,
|
|
17
18
|
isTestOrMockFile,
|
|
18
19
|
isScannerOrFixtureFile,
|
|
19
20
|
isExampleDirectory,
|
|
20
21
|
isLibraryCode,
|
|
21
|
-
} from '
|
|
22
|
-
import { isLLMContextFile } from './
|
|
22
|
+
} from '../../parse/file-classifier'
|
|
23
|
+
import { isLLMContextFile } from './prompt-hygiene'
|
|
24
|
+
|
|
25
|
+
const BASE_CONFIDENCE = 0.55
|
|
23
26
|
|
|
24
27
|
// ============================================================================
|
|
25
28
|
// LLM Output Variable Detection
|
|
@@ -141,11 +144,11 @@ function isAppDataInterpolation(lineContent: string, surroundingContext: string)
|
|
|
141
144
|
/**
|
|
142
145
|
* Check if execution is sandboxed
|
|
143
146
|
*/
|
|
144
|
-
function isSandboxedExecution(content: string, lineNumber: number): boolean {
|
|
145
|
-
const
|
|
147
|
+
function isSandboxedExecution(content: string, lineNumber: number, lines?: string[]): boolean {
|
|
148
|
+
const _lines = lines ?? content.split('\n')
|
|
146
149
|
const contextStart = Math.max(0, lineNumber - 25)
|
|
147
|
-
const contextEnd = Math.min(
|
|
148
|
-
const context =
|
|
150
|
+
const contextEnd = Math.min(_lines.length, lineNumber + 10)
|
|
151
|
+
const context = _lines.slice(contextStart, contextEnd).join('\n')
|
|
149
152
|
|
|
150
153
|
const sandboxPatterns = [
|
|
151
154
|
/vm2/i,
|
|
@@ -168,11 +171,11 @@ function isSandboxedExecution(content: string, lineNumber: number): boolean {
|
|
|
168
171
|
/**
|
|
169
172
|
* Check if output has validation before execution
|
|
170
173
|
*/
|
|
171
|
-
function hasOutputValidation(content: string, lineNumber: number): boolean {
|
|
172
|
-
const
|
|
174
|
+
function hasOutputValidation(content: string, lineNumber: number, lines?: string[]): boolean {
|
|
175
|
+
const _lines = lines ?? content.split('\n')
|
|
173
176
|
const contextStart = Math.max(0, lineNumber - 15)
|
|
174
|
-
const contextEnd = Math.min(
|
|
175
|
-
const context =
|
|
177
|
+
const contextEnd = Math.min(_lines.length, lineNumber + 5)
|
|
178
|
+
const context = _lines.slice(contextStart, contextEnd).join('\n')
|
|
176
179
|
|
|
177
180
|
const validationPatterns = [
|
|
178
181
|
/validate/i,
|
|
@@ -615,6 +618,126 @@ const EXECUTION_SINK_PATTERNS: ExecutionSinkPattern[] = [
|
|
|
615
618
|
description: 'AI-generated value interpolated into SQL query via f-string. Enables SQL injection.',
|
|
616
619
|
suggestedFix: 'Use parameterized queries: cursor.execute("SELECT * FROM users WHERE id = ?", [user_id])',
|
|
617
620
|
},
|
|
621
|
+
|
|
622
|
+
// ========== Sprint 6: Template Engine Injection Sinks ==========
|
|
623
|
+
{
|
|
624
|
+
name: 'LLM output to EJS template',
|
|
625
|
+
pattern: /\bejs\.(?:render|renderFile|compile)\s*\([^)]*(?:response|result|output|completion|content|message|text|answer)(?:\.|\.data\.|\.text|\.content)?/gi,
|
|
626
|
+
sinkType: 'template_render',
|
|
627
|
+
baseSeverity: 'high',
|
|
628
|
+
description: 'LLM output passed to EJS template engine. Server-side template injection (SSTI) can lead to remote code execution.',
|
|
629
|
+
suggestedFix: 'Sanitize LLM output before passing to templates. Use autoescaping and never pass AI output as template source.',
|
|
630
|
+
},
|
|
631
|
+
{
|
|
632
|
+
name: 'LLM output to Handlebars template',
|
|
633
|
+
pattern: /\b(?:handlebars|hbs)\.(?:compile|render)\s*\([^)]*(?:response|result|output|completion|content)(?:\.|\.data\.|\.text|\.content)?/gi,
|
|
634
|
+
sinkType: 'template_render',
|
|
635
|
+
baseSeverity: 'high',
|
|
636
|
+
description: 'LLM output passed to Handlebars template. If used with SafeString, SSTI is possible.',
|
|
637
|
+
suggestedFix: 'Never pass LLM output to Handlebars SafeString. Use default escaping and sanitize AI output.',
|
|
638
|
+
},
|
|
639
|
+
{
|
|
640
|
+
name: 'LLM output to Pug/Jade template',
|
|
641
|
+
pattern: /\bpug\.(?:render|compile|renderFile)\s*\([^)]*(?:response|result|output|completion|content)(?:\.|\.data\.|\.text|\.content)?/gi,
|
|
642
|
+
sinkType: 'template_render',
|
|
643
|
+
baseSeverity: 'high',
|
|
644
|
+
description: 'LLM output passed to Pug template engine. Unescaped interpolation (!{}) enables SSTI.',
|
|
645
|
+
suggestedFix: 'Use escaped interpolation (#{}) and sanitize LLM output before rendering.',
|
|
646
|
+
},
|
|
647
|
+
{
|
|
648
|
+
name: 'LLM output to Nunjucks template',
|
|
649
|
+
pattern: /\bnunjucks\.(?:render|renderString)\s*\([^)]*(?:response|result|output|completion|content)(?:\.|\.data\.|\.text|\.content)?/gi,
|
|
650
|
+
sinkType: 'template_render',
|
|
651
|
+
baseSeverity: 'high',
|
|
652
|
+
description: 'LLM output passed to Nunjucks template. SSTI risk if autoescape is disabled.',
|
|
653
|
+
suggestedFix: 'Enable autoescape and sanitize LLM output before rendering.',
|
|
654
|
+
},
|
|
655
|
+
{
|
|
656
|
+
name: 'LLM output to Jinja2 template (Python)',
|
|
657
|
+
pattern: /\b(?:jinja2\.)?Template\s*\([^)]*(?:response|result|output|completion|content)(?:\.|\.content|\.text)?/gi,
|
|
658
|
+
sinkType: 'template_render',
|
|
659
|
+
baseSeverity: 'high',
|
|
660
|
+
description: 'LLM output used as Jinja2 template source. SSTI can lead to RCE in Python.',
|
|
661
|
+
suggestedFix: 'Never use LLM output as template source. Use it only as template variables with autoescaping enabled.',
|
|
662
|
+
},
|
|
663
|
+
{
|
|
664
|
+
name: 'LLM output in Mustache template',
|
|
665
|
+
pattern: /\bMustache\.render\s*\([^)]*(?:response|result|output|completion|content)(?:\.|\.data\.|\.text|\.content)?/gi,
|
|
666
|
+
sinkType: 'template_render',
|
|
667
|
+
baseSeverity: 'medium',
|
|
668
|
+
description: 'LLM output passed to Mustache template. While Mustache auto-escapes HTML, triple braces {{{...}}} bypass this.',
|
|
669
|
+
suggestedFix: 'Ensure LLM output is never used with triple braces. Validate template structure.',
|
|
670
|
+
},
|
|
671
|
+
|
|
672
|
+
// ========== Sprint 6: NoSQL Injection Sinks ==========
|
|
673
|
+
{
|
|
674
|
+
name: 'NoSQL injection via JSON.parse',
|
|
675
|
+
pattern: /\.(?:find|findOne|findOneAndUpdate|updateOne|updateMany|deleteOne|deleteMany|aggregate)\s*\(\s*JSON\.parse\s*\(\s*(?:response|result|output|completion|content)(?:\.|\.text|\.content)?/gi,
|
|
676
|
+
sinkType: 'sql_builder',
|
|
677
|
+
baseSeverity: 'high',
|
|
678
|
+
description: 'LLM output parsed as MongoDB query via JSON.parse. NoSQL injection can bypass authentication or leak data.',
|
|
679
|
+
suggestedFix: 'Use parameterized queries or validate/sanitize LLM output against a schema before using in queries.',
|
|
680
|
+
},
|
|
681
|
+
{
|
|
682
|
+
name: 'MongoDB $where injection',
|
|
683
|
+
pattern: /\$where\s*:\s*[^}]*(?:response|result|output|completion|content|message)(?:\.|\.text|\.content)?/gi,
|
|
684
|
+
sinkType: 'sql_builder',
|
|
685
|
+
baseSeverity: 'critical',
|
|
686
|
+
description: 'LLM output in MongoDB $where operator. $where executes JavaScript, enabling arbitrary code execution.',
|
|
687
|
+
suggestedFix: 'Avoid $where operator entirely. Use standard MongoDB query operators instead.',
|
|
688
|
+
},
|
|
689
|
+
{
|
|
690
|
+
name: 'Dynamic MongoDB query from LLM',
|
|
691
|
+
pattern: /(?:db|collection|mongoose)\.(?:find|findOne|aggregate)\s*\(\s*(?:response|result|output|completion|aiQuery)(?:\.|\.query|\.filter)?/gi,
|
|
692
|
+
sinkType: 'sql_builder',
|
|
693
|
+
baseSeverity: 'high',
|
|
694
|
+
description: 'LLM output used directly as MongoDB query. Query operators could be injected.',
|
|
695
|
+
suggestedFix: 'Validate query structure. Only allow specific operators. Use schema validation before query execution.',
|
|
696
|
+
},
|
|
697
|
+
|
|
698
|
+
// ========== Sprint 6: GraphQL Injection Sinks ==========
|
|
699
|
+
{
|
|
700
|
+
name: 'GraphQL query injection',
|
|
701
|
+
pattern: /\b(?:gql|graphql)\s*`[^`]*\$\{[^}]*(?:response|result|output|completion|content|message)[^}]*\}/gi,
|
|
702
|
+
sinkType: 'sql_builder',
|
|
703
|
+
baseSeverity: 'high',
|
|
704
|
+
description: 'LLM output interpolated into GraphQL query string. Can lead to query manipulation or unauthorized data access.',
|
|
705
|
+
suggestedFix: 'Use GraphQL variables instead of string interpolation for dynamic values.',
|
|
706
|
+
},
|
|
707
|
+
{
|
|
708
|
+
name: 'GraphQL query from LLM output',
|
|
709
|
+
pattern: /(?:apolloClient|urqlClient|client)\.query\s*\(\s*\{[^}]*query\s*:\s*(?:response|result|output|completion|aiQuery)(?:\.|\.query)?/gi,
|
|
710
|
+
sinkType: 'sql_builder',
|
|
711
|
+
baseSeverity: 'high',
|
|
712
|
+
description: 'LLM output used as GraphQL query. Malicious queries could access unauthorized data or cause DoS.',
|
|
713
|
+
suggestedFix: 'Use predefined queries with variables. Validate query structure and depth before execution.',
|
|
714
|
+
},
|
|
715
|
+
|
|
716
|
+
// ========== Sprint 6: ReDoS (Regular Expression DoS) Sinks ==========
|
|
717
|
+
{
|
|
718
|
+
name: 'Dynamic regex from LLM output',
|
|
719
|
+
pattern: /new\s+RegExp\s*\(\s*(?:response|result|output|completion|content|message|answer)(?:\.|\.text|\.content|\.pattern)?/gi,
|
|
720
|
+
sinkType: 'code_execution',
|
|
721
|
+
baseSeverity: 'medium',
|
|
722
|
+
description: 'LLM-generated regex pattern. Malicious patterns can cause catastrophic backtracking (ReDoS), hanging the server.',
|
|
723
|
+
suggestedFix: 'Validate regex complexity before compilation. Use safe-regex library or set timeout for regex execution.',
|
|
724
|
+
},
|
|
725
|
+
{
|
|
726
|
+
name: 'Python regex from LLM output',
|
|
727
|
+
pattern: /re\.compile\s*\(\s*(?:response|result|output|completion|content|pattern)(?:\.|\.text|\.content)?/gi,
|
|
728
|
+
sinkType: 'code_execution',
|
|
729
|
+
baseSeverity: 'medium',
|
|
730
|
+
description: 'LLM-generated regex compiled in Python. ReDoS attacks can cause denial of service.',
|
|
731
|
+
suggestedFix: 'Use regex_timeout or validate pattern complexity before compilation.',
|
|
732
|
+
},
|
|
733
|
+
{
|
|
734
|
+
name: 'Dynamic regex replacement',
|
|
735
|
+
pattern: /\.replace\s*\(\s*new\s+RegExp\s*\(\s*(?:response|result|output|completion|content)/gi,
|
|
736
|
+
sinkType: 'code_execution',
|
|
737
|
+
baseSeverity: 'medium',
|
|
738
|
+
description: 'LLM output used as regex pattern in replace operation. ReDoS risk.',
|
|
739
|
+
suggestedFix: 'Use string replace or validate regex pattern complexity.',
|
|
740
|
+
},
|
|
618
741
|
]
|
|
619
742
|
|
|
620
743
|
// ============================================================================
|
|
@@ -626,11 +749,11 @@ const EXECUTION_SINK_PATTERNS: ExecutionSinkPattern[] = [
|
|
|
626
749
|
* Strong validation = skip finding entirely
|
|
627
750
|
* Weak validation = downgrade severity
|
|
628
751
|
*/
|
|
629
|
-
function getURLValidationLevel(content: string, lineNumber: number): 'strong' | 'weak' | 'none' {
|
|
630
|
-
const
|
|
752
|
+
function getURLValidationLevel(content: string, lineNumber: number, lines?: string[]): 'strong' | 'weak' | 'none' {
|
|
753
|
+
const _lines = lines ?? content.split('\n')
|
|
631
754
|
const contextStart = Math.max(0, lineNumber - 15)
|
|
632
|
-
const contextEnd = Math.min(
|
|
633
|
-
const context =
|
|
755
|
+
const contextEnd = Math.min(_lines.length, lineNumber + 5)
|
|
756
|
+
const context = _lines.slice(contextStart, contextEnd).join('\n')
|
|
634
757
|
|
|
635
758
|
// Strong validation - skip entirely
|
|
636
759
|
const strongValidationPatterns = [
|
|
@@ -699,11 +822,11 @@ function isDOMSanitized(lineContent: string, surroundingContext: string): boolea
|
|
|
699
822
|
/**
|
|
700
823
|
* Check if file path is properly validated
|
|
701
824
|
*/
|
|
702
|
-
function isPathValidated(content: string, lineNumber: number): boolean {
|
|
703
|
-
const
|
|
825
|
+
function isPathValidated(content: string, lineNumber: number, lines?: string[]): boolean {
|
|
826
|
+
const _lines = lines ?? content.split('\n')
|
|
704
827
|
const contextStart = Math.max(0, lineNumber - 15)
|
|
705
|
-
const contextEnd = Math.min(
|
|
706
|
-
const context =
|
|
828
|
+
const contextEnd = Math.min(_lines.length, lineNumber + 5)
|
|
829
|
+
const context = _lines.slice(contextStart, contextEnd).join('\n')
|
|
707
830
|
|
|
708
831
|
const pathValidationPatterns = [
|
|
709
832
|
/path\.resolve\s*\([^)]*\).*startsWith/i, // Resolved path + startsWith check
|
|
@@ -724,11 +847,11 @@ function isPathValidated(content: string, lineNumber: number): boolean {
|
|
|
724
847
|
/**
|
|
725
848
|
* Check if header value is sanitized
|
|
726
849
|
*/
|
|
727
|
-
function isHeaderSanitized(content: string, lineNumber: number): boolean {
|
|
728
|
-
const
|
|
850
|
+
function isHeaderSanitized(content: string, lineNumber: number, lines?: string[]): boolean {
|
|
851
|
+
const _lines = lines ?? content.split('\n')
|
|
729
852
|
const contextStart = Math.max(0, lineNumber - 15)
|
|
730
|
-
const contextEnd = Math.min(
|
|
731
|
-
const context =
|
|
853
|
+
const contextEnd = Math.min(_lines.length, lineNumber + 5)
|
|
854
|
+
const context = _lines.slice(contextStart, contextEnd).join('\n')
|
|
732
855
|
|
|
733
856
|
const headerSanitizationPatterns = [
|
|
734
857
|
/\.replace\s*\(\s*\/\[\\r\\n\]/i, // CRLF removal
|
|
@@ -789,11 +912,11 @@ function isSQLParameterized(lineContent: string, surroundingContext: string): bo
|
|
|
789
912
|
/**
|
|
790
913
|
* Check if shell execution uses allowlist
|
|
791
914
|
*/
|
|
792
|
-
function isShellAllowlisted(content: string, lineNumber: number): boolean {
|
|
793
|
-
const
|
|
915
|
+
function isShellAllowlisted(content: string, lineNumber: number, lines?: string[]): boolean {
|
|
916
|
+
const _lines = lines ?? content.split('\n')
|
|
794
917
|
const contextStart = Math.max(0, lineNumber - 15)
|
|
795
|
-
const contextEnd = Math.min(
|
|
796
|
-
const context =
|
|
918
|
+
const contextEnd = Math.min(_lines.length, lineNumber + 5)
|
|
919
|
+
const context = _lines.slice(contextStart, contextEnd).join('\n')
|
|
797
920
|
|
|
798
921
|
const shellAllowlistPatterns = [
|
|
799
922
|
/allowedArgs\.includes\s*\(/i, // Argument allowlist
|
|
@@ -807,14 +930,93 @@ function isShellAllowlisted(content: string, lineNumber: number): boolean {
|
|
|
807
930
|
return shellAllowlistPatterns.some(p => p.test(context))
|
|
808
931
|
}
|
|
809
932
|
|
|
933
|
+
/**
|
|
934
|
+
* Check if template engine has autoescape enabled or uses safe rendering
|
|
935
|
+
*/
|
|
936
|
+
function isTemplateSafe(content: string, lineNumber: number, lines?: string[]): boolean {
|
|
937
|
+
const _lines = lines ?? content.split('\n')
|
|
938
|
+
const contextStart = Math.max(0, lineNumber - 15)
|
|
939
|
+
const contextEnd = Math.min(_lines.length, lineNumber + 5)
|
|
940
|
+
const context = _lines.slice(contextStart, contextEnd).join('\n')
|
|
941
|
+
|
|
942
|
+
const templateSafePatterns = [
|
|
943
|
+
/autoescape\s*[=:]\s*true/i, // Autoescape enabled
|
|
944
|
+
/autoescaping\s*[=:]\s*true/i, // Alternative naming
|
|
945
|
+
/escape\s*[=:]\s*true/i, // Escape option
|
|
946
|
+
/\.escapeHtml\s*\(/i, // Manual escaping
|
|
947
|
+
/sanitize(?:Html|Output)?\s*\(/i, // Sanitization function
|
|
948
|
+
/DOMPurify\.sanitize/i, // DOMPurify sanitization
|
|
949
|
+
/#{[^}]+}/i, // Pug escaped interpolation (safe)
|
|
950
|
+
/\{\{[^}]+\}\}/i, // Handlebars/Mustache double-brace (escaped by default)
|
|
951
|
+
]
|
|
952
|
+
|
|
953
|
+
// Patterns that indicate unsafe usage
|
|
954
|
+
const unsafePatterns = [
|
|
955
|
+
/autoescape\s*[=:]\s*false/i, // Autoescape disabled
|
|
956
|
+
/!{[^}]+}/i, // Pug unescaped interpolation
|
|
957
|
+
/{{{[^}]+}}}/i, // Handlebars/Mustache triple-brace (unescaped)
|
|
958
|
+
/SafeString/i, // Handlebars SafeString (bypasses escaping)
|
|
959
|
+
/\|safe\b/i, // Jinja2/Nunjucks safe filter
|
|
960
|
+
]
|
|
961
|
+
|
|
962
|
+
const isSafe = templateSafePatterns.some(p => p.test(context))
|
|
963
|
+
const isUnsafe = unsafePatterns.some(p => p.test(context))
|
|
964
|
+
|
|
965
|
+
return isSafe && !isUnsafe
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
/**
|
|
969
|
+
* Check if NoSQL query uses schema validation or allowlist
|
|
970
|
+
*/
|
|
971
|
+
function isNoSQLSafe(content: string, lineNumber: number, lines?: string[]): boolean {
|
|
972
|
+
const _lines = lines ?? content.split('\n')
|
|
973
|
+
const contextStart = Math.max(0, lineNumber - 15)
|
|
974
|
+
const contextEnd = Math.min(_lines.length, lineNumber + 5)
|
|
975
|
+
const context = _lines.slice(contextStart, contextEnd).join('\n')
|
|
976
|
+
|
|
977
|
+
const safePatterns = [
|
|
978
|
+
/schema\.parse\s*\(/i, // Zod schema validation
|
|
979
|
+
/\.validate\s*\(/i, // Joi/Yup validation
|
|
980
|
+
/allowedOperators/i, // Operator allowlist
|
|
981
|
+
/allowedFields/i, // Field allowlist
|
|
982
|
+
/sanitizeQuery/i, // Query sanitization function
|
|
983
|
+
/mongo-sanitize/i, // mongo-sanitize library
|
|
984
|
+
/mongoose\.(?:Schema|model)/i, // Using Mongoose models (safer)
|
|
985
|
+
]
|
|
986
|
+
|
|
987
|
+
return safePatterns.some(p => p.test(context))
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
/**
|
|
991
|
+
* Check if regex has complexity validation or timeout
|
|
992
|
+
*/
|
|
993
|
+
function isRegexSafe(content: string, lineNumber: number, lines?: string[]): boolean {
|
|
994
|
+
const _lines = lines ?? content.split('\n')
|
|
995
|
+
const contextStart = Math.max(0, lineNumber - 15)
|
|
996
|
+
const contextEnd = Math.min(_lines.length, lineNumber + 5)
|
|
997
|
+
const context = _lines.slice(contextStart, contextEnd).join('\n')
|
|
998
|
+
|
|
999
|
+
const safePatterns = [
|
|
1000
|
+
/safe-regex/i, // safe-regex library
|
|
1001
|
+
/recheck/i, // recheck library
|
|
1002
|
+
/regex-timeout/i, // Timeout wrapper
|
|
1003
|
+
/RE2/i, // RE2 library (safe by design)
|
|
1004
|
+
/validateRegex/i, // Custom validation
|
|
1005
|
+
/maxLength|maxPatternLength/i, // Length limits
|
|
1006
|
+
/try\s*\{[^}]*new\s+RegExp[^}]*\}\s*catch/i, // Try-catch around regex
|
|
1007
|
+
]
|
|
1008
|
+
|
|
1009
|
+
return safePatterns.some(p => p.test(context))
|
|
1010
|
+
}
|
|
1011
|
+
|
|
810
1012
|
/**
|
|
811
1013
|
* Check if dynamic import uses allowlist
|
|
812
1014
|
*/
|
|
813
|
-
function isImportAllowlisted(content: string, lineNumber: number): boolean {
|
|
814
|
-
const
|
|
1015
|
+
function isImportAllowlisted(content: string, lineNumber: number, lines?: string[]): boolean {
|
|
1016
|
+
const _lines = lines ?? content.split('\n')
|
|
815
1017
|
const contextStart = Math.max(0, lineNumber - 15)
|
|
816
|
-
const contextEnd = Math.min(
|
|
817
|
-
const context =
|
|
1018
|
+
const contextEnd = Math.min(_lines.length, lineNumber + 5)
|
|
1019
|
+
const context = _lines.slice(contextStart, contextEnd).join('\n')
|
|
818
1020
|
|
|
819
1021
|
const importAllowlistPatterns = [
|
|
820
1022
|
/ALLOWED_PLUGINS\s*[=:]/i, // Plugin allowlist
|
|
@@ -835,11 +1037,11 @@ function isImportAllowlisted(content: string, lineNumber: number): boolean {
|
|
|
835
1037
|
/**
|
|
836
1038
|
* Get surrounding context for analysis
|
|
837
1039
|
*/
|
|
838
|
-
function getSurroundingContext(content: string, lineIndex: number, windowSize: number = 15): string {
|
|
839
|
-
const
|
|
1040
|
+
function getSurroundingContext(content: string, lineIndex: number, windowSize: number = 15, lines?: string[]): string {
|
|
1041
|
+
const _lines = lines ?? content.split('\n')
|
|
840
1042
|
const start = Math.max(0, lineIndex - windowSize)
|
|
841
|
-
const end = Math.min(
|
|
842
|
-
return
|
|
1043
|
+
const end = Math.min(_lines.length, lineIndex + windowSize)
|
|
1044
|
+
return _lines.slice(start, end).join('\n')
|
|
843
1045
|
}
|
|
844
1046
|
|
|
845
1047
|
/**
|
|
@@ -896,7 +1098,8 @@ function calculateSeverity(
|
|
|
896
1098
|
*/
|
|
897
1099
|
export function detectAIExecutionSinks(
|
|
898
1100
|
content: string,
|
|
899
|
-
filePath: string
|
|
1101
|
+
filePath: string,
|
|
1102
|
+
options?: { parsed?: ParsedFile }
|
|
900
1103
|
): Vulnerability[] {
|
|
901
1104
|
const vulnerabilities: Vulnerability[] = []
|
|
902
1105
|
|
|
@@ -906,7 +1109,7 @@ export function detectAIExecutionSinks(
|
|
|
906
1109
|
// Only deeply scan files that appear to be in LLM context
|
|
907
1110
|
// But still do basic scanning on all files for obvious patterns
|
|
908
1111
|
const isLLMFile = isLLMContextFile(filePath, content)
|
|
909
|
-
const lines = content.split('\n')
|
|
1112
|
+
const lines = options?.parsed?.lines ?? content.split('\n')
|
|
910
1113
|
const isTestFile = isTestOrMockFile(filePath)
|
|
911
1114
|
const isExample = isExampleDirectory(filePath)
|
|
912
1115
|
const isLibrary = isLibraryCode(filePath)
|
|
@@ -922,7 +1125,7 @@ export function detectAIExecutionSinks(
|
|
|
922
1125
|
// Skip comments
|
|
923
1126
|
if (isComment(lineContent)) continue
|
|
924
1127
|
|
|
925
|
-
const surroundingContext = getSurroundingContext(content, lineNumber - 1)
|
|
1128
|
+
const surroundingContext = getSurroundingContext(content, lineNumber - 1, 15, lines)
|
|
926
1129
|
|
|
927
1130
|
// Check if this is actually in an LLM context
|
|
928
1131
|
const hasLLMContext = isLLMFile || hasLLMResponseContext(lineContent, surroundingContext)
|
|
@@ -953,8 +1156,8 @@ export function detectAIExecutionSinks(
|
|
|
953
1156
|
}
|
|
954
1157
|
|
|
955
1158
|
// Check for sandboxing and validation
|
|
956
|
-
const isSandboxed = isSandboxedExecution(content, lineNumber)
|
|
957
|
-
const hasValidation = hasOutputValidation(content, lineNumber)
|
|
1159
|
+
const isSandboxed = isSandboxedExecution(content, lineNumber, lines)
|
|
1160
|
+
const hasValidation = hasOutputValidation(content, lineNumber, lines)
|
|
958
1161
|
|
|
959
1162
|
// ===== SINK-SPECIFIC VALIDATION CHECKS =====
|
|
960
1163
|
|
|
@@ -963,7 +1166,7 @@ export function detectAIExecutionSinks(
|
|
|
963
1166
|
pattern.name.includes('HTTP') || pattern.name.includes('redirect') ||
|
|
964
1167
|
pattern.name.includes('location') || pattern.name.includes('got')
|
|
965
1168
|
if (isNetworkSink) {
|
|
966
|
-
const urlValidLevel = getURLValidationLevel(content, lineNumber)
|
|
1169
|
+
const urlValidLevel = getURLValidationLevel(content, lineNumber, lines)
|
|
967
1170
|
if (urlValidLevel === 'strong') {
|
|
968
1171
|
continue // Skip - strong URL validation present
|
|
969
1172
|
}
|
|
@@ -982,14 +1185,14 @@ export function detectAIExecutionSinks(
|
|
|
982
1185
|
// Check for header sanitization
|
|
983
1186
|
const isHeaderSink = pattern.name.includes('header') || pattern.name.includes('cookie') ||
|
|
984
1187
|
pattern.name.includes('res.type')
|
|
985
|
-
if (isHeaderSink && isHeaderSanitized(content, lineNumber)) {
|
|
1188
|
+
if (isHeaderSink && isHeaderSanitized(content, lineNumber, lines)) {
|
|
986
1189
|
continue // Skip - header value is sanitized
|
|
987
1190
|
}
|
|
988
1191
|
|
|
989
1192
|
// Check for path validation on file system sinks
|
|
990
1193
|
const isFileSink = pattern.name.includes('file path') || pattern.name.includes('fs operation') ||
|
|
991
1194
|
pattern.name.includes('path.join')
|
|
992
|
-
if (isFileSink && isPathValidated(content, lineNumber)) {
|
|
1195
|
+
if (isFileSink && isPathValidated(content, lineNumber, lines)) {
|
|
993
1196
|
continue // Skip - path is validated
|
|
994
1197
|
}
|
|
995
1198
|
|
|
@@ -1001,16 +1204,37 @@ export function detectAIExecutionSinks(
|
|
|
1001
1204
|
|
|
1002
1205
|
// Check for shell allowlist
|
|
1003
1206
|
const isShellSink = pattern.sinkType === 'shell_command'
|
|
1004
|
-
if (isShellSink && isShellAllowlisted(content, lineNumber)) {
|
|
1207
|
+
if (isShellSink && isShellAllowlisted(content, lineNumber, lines)) {
|
|
1005
1208
|
continue // Skip - shell command uses allowlist
|
|
1006
1209
|
}
|
|
1007
1210
|
|
|
1008
1211
|
// Check for import allowlist
|
|
1009
1212
|
const isImportSink = pattern.name.includes('import') || pattern.name.includes('require')
|
|
1010
|
-
if (isImportSink && isImportAllowlisted(content, lineNumber)) {
|
|
1213
|
+
if (isImportSink && isImportAllowlisted(content, lineNumber, lines)) {
|
|
1011
1214
|
continue // Skip - import uses allowlist
|
|
1012
1215
|
}
|
|
1013
1216
|
|
|
1217
|
+
// Check for template engine safety (autoescape, sanitization)
|
|
1218
|
+
const isTemplateEngineSink = pattern.name.includes('EJS') || pattern.name.includes('Handlebars') ||
|
|
1219
|
+
pattern.name.includes('Pug') || pattern.name.includes('Nunjucks') || pattern.name.includes('Jinja2') ||
|
|
1220
|
+
pattern.name.includes('Mustache')
|
|
1221
|
+
if (isTemplateEngineSink && isTemplateSafe(content, lineNumber, lines)) {
|
|
1222
|
+
continue // Skip - template engine has safe configuration
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
// Check for NoSQL query safety
|
|
1226
|
+
const isNoSQLSink = pattern.name.includes('NoSQL') || pattern.name.includes('MongoDB') ||
|
|
1227
|
+
pattern.name.includes('$where')
|
|
1228
|
+
if (isNoSQLSink && isNoSQLSafe(content, lineNumber, lines)) {
|
|
1229
|
+
continue // Skip - NoSQL query is validated
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
// Check for regex safety (ReDoS protection)
|
|
1233
|
+
const isRegexSink = pattern.name.includes('regex') || pattern.name.includes('RegExp')
|
|
1234
|
+
if (isRegexSink && isRegexSafe(content, lineNumber, lines)) {
|
|
1235
|
+
continue // Skip - regex has safety measures
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1014
1238
|
// Check for Python-specific safe patterns
|
|
1015
1239
|
const isPythonSink = pattern.name.includes('Python') || pattern.name.includes('pickle') ||
|
|
1016
1240
|
pattern.name.includes('subprocess') || pattern.name.includes('os.system')
|
|
@@ -1025,7 +1249,7 @@ export function detectAIExecutionSinks(
|
|
|
1025
1249
|
}
|
|
1026
1250
|
|
|
1027
1251
|
// Check URL validation level for severity adjustment
|
|
1028
|
-
const hasURLValid = isNetworkSink ? getURLValidationLevel(content, lineNumber) !== 'none' : false
|
|
1252
|
+
const hasURLValid = isNetworkSink ? getURLValidationLevel(content, lineNumber, lines) !== 'none' : false
|
|
1029
1253
|
|
|
1030
1254
|
// Combine validation checks (URL validation counts as validation for network sinks)
|
|
1031
1255
|
const effectiveValidation = hasValidation || hasURLValid
|
|
@@ -1075,7 +1299,9 @@ export function detectAIExecutionSinks(
|
|
|
1075
1299
|
suggestedFix: pattern.suggestedFix,
|
|
1076
1300
|
confidence: hasLLMContext ? 'high' : 'medium',
|
|
1077
1301
|
layer: 2,
|
|
1302
|
+
source: 'ai_code' as const,
|
|
1078
1303
|
requiresAIValidation: severity !== 'info' && severity !== 'low',
|
|
1304
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
1079
1305
|
})
|
|
1080
1306
|
}
|
|
1081
1307
|
}
|