@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
|
@@ -0,0 +1,880 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Layer 2: MCP (Model Context Protocol) Security Detection
|
|
4
|
+
* Detects security issues in MCP tool implementations
|
|
5
|
+
*
|
|
6
|
+
* Background: MCP enables AI agents to call external tools. Security risks include:
|
|
7
|
+
* - Tool Poisoning: External content returned without validation (CVE-2025-6514)
|
|
8
|
+
* - Credential Issues: Credentials in tool parameters/responses
|
|
9
|
+
* - Confused Deputy: Operations without proper user context
|
|
10
|
+
*
|
|
11
|
+
* Reference: https://modelcontextprotocol.io, 13,000+ MCP servers deployed
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.detectMCPSecurity = detectMCPSecurity;
|
|
15
|
+
const file_classifier_1 = require("../../parse/file-classifier");
|
|
16
|
+
const BASE_CONFIDENCE = 0.50;
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Context Detection
|
|
19
|
+
// ============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Check if file is an MCP server/tool file based on imports and patterns
|
|
22
|
+
*/
|
|
23
|
+
function isMCPFile(content, filePath) {
|
|
24
|
+
// Import patterns for MCP SDK
|
|
25
|
+
const mcpImportPatterns = [
|
|
26
|
+
/@modelcontextprotocol\/sdk/i,
|
|
27
|
+
/from\s+['"]mcp['"]/i,
|
|
28
|
+
/from\s+['"]@mcp\//i,
|
|
29
|
+
/McpServer/i,
|
|
30
|
+
/mcp\.server/i,
|
|
31
|
+
/server\.tool\s*\(/i,
|
|
32
|
+
/@server\.tool/i,
|
|
33
|
+
];
|
|
34
|
+
if (mcpImportPatterns.some(p => p.test(content))) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
// Path patterns
|
|
38
|
+
const mcpPathPatterns = [
|
|
39
|
+
/\/mcp\//i,
|
|
40
|
+
/mcp[-_]?server/i,
|
|
41
|
+
/mcp[-_]?tools?/i,
|
|
42
|
+
];
|
|
43
|
+
return mcpPathPatterns.some(p => p.test(filePath));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if line/context has content sanitization
|
|
47
|
+
*/
|
|
48
|
+
function hasContentSanitization(context) {
|
|
49
|
+
const sanitizationPatterns = [
|
|
50
|
+
/sanitize|DOMPurify|purify/i,
|
|
51
|
+
/escapeHtml|escape_html|html\.escape/i,
|
|
52
|
+
/strip(?:Tags|Html|Scripts)/i,
|
|
53
|
+
/validate(?:Content|Input|Schema)/i,
|
|
54
|
+
/zod\.parse|schema\.parse|safeParse/i,
|
|
55
|
+
/filterHtml|cleanHtml/i,
|
|
56
|
+
/ALLOWED_TAGS/i,
|
|
57
|
+
// Safe return patterns - returning only safe fields
|
|
58
|
+
/\.map\s*\([^)]*\{\s*id|title|name|summary\s*:/i,
|
|
59
|
+
// Static content patterns
|
|
60
|
+
/loadStaticDocs|staticContent|publicData/i,
|
|
61
|
+
// Pure computation
|
|
62
|
+
/mathjs\.evaluate|calculate/i,
|
|
63
|
+
];
|
|
64
|
+
return sanitizationPatterns.some(p => p.test(context));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if the return is for a safe/static data source
|
|
68
|
+
*/
|
|
69
|
+
function isSafeDataSource(context) {
|
|
70
|
+
const safePatterns = [
|
|
71
|
+
// Static/public data
|
|
72
|
+
/(?:static|public)(?:Data|Docs|Content)/i,
|
|
73
|
+
// Mathematical operations
|
|
74
|
+
/mathjs|calculate|compute/i,
|
|
75
|
+
// Internal API with server-side auth
|
|
76
|
+
/process\.env\.INTERNAL|SERVER_SIDE/i,
|
|
77
|
+
// User's own data explicitly
|
|
78
|
+
/findByUser|getByUser|user\.(?:files|documents|records)/i,
|
|
79
|
+
// Returns only safe fields like id, name, title
|
|
80
|
+
/return\s*\{[^}]*:\s*\{[^}]*(?:only|safe|id|title|name)[^}]*\}/i,
|
|
81
|
+
];
|
|
82
|
+
return safePatterns.some(p => p.test(context));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Check if tool has user context access
|
|
86
|
+
*/
|
|
87
|
+
function hasUserContext(context) {
|
|
88
|
+
const userContextPatterns = [
|
|
89
|
+
/context\.user/i,
|
|
90
|
+
/context\.userId/i,
|
|
91
|
+
/context\.session/i,
|
|
92
|
+
/context\.auth/i,
|
|
93
|
+
/getCurrentUser/i,
|
|
94
|
+
/request\.user/i,
|
|
95
|
+
/req\.user/i,
|
|
96
|
+
/user\.id/i,
|
|
97
|
+
/userId/i,
|
|
98
|
+
/session\.user/i,
|
|
99
|
+
/auth\(\)/i,
|
|
100
|
+
/tenantId/i,
|
|
101
|
+
/tenant\.id/i,
|
|
102
|
+
/orgId/i,
|
|
103
|
+
];
|
|
104
|
+
return userContextPatterns.some(p => p.test(context));
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if there's an authorization check in context
|
|
108
|
+
*/
|
|
109
|
+
function hasAuthorizationCheck(context) {
|
|
110
|
+
const authCheckPatterns = [
|
|
111
|
+
/if\s*\([^)]*\.ownerId\s*[!=]==?\s*/i,
|
|
112
|
+
/if\s*\([^)]*userId\s*[!=]==?\s*/i,
|
|
113
|
+
/if\s*\([^)]*tenantId\s*[!=]==?\s*/i,
|
|
114
|
+
/Not\s*authorized/i,
|
|
115
|
+
/Forbidden/i,
|
|
116
|
+
/checkPermission/i,
|
|
117
|
+
/checkAccess/i,
|
|
118
|
+
/canAccess/i,
|
|
119
|
+
/hasPermission/i,
|
|
120
|
+
/isAuthorized/i,
|
|
121
|
+
/throw.*Error.*auth/i,
|
|
122
|
+
];
|
|
123
|
+
return authCheckPatterns.some(p => p.test(context));
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get surrounding context for analysis
|
|
127
|
+
*/
|
|
128
|
+
function getSurroundingContext(content, lineIndex, windowSize = 30) {
|
|
129
|
+
const lines = content.split('\n');
|
|
130
|
+
const start = Math.max(0, lineIndex - windowSize);
|
|
131
|
+
const end = Math.min(lines.length, lineIndex + windowSize);
|
|
132
|
+
return lines.slice(start, end).join('\n');
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Tool Poisoning Patterns
|
|
136
|
+
* Detect tools that return external content without validation
|
|
137
|
+
*/
|
|
138
|
+
const TOOL_POISONING_PATTERNS = [
|
|
139
|
+
// Raw HTTP response content (JS and Python)
|
|
140
|
+
{
|
|
141
|
+
name: 'Raw HTTP response in tool',
|
|
142
|
+
pattern: /(?:return|=>)\s*[{(]\s*[{"]?[^}]*(?:content|body|text|html)['"]\s*[:=]\s*(?:await\s+)?(?:response|res)\.(?:text|json|body)/gi,
|
|
143
|
+
category: 'tool_poisoning',
|
|
144
|
+
baseSeverity: 'high',
|
|
145
|
+
description: 'MCP tool returns raw HTTP response content without sanitization. External content could contain prompt injection payloads.',
|
|
146
|
+
suggestedFix: 'Sanitize external content before returning: return { content: sanitize(response.text()) }',
|
|
147
|
+
},
|
|
148
|
+
// Raw fetch result
|
|
149
|
+
{
|
|
150
|
+
name: 'Fetch result returned directly',
|
|
151
|
+
pattern: /return\s*[{(]\s*[{"]?[^}]*[:=]\s*await\s+fetch\([^)]+\)\.(?:text|json)\(\)/gi,
|
|
152
|
+
category: 'tool_poisoning',
|
|
153
|
+
baseSeverity: 'high',
|
|
154
|
+
description: 'Fetch result returned directly in tool response. Content may contain malicious instructions.',
|
|
155
|
+
suggestedFix: 'Validate and sanitize fetch results before including in response.',
|
|
156
|
+
},
|
|
157
|
+
// Database query results (JS)
|
|
158
|
+
{
|
|
159
|
+
name: 'Raw database content in response',
|
|
160
|
+
pattern: /return\s*\{[^}]*(?:data|results?|rows|documents?|items?)\s*:\s*(?:await\s+)?(?:db|database|client|collection|query)\.(?:query|find|search|execute)/gi,
|
|
161
|
+
category: 'tool_poisoning',
|
|
162
|
+
baseSeverity: 'medium',
|
|
163
|
+
description: 'Database query results returned without filtering. Stored content could be poisoned.',
|
|
164
|
+
suggestedFix: 'Validate and sanitize database content. Consider returning only safe fields.',
|
|
165
|
+
},
|
|
166
|
+
// Database query results (Python)
|
|
167
|
+
{
|
|
168
|
+
name: 'Raw database content in Python response',
|
|
169
|
+
pattern: /return\s*\{[^}]*["'](?:data|results?|documents?)["']\s*:\s*(?:await\s+)?(?:db|database|results)[\.\[]/gi,
|
|
170
|
+
category: 'tool_poisoning',
|
|
171
|
+
baseSeverity: 'medium',
|
|
172
|
+
description: 'Database query results returned without filtering in Python MCP tool.',
|
|
173
|
+
suggestedFix: 'Validate and sanitize database content. Consider returning only safe fields.',
|
|
174
|
+
},
|
|
175
|
+
// File content
|
|
176
|
+
{
|
|
177
|
+
name: 'File content returned without validation',
|
|
178
|
+
pattern: /return\s*[{(]\s*[{"]?[^}]*content['"]\s*[:=]\s*(?:await\s+)?(?:fs|file|readFile|readFileSync)/gi,
|
|
179
|
+
category: 'tool_poisoning',
|
|
180
|
+
baseSeverity: 'high',
|
|
181
|
+
description: 'File content returned without validation. Files could contain malicious instructions.',
|
|
182
|
+
suggestedFix: 'Validate file content and type. Sanitize before returning to the model.',
|
|
183
|
+
},
|
|
184
|
+
// Email content
|
|
185
|
+
{
|
|
186
|
+
name: 'Email content in response',
|
|
187
|
+
pattern: /return\s*[{(]\s*[{"]?[^}]*(?:body|content|text)['"]\s*[:=]\s*(?:email|message|mail)\.(?:body|content|text|html)/gi,
|
|
188
|
+
category: 'tool_poisoning',
|
|
189
|
+
baseSeverity: 'high',
|
|
190
|
+
description: 'Email content returned to model. Emails are common vectors for prompt injection.',
|
|
191
|
+
suggestedFix: 'Sanitize email content. Strip HTML, scripts, and instruction-like patterns.',
|
|
192
|
+
},
|
|
193
|
+
// RSS/feed content
|
|
194
|
+
{
|
|
195
|
+
name: 'RSS/feed content in response',
|
|
196
|
+
pattern: /return\s*[{(]\s*[{"]?[^}]*(?:items?|entries?|feed)['"]\s*[:=]\s*(?:feed|rss|parser)\.(?:items?|entries?|parse)/gi,
|
|
197
|
+
category: 'tool_poisoning',
|
|
198
|
+
baseSeverity: 'medium',
|
|
199
|
+
description: 'RSS/feed content returned without filtering. Feed titles and descriptions could be poisoned.',
|
|
200
|
+
suggestedFix: 'Sanitize feed content. Filter to safe fields only (id, title summary).',
|
|
201
|
+
},
|
|
202
|
+
// Generic raw content return (JS)
|
|
203
|
+
{
|
|
204
|
+
name: 'Raw content in tool response',
|
|
205
|
+
pattern: /server\.tool\s*\([^)]+,\s*async[^{]+\{[^}]*return\s*\{[^}]*:\s*(?:await\s+)?response\.text\(\)/gi,
|
|
206
|
+
category: 'tool_poisoning',
|
|
207
|
+
baseSeverity: 'high',
|
|
208
|
+
description: 'MCP tool returns raw text content from external source.',
|
|
209
|
+
suggestedFix: 'Add content sanitization layer before returning external content.',
|
|
210
|
+
},
|
|
211
|
+
// Python httpx response text
|
|
212
|
+
{
|
|
213
|
+
name: 'Raw HTTP response in Python tool',
|
|
214
|
+
pattern: /return\s*\{[^}]*["']content["']\s*:\s*(?:await\s+)?response\.text/gi,
|
|
215
|
+
category: 'tool_poisoning',
|
|
216
|
+
baseSeverity: 'high',
|
|
217
|
+
description: 'Python MCP tool returns raw HTTP response content.',
|
|
218
|
+
suggestedFix: 'Sanitize external content before returning to the model.',
|
|
219
|
+
},
|
|
220
|
+
// Variable-based: HTTP response assigned then returned
|
|
221
|
+
{
|
|
222
|
+
name: 'HTTP response variable in MCP tool',
|
|
223
|
+
pattern: /(?:const|let|var)\s+\w+\s*=\s*(?:await\s+)?response\.text\(\)[^}]+return\s*\{[^}]*content/gis,
|
|
224
|
+
category: 'tool_poisoning',
|
|
225
|
+
baseSeverity: 'high',
|
|
226
|
+
description: 'HTTP response text stored in variable and returned. External content could be poisoned.',
|
|
227
|
+
suggestedFix: 'Sanitize the content before returning: const sanitized = sanitize(html)',
|
|
228
|
+
},
|
|
229
|
+
// Variable-based: File read assigned then returned
|
|
230
|
+
{
|
|
231
|
+
name: 'File read variable in MCP tool',
|
|
232
|
+
pattern: /(?:const|let|var)\s+\w+\s*=\s*(?:await\s+)?(?:fs\.readFile|readFile)[^}]+return\s*\{[^}]*content/gis,
|
|
233
|
+
category: 'tool_poisoning',
|
|
234
|
+
baseSeverity: 'high',
|
|
235
|
+
description: 'File content stored in variable and returned. File content could contain malicious instructions.',
|
|
236
|
+
suggestedFix: 'Validate and sanitize file content before returning.',
|
|
237
|
+
},
|
|
238
|
+
// Database query result in return (shorthand property)
|
|
239
|
+
{
|
|
240
|
+
name: 'Database query in MCP return',
|
|
241
|
+
pattern: /(?:const|let|var)\s+(?:results?|data|rows)\s*=\s*(?:await\s+)?(?:db|database|client)\.(?:query|find|search)[^}]+return\s*\{[^}]*(?:data|results?|rows)/gis,
|
|
242
|
+
category: 'tool_poisoning',
|
|
243
|
+
baseSeverity: 'medium',
|
|
244
|
+
description: 'Database query results returned in MCP tool. Stored content could be poisoned.',
|
|
245
|
+
suggestedFix: 'Validate and sanitize database content before returning.',
|
|
246
|
+
},
|
|
247
|
+
// Email body returned
|
|
248
|
+
{
|
|
249
|
+
name: 'Email body in MCP return',
|
|
250
|
+
pattern: /(?:email|message|mail)\s*=\s*(?:await)?[^}]+return\s*\{[^}]*body\s*:\s*(?:email|message|mail)\.body/gis,
|
|
251
|
+
category: 'tool_poisoning',
|
|
252
|
+
baseSeverity: 'high',
|
|
253
|
+
description: 'Email body content returned in MCP tool. Emails are common prompt injection vectors.',
|
|
254
|
+
suggestedFix: 'Sanitize email content. Strip HTML and instruction-like patterns.',
|
|
255
|
+
},
|
|
256
|
+
// Feed/RSS items returned
|
|
257
|
+
{
|
|
258
|
+
name: 'RSS/feed items in MCP return',
|
|
259
|
+
pattern: /(?:feed|rss)\s*=\s*(?:await)?[^}]+return\s*\{[^}]*items?\s*:\s*(?:feed|rss)\.items?/gis,
|
|
260
|
+
category: 'tool_poisoning',
|
|
261
|
+
baseSeverity: 'medium',
|
|
262
|
+
description: 'RSS/feed items returned in MCP tool. Feed content could be poisoned.',
|
|
263
|
+
suggestedFix: 'Sanitize feed content. Filter to safe fields only.',
|
|
264
|
+
},
|
|
265
|
+
];
|
|
266
|
+
/**
|
|
267
|
+
* Credential Issue Patterns
|
|
268
|
+
* Detect credentials in tool parameters or responses
|
|
269
|
+
*/
|
|
270
|
+
const CREDENTIAL_PATTERNS = [
|
|
271
|
+
// API key in parameter
|
|
272
|
+
{
|
|
273
|
+
name: 'API key in tool parameter',
|
|
274
|
+
pattern: /server\.tool\s*\([^)]+,\s*async\s*\(\s*\{[^}]*(?:apiKey|api_key|token|secret|password|privateKey|private_key|accessToken|access_token|authToken|auth_token)/gi,
|
|
275
|
+
category: 'credential_issue',
|
|
276
|
+
baseSeverity: 'high',
|
|
277
|
+
description: 'Tool accepts credentials as parameter. Credentials should not flow through the model.',
|
|
278
|
+
suggestedFix: 'Use server-side credential storage. Remove credential parameter and use environment variables or secret manager.',
|
|
279
|
+
},
|
|
280
|
+
// Python decorator with credentials
|
|
281
|
+
{
|
|
282
|
+
name: 'Python tool with credential parameter',
|
|
283
|
+
pattern: /@server\.tool[^)]*\)\s*(?:async\s+)?def\s+\w+\s*\([^)]*(?:api_key|token|secret|password|private_key|access_token|auth_token)/gi,
|
|
284
|
+
category: 'credential_issue',
|
|
285
|
+
baseSeverity: 'high',
|
|
286
|
+
description: 'Python MCP tool accepts credentials as parameter.',
|
|
287
|
+
suggestedFix: 'Use server-side credential management. Do not pass secrets through tool parameters.',
|
|
288
|
+
},
|
|
289
|
+
// Returning credentials in response
|
|
290
|
+
{
|
|
291
|
+
name: 'Credentials in tool response',
|
|
292
|
+
pattern: /return\s*\{[^}]*(?:apiKey|api_key|token|password|secret|privateKey|private_key|accessToken|access_token|refreshToken|refresh_token|jwt)\s*:/gi,
|
|
293
|
+
category: 'credential_issue',
|
|
294
|
+
baseSeverity: 'critical',
|
|
295
|
+
description: 'Tool response includes credentials. Exposing secrets to the model is dangerous.',
|
|
296
|
+
suggestedFix: 'Never return credentials in tool responses. Return success status or user-safe identifiers only.',
|
|
297
|
+
},
|
|
298
|
+
// Connection string in parameter
|
|
299
|
+
{
|
|
300
|
+
name: 'Connection string in tool parameter',
|
|
301
|
+
pattern: /server\.tool\s*\([^)]+,\s*async\s*\(\s*\{[^}]*(?:connectionString|connection_string|dsn|dbUrl|db_url|databaseUrl|database_url)/gi,
|
|
302
|
+
category: 'credential_issue',
|
|
303
|
+
baseSeverity: 'high',
|
|
304
|
+
description: 'Database connection string passed as tool parameter. Connection strings contain credentials.',
|
|
305
|
+
suggestedFix: 'Use server-side database configuration. Do not accept connection strings as parameters.',
|
|
306
|
+
},
|
|
307
|
+
// Environment secrets in response
|
|
308
|
+
{
|
|
309
|
+
name: 'Environment secrets in response',
|
|
310
|
+
pattern: /return\s*\{[^}]*:\s*process\.env\.(?:.*(?:KEY|SECRET|TOKEN|PASSWORD|CREDENTIAL))/gi,
|
|
311
|
+
category: 'credential_issue',
|
|
312
|
+
baseSeverity: 'critical',
|
|
313
|
+
description: 'Environment secrets returned in tool response.',
|
|
314
|
+
suggestedFix: 'Never return environment secrets. Use them server-side only.',
|
|
315
|
+
},
|
|
316
|
+
];
|
|
317
|
+
/**
|
|
318
|
+
* Confused Deputy Patterns
|
|
319
|
+
* Detect operations without proper user context
|
|
320
|
+
*/
|
|
321
|
+
const CONFUSED_DEPUTY_PATTERNS = [
|
|
322
|
+
// Data operation without user context
|
|
323
|
+
{
|
|
324
|
+
name: 'Data deletion without user context',
|
|
325
|
+
pattern: /server\.tool\s*\([^)]+,\s*async\s*\(\s*\{[^}]*(?:Id|id)\s*\}[^)]*\)\s*(?:=>|:)[^{]*\{[^}]*(?:\.delete|\.remove|\.destroy)\s*\(/gi,
|
|
326
|
+
category: 'confused_deputy',
|
|
327
|
+
baseSeverity: 'high',
|
|
328
|
+
description: 'Tool deletes data using only an ID parameter without user context verification.',
|
|
329
|
+
suggestedFix: 'Add user context parameter and verify ownership: if (record.ownerId !== context.user.id) throw new Error("Unauthorized")',
|
|
330
|
+
},
|
|
331
|
+
// Update operation without auth check
|
|
332
|
+
{
|
|
333
|
+
name: 'Data update without authorization',
|
|
334
|
+
pattern: /server\.tool\s*\([^)]+,\s*async\s*\(\s*\{[^}]*(?:Id|id)[^}]*data[^}]*\}[^)]*\)[^{]*\{[^}]*(?:\.update|\.set|\.save)\s*\(/gi,
|
|
335
|
+
category: 'confused_deputy',
|
|
336
|
+
baseSeverity: 'high',
|
|
337
|
+
description: 'Tool updates data without verifying the user owns the record.',
|
|
338
|
+
suggestedFix: 'Validate user ownership before update. Add authorization check.',
|
|
339
|
+
},
|
|
340
|
+
// Reading user-specific data without context
|
|
341
|
+
{
|
|
342
|
+
name: 'User data access without context',
|
|
343
|
+
pattern: /server\.tool\s*\([^)]+(?:user|file|record|document|message)[^)]+,\s*async\s*\(\s*\{[^}]*(?:Id|id)\s*\}/gi,
|
|
344
|
+
category: 'confused_deputy',
|
|
345
|
+
baseSeverity: 'medium',
|
|
346
|
+
description: 'Tool accesses user-specific data with only an ID. Missing user context verification.',
|
|
347
|
+
suggestedFix: 'Add user context and verify access permissions for the requested resource.',
|
|
348
|
+
},
|
|
349
|
+
// Admin/privileged operation without auth
|
|
350
|
+
{
|
|
351
|
+
name: 'Privileged operation without authorization',
|
|
352
|
+
pattern: /server\.tool\s*\([^)]+(?:admin|grant|revoke|elevate|promote)[^)]*,\s*async/gi,
|
|
353
|
+
category: 'confused_deputy',
|
|
354
|
+
baseSeverity: 'critical',
|
|
355
|
+
description: 'Privileged/admin tool without visible authorization check.',
|
|
356
|
+
suggestedFix: 'Add strict authorization check. Verify caller has admin privileges before executing.',
|
|
357
|
+
},
|
|
358
|
+
// Send email/message as user
|
|
359
|
+
{
|
|
360
|
+
name: 'Send message without identity verification',
|
|
361
|
+
pattern: /server\.tool\s*\([^)]+(?:send|email|message)[^)]+,\s*async\s*\(\s*\{[^}]*(?:from|sender)[^}]*\}/gi,
|
|
362
|
+
category: 'confused_deputy',
|
|
363
|
+
baseSeverity: 'high',
|
|
364
|
+
description: 'Tool sends messages with a \'from\' parameter. Should use authenticated user identity.',
|
|
365
|
+
suggestedFix: 'Use context.user for sender identity. Do not allow arbitrary \'from\' values.',
|
|
366
|
+
},
|
|
367
|
+
// Cross-tenant data access
|
|
368
|
+
{
|
|
369
|
+
name: 'Organization/tenant data without scope',
|
|
370
|
+
pattern: /server\.tool\s*\([^)]+(?:org|organization|tenant|workspace)[^)]+,\s*async\s*\(\s*\{[^}]*(?:Id|id)\s*\}/gi,
|
|
371
|
+
category: 'confused_deputy',
|
|
372
|
+
baseSeverity: 'high',
|
|
373
|
+
description: 'Tool accesses organization data by ID without tenant context verification.',
|
|
374
|
+
suggestedFix: 'Verify tenant membership: if (org.id !== context.user.tenantId) throw new Error("Unauthorized")',
|
|
375
|
+
},
|
|
376
|
+
// Python tool without context
|
|
377
|
+
{
|
|
378
|
+
name: 'Python tool data operation without user',
|
|
379
|
+
pattern: /@server\.tool[^)]*\)\s*(?:async\s+)?def\s+(?:delete|update|remove|create)_\w+\s*\(\s*(?:\w+_)?id\s*:/gi,
|
|
380
|
+
category: 'confused_deputy',
|
|
381
|
+
baseSeverity: 'medium',
|
|
382
|
+
description: 'Python MCP tool performs data operation with only an ID parameter.',
|
|
383
|
+
suggestedFix: 'Add user context parameter and validate authorization.',
|
|
384
|
+
},
|
|
385
|
+
];
|
|
386
|
+
/**
|
|
387
|
+
* Tool Description Injection Patterns
|
|
388
|
+
* Detect prompt injection risks in MCP tool descriptions/metadata
|
|
389
|
+
*/
|
|
390
|
+
const DESCRIPTION_INJECTION_PATTERNS = [
|
|
391
|
+
// Dynamic description from variable/input (JS template literals)
|
|
392
|
+
{
|
|
393
|
+
name: 'Dynamic tool description from variable',
|
|
394
|
+
pattern: /description\s*:\s*[`'"].*\$\{.*(?:user|req|input|param|config).*\}.*[`'"]/gi,
|
|
395
|
+
category: 'description_injection',
|
|
396
|
+
baseSeverity: 'high',
|
|
397
|
+
description: 'Tool description constructed from user input or external variables. Malicious content could manipulate AI behavior.',
|
|
398
|
+
suggestedFix: 'Use static descriptions only. Never include user input in tool descriptions.',
|
|
399
|
+
},
|
|
400
|
+
// Description concatenated with user input
|
|
401
|
+
{
|
|
402
|
+
name: 'Tool description with user input concatenation',
|
|
403
|
+
pattern: /description\s*:\s*(?:["'][^"']*["']\s*\+\s*)?(?:user|req|input|param|options)\./gi,
|
|
404
|
+
category: 'description_injection',
|
|
405
|
+
baseSeverity: 'high',
|
|
406
|
+
description: 'Tool description concatenated with user-controlled values. Could inject prompt manipulation instructions.',
|
|
407
|
+
suggestedFix: 'Use static descriptions. If dynamic content is needed, sanitize and validate strictly.',
|
|
408
|
+
},
|
|
409
|
+
// Injection keywords in tool descriptions
|
|
410
|
+
{
|
|
411
|
+
name: 'Injection keywords in tool description',
|
|
412
|
+
pattern: /description\s*:\s*["'`][^"'`]*(?:ignore\s*(?:previous|above|all)|bypass|override|system\s*prompt|disregard|forget)[^"'`]*["'`]/gi,
|
|
413
|
+
category: 'description_injection',
|
|
414
|
+
baseSeverity: 'critical',
|
|
415
|
+
description: 'Tool description contains prompt injection keywords. This could manipulate AI behavior.',
|
|
416
|
+
suggestedFix: 'Remove manipulation keywords from description. Use neutral, factual descriptions.',
|
|
417
|
+
},
|
|
418
|
+
// Tool name from untrusted source
|
|
419
|
+
{
|
|
420
|
+
name: 'Dynamic tool name from config/options',
|
|
421
|
+
pattern: /(?:registerTool|server\.tool|addTool)\s*\(\s*(?:config|options|params|settings)\s*\[?\s*['".]?\s*(?:name|tool)/gi,
|
|
422
|
+
category: 'description_injection',
|
|
423
|
+
baseSeverity: 'high',
|
|
424
|
+
description: 'Tool name derived from configuration or options. Attackers could shadow legitimate tools.',
|
|
425
|
+
suggestedFix: 'Use hardcoded tool names. Validate against an allowlist if dynamic names are required.',
|
|
426
|
+
},
|
|
427
|
+
// Python dynamic description
|
|
428
|
+
{
|
|
429
|
+
name: 'Python tool with dynamic description',
|
|
430
|
+
pattern: /@server\.tool\s*\(\s*name\s*=\s*(?:f["']|["'].*\{)/gi,
|
|
431
|
+
category: 'description_injection',
|
|
432
|
+
baseSeverity: 'high',
|
|
433
|
+
description: 'Python MCP tool with f-string or formatted description. Could include injected content.',
|
|
434
|
+
suggestedFix: 'Use static string literals for tool names and descriptions.',
|
|
435
|
+
},
|
|
436
|
+
// Description from database/storage
|
|
437
|
+
{
|
|
438
|
+
name: 'Tool description from storage',
|
|
439
|
+
pattern: /description\s*:\s*(?:await\s+)?(?:db|database|storage|cache|redis)\.(?:get|read|fetch)/gi,
|
|
440
|
+
category: 'description_injection',
|
|
441
|
+
baseSeverity: 'medium',
|
|
442
|
+
description: 'Tool description loaded from storage. Stored content could be poisoned.',
|
|
443
|
+
suggestedFix: 'Use static descriptions. If dynamic descriptions are required, validate and sanitize thoroughly.',
|
|
444
|
+
},
|
|
445
|
+
];
|
|
446
|
+
/**
|
|
447
|
+
* Cross-Server Tool Shadowing Patterns
|
|
448
|
+
* Detect malicious MCP servers overriding legitimate tools
|
|
449
|
+
*/
|
|
450
|
+
const SERVER_SHADOWING_PATTERNS = [
|
|
451
|
+
// Server config from environment/user input
|
|
452
|
+
{
|
|
453
|
+
name: 'MCP server config from environment',
|
|
454
|
+
pattern: /(?:MCP_SERVERS?|mcpServers?)\s*[=:]\s*(?:JSON\.parse\s*\(\s*)?process\.env/gi,
|
|
455
|
+
category: 'server_shadowing',
|
|
456
|
+
baseSeverity: 'medium',
|
|
457
|
+
description: 'MCP server configuration loaded from environment variables. Ensure proper validation.',
|
|
458
|
+
suggestedFix: 'Validate server URLs against an allowlist. Use explicit server configuration in code.',
|
|
459
|
+
},
|
|
460
|
+
// Server URLs from user input
|
|
461
|
+
{
|
|
462
|
+
name: 'MCP server URL from user input',
|
|
463
|
+
pattern: /(?:server(?:Url|URL|Uri)|endpoint)\s*:\s*(?:req\.|user\.|input\.|params\.|body\.)/gi,
|
|
464
|
+
category: 'server_shadowing',
|
|
465
|
+
baseSeverity: 'high',
|
|
466
|
+
description: 'MCP server URL derived from user input. Attackers could point to malicious servers.',
|
|
467
|
+
suggestedFix: 'Use hardcoded server URLs or validate against a strict allowlist.',
|
|
468
|
+
},
|
|
469
|
+
// Dynamic server registration from config
|
|
470
|
+
{
|
|
471
|
+
name: 'Dynamic MCP server registration',
|
|
472
|
+
pattern: /(?:for|forEach)\s*\([^)]*\)\s*(?:=>|\{)\s*[^}]*(?:register|connect|add)(?:Server|MCP)/gi,
|
|
473
|
+
category: 'server_shadowing',
|
|
474
|
+
baseSeverity: 'medium',
|
|
475
|
+
description: 'MCP servers registered dynamically from configuration. Tool shadowing risk.',
|
|
476
|
+
suggestedFix: 'Register servers explicitly. Implement tool name conflict detection.',
|
|
477
|
+
},
|
|
478
|
+
// Server list from JSON parse
|
|
479
|
+
{
|
|
480
|
+
name: 'MCP servers from parsed JSON',
|
|
481
|
+
pattern: /servers\s*=\s*JSON\.parse\s*\(\s*(?:req\.|user|input|localStorage|sessionStorage)/gi,
|
|
482
|
+
category: 'server_shadowing',
|
|
483
|
+
baseSeverity: 'high',
|
|
484
|
+
description: 'MCP server list parsed from user-controlled data. Could inject malicious servers.',
|
|
485
|
+
suggestedFix: 'Define servers in code. If dynamic loading is needed, validate against an allowlist.',
|
|
486
|
+
},
|
|
487
|
+
// Server config override
|
|
488
|
+
{
|
|
489
|
+
name: 'MCP server config override pattern',
|
|
490
|
+
pattern: /Object\.assign\s*\([^)]*(?:server|mcp)Config[^)]*,\s*(?:req\.|user\.|options\.)/gi,
|
|
491
|
+
category: 'server_shadowing',
|
|
492
|
+
baseSeverity: 'medium',
|
|
493
|
+
description: 'MCP server configuration being overridden with user-provided values.',
|
|
494
|
+
suggestedFix: 'Validate and sanitize configuration overrides. Use allowlist for permitted settings.',
|
|
495
|
+
},
|
|
496
|
+
];
|
|
497
|
+
/**
|
|
498
|
+
* Phase 5 Task 5: MCP Schema Validation Patterns
|
|
499
|
+
* Detect MCP tools that use arguments without schema validation
|
|
500
|
+
*/
|
|
501
|
+
const SCHEMA_VALIDATION_PATTERNS = [
|
|
502
|
+
// MCP tool using args directly without validation (JS)
|
|
503
|
+
{
|
|
504
|
+
name: 'MCP tool without input validation',
|
|
505
|
+
pattern: /server\.tool\s*\([^)]+,\s*async\s*\(\s*(?:args|params|input)\s*\)\s*(?:=>|:)[^{]*\{(?![\s\S]{0,100}(?:schema\.parse|safeParse|validate|zod|yup|joi|superstruct|ajv|\.parse\())/gi,
|
|
506
|
+
category: 'schema_bypass',
|
|
507
|
+
baseSeverity: 'medium',
|
|
508
|
+
description: 'MCP tool uses arguments directly without schema validation. Malformed or malicious input could cause unexpected behavior.',
|
|
509
|
+
suggestedFix: 'Validate inputs with a schema: const validated = schema.parse(args); return runCommand(validated.command)',
|
|
510
|
+
},
|
|
511
|
+
// MCP tool accessing args properties without validation
|
|
512
|
+
{
|
|
513
|
+
name: 'MCP tool args used without validation',
|
|
514
|
+
pattern: /server\.tool\s*\([^)]+,\s*async\s*\(\s*(?:args|params)\s*\)[^{]*\{[^}]*(?:args|params)\.(?:command|query|path|url|file|data|input|content|sql|script|code)(?![\s\S]{0,50}(?:validated|parsed|sanitized))/gi,
|
|
515
|
+
category: 'schema_bypass',
|
|
516
|
+
baseSeverity: 'high',
|
|
517
|
+
description: 'MCP tool uses potentially dangerous argument properties directly. Input validation required.',
|
|
518
|
+
suggestedFix: 'Validate dangerous inputs: const { command } = commandSchema.parse(args)',
|
|
519
|
+
},
|
|
520
|
+
// Python MCP tool without type/validation
|
|
521
|
+
{
|
|
522
|
+
name: 'Python MCP tool without validation',
|
|
523
|
+
pattern: /@server\.tool[^)]*\)\s*(?:async\s+)?def\s+\w+\s*\(\s*(?:args|params|kwargs|\*\*)\s*(?::\s*dict)?\s*\)(?![\s\S]{0,50}(?:pydantic|validate|TypedDict|dataclass))/gi,
|
|
524
|
+
category: 'schema_bypass',
|
|
525
|
+
baseSeverity: 'medium',
|
|
526
|
+
description: 'Python MCP tool accepts dict/kwargs without type validation. Use Pydantic or TypedDict.',
|
|
527
|
+
suggestedFix: 'Use Pydantic model: def tool_name(args: MyInputModel) or validate with TypedDict',
|
|
528
|
+
},
|
|
529
|
+
// Args spread into function call
|
|
530
|
+
{
|
|
531
|
+
name: 'MCP tool args spread into call',
|
|
532
|
+
pattern: /(?:runCommand|exec|spawn|query|execute|fetch)\s*\(\s*\.\.\.(?:args|params|input)/gi,
|
|
533
|
+
category: 'schema_bypass',
|
|
534
|
+
baseSeverity: 'high',
|
|
535
|
+
description: 'MCP tool arguments spread directly into function call. All fields pass through unvalidated.',
|
|
536
|
+
suggestedFix: 'Validate and destructure specific fields: const { field1, field2 } = schema.parse(args); fn(field1, field2)',
|
|
537
|
+
},
|
|
538
|
+
// Dynamic property access on args
|
|
539
|
+
{
|
|
540
|
+
name: 'Dynamic property access on MCP args',
|
|
541
|
+
pattern: /(?:args|params|input)\s*\[\s*(?:key|prop|field|name)\s*\]/gi,
|
|
542
|
+
category: 'schema_bypass',
|
|
543
|
+
baseSeverity: 'medium',
|
|
544
|
+
description: 'Dynamic property access on MCP tool arguments. Could access unintended properties.',
|
|
545
|
+
suggestedFix: 'Use explicit destructuring with validation: const { expectedField } = schema.parse(args)',
|
|
546
|
+
},
|
|
547
|
+
];
|
|
548
|
+
/**
|
|
549
|
+
* Phase 6 Task 3: MCP Tool Result Injection Patterns
|
|
550
|
+
* Detect MCP tool results directly interpolated into prompts without sanitization
|
|
551
|
+
*/
|
|
552
|
+
const RESULT_INJECTION_PATTERNS = [
|
|
553
|
+
// MCP result interpolated into prompt template literal
|
|
554
|
+
{
|
|
555
|
+
name: 'MCP result in prompt template',
|
|
556
|
+
pattern: /`[^`]*\$\{[^}]*(?:tool|mcp|result|toolResult|mcpResult)[^}]*\}[^`]*`\s*(?:\+\s*)?(?:system|prompt|message|instruction)/gi,
|
|
557
|
+
category: 'tool_poisoning',
|
|
558
|
+
baseSeverity: 'high',
|
|
559
|
+
description: 'MCP tool results interpolated into prompts could contain injection payloads from external sources.',
|
|
560
|
+
suggestedFix: 'Sanitize MCP tool results before including in prompts. Use structured data extraction: const safeData = extractSafeFields(toolResult)',
|
|
561
|
+
},
|
|
562
|
+
// Tool result concatenated with system prompt
|
|
563
|
+
{
|
|
564
|
+
name: 'Tool result concatenated with prompt',
|
|
565
|
+
pattern: /(?:systemPrompt|prompt|message|instruction)\s*(?:\+|\.concat)\s*(?:toolResult|mcpResult|result|tool\.result|mcp\.result)/gi,
|
|
566
|
+
category: 'tool_poisoning',
|
|
567
|
+
baseSeverity: 'high',
|
|
568
|
+
description: 'Tool results concatenated with prompts. External content in results could manipulate model behavior.',
|
|
569
|
+
suggestedFix: 'Sanitize tool results before concatenation. Consider using delimiters: prompt + "\\n---DATA---\\n" + sanitize(result)',
|
|
570
|
+
},
|
|
571
|
+
// Tool result in messages array
|
|
572
|
+
{
|
|
573
|
+
name: 'Raw tool result in messages',
|
|
574
|
+
pattern: /messages\s*(?:\.push|:\s*\[)[^;]*content\s*:\s*(?:toolResult|mcpResult|result|tool\.result)(?!\.sanitized|\.safe)/gi,
|
|
575
|
+
category: 'tool_poisoning',
|
|
576
|
+
baseSeverity: 'medium',
|
|
577
|
+
description: 'Raw tool results added to message content. Results from external tools could contain injection payloads.',
|
|
578
|
+
suggestedFix: 'Sanitize or structure tool results: messages.push({ content: sanitizeForPrompt(toolResult) })',
|
|
579
|
+
},
|
|
580
|
+
// Tool result used as context without processing
|
|
581
|
+
{
|
|
582
|
+
name: 'Tool result as unprocessed context',
|
|
583
|
+
pattern: /context\s*[:=]\s*(?:toolResult|mcpResult|result|tool\.(?:output|result))(?!\s*\.|\.sanitize|\.filter)/gi,
|
|
584
|
+
category: 'tool_poisoning',
|
|
585
|
+
baseSeverity: 'medium',
|
|
586
|
+
description: 'Tool result assigned directly as context. External content should be processed before use.',
|
|
587
|
+
suggestedFix: 'Process and validate tool results: const context = processToolResult(result)',
|
|
588
|
+
},
|
|
589
|
+
// Spread tool result into prompt data
|
|
590
|
+
{
|
|
591
|
+
name: 'Tool result spread into prompt',
|
|
592
|
+
pattern: /\{[^}]*\.\.\.(?:toolResult|mcpResult|result|tool\.result)[^}]*\}\s*(?:as|:|\s+(?:prompt|message|context))/gi,
|
|
593
|
+
category: 'tool_poisoning',
|
|
594
|
+
baseSeverity: 'high',
|
|
595
|
+
description: 'Tool result spread into prompt data. All fields from external tool pass through.',
|
|
596
|
+
suggestedFix: 'Extract specific fields: const { safeField1, safeField2 } = validateToolResult(result)',
|
|
597
|
+
},
|
|
598
|
+
// JSON stringify tool result into prompt
|
|
599
|
+
{
|
|
600
|
+
name: 'JSON stringified tool result in prompt',
|
|
601
|
+
pattern: /JSON\.stringify\s*\(\s*(?:toolResult|mcpResult|result|tool\.result)\s*\)[^;]*(?:prompt|message|context|instruction)/gi,
|
|
602
|
+
category: 'tool_poisoning',
|
|
603
|
+
baseSeverity: 'medium',
|
|
604
|
+
description: 'Tool result JSON-stringified into prompt. Serialized content could contain injection payloads.',
|
|
605
|
+
suggestedFix: 'Filter tool result before stringification: JSON.stringify(filterSafeFields(result))',
|
|
606
|
+
},
|
|
607
|
+
// Format tool result for LLM
|
|
608
|
+
{
|
|
609
|
+
name: 'Unvalidated tool result formatting',
|
|
610
|
+
pattern: /format(?:Tool|Result|Output)?\s*\(\s*(?:toolResult|mcpResult|result|tool\.result)\s*\)(?![\s\S]{0,30}(?:sanitize|validate|filter))/gi,
|
|
611
|
+
category: 'tool_poisoning',
|
|
612
|
+
baseSeverity: 'medium',
|
|
613
|
+
description: 'Tool result formatted without validation. Formatting function should include sanitization.',
|
|
614
|
+
suggestedFix: 'Include sanitization in formatting: formatToolResult(sanitize(result))',
|
|
615
|
+
},
|
|
616
|
+
];
|
|
617
|
+
/**
|
|
618
|
+
* Phase 5 Task 6: Human-in-the-Loop for Destructive Operations
|
|
619
|
+
* Detect destructive operations without confirmation mechanism
|
|
620
|
+
*/
|
|
621
|
+
const DESTRUCTIVE_OPS_PATTERNS = [
|
|
622
|
+
// File deletion without confirmation
|
|
623
|
+
{
|
|
624
|
+
name: 'MCP file deletion without confirmation',
|
|
625
|
+
pattern: /server\.tool\s*\([^)]+(?:delete|remove|unlink|rm)[^)]+,\s*async[^{]*\{(?![\s\S]{0,100}(?:confirm|approved|needsConfirmation|requireApproval|humanInLoop))[^}]*(?:fs\.rm|fs\.unlink|unlinkSync|rmSync|remove|rimraf)/gi,
|
|
626
|
+
category: 'missing_hitl',
|
|
627
|
+
baseSeverity: 'high',
|
|
628
|
+
description: 'MCP tool performs file deletion without confirmation mechanism. Destructive operations should require human approval.',
|
|
629
|
+
suggestedFix: 'Add confirmation: if (!args.confirmed) { return { needsConfirmation: true, action: "delete", path: args.path } }',
|
|
630
|
+
},
|
|
631
|
+
// Database deletion without confirmation
|
|
632
|
+
{
|
|
633
|
+
name: 'MCP database deletion without confirmation',
|
|
634
|
+
pattern: /server\.tool\s*\([^)]+(?:delete|drop|truncate|remove)[^)]+,\s*async[^{]*\{(?![\s\S]{0,100}(?:confirm|approved|needsConfirmation))[^}]*(?:\.delete|\.drop|\.truncate|\.destroy|DELETE\s+FROM|DROP\s+TABLE)/gi,
|
|
635
|
+
category: 'missing_hitl',
|
|
636
|
+
baseSeverity: 'high',
|
|
637
|
+
description: 'MCP tool performs database deletion without confirmation. Data loss risk.',
|
|
638
|
+
suggestedFix: 'Require confirmation for destructive DB operations: if (!args.confirmed) return { needsConfirmation: true }',
|
|
639
|
+
},
|
|
640
|
+
// Recursive directory deletion
|
|
641
|
+
{
|
|
642
|
+
name: 'MCP recursive deletion without confirmation',
|
|
643
|
+
pattern: /(?:fs\.rm|rimraf|rmdir)\s*\([^)]*,\s*\{\s*recursive\s*:\s*true/gi,
|
|
644
|
+
category: 'missing_hitl',
|
|
645
|
+
baseSeverity: 'critical',
|
|
646
|
+
description: 'Recursive directory deletion in MCP tool. High risk of unintended data loss.',
|
|
647
|
+
suggestedFix: 'Add explicit confirmation with path display: if (!args.confirmed) return { needsConfirmation: true, message: `Delete ${path} and all contents?` }',
|
|
648
|
+
},
|
|
649
|
+
// Shell command execution without confirmation
|
|
650
|
+
{
|
|
651
|
+
name: 'MCP shell execution without confirmation',
|
|
652
|
+
pattern: /server\.tool\s*\([^)]+(?:exec|run|shell|command)[^)]+,\s*async[^{]*\{(?![\s\S]{0,100}(?:confirm|approved|needsConfirmation))[^}]*(?:exec|spawn|execSync|spawnSync)\s*\(/gi,
|
|
653
|
+
category: 'missing_hitl',
|
|
654
|
+
baseSeverity: 'high',
|
|
655
|
+
description: 'MCP tool executes shell commands without confirmation. Dangerous commands could be executed.',
|
|
656
|
+
suggestedFix: 'Require confirmation for shell commands: if (!args.confirmed) return { needsConfirmation: true, command: args.command }',
|
|
657
|
+
},
|
|
658
|
+
// Send/publish operations without confirmation
|
|
659
|
+
{
|
|
660
|
+
name: 'MCP send operation without confirmation',
|
|
661
|
+
pattern: /server\.tool\s*\([^)]+(?:send|publish|broadcast|notify)[^)]+,\s*async[^{]*\{(?![\s\S]{0,100}(?:confirm|approved|draft))[^}]*(?:\.send|\.publish|sendEmail|sendMessage)/gi,
|
|
662
|
+
category: 'missing_hitl',
|
|
663
|
+
baseSeverity: 'medium',
|
|
664
|
+
description: 'MCP tool sends messages/emails without confirmation. Could send unintended communications.',
|
|
665
|
+
suggestedFix: 'Add draft/confirmation: if (!args.confirmed) return { needsConfirmation: true, preview: messageContent }',
|
|
666
|
+
},
|
|
667
|
+
// Payment/transaction operations
|
|
668
|
+
{
|
|
669
|
+
name: 'MCP payment without confirmation',
|
|
670
|
+
pattern: /server\.tool\s*\([^)]+(?:pay|charge|transfer|transaction)[^)]+,\s*async[^{]*\{(?![\s\S]{0,100}(?:confirm|approved|needsConfirmation))/gi,
|
|
671
|
+
category: 'missing_hitl',
|
|
672
|
+
baseSeverity: 'critical',
|
|
673
|
+
description: 'MCP tool processes payments without confirmation. Financial operations require human approval.',
|
|
674
|
+
suggestedFix: 'Always require confirmation for financial operations: if (!args.confirmed) return { needsConfirmation: true, amount, recipient }',
|
|
675
|
+
},
|
|
676
|
+
// API key/secret deletion
|
|
677
|
+
{
|
|
678
|
+
name: 'MCP credential deletion without confirmation',
|
|
679
|
+
pattern: /server\.tool\s*\([^)]+(?:delete|revoke|remove)[^)]*(?:key|token|secret|credential)[^)]+,\s*async[^{]*\{(?![\s\S]{0,100}(?:confirm|approved))/gi,
|
|
680
|
+
category: 'missing_hitl',
|
|
681
|
+
baseSeverity: 'high',
|
|
682
|
+
description: 'MCP tool deletes credentials without confirmation. Could cause service disruption.',
|
|
683
|
+
suggestedFix: 'Require explicit confirmation: if (!args.confirmed) return { needsConfirmation: true, warning: "This will revoke access" }',
|
|
684
|
+
},
|
|
685
|
+
];
|
|
686
|
+
// ============================================================================
|
|
687
|
+
// Main Detection Function
|
|
688
|
+
// ============================================================================
|
|
689
|
+
/**
|
|
690
|
+
* Map internal category to vulnerability category
|
|
691
|
+
*/
|
|
692
|
+
function mapCategory(internal) {
|
|
693
|
+
switch (internal) {
|
|
694
|
+
case 'tool_poisoning':
|
|
695
|
+
return 'ai_mcp_tool_poisoning';
|
|
696
|
+
case 'credential_issue':
|
|
697
|
+
return 'ai_mcp_credential_issue';
|
|
698
|
+
case 'confused_deputy':
|
|
699
|
+
return 'ai_mcp_confused_deputy';
|
|
700
|
+
case 'description_injection':
|
|
701
|
+
return 'ai_mcp_description_injection';
|
|
702
|
+
case 'server_shadowing':
|
|
703
|
+
return 'ai_mcp_server_shadowing';
|
|
704
|
+
case 'schema_bypass':
|
|
705
|
+
return 'ai_mcp_tool_poisoning'; // Schema bypass leads to tool poisoning risks
|
|
706
|
+
case 'missing_hitl':
|
|
707
|
+
return 'ai_excessive_agency'; // Missing human-in-the-loop is excessive agency
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
/**
|
|
711
|
+
* Main detection function for MCP security issues
|
|
712
|
+
*/
|
|
713
|
+
function detectMCPSecurity(content, filePath, options) {
|
|
714
|
+
const vulnerabilities = [];
|
|
715
|
+
// Skip non-applicable files
|
|
716
|
+
if ((0, file_classifier_1.isScannerOrFixtureFile)(filePath))
|
|
717
|
+
return vulnerabilities;
|
|
718
|
+
if ((0, file_classifier_1.isDocumentationFile)(filePath))
|
|
719
|
+
return vulnerabilities;
|
|
720
|
+
// Only scan MCP-related files
|
|
721
|
+
if (!isMCPFile(content, filePath)) {
|
|
722
|
+
return vulnerabilities;
|
|
723
|
+
}
|
|
724
|
+
const lines = options?.parsed?.lines ?? content.split('\n');
|
|
725
|
+
const isTestFile = (0, file_classifier_1.isTestOrMockFile)(filePath);
|
|
726
|
+
const isExample = (0, file_classifier_1.isExampleDirectory)(filePath);
|
|
727
|
+
const isLibrary = (0, file_classifier_1.isLibraryCode)(filePath);
|
|
728
|
+
// Process all pattern categories
|
|
729
|
+
const allPatterns = [
|
|
730
|
+
...TOOL_POISONING_PATTERNS,
|
|
731
|
+
...CREDENTIAL_PATTERNS,
|
|
732
|
+
...CONFUSED_DEPUTY_PATTERNS,
|
|
733
|
+
...DESCRIPTION_INJECTION_PATTERNS,
|
|
734
|
+
...SERVER_SHADOWING_PATTERNS,
|
|
735
|
+
// Phase 5: New detection patterns
|
|
736
|
+
...SCHEMA_VALIDATION_PATTERNS,
|
|
737
|
+
...DESTRUCTIVE_OPS_PATTERNS,
|
|
738
|
+
// Phase 6: MCP result injection
|
|
739
|
+
...RESULT_INJECTION_PATTERNS,
|
|
740
|
+
];
|
|
741
|
+
// Track findings to avoid duplicates
|
|
742
|
+
const seenFindings = new Set();
|
|
743
|
+
for (const pattern of allPatterns) {
|
|
744
|
+
const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags);
|
|
745
|
+
let match;
|
|
746
|
+
while ((match = regex.exec(content)) !== null) {
|
|
747
|
+
const lineNumber = content.substring(0, match.index).split('\n').length;
|
|
748
|
+
const lineContent = lines[lineNumber - 1]?.trim() || '';
|
|
749
|
+
// Skip comments
|
|
750
|
+
if ((0, file_classifier_1.isComment)(lineContent))
|
|
751
|
+
continue;
|
|
752
|
+
// Create dedup key
|
|
753
|
+
const dedupKey = `${filePath}:${lineNumber}:${pattern.category}`;
|
|
754
|
+
if (seenFindings.has(dedupKey))
|
|
755
|
+
continue;
|
|
756
|
+
seenFindings.add(dedupKey);
|
|
757
|
+
// Get surrounding context for analysis
|
|
758
|
+
const context = getSurroundingContext(content, lineNumber - 1, 30);
|
|
759
|
+
// Calculate severity based on context
|
|
760
|
+
let severity = pattern.baseSeverity;
|
|
761
|
+
let description = pattern.description;
|
|
762
|
+
const notes = [];
|
|
763
|
+
// Apply context-aware severity adjustments
|
|
764
|
+
if (pattern.category === 'tool_poisoning') {
|
|
765
|
+
// Check for content sanitization
|
|
766
|
+
if (hasContentSanitization(context)) {
|
|
767
|
+
severity = 'info';
|
|
768
|
+
notes.push('Content sanitization detected');
|
|
769
|
+
}
|
|
770
|
+
// Check for safe data source
|
|
771
|
+
else if (isSafeDataSource(context)) {
|
|
772
|
+
severity = 'info';
|
|
773
|
+
notes.push('Safe/static data source detected');
|
|
774
|
+
}
|
|
775
|
+
// Check for user context (their own data)
|
|
776
|
+
else if (hasUserContext(context)) {
|
|
777
|
+
// Has user context - might be returning user's own data
|
|
778
|
+
if (severity === 'high')
|
|
779
|
+
severity = 'medium';
|
|
780
|
+
notes.push('User context present - may be returning user\'s own data');
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
if (pattern.category === 'confused_deputy') {
|
|
784
|
+
// Check for user context
|
|
785
|
+
if (hasUserContext(context)) {
|
|
786
|
+
// User context present - check for auth
|
|
787
|
+
if (hasAuthorizationCheck(context)) {
|
|
788
|
+
severity = 'info';
|
|
789
|
+
notes.push('Authorization check detected');
|
|
790
|
+
}
|
|
791
|
+
else {
|
|
792
|
+
// Has user but no auth check - lower severity
|
|
793
|
+
if (severity === 'high')
|
|
794
|
+
severity = 'medium';
|
|
795
|
+
if (severity === 'critical')
|
|
796
|
+
severity = 'high';
|
|
797
|
+
notes.push('User context present but no authorization check');
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
// Credential issues are always serious, but check context
|
|
802
|
+
if (pattern.category === 'credential_issue') {
|
|
803
|
+
// Check if it's returning the credential
|
|
804
|
+
if (pattern.name.includes('response') || pattern.name.includes('return')) {
|
|
805
|
+
// Returning credentials is always critical/high
|
|
806
|
+
}
|
|
807
|
+
else if (hasUserContext(context)) {
|
|
808
|
+
// Parameter with user context - still bad but slightly less severe
|
|
809
|
+
if (severity === 'high')
|
|
810
|
+
severity = 'medium';
|
|
811
|
+
notes.push('User context present but credentials still in parameters');
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
// Description injection - check for input sanitization
|
|
815
|
+
if (pattern.category === 'description_injection') {
|
|
816
|
+
// Check for sanitization or validation before description
|
|
817
|
+
if (/sanitize|validate|escape|filter|strip/i.test(context)) {
|
|
818
|
+
severity = 'low';
|
|
819
|
+
notes.push('Input sanitization detected nearby');
|
|
820
|
+
}
|
|
821
|
+
// Check for static/constant descriptions
|
|
822
|
+
if (/const\s+\w+\s*=\s*["'`][^"'`]+["'`]\s*;?\s*$/m.test(context)) {
|
|
823
|
+
// Likely a constant being used
|
|
824
|
+
severity = 'info';
|
|
825
|
+
notes.push('May be using constant description');
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
// Server shadowing - check for allowlist validation
|
|
829
|
+
if (pattern.category === 'server_shadowing') {
|
|
830
|
+
// Check for allowlist/whitelist validation
|
|
831
|
+
if (/allowlist|whitelist|ALLOWED_SERVERS|validServers|trustedServers/i.test(context)) {
|
|
832
|
+
severity = 'info';
|
|
833
|
+
notes.push('Server allowlist detected');
|
|
834
|
+
}
|
|
835
|
+
// Check for URL validation
|
|
836
|
+
if (/validate.*url|url.*validate|isValidUrl|checkUrl/i.test(context)) {
|
|
837
|
+
severity = 'low';
|
|
838
|
+
notes.push('URL validation detected');
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
// Downgrade test files
|
|
842
|
+
if (isTestFile) {
|
|
843
|
+
severity = 'info';
|
|
844
|
+
notes.push('in test file');
|
|
845
|
+
}
|
|
846
|
+
// Downgrade example/demo directories
|
|
847
|
+
if (isExample && severity !== 'info') {
|
|
848
|
+
severity = 'info';
|
|
849
|
+
notes.push('in example/demo directory');
|
|
850
|
+
}
|
|
851
|
+
// Downgrade library code
|
|
852
|
+
if (isLibrary && severity !== 'info') {
|
|
853
|
+
severity = 'info';
|
|
854
|
+
notes.push('library code');
|
|
855
|
+
}
|
|
856
|
+
// Build final description
|
|
857
|
+
if (notes.length > 0) {
|
|
858
|
+
description += ` (${notes.join('; ')})`;
|
|
859
|
+
}
|
|
860
|
+
vulnerabilities.push({
|
|
861
|
+
id: `ai-mcp-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
|
|
862
|
+
filePath,
|
|
863
|
+
lineNumber,
|
|
864
|
+
lineContent,
|
|
865
|
+
severity,
|
|
866
|
+
category: mapCategory(pattern.category),
|
|
867
|
+
title: pattern.name,
|
|
868
|
+
description,
|
|
869
|
+
suggestedFix: pattern.suggestedFix,
|
|
870
|
+
confidence: severity === 'info' ? 'low' : 'medium',
|
|
871
|
+
layer: 2,
|
|
872
|
+
source: 'ai_code',
|
|
873
|
+
requiresAIValidation: severity !== 'info' && severity !== 'low',
|
|
874
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
875
|
+
});
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
return vulnerabilities;
|
|
879
|
+
}
|
|
880
|
+
//# sourceMappingURL=mcp-security.js.map
|