@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
|
@@ -5,13 +5,17 @@
|
|
|
5
5
|
* This module orchestrates detection across multiple specialized modules.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import type { Vulnerability, VulnerabilitySeverity } from '
|
|
8
|
+
import type { Vulnerability, VulnerabilitySeverity } from '../../../shared/types'
|
|
9
|
+
import type { ParsedFile } from '../../../shared/parsed-file'
|
|
9
10
|
import {
|
|
10
11
|
isComment,
|
|
11
12
|
isTestOrMockFile,
|
|
12
13
|
isScannerOrFixtureFile,
|
|
13
14
|
isSeedOrDataGenFile,
|
|
14
|
-
|
|
15
|
+
isDesktopAppContext,
|
|
16
|
+
isMcpServerContext,
|
|
17
|
+
isFileLoaderContext,
|
|
18
|
+
} from '../../../parse/file-classifier'
|
|
15
19
|
|
|
16
20
|
// Pattern definitions
|
|
17
21
|
import {
|
|
@@ -30,6 +34,7 @@ import {
|
|
|
30
34
|
hasDOMPurifySanitization,
|
|
31
35
|
isLLMPromptContext,
|
|
32
36
|
isStaticBootstrapScript,
|
|
37
|
+
isTrustedLibraryHTMLOutput,
|
|
33
38
|
} from './dom-xss'
|
|
34
39
|
|
|
35
40
|
// JSON.parse detection
|
|
@@ -57,12 +62,15 @@ import { hasOnlyStaticInputs, hasPathTraversalProtection } from './utils/helpers
|
|
|
57
62
|
// Re-export types and patterns for external use
|
|
58
63
|
export { DANGEROUS_FUNCTIONS, type DangerousFunctionPattern } from './patterns'
|
|
59
64
|
|
|
65
|
+
const BASE_CONFIDENCE = 0.40
|
|
66
|
+
|
|
60
67
|
/**
|
|
61
68
|
* Main detection function for dangerous function calls
|
|
62
69
|
*/
|
|
63
70
|
export function detectDangerousFunctions(
|
|
64
71
|
content: string,
|
|
65
|
-
filePath: string
|
|
72
|
+
filePath: string,
|
|
73
|
+
options?: { parsed?: ParsedFile }
|
|
66
74
|
): Vulnerability[] {
|
|
67
75
|
const vulnerabilities: Vulnerability[] = []
|
|
68
76
|
|
|
@@ -71,7 +79,7 @@ export function detectDangerousFunctions(
|
|
|
71
79
|
return vulnerabilities
|
|
72
80
|
}
|
|
73
81
|
|
|
74
|
-
const lines = content.split('\n')
|
|
82
|
+
const lines = options?.parsed?.lines ?? content.split('\n')
|
|
75
83
|
const isTestFile = isTestOrMockFile(filePath)
|
|
76
84
|
|
|
77
85
|
lines.forEach((line, index) => {
|
|
@@ -100,7 +108,8 @@ export function detectDangerousFunctions(
|
|
|
100
108
|
index,
|
|
101
109
|
filePath,
|
|
102
110
|
isTestFile,
|
|
103
|
-
vulnerabilities
|
|
111
|
+
vulnerabilities,
|
|
112
|
+
lines
|
|
104
113
|
)
|
|
105
114
|
break
|
|
106
115
|
}
|
|
@@ -139,7 +148,8 @@ export function detectDangerousFunctions(
|
|
|
139
148
|
index,
|
|
140
149
|
filePath,
|
|
141
150
|
isTestFile,
|
|
142
|
-
vulnerabilities
|
|
151
|
+
vulnerabilities,
|
|
152
|
+
lines
|
|
143
153
|
)
|
|
144
154
|
) {
|
|
145
155
|
break
|
|
@@ -159,7 +169,8 @@ export function detectDangerousFunctions(
|
|
|
159
169
|
index,
|
|
160
170
|
filePath,
|
|
161
171
|
isTestFile,
|
|
162
|
-
vulnerabilities
|
|
172
|
+
vulnerabilities,
|
|
173
|
+
lines
|
|
163
174
|
)
|
|
164
175
|
break
|
|
165
176
|
}
|
|
@@ -176,7 +187,8 @@ export function detectDangerousFunctions(
|
|
|
176
187
|
index,
|
|
177
188
|
filePath,
|
|
178
189
|
isTestFile,
|
|
179
|
-
vulnerabilities
|
|
190
|
+
vulnerabilities,
|
|
191
|
+
lines
|
|
180
192
|
)
|
|
181
193
|
break
|
|
182
194
|
}
|
|
@@ -204,7 +216,38 @@ export function detectDangerousFunctions(
|
|
|
204
216
|
index,
|
|
205
217
|
filePath,
|
|
206
218
|
isTestFile,
|
|
207
|
-
vulnerabilities
|
|
219
|
+
vulnerabilities,
|
|
220
|
+
lines
|
|
221
|
+
)
|
|
222
|
+
break
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Special handling for regex patterns - check for escaped input
|
|
226
|
+
if (funcPattern.name === 'Potentially unsafe regex') {
|
|
227
|
+
handleRegexPattern(
|
|
228
|
+
funcPattern,
|
|
229
|
+
line,
|
|
230
|
+
content,
|
|
231
|
+
index,
|
|
232
|
+
filePath,
|
|
233
|
+
isTestFile,
|
|
234
|
+
vulnerabilities,
|
|
235
|
+
lines
|
|
236
|
+
)
|
|
237
|
+
break
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Special handling for spread operator with user input
|
|
241
|
+
if (funcPattern.name === 'Spread operator with user input') {
|
|
242
|
+
handleSpreadPattern(
|
|
243
|
+
funcPattern,
|
|
244
|
+
line,
|
|
245
|
+
content,
|
|
246
|
+
index,
|
|
247
|
+
filePath,
|
|
248
|
+
isTestFile,
|
|
249
|
+
vulnerabilities,
|
|
250
|
+
lines
|
|
208
251
|
)
|
|
209
252
|
break
|
|
210
253
|
}
|
|
@@ -244,30 +287,37 @@ function handleInnerHTMLPattern(
|
|
|
244
287
|
index: number,
|
|
245
288
|
filePath: string,
|
|
246
289
|
isTestFile: boolean,
|
|
247
|
-
vulnerabilities: Vulnerability[]
|
|
290
|
+
vulnerabilities: Vulnerability[],
|
|
291
|
+
lines?: string[]
|
|
248
292
|
): void {
|
|
249
293
|
// Check if this is a style element (CSS injection is not XSS)
|
|
250
|
-
if (isStyleElementInnerHTML(line, content, index)) {
|
|
294
|
+
if (isStyleElementInnerHTML(line, content, index, lines)) {
|
|
251
295
|
// Style elements with CSS are safe - don't report anything
|
|
252
296
|
// CSS cannot execute JavaScript, so there's no XSS risk
|
|
253
297
|
return
|
|
254
298
|
}
|
|
255
299
|
|
|
256
300
|
// Check if this uses static content only - skip entirely (safe)
|
|
257
|
-
if (isStaticHTMLContent(line, content, index)) {
|
|
301
|
+
if (isStaticHTMLContent(line, content, index, lines)) {
|
|
258
302
|
return // Static HTML is safe - no finding needed
|
|
259
303
|
}
|
|
260
304
|
|
|
261
305
|
// Check if DOMPurify or similar sanitization is used - skip entirely (safe)
|
|
262
|
-
if (hasDOMPurifySanitization(line, content, index)) {
|
|
306
|
+
if (hasDOMPurifySanitization(line, content, index, lines)) {
|
|
263
307
|
return // Sanitized HTML is safe - no finding needed
|
|
264
308
|
}
|
|
265
309
|
|
|
266
310
|
// Check if this is a static bootstrap script (e.g., theme/font loader) - skip entirely (safe)
|
|
267
|
-
if (isStaticBootstrapScript(line, content, index)) {
|
|
311
|
+
if (isStaticBootstrapScript(line, content, index, lines)) {
|
|
268
312
|
return // Static bootstrap scripts are safe - no finding needed
|
|
269
313
|
}
|
|
270
314
|
|
|
315
|
+
// Check if this uses output from trusted HTML rendering libraries (Shiki, highlight.js, marked, etc.)
|
|
316
|
+
// These libraries produce sanitized HTML output
|
|
317
|
+
if (isTrustedLibraryHTMLOutput(line, content, index, lines)) {
|
|
318
|
+
return // Trusted library output is safe - no finding needed
|
|
319
|
+
}
|
|
320
|
+
|
|
271
321
|
// Check if this is in LLM prompt context (not XSS - it's prompt injection)
|
|
272
322
|
if (isLLMPromptContext(line, content, filePath)) {
|
|
273
323
|
vulnerabilities.push({
|
|
@@ -283,8 +333,9 @@ function handleInnerHTMLPattern(
|
|
|
283
333
|
suggestedFix:
|
|
284
334
|
'Consider input validation, content filtering, or structured prompts to limit prompt injection risk.',
|
|
285
335
|
confidence: 'low',
|
|
336
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
286
337
|
layer: 2,
|
|
287
|
-
})
|
|
338
|
+
source: 'structural' as const, })
|
|
288
339
|
return
|
|
289
340
|
}
|
|
290
341
|
|
|
@@ -308,8 +359,9 @@ function handleInnerHTMLPattern(
|
|
|
308
359
|
(isTestFile ? ' (in test file)' : ''),
|
|
309
360
|
suggestedFix: funcPattern.suggestedFix,
|
|
310
361
|
confidence: isTestFile ? 'low' : 'high',
|
|
362
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
311
363
|
layer: 2,
|
|
312
|
-
requiresAIValidation: true, // Dynamic HTML needs validation
|
|
364
|
+
source: 'structural' as const, requiresAIValidation: true, // Dynamic HTML needs validation
|
|
313
365
|
})
|
|
314
366
|
}
|
|
315
367
|
|
|
@@ -362,8 +414,9 @@ function handleEvalPattern(
|
|
|
362
414
|
description: funcPattern.description,
|
|
363
415
|
suggestedFix: funcPattern.suggestedFix,
|
|
364
416
|
confidence: 'high',
|
|
417
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
365
418
|
layer: 2,
|
|
366
|
-
requiresAIValidation: true, // Code execution patterns need validation
|
|
419
|
+
source: 'structural' as const, requiresAIValidation: true, // Code execution patterns need validation
|
|
367
420
|
})
|
|
368
421
|
return true
|
|
369
422
|
}
|
|
@@ -379,7 +432,8 @@ function handleChildProcessPattern(
|
|
|
379
432
|
index: number,
|
|
380
433
|
filePath: string,
|
|
381
434
|
isTestFile: boolean,
|
|
382
|
-
vulnerabilities: Vulnerability[]
|
|
435
|
+
vulnerabilities: Vulnerability[],
|
|
436
|
+
lines?: string[]
|
|
383
437
|
): boolean {
|
|
384
438
|
// First check if this is actually from child_process (not RegExp.exec)
|
|
385
439
|
const isExecMatch = /\bexec\s*\(/.test(line)
|
|
@@ -400,10 +454,10 @@ function handleChildProcessPattern(
|
|
|
400
454
|
}
|
|
401
455
|
|
|
402
456
|
// Check if arguments are validated via allowlist
|
|
403
|
-
const
|
|
457
|
+
const _lines = lines ?? content.split('\n')
|
|
404
458
|
const contextStart = Math.max(0, index - 15)
|
|
405
|
-
const contextEnd = Math.min(
|
|
406
|
-
const context =
|
|
459
|
+
const contextEnd = Math.min(_lines.length, index + 5)
|
|
460
|
+
const context = _lines.slice(contextStart, contextEnd).join('\n')
|
|
407
461
|
|
|
408
462
|
// Detect allowlist validation patterns before exec/spawn
|
|
409
463
|
const hasArgAllowlist =
|
|
@@ -432,6 +486,59 @@ function handleChildProcessPattern(
|
|
|
432
486
|
return true // Static command is safe - no finding needed
|
|
433
487
|
}
|
|
434
488
|
|
|
489
|
+
// Check for build/script context with hardcoded command + args array
|
|
490
|
+
const isBuildScript = /(build|generate|format|lint|setup|deploy|migrate|compile)/i.test(filePath) ||
|
|
491
|
+
/\/(scripts?|tools?|bin)\//i.test(filePath)
|
|
492
|
+
|
|
493
|
+
if (isBuildScript) {
|
|
494
|
+
// spawnSync("cmd", ["arg1", "arg2"]) with string literal command is safe in build scripts
|
|
495
|
+
const hasHardcodedCommand = /spawn(?:Sync)?\s*\(\s*['"][^'"]+['"]/.test(line)
|
|
496
|
+
if (hasHardcodedCommand) {
|
|
497
|
+
vulnerabilities.push({
|
|
498
|
+
id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
|
|
499
|
+
filePath,
|
|
500
|
+
lineNumber: index + 1,
|
|
501
|
+
lineContent: line.trim(),
|
|
502
|
+
severity: 'info',
|
|
503
|
+
category: 'dangerous_function',
|
|
504
|
+
title: funcPattern.name + ' (build script)',
|
|
505
|
+
description: 'Shell command execution in build/tooling script with hardcoded command. Build scripts are developer-controlled.',
|
|
506
|
+
suggestedFix: 'Ensure this script is not exposed to untrusted input.',
|
|
507
|
+
confidence: 'low',
|
|
508
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
509
|
+
layer: 2,
|
|
510
|
+
source: 'structural' as const, })
|
|
511
|
+
return true
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
// Check for desktop app or MCP server context
|
|
516
|
+
// These contexts legitimately spawn processes
|
|
517
|
+
const isDesktopApp = isDesktopAppContext(filePath)
|
|
518
|
+
const isMcpServer = isMcpServerContext(filePath)
|
|
519
|
+
|
|
520
|
+
if (isDesktopApp || isMcpServer) {
|
|
521
|
+
// Desktop apps and MCP servers legitimately spawn processes
|
|
522
|
+
// Still report but with reduced severity and context
|
|
523
|
+
const contextType = isDesktopApp ? 'desktop app' : 'MCP server'
|
|
524
|
+
vulnerabilities.push({
|
|
525
|
+
id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
|
|
526
|
+
filePath,
|
|
527
|
+
lineNumber: index + 1,
|
|
528
|
+
lineContent: line.trim(),
|
|
529
|
+
severity: 'medium', // Reduced from high
|
|
530
|
+
category: 'dangerous_function',
|
|
531
|
+
title: `${funcPattern.name} (${contextType})`,
|
|
532
|
+
description: `${funcPattern.description} (Expected in ${contextType} context - verify input validation)`,
|
|
533
|
+
suggestedFix:
|
|
534
|
+
'Ensure command arguments from IPC are validated against an allowlist.',
|
|
535
|
+
confidence: 'medium',
|
|
536
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
537
|
+
layer: 2,
|
|
538
|
+
source: 'structural' as const, })
|
|
539
|
+
return true
|
|
540
|
+
}
|
|
541
|
+
|
|
435
542
|
// Dynamic command - report with standard severity
|
|
436
543
|
let severity = funcPattern.severity
|
|
437
544
|
let confidence: 'high' | 'medium' | 'low' = 'high'
|
|
@@ -458,8 +565,9 @@ function handleChildProcessPattern(
|
|
|
458
565
|
description: funcPattern.description + (isTestFile ? ' (in test file)' : ''),
|
|
459
566
|
suggestedFix: funcPattern.suggestedFix,
|
|
460
567
|
confidence,
|
|
568
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
461
569
|
layer: 2,
|
|
462
|
-
})
|
|
570
|
+
source: 'structural' as const, })
|
|
463
571
|
return true
|
|
464
572
|
}
|
|
465
573
|
|
|
@@ -473,7 +581,8 @@ function handleSQLPattern(
|
|
|
473
581
|
index: number,
|
|
474
582
|
filePath: string,
|
|
475
583
|
isTestFile: boolean,
|
|
476
|
-
vulnerabilities: Vulnerability[]
|
|
584
|
+
vulnerabilities: Vulnerability[],
|
|
585
|
+
lines?: string[]
|
|
477
586
|
): void {
|
|
478
587
|
// Check for whitelist validation - skip entirely (safe)
|
|
479
588
|
if (hasSQLWhitelistValidation(content, index)) {
|
|
@@ -496,6 +605,40 @@ function handleSQLPattern(
|
|
|
496
605
|
return // Parameterized query - safe, no finding needed
|
|
497
606
|
}
|
|
498
607
|
|
|
608
|
+
// Knex .raw() with ? placeholders and array binding - this IS parameterized
|
|
609
|
+
// e.g., db.raw(`"table"."col" + ?`, [value]) or db.raw('SELECT ... WHERE id = ?', [id])
|
|
610
|
+
const knexRawParameterized = /\.raw\s*\(\s*[`'"]/i.test(line) &&
|
|
611
|
+
/\?\s*[`'"]\s*,\s*\[/.test(line)
|
|
612
|
+
if (knexRawParameterized) {
|
|
613
|
+
return // Knex .raw() with ? placeholders is parameterized - safe
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
// Knex .raw() with only const enum/table name interpolation (not user input)
|
|
617
|
+
// e.g., db.raw(`"${TableName.Users}"."col"`) where TableName is a const enum
|
|
618
|
+
const knexRawConstInterpolation = /\.raw\s*\(\s*`/.test(line) &&
|
|
619
|
+
/\$\{[A-Z][A-Za-z]*\.[A-Z]/.test(line)
|
|
620
|
+
if (knexRawConstInterpolation) {
|
|
621
|
+
const interpolations = line.match(/\$\{([^}]+)\}/g) || []
|
|
622
|
+
const allConst = interpolations.every(i => /^\$\{[A-Z_][A-Z_a-z]*\./.test(i))
|
|
623
|
+
if (allConst) {
|
|
624
|
+
return // Only const enum interpolation - safe
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
// Knex .raw() for SET statement_timeout (infrastructure, not user input)
|
|
629
|
+
// e.g., trx.raw(`SET statement_timeout = ${QUERY_TIMEOUT_MS}`)
|
|
630
|
+
const isSetStatement = /\.raw\s*\(\s*[`'"]SET\s+/i.test(line)
|
|
631
|
+
if (isSetStatement) {
|
|
632
|
+
return // SET statements are infrastructure config, not queries with user data
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
// DROP TRIGGER / DDL statements from migration/schema files
|
|
636
|
+
const isDDLStatement = /\.raw\s*\(\s*[`'"](DROP|CREATE|ALTER)\s+/i.test(line) &&
|
|
637
|
+
/(migration|schema|seed)/i.test(filePath)
|
|
638
|
+
if (isDDLStatement) {
|
|
639
|
+
return // DDL in migration/schema files - not user-facing
|
|
640
|
+
}
|
|
641
|
+
|
|
499
642
|
// Check for Prisma tagged template literal - these ARE parameterized (safe)
|
|
500
643
|
// Prisma's $queryRaw`...${var}...` treats ${} as parameterized values, not string interpolation
|
|
501
644
|
// e.g., prisma.$queryRaw`SELECT * FROM users WHERE id = ${userId}`
|
|
@@ -506,10 +649,10 @@ function handleSQLPattern(
|
|
|
506
649
|
|
|
507
650
|
// Check for schema-validated input (zod .enum() for table/column names)
|
|
508
651
|
// e.g., z.enum(['users', 'posts']).parse(input) followed by SQL
|
|
509
|
-
const
|
|
652
|
+
const _lines = lines ?? content.split('\n')
|
|
510
653
|
const contextStart = Math.max(0, index - 20)
|
|
511
654
|
const contextEnd = index
|
|
512
|
-
const previousContext =
|
|
655
|
+
const previousContext = _lines.slice(contextStart, contextEnd).join('\n')
|
|
513
656
|
|
|
514
657
|
// Detect zod enum validation for SQL identifiers
|
|
515
658
|
const hasSchemaValidation =
|
|
@@ -549,8 +692,9 @@ function handleSQLPattern(
|
|
|
549
692
|
description: funcPattern.description + (isTestFile ? ' (in test file)' : ''),
|
|
550
693
|
suggestedFix: funcPattern.suggestedFix,
|
|
551
694
|
confidence,
|
|
695
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
552
696
|
layer: 2,
|
|
553
|
-
})
|
|
697
|
+
source: 'structural' as const, })
|
|
554
698
|
}
|
|
555
699
|
|
|
556
700
|
/**
|
|
@@ -563,8 +707,38 @@ function handleFilePathPattern(
|
|
|
563
707
|
index: number,
|
|
564
708
|
filePath: string,
|
|
565
709
|
isTestFile: boolean,
|
|
566
|
-
vulnerabilities: Vulnerability[]
|
|
710
|
+
vulnerabilities: Vulnerability[],
|
|
711
|
+
lines?: string[]
|
|
567
712
|
): void {
|
|
713
|
+
// Check for desktop app context (Electron, Tauri, etc.)
|
|
714
|
+
// Desktop apps legitimately access filesystem
|
|
715
|
+
const isDesktopApp = isDesktopAppContext(filePath)
|
|
716
|
+
|
|
717
|
+
// Check for file loader context
|
|
718
|
+
// File loaders legitimately access filesystem to process files
|
|
719
|
+
const isFileLoader = isFileLoaderContext(filePath)
|
|
720
|
+
|
|
721
|
+
// Desktop apps and file loaders are expected to access filesystem
|
|
722
|
+
if (isDesktopApp || isFileLoader) {
|
|
723
|
+
const contextType = isDesktopApp ? 'desktop app' : 'file loader'
|
|
724
|
+
vulnerabilities.push({
|
|
725
|
+
id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
|
|
726
|
+
filePath,
|
|
727
|
+
lineNumber: index + 1,
|
|
728
|
+
lineContent: line.trim(),
|
|
729
|
+
severity: 'info',
|
|
730
|
+
category: 'dangerous_function',
|
|
731
|
+
title: `${funcPattern.name} (${contextType})`,
|
|
732
|
+
description: `Dynamic file path in ${contextType} context. File system access is expected functionality. Verify path inputs are validated.`,
|
|
733
|
+
suggestedFix:
|
|
734
|
+
'Ensure file paths are validated and constrained to expected directories.',
|
|
735
|
+
confidence: 'low',
|
|
736
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
737
|
+
layer: 2,
|
|
738
|
+
source: 'structural' as const, })
|
|
739
|
+
return
|
|
740
|
+
}
|
|
741
|
+
|
|
568
742
|
// Check file context for CLI/tooling (lower risk)
|
|
569
743
|
const isCLITool =
|
|
570
744
|
/\/(cli|scripts?|tools?|bin)\//i.test(filePath) ||
|
|
@@ -580,11 +754,18 @@ function handleFilePathPattern(
|
|
|
580
754
|
/\/(utils?|helpers?|lib|common|shared)\//i.test(filePath) ||
|
|
581
755
|
/(util(s)?|helper(s)?|checksum|hash)\.(ts|js)$/i.test(filePath)
|
|
582
756
|
|
|
757
|
+
// Check for server infrastructure/config files (transport, signing, credentials)
|
|
758
|
+
// These files read/write config-controlled paths, not user input
|
|
759
|
+
const isServerInfrastructureFile =
|
|
760
|
+
/\/(transports?|signing|credentials?|certificates?|certs?)\//i.test(filePath) ||
|
|
761
|
+
/\/(config|infrastructure|provisioning)\//i.test(filePath) ||
|
|
762
|
+
/(transport|signer|credential|certificate)\.(ts|js)$/i.test(filePath)
|
|
763
|
+
|
|
583
764
|
// Get surrounding context for protection check
|
|
584
|
-
const
|
|
765
|
+
const _lines = lines ?? content.split('\n')
|
|
585
766
|
const contextStart = Math.max(0, index - 10)
|
|
586
|
-
const contextEnd = Math.min(
|
|
587
|
-
const context =
|
|
767
|
+
const contextEnd = Math.min(_lines.length, index + 10)
|
|
768
|
+
const context = _lines.slice(contextStart, contextEnd).join('\n')
|
|
588
769
|
|
|
589
770
|
// Check if path comes from directory iteration (fs.readdir, fs.readdirSync)
|
|
590
771
|
// These paths are filesystem-controlled, not user input
|
|
@@ -592,6 +773,9 @@ function handleFilePathPattern(
|
|
|
592
773
|
/\b(readdir|readdirSync|opendir|opendirSync)\s*\(/.test(content) &&
|
|
593
774
|
(/for\s*\(\s*(const|let|var)\s+\w+\s+of/.test(context) ||
|
|
594
775
|
/\.forEach\s*\(/.test(context) ||
|
|
776
|
+
/\.map\s*\(/.test(context) || // array.map() iteration
|
|
777
|
+
/pMap\s*\(/.test(context) || // p-map library (parallel map)
|
|
778
|
+
/Promise\.all\s*\(/.test(context) || // Promise.all mapping
|
|
595
779
|
/entry\.(name|isFile|isDirectory)/.test(context) ||
|
|
596
780
|
/dirent\.(name|isFile|isDirectory)/.test(context))
|
|
597
781
|
|
|
@@ -609,8 +793,9 @@ function handleFilePathPattern(
|
|
|
609
793
|
suggestedFix:
|
|
610
794
|
'Ensure path normalization and base directory checks are applied consistently.',
|
|
611
795
|
confidence: 'low',
|
|
796
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
612
797
|
layer: 2,
|
|
613
|
-
})
|
|
798
|
+
source: 'structural' as const, })
|
|
614
799
|
return
|
|
615
800
|
}
|
|
616
801
|
|
|
@@ -620,6 +805,29 @@ function handleFilePathPattern(
|
|
|
620
805
|
return
|
|
621
806
|
}
|
|
622
807
|
|
|
808
|
+
// Check for Object.entries/keys/values over hardcoded objects
|
|
809
|
+
// Pattern: for (const [key, val] of Object.entries(STATIC_OBJ))
|
|
810
|
+
const hasHardcodedObjectIteration = ((): boolean => {
|
|
811
|
+
// Look for Object.entries/keys/values in context
|
|
812
|
+
const hasObjectIteration = /Object\.(entries|keys|values)\s*\(/.test(context)
|
|
813
|
+
if (!hasObjectIteration) return false
|
|
814
|
+
|
|
815
|
+
// Check if the object being iterated is defined as a const literal nearby
|
|
816
|
+
// Pattern: const objName = { ... }; ... Object.entries(objName)
|
|
817
|
+
const objectMatch = context.match(/Object\.(entries|keys|values)\s*\(\s*(\w+)\s*\)/)
|
|
818
|
+
if (!objectMatch) return false
|
|
819
|
+
|
|
820
|
+
const objName = objectMatch[2]
|
|
821
|
+
// Check if objName is defined as a const object literal in the file
|
|
822
|
+
const isConstObject = new RegExp(`const\\s+${objName}\\s*=\\s*\\{`).test(content)
|
|
823
|
+
return isConstObject
|
|
824
|
+
})()
|
|
825
|
+
|
|
826
|
+
if (hasHardcodedObjectIteration) {
|
|
827
|
+
// Skip entirely - iterating over hardcoded object, not user input
|
|
828
|
+
return
|
|
829
|
+
}
|
|
830
|
+
|
|
623
831
|
// GitHub Action paths are workflow-controlled (not arbitrary user input)
|
|
624
832
|
if (isGitHubAction) {
|
|
625
833
|
vulnerabilities.push({
|
|
@@ -635,8 +843,9 @@ function handleFilePathPattern(
|
|
|
635
843
|
suggestedFix:
|
|
636
844
|
'Verify paths come from trusted action inputs or environment variables.',
|
|
637
845
|
confidence: 'low',
|
|
846
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
638
847
|
layer: 2,
|
|
639
|
-
})
|
|
848
|
+
source: 'structural' as const, })
|
|
640
849
|
return
|
|
641
850
|
}
|
|
642
851
|
|
|
@@ -655,8 +864,9 @@ function handleFilePathPattern(
|
|
|
655
864
|
suggestedFix:
|
|
656
865
|
'Add path validation if accepting paths from untrusted sources.',
|
|
657
866
|
confidence: 'low',
|
|
867
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
658
868
|
layer: 2,
|
|
659
|
-
})
|
|
869
|
+
source: 'structural' as const, })
|
|
660
870
|
return
|
|
661
871
|
}
|
|
662
872
|
|
|
@@ -668,6 +878,30 @@ function handleFilePathPattern(
|
|
|
668
878
|
return
|
|
669
879
|
}
|
|
670
880
|
|
|
881
|
+
// Server infrastructure files (signing, transport, credentials) use config-controlled paths
|
|
882
|
+
// These paths come from environment variables or internal configuration, not user input
|
|
883
|
+
if (isServerInfrastructureFile && !hasRequestData) {
|
|
884
|
+
// Check if path comes from environment variables or function parameters
|
|
885
|
+
const hasEnvVarPath = /process\.env\.|import\.meta\.env\.|env\s*\(/i.test(context)
|
|
886
|
+
const hasConfigPath = /config\.|settings\.|credentials?\./i.test(context)
|
|
887
|
+
const hasCertPath = /certPath|keyPath|credentialsPath|googleApplicationCredentials/i.test(context)
|
|
888
|
+
|
|
889
|
+
if (hasEnvVarPath || hasConfigPath || hasCertPath) {
|
|
890
|
+
// Skip entirely - paths from env vars/config are not user-controlled
|
|
891
|
+
return
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
// Check if file path variable comes from environment variable wrapper function
|
|
896
|
+
// Common pattern: env('VAR_NAME') || 'default', process.env.VAR, etc.
|
|
897
|
+
const hasEnvVarSource = /env\s*\(\s*['"][^'"]+['"]\s*\)|process\.env\.\w+|import\.meta\.env\.\w+/i.test(context)
|
|
898
|
+
const hasOnlyConfigSource = hasEnvVarSource && !hasRequestData
|
|
899
|
+
|
|
900
|
+
if (hasOnlyConfigSource) {
|
|
901
|
+
// Path comes from environment variable, not user input - skip
|
|
902
|
+
return
|
|
903
|
+
}
|
|
904
|
+
|
|
671
905
|
// Standard handling for unprotected paths
|
|
672
906
|
let severity = funcPattern.severity
|
|
673
907
|
let confidence: 'high' | 'medium' | 'low' = 'high'
|
|
@@ -694,8 +928,9 @@ function handleFilePathPattern(
|
|
|
694
928
|
description: funcPattern.description + (isTestFile ? ' (in test file)' : ''),
|
|
695
929
|
suggestedFix: funcPattern.suggestedFix,
|
|
696
930
|
confidence,
|
|
931
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
697
932
|
layer: 2,
|
|
698
|
-
})
|
|
933
|
+
source: 'structural' as const, })
|
|
699
934
|
}
|
|
700
935
|
|
|
701
936
|
/**
|
|
@@ -809,6 +1044,14 @@ function handleMathRandomPattern(
|
|
|
809
1044
|
suggestedFix =
|
|
810
1045
|
'Use crypto.randomBytes() for security tokens. Use crypto.randomUUID() for unique IDs.'
|
|
811
1046
|
}
|
|
1047
|
+
// UI/cosmetic context - info (skeleton widths, animations, visual effects)
|
|
1048
|
+
else if (context.inUIContext) {
|
|
1049
|
+
severity = 'info'
|
|
1050
|
+
confidence = 'low'
|
|
1051
|
+
description =
|
|
1052
|
+
'Math.random() in UI/cosmetic context. Acceptable for visual effects, skeleton loading, animations.'
|
|
1053
|
+
suggestedFix = 'No change needed for UI/cosmetic randomness.'
|
|
1054
|
+
}
|
|
812
1055
|
// Business logic context - low
|
|
813
1056
|
else if (context.inBusinessLogicContext) {
|
|
814
1057
|
severity = 'low'
|
|
@@ -842,14 +1085,83 @@ function handleMathRandomPattern(
|
|
|
842
1085
|
description,
|
|
843
1086
|
suggestedFix,
|
|
844
1087
|
confidence,
|
|
1088
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
845
1089
|
layer: 2,
|
|
846
|
-
})
|
|
1090
|
+
source: 'structural' as const, })
|
|
847
1091
|
}
|
|
848
1092
|
|
|
849
1093
|
/**
|
|
850
|
-
*
|
|
851
|
-
*
|
|
852
|
-
*
|
|
1094
|
+
* Extract the full Python function call block starting from the trigger line.
|
|
1095
|
+
* Uses paren-balancing to collect up to `maxLines` forward, capturing multi-line calls.
|
|
1096
|
+
* Returns the joined block string.
|
|
1097
|
+
*/
|
|
1098
|
+
function extractPythonCallBlock(
|
|
1099
|
+
lines: string[],
|
|
1100
|
+
startIndex: number,
|
|
1101
|
+
maxLines: number = 10
|
|
1102
|
+
): string {
|
|
1103
|
+
let depth = 0
|
|
1104
|
+
let started = false
|
|
1105
|
+
const blockLines: string[] = []
|
|
1106
|
+
|
|
1107
|
+
for (let i = startIndex; i < Math.min(lines.length, startIndex + maxLines); i++) {
|
|
1108
|
+
const ln = lines[i]
|
|
1109
|
+
blockLines.push(ln)
|
|
1110
|
+
|
|
1111
|
+
for (const ch of ln) {
|
|
1112
|
+
if (ch === '(') {
|
|
1113
|
+
depth++
|
|
1114
|
+
started = true
|
|
1115
|
+
} else if (ch === ')') {
|
|
1116
|
+
depth--
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
// Once we've opened at least one paren and balanced back to 0, we're done
|
|
1121
|
+
if (started && depth <= 0) break
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
return blockLines.join('\n')
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
/**
|
|
1128
|
+
* Check if a Python list (as a string) contains only static string literals.
|
|
1129
|
+
* Returns true if every element is a plain string literal (no f-strings, no variables).
|
|
1130
|
+
*/
|
|
1131
|
+
function isPythonListAllStatic(listContent: string): boolean {
|
|
1132
|
+
// Remove the outer brackets
|
|
1133
|
+
const inner = listContent.replace(/^\[/, '').replace(/\]$/, '').trim()
|
|
1134
|
+
if (!inner) return true // empty list
|
|
1135
|
+
|
|
1136
|
+
// Split on commas (rough — good enough for typical subprocess args)
|
|
1137
|
+
const elements = inner.split(',').map(e => e.trim()).filter(e => e.length > 0)
|
|
1138
|
+
|
|
1139
|
+
for (const el of elements) {
|
|
1140
|
+
// Must be a plain string literal: 'foo', "bar", or """...""" / '''...'''
|
|
1141
|
+
// Reject f-strings, variables, function calls
|
|
1142
|
+
if (/^f['"`]/.test(el)) return false // f-string
|
|
1143
|
+
if (/^['"]/.test(el) && /['"]$/.test(el)) continue // simple string literal
|
|
1144
|
+
if (/^"""/.test(el) || /^'''/.test(el)) continue // triple-quoted
|
|
1145
|
+
return false // variable, function call, or other expression
|
|
1146
|
+
}
|
|
1147
|
+
return true
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
/**
|
|
1151
|
+
* Handle Python subprocess/os.system patterns with multi-line awareness.
|
|
1152
|
+
*
|
|
1153
|
+
* Decision tree:
|
|
1154
|
+
* 1. os.system(...) → HIGH (always dangerous)
|
|
1155
|
+
* 2. shell=True in call block? → HIGH
|
|
1156
|
+
* 3. First arg is inline list [...]?
|
|
1157
|
+
* a. All string literals, no f-strings → SKIP (safe)
|
|
1158
|
+
* b. Has f-strings or variables → LOW (list args prevent shell injection)
|
|
1159
|
+
* 4. First arg is a variable name?
|
|
1160
|
+
* a. Resolved to list nearby, all static → SKIP
|
|
1161
|
+
* b. Resolved to list nearby, has dynamics → LOW
|
|
1162
|
+
* c. Can't resolve → LOW (unresolved, flag for review)
|
|
1163
|
+
* 5. f-string as direct arg (not in list)? → HIGH (command injection)
|
|
1164
|
+
* 6. Everything else → HIGH (fallback)
|
|
853
1165
|
*/
|
|
854
1166
|
function handlePythonSubprocessPattern(
|
|
855
1167
|
funcPattern: DangerousFunctionPattern,
|
|
@@ -858,53 +1170,347 @@ function handlePythonSubprocessPattern(
|
|
|
858
1170
|
index: number,
|
|
859
1171
|
filePath: string,
|
|
860
1172
|
isTestFile: boolean,
|
|
861
|
-
vulnerabilities: Vulnerability[]
|
|
1173
|
+
vulnerabilities: Vulnerability[],
|
|
1174
|
+
lines?: string[]
|
|
862
1175
|
): void {
|
|
863
|
-
// os.system is always dangerous - no safe usage
|
|
1176
|
+
// 1. os.system is always dangerous - no safe usage
|
|
864
1177
|
if (/os\.system\s*\(/i.test(line)) {
|
|
865
1178
|
handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities)
|
|
866
1179
|
return
|
|
867
1180
|
}
|
|
868
1181
|
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
//
|
|
872
|
-
const
|
|
873
|
-
|
|
874
|
-
// Check for shell=True
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
//
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
1182
|
+
const _lines = lines ?? content.split('\n')
|
|
1183
|
+
|
|
1184
|
+
// Extract the full multi-line call block (up to 10 lines forward)
|
|
1185
|
+
const callBlock = extractPythonCallBlock(_lines, index)
|
|
1186
|
+
|
|
1187
|
+
// 2. Check for shell=True across the entire call block
|
|
1188
|
+
const hasShellTrue = /shell\s*=\s*True/i.test(callBlock)
|
|
1189
|
+
if (hasShellTrue) {
|
|
1190
|
+
handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities)
|
|
1191
|
+
return
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
// 3. Check for inline list args in the call block (not just same line)
|
|
1195
|
+
const inlineListMatch = callBlock.match(
|
|
1196
|
+
/subprocess\.(run|call|check_output|Popen)\s*\(\s*\[([\s\S]*?)\]/i
|
|
1197
|
+
)
|
|
1198
|
+
if (inlineListMatch) {
|
|
1199
|
+
const listContent = '[' + inlineListMatch[2] + ']'
|
|
1200
|
+
if (isPythonListAllStatic(listContent)) {
|
|
1201
|
+
// 3a. All static string literals → SKIP (safe)
|
|
887
1202
|
return
|
|
888
1203
|
}
|
|
889
|
-
//
|
|
1204
|
+
// 3b. Has f-strings or variables → LOW (list args prevent shell injection)
|
|
890
1205
|
vulnerabilities.push({
|
|
891
1206
|
id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
|
|
892
1207
|
filePath,
|
|
893
1208
|
lineNumber: index + 1,
|
|
894
1209
|
lineContent: line.trim(),
|
|
895
|
-
severity: 'low',
|
|
1210
|
+
severity: isTestFile ? 'info' : 'low',
|
|
896
1211
|
category: 'dangerous_function',
|
|
897
1212
|
title: funcPattern.name + ' (list args)',
|
|
898
1213
|
description:
|
|
899
|
-
'subprocess with list arguments (safer than shell=True).
|
|
900
|
-
suggestedFix: 'Ensure
|
|
1214
|
+
'subprocess with list arguments (safer than shell=True). Some arguments contain variables or f-strings — verify they are validated.',
|
|
1215
|
+
suggestedFix: 'Ensure dynamic arguments are validated and sanitized.',
|
|
1216
|
+
confidence: 'low',
|
|
1217
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
1218
|
+
layer: 2,
|
|
1219
|
+
source: 'structural' as const, })
|
|
1220
|
+
return
|
|
1221
|
+
}
|
|
1222
|
+
|
|
1223
|
+
// 4. Check for variable reference as first arg
|
|
1224
|
+
// Pattern: subprocess.run(args, ...) or subprocess.check_output(cmd, ...)
|
|
1225
|
+
const varArgMatch = callBlock.match(
|
|
1226
|
+
/subprocess\.(run|call|check_output|Popen)\s*\(\s*([a-zA-Z_]\w*)\s*[,)]/i
|
|
1227
|
+
)
|
|
1228
|
+
if (varArgMatch) {
|
|
1229
|
+
const varName = varArgMatch[2]
|
|
1230
|
+
|
|
1231
|
+
// Look backwards up to 15 lines for assignment: varName = [...]
|
|
1232
|
+
const searchStart = Math.max(0, index - 15)
|
|
1233
|
+
const previousLines = _lines.slice(searchStart, index + 1).join('\n')
|
|
1234
|
+
|
|
1235
|
+
// Match varName = [...] assignment (possibly multi-line)
|
|
1236
|
+
const assignmentPattern = new RegExp(
|
|
1237
|
+
varName + '\\s*=\\s*\\[([\\s\\S]*?)\\]',
|
|
1238
|
+
'i'
|
|
1239
|
+
)
|
|
1240
|
+
const assignmentMatch = previousLines.match(assignmentPattern)
|
|
1241
|
+
|
|
1242
|
+
if (assignmentMatch) {
|
|
1243
|
+
const listContent = '[' + assignmentMatch[1] + ']'
|
|
1244
|
+
if (isPythonListAllStatic(listContent)) {
|
|
1245
|
+
// 4a. Variable resolves to all-static list → SKIP
|
|
1246
|
+
return
|
|
1247
|
+
}
|
|
1248
|
+
// 4b. Variable resolves to list with dynamic elements → LOW
|
|
1249
|
+
vulnerabilities.push({
|
|
1250
|
+
id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
|
|
1251
|
+
filePath,
|
|
1252
|
+
lineNumber: index + 1,
|
|
1253
|
+
lineContent: line.trim(),
|
|
1254
|
+
severity: isTestFile ? 'info' : 'low',
|
|
1255
|
+
category: 'dangerous_function',
|
|
1256
|
+
title: funcPattern.name + ' (list args via variable)',
|
|
1257
|
+
description:
|
|
1258
|
+
`subprocess called with variable '${varName}' which resolves to a list. List arguments prevent shell injection, but some elements are dynamic.`,
|
|
1259
|
+
suggestedFix: 'Ensure dynamic list elements are validated and sanitized.',
|
|
1260
|
+
confidence: 'low',
|
|
1261
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
1262
|
+
layer: 2,
|
|
1263
|
+
source: 'structural' as const, })
|
|
1264
|
+
return
|
|
1265
|
+
}
|
|
1266
|
+
|
|
1267
|
+
// 4c. Can't resolve the variable — flag for review at LOW
|
|
1268
|
+
vulnerabilities.push({
|
|
1269
|
+
id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
|
|
1270
|
+
filePath,
|
|
1271
|
+
lineNumber: index + 1,
|
|
1272
|
+
lineContent: line.trim(),
|
|
1273
|
+
severity: isTestFile ? 'info' : 'low',
|
|
1274
|
+
category: 'dangerous_function',
|
|
1275
|
+
title: funcPattern.name + ' (unresolved variable)',
|
|
1276
|
+
description:
|
|
1277
|
+
`subprocess called with variable '${varName}' — could not resolve its value nearby. If it is a list, shell injection risk is low.`,
|
|
1278
|
+
suggestedFix: 'Verify the variable is a list (not a string) and arguments are validated.',
|
|
1279
|
+
confidence: 'low',
|
|
1280
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
1281
|
+
layer: 2,
|
|
1282
|
+
source: 'structural' as const, })
|
|
1283
|
+
return
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
// 5. f-string as direct arg (not inside a list) → HIGH (command injection)
|
|
1287
|
+
const hasFStringDirectArg = /subprocess\.(run|call|check_output|Popen)\s*\(\s*f['"`]/i.test(callBlock)
|
|
1288
|
+
if (hasFStringDirectArg) {
|
|
1289
|
+
handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities)
|
|
1290
|
+
return
|
|
1291
|
+
}
|
|
1292
|
+
|
|
1293
|
+
// 6. Everything else → HIGH (fallback)
|
|
1294
|
+
handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities)
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
/**
|
|
1298
|
+
* Handle regex patterns - check for escaped input
|
|
1299
|
+
* Pattern: new RegExp(escapedInput) or new RegExp(input.replaceAll(...escaped...))
|
|
1300
|
+
*/
|
|
1301
|
+
function handleRegexPattern(
|
|
1302
|
+
funcPattern: DangerousFunctionPattern,
|
|
1303
|
+
line: string,
|
|
1304
|
+
content: string,
|
|
1305
|
+
index: number,
|
|
1306
|
+
filePath: string,
|
|
1307
|
+
isTestFile: boolean,
|
|
1308
|
+
vulnerabilities: Vulnerability[],
|
|
1309
|
+
lines?: string[]
|
|
1310
|
+
): void {
|
|
1311
|
+
const _lines = lines ?? content.split('\n')
|
|
1312
|
+
const contextStart = Math.max(0, index - 15)
|
|
1313
|
+
const contextEnd = Math.min(_lines.length, index + 3)
|
|
1314
|
+
const context = _lines.slice(contextStart, contextEnd).join('\n')
|
|
1315
|
+
|
|
1316
|
+
// Check for RegExp object property access (.source, .flags)
|
|
1317
|
+
// This indicates input is already a validated RegExp, not user string
|
|
1318
|
+
// e.g., new RegExp(existingRegex.source, existingRegex.flags)
|
|
1319
|
+
const isRegExpFromRegExp = /\.source\s*[,)\s]/.test(line)
|
|
1320
|
+
if (isRegExpFromRegExp) {
|
|
1321
|
+
return // Safe - .source only exists on RegExp objects (already validated)
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1324
|
+
// Check for escaping ON THE SAME LINE as new RegExp() - this is a strong signal
|
|
1325
|
+
const sameLineEscapingPatterns = [
|
|
1326
|
+
/\.replaceAll\s*\([^)]*\)\s*[,)]/i, // .replaceAll(...)) - escaping before RegExp
|
|
1327
|
+
/escape\w*\s*\([^)]*\)\s*[,)]/i, // escapeRegExp(input)) - function result used
|
|
1328
|
+
/\.replace\s*\([^,]+,[^)]+\)\s*[,)]/i, // .replace(..., ...) followed by closing
|
|
1329
|
+
]
|
|
1330
|
+
if (sameLineEscapingPatterns.some(p => p.test(line))) {
|
|
1331
|
+
return // Safe - escaping applied on same line before RegExp construction
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
// Check previous 5 lines for escaping assignment (extended from 3 to catch multi-line patterns)
|
|
1335
|
+
const prevLinesStart = Math.max(0, index - 5)
|
|
1336
|
+
const prevLines = _lines.slice(prevLinesStart, index + 1).join('\n')
|
|
1337
|
+
|
|
1338
|
+
// Check for escaping patterns before new RegExp
|
|
1339
|
+
const escapingPatterns = [
|
|
1340
|
+
// Direct escaping function calls
|
|
1341
|
+
/escapeRegExp\s*\(/i, // escapeRegExp(input)
|
|
1342
|
+
/escapeString\s*\(/i, // escapeString(input)
|
|
1343
|
+
/escape\s*\(\s*pattern/i, // escape(pattern)
|
|
1344
|
+
/escapeForRegex\s*\(/i, // escapeForRegex(input)
|
|
1345
|
+
/regexEscape\s*\(/i, // regexEscape(input)
|
|
1346
|
+
|
|
1347
|
+
// replaceAll with regex escape pattern - original strict patterns
|
|
1348
|
+
/\.replaceAll\s*\(\s*\/\[.*\\\\\]\s*\/[gi]*\s*,\s*['"`]\\\\?\$&['"`]\s*\)/, // .replaceAll(/[special]/g, '\\$&')
|
|
1349
|
+
/\.replace\s*\(\s*\/\[.*\\\\\]\s*\/[gi]*\s*,\s*['"`]\\\\?\$&['"`]\s*\)/, // .replace(/[special]/g, '\\$&')
|
|
1350
|
+
|
|
1351
|
+
// More permissive $& replacement detection (the escape marker)
|
|
1352
|
+
// $& is the regex replacement marker that inserts the matched string - used for escaping
|
|
1353
|
+
/\.replace(?:All)?[\s\S]*?['"`]\\*\$&['"`]/, // .replace/.replaceAll with $& anywhere in call
|
|
1354
|
+
/\.replaceAll?[^;]*\$&/, // .replace/.replaceAll until semicolon with $&
|
|
1355
|
+
|
|
1356
|
+
// Lodash/underscore escapeRegExp
|
|
1357
|
+
/_\.escapeRegExp\s*\(/, // _.escapeRegExp(input)
|
|
1358
|
+
/lodash.*escapeRegExp/i, // lodash.escapeRegExp
|
|
1359
|
+
|
|
1360
|
+
// Variable assignment with escaping (check previous lines)
|
|
1361
|
+
/escaped\w*\s*=.*\.replace/i, // escapedInput = input.replace(...)
|
|
1362
|
+
/safe\w*\s*=.*escape/i, // safePattern = escapeRegExp(...)
|
|
1363
|
+
]
|
|
1364
|
+
|
|
1365
|
+
// Check both previous lines and full context
|
|
1366
|
+
const hasEscaping = escapingPatterns.some(p => p.test(line) || p.test(prevLines) || p.test(context))
|
|
1367
|
+
|
|
1368
|
+
// Check for try-catch wrapping (ReDoS contained)
|
|
1369
|
+
const hasTryCatch =
|
|
1370
|
+
/try\s*\{[^}]*new\s+RegExp/i.test(context) ||
|
|
1371
|
+
(context.includes('try {') && _lines.slice(Math.max(0, index - 5), index + 1).some(l => /try\s*\{/.test(l)))
|
|
1372
|
+
|
|
1373
|
+
// Check for configuration-based patterns (trusted input)
|
|
1374
|
+
const isConfigBased =
|
|
1375
|
+
/config\./i.test(line) ||
|
|
1376
|
+
/settings\./i.test(line) ||
|
|
1377
|
+
/rules\./i.test(line) ||
|
|
1378
|
+
/options\.\w+Pattern/i.test(line) ||
|
|
1379
|
+
/urlPattern/i.test(line) ||
|
|
1380
|
+
/routePattern/i.test(line)
|
|
1381
|
+
|
|
1382
|
+
// Escaped input is safe - skip entirely
|
|
1383
|
+
if (hasEscaping) {
|
|
1384
|
+
return
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
// Config-based patterns are trusted - skip
|
|
1388
|
+
if (isConfigBased) {
|
|
1389
|
+
return
|
|
1390
|
+
}
|
|
1391
|
+
|
|
1392
|
+
// Check if regex source is an object property (app-controlled data, not user input)
|
|
1393
|
+
// Patterns: obj.pattern, item.regex, l.urlRegExp, entry.matchPattern
|
|
1394
|
+
const objectPropertySource = /new\s+RegExp\s*\(\s*\w+\.\w*(regex|pattern|regexp|match|rule|expression|filter)\w*/i.test(line)
|
|
1395
|
+
if (objectPropertySource) {
|
|
1396
|
+
vulnerabilities.push({
|
|
1397
|
+
id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
|
|
1398
|
+
filePath,
|
|
1399
|
+
lineNumber: index + 1,
|
|
1400
|
+
lineContent: line.trim(),
|
|
1401
|
+
severity: 'info',
|
|
1402
|
+
category: 'dangerous_function',
|
|
1403
|
+
title: funcPattern.name + ' (app-controlled)',
|
|
1404
|
+
description: 'Dynamic regex from object property. If the regex source is app-defined (not user input), ReDoS risk is minimal.',
|
|
1405
|
+
suggestedFix: 'Ensure regex patterns come from trusted, validated sources.',
|
|
1406
|
+
confidence: 'low',
|
|
1407
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
1408
|
+
layer: 2,
|
|
1409
|
+
source: 'structural' as const, })
|
|
1410
|
+
return
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1413
|
+
// Check if regex source is from array iteration over app data
|
|
1414
|
+
// Pattern: for (const item of items) { new RegExp(item.xxx) }
|
|
1415
|
+
const isArrayIterationContext = /for\s*\(\s*(const|let|var)\s+\w+\s+(of|in)\s+/.test(context) &&
|
|
1416
|
+
/new\s+RegExp\s*\(\s*\w+\./.test(line)
|
|
1417
|
+
if (isArrayIterationContext) {
|
|
1418
|
+
vulnerabilities.push({
|
|
1419
|
+
id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
|
|
1420
|
+
filePath,
|
|
1421
|
+
lineNumber: index + 1,
|
|
1422
|
+
lineContent: line.trim(),
|
|
1423
|
+
severity: 'info',
|
|
1424
|
+
category: 'dangerous_function',
|
|
1425
|
+
title: funcPattern.name + ' (iteration)',
|
|
1426
|
+
description: 'Dynamic regex in array iteration. If iterating over app-defined data, ReDoS risk is minimal.',
|
|
1427
|
+
suggestedFix: 'Ensure regex patterns come from trusted sources, not user input.',
|
|
1428
|
+
confidence: 'low',
|
|
1429
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
1430
|
+
layer: 2,
|
|
1431
|
+
source: 'structural' as const, })
|
|
1432
|
+
return
|
|
1433
|
+
}
|
|
1434
|
+
|
|
1435
|
+
// Try-catch wrapped - lower severity (ReDoS contained)
|
|
1436
|
+
if (hasTryCatch) {
|
|
1437
|
+
vulnerabilities.push({
|
|
1438
|
+
id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
|
|
1439
|
+
filePath,
|
|
1440
|
+
lineNumber: index + 1,
|
|
1441
|
+
lineContent: line.trim(),
|
|
1442
|
+
severity: 'info',
|
|
1443
|
+
category: 'dangerous_function',
|
|
1444
|
+
title: funcPattern.name + ' (try-catch wrapped)',
|
|
1445
|
+
description:
|
|
1446
|
+
'Dynamic regex with try-catch error handling. ReDoS attacks are contained but may still cause performance issues.',
|
|
1447
|
+
suggestedFix: 'Consider using safe-regex library or adding timeout for regex operations.',
|
|
901
1448
|
confidence: 'low',
|
|
1449
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
902
1450
|
layer: 2,
|
|
903
|
-
})
|
|
1451
|
+
source: 'structural' as const, })
|
|
904
1452
|
return
|
|
905
1453
|
}
|
|
906
1454
|
|
|
907
|
-
// Standard handling for
|
|
1455
|
+
// Standard handling for unprotected regex
|
|
1456
|
+
handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities)
|
|
1457
|
+
}
|
|
1458
|
+
|
|
1459
|
+
/**
|
|
1460
|
+
* Handle spread operator with user input patterns
|
|
1461
|
+
* Checks for schema validation (Fastify, Zod, tRPC) that strips unknown properties
|
|
1462
|
+
*/
|
|
1463
|
+
function handleSpreadPattern(
|
|
1464
|
+
funcPattern: DangerousFunctionPattern,
|
|
1465
|
+
line: string,
|
|
1466
|
+
content: string,
|
|
1467
|
+
index: number,
|
|
1468
|
+
filePath: string,
|
|
1469
|
+
isTestFile: boolean,
|
|
1470
|
+
vulnerabilities: Vulnerability[],
|
|
1471
|
+
lines?: string[]
|
|
1472
|
+
): void {
|
|
1473
|
+
const _lines = lines ?? content.split('\n')
|
|
1474
|
+
const contextStart = Math.max(0, index - 30)
|
|
1475
|
+
const contextEnd = index
|
|
1476
|
+
const context = _lines.slice(contextStart, contextEnd).join('\n')
|
|
1477
|
+
|
|
1478
|
+
// Fastify/Hapi schema validation on route - body is pre-validated
|
|
1479
|
+
// Pattern: schema: { body: someSchema } before handler
|
|
1480
|
+
const hasRouteSchemaValidation =
|
|
1481
|
+
/schema\s*:\s*\{[^}]*body\s*:\s*\w+/i.test(context) ||
|
|
1482
|
+
/body\s*:\s*\w+Schema/i.test(context)
|
|
1483
|
+
|
|
1484
|
+
// Express + Zod/Joi/Yup middleware validation
|
|
1485
|
+
const hasMiddlewareValidation =
|
|
1486
|
+
/validate\s*\(\s*\w+Schema\s*\)/i.test(context) ||
|
|
1487
|
+
/\.parse\s*\(\s*req\.body\s*\)/i.test(context) ||
|
|
1488
|
+
/celebrate\s*\(/i.test(context)
|
|
1489
|
+
|
|
1490
|
+
// tRPC input validation
|
|
1491
|
+
const hasTRPCValidation =
|
|
1492
|
+
/\.input\s*\(\s*z\./i.test(context) ||
|
|
1493
|
+
/\.input\s*\(\s*\w+Schema\s*\)/i.test(context)
|
|
1494
|
+
|
|
1495
|
+
if (hasRouteSchemaValidation || hasMiddlewareValidation || hasTRPCValidation) {
|
|
1496
|
+
vulnerabilities.push({
|
|
1497
|
+
id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
|
|
1498
|
+
filePath,
|
|
1499
|
+
lineNumber: index + 1,
|
|
1500
|
+
lineContent: line.trim(),
|
|
1501
|
+
severity: 'info',
|
|
1502
|
+
category: 'dangerous_function',
|
|
1503
|
+
title: funcPattern.name + ' (schema-validated)',
|
|
1504
|
+
description: 'Request body is spread but has schema validation. Schema validation strips unknown properties, reducing mass assignment risk.',
|
|
1505
|
+
suggestedFix: 'Ensure schema validation is strict (no .passthrough() in Zod, no additionalProperties in JSON Schema).',
|
|
1506
|
+
confidence: 'low',
|
|
1507
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
1508
|
+
layer: 2,
|
|
1509
|
+
source: 'structural' as const, })
|
|
1510
|
+
return
|
|
1511
|
+
}
|
|
1512
|
+
|
|
1513
|
+
// No schema validation - standard handling
|
|
908
1514
|
handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities)
|
|
909
1515
|
}
|
|
910
1516
|
|
|
@@ -944,6 +1550,7 @@ function handleStandardPattern(
|
|
|
944
1550
|
description: funcPattern.description + (isTestFile ? ' (in test file)' : ''),
|
|
945
1551
|
suggestedFix: funcPattern.suggestedFix,
|
|
946
1552
|
confidence,
|
|
1553
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
947
1554
|
layer: 2,
|
|
948
|
-
})
|
|
1555
|
+
source: 'structural' as const, })
|
|
949
1556
|
}
|