@oculum/scanner 1.0.12 → 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/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/index.d.ts +17 -64
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -1034
- package/dist/index.js.map +1 -1
- package/dist/layer2/framework-checks.d.ts.map +1 -1
- package/dist/layer2/framework-checks.js +1 -8
- package/dist/layer2/framework-checks.js.map +1 -1
- package/dist/layer2/index.d.ts +4 -0
- package/dist/layer2/index.d.ts.map +1 -1
- package/dist/layer2/index.js +50 -1
- 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/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/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/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/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 +2 -2
- package/dist/tiers.d.ts.map +1 -1
- package/dist/tiers.js +10 -0
- package/dist/tiers.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- 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 +15 -0
- package/src/__tests__/benchmark/fixtures/layer2/log-injection.ts +147 -0
- package/src/__tests__/benchmark/fixtures/layer2/security-headers.ts +197 -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 +3 -3
- 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 +2 -2
- 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 +312 -4
- 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 +37 -49
- package/src/__tests__/snapshots/__snapshots__/dangerous-functions-refactor.test.ts.snap +52 -0
- package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +3 -3
- package/src/__tests__/snapshots/anthropic-validation-refactor.test.ts +2 -2
- 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/{layer2/ai-agent-tools.ts → detect/ai-code/agent-tools.ts} +23 -3
- package/src/{layer2 → detect/ai-code}/byok-patterns.ts +17 -5
- package/src/{layer2/ai-endpoint-protection.ts → detect/ai-code/endpoint-protection.ts} +8 -4
- package/src/{layer2/ai-execution-sinks.ts → detect/ai-code/execution-sinks.ts} +8 -4
- package/src/{layer2/ai-fingerprinting.ts → detect/ai-code/fingerprinting.ts} +20 -4
- package/src/detect/ai-code/index.ts +11 -0
- package/src/{layer2/ai-mcp-security.ts → detect/ai-code/mcp-security.ts} +7 -3
- package/src/{layer2 → detect/ai-code}/model-supply-chain.ts +7 -3
- package/src/{layer2/ai-package-hallucination.ts → detect/ai-code/package-hallucination.ts} +18 -3
- package/src/{layer2/ai-prompt-hygiene.ts → detect/ai-code/prompt-hygiene.ts} +25 -3
- package/src/{layer2/ai-rag-safety.ts → detect/ai-code/rag-safety.ts} +7 -3
- package/src/{layer2/ai-schema-validation.ts → detect/ai-code/schema-validation.ts} +7 -3
- package/src/detect/config/agent-skill-injection.ts +551 -0
- package/src/{layer1 → detect/config}/comments.ts +6 -2
- package/src/{layer1 → detect/config}/file-flags.ts +9 -3
- 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 +12 -5
- package/src/detect/index.ts +131 -0
- package/src/{layer1 → detect/secrets}/config-audit.ts +7 -2
- package/src/{layer1 → detect/secrets}/config-mcp-audit.ts +8 -3
- package/src/{layer1 → detect/secrets}/entropy.ts +23 -11
- package/src/{layer1 → detect/secrets}/index.ts +31 -30
- package/src/{layer1 → detect/secrets}/patterns.ts +10 -3
- package/src/{layer1 → detect/secrets}/weak-crypto.ts +7 -2
- package/src/{layer2/auth-antipatterns.ts → detect/structural/auth-patterns.ts} +23 -11
- package/src/{layer2 → detect/structural}/dangerous-functions/dom-xss.ts +1 -1
- package/src/{layer2 → detect/structural}/dangerous-functions/index.ts +47 -24
- package/src/{layer2 → detect/structural}/dangerous-functions/json-parse.ts +10 -2
- package/src/{layer2 → detect/structural}/dangerous-functions/math-random.ts +2 -2
- package/src/{layer2 → detect/structural}/dangerous-functions/patterns.ts +1 -1
- package/src/{layer2 → detect/structural}/dangerous-functions/request-validation.ts +10 -2
- package/src/{layer2 → detect/structural}/dangerous-functions/utils/control-flow.ts +2 -2
- package/src/{layer2 → detect/structural}/data-exposure.ts +11 -3
- package/src/{layer2 → detect/structural}/framework-checks.ts +10 -11
- package/src/{layer2 → detect/structural}/index.ts +80 -77
- package/src/detect/structural/log-injection.ts +254 -0
- package/src/{layer2 → detect/structural}/logic-gates.ts +13 -5
- package/src/{layer2 → detect/structural}/risky-imports.ts +7 -3
- 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 +7 -3
- package/src/detect/structural/xxe-detection.ts +295 -0
- package/src/index.ts +39 -1291
- 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/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} +54 -0
- 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 +5 -5
- package/src/postprocess/aggregation.ts +74 -0
- package/src/postprocess/contradictions.ts +128 -0
- package/src/postprocess/dedup.ts +62 -0
- package/src/{filtering → postprocess/filtering}/__tests__/pipeline.test.ts +1 -1
- package/src/{filtering → postprocess/filtering}/context-adjustments.ts +2 -2
- package/src/{filtering → postprocess/filtering}/pipeline.ts +2 -2
- 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/{formatters → report/formatters}/ai-context.ts +1 -1
- package/src/{formatters → report/formatters}/cli-terminal.ts +11 -11
- package/src/{formatters → report/formatters}/github-comment.ts +1 -1
- package/src/{formatters → report/formatters}/grouping.ts +8 -8
- package/src/{formatters → report/formatters}/ide/claude-code.ts +1 -1
- package/src/{formatters → report/formatters}/ide/cursor.ts +1 -1
- package/src/{formatters → report/formatters}/ide/windsurf.ts +1 -1
- 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 +15 -14
- package/src/score/confidence.ts +66 -0
- package/src/score/index.ts +316 -0
- package/src/score/types.ts +187 -0
- package/src/{baseline → shared/baseline}/__tests__/diff.test.ts +2 -2
- package/src/{baseline → shared/baseline}/diff.ts +1 -1
- package/src/{baseline → shared/baseline}/manager.ts +1 -1
- package/src/{category-filter.ts → shared/category-filter.ts} +1 -1
- package/src/{utils → shared}/code-analysis.ts +1 -1
- 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/{types.ts → shared/types.ts} +22 -5
- package/src/tiers.ts +18 -1
- 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/{layer2 → detect/structural}/dangerous-functions/utils/schema-validation.ts +0 -0
- /package/src/{utils → model}/route-hierarchy.ts +0 -0
- /package/src/{filtering → postprocess/filtering}/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/{formatters → report/formatters}/__tests__/ai-context.test.ts +0 -0
- /package/src/{formatters → report/formatters}/ide/__tests__/ide.test.ts +0 -0
- /package/src/{formatters → report/formatters}/ide/index.ts +0 -0
- /package/src/{formatters → report/formatters}/index.ts +0 -0
- /package/src/{utils → shared}/__tests__/code-analysis.test.ts +0 -0
- /package/src/{utils → shared}/__tests__/parsed-file.test.ts +0 -0
- /package/src/{ai-context → shared/ai-context}/__tests__/manager.test.ts +0 -0
- /package/src/{ai-context → shared/ai-context}/index.ts +0 -0
- /package/src/{ai-context → shared/ai-context}/manager.ts +0 -0
- /package/src/{baseline → shared/baseline}/__tests__/manager.test.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}/comment-analyzer.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}/environment-context.ts +0 -0
- /package/src/{utils → shared}/intent-detector.ts +0 -0
- /package/src/{utils → shared}/parsed-file.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/{utils → shared}/schema-semantics.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,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confidence Scoring System
|
|
3
|
+
*
|
|
4
|
+
* Entry point for the confidence scoring system. Provides:
|
|
5
|
+
* - scoreFindings() — score a batch of findings
|
|
6
|
+
* - buildConfidenceLog() — structured logging for debugging/tuning
|
|
7
|
+
* - buildAdjustmentContext() — build context for adjustment rules
|
|
8
|
+
* - DEPTH_CONFIGS — threshold configs for each scan depth
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { Vulnerability, ScanDepth } from '../shared/types'
|
|
12
|
+
import type {
|
|
13
|
+
ScoredFinding,
|
|
14
|
+
ConfidenceLog,
|
|
15
|
+
AdjustmentContext,
|
|
16
|
+
DepthConfig,
|
|
17
|
+
} from './types'
|
|
18
|
+
import type { ContextEngineResult } from '../model/taint-types'
|
|
19
|
+
import type { CrossFileTaintPath } from '../model/cross-file-taint'
|
|
20
|
+
import { findClosestRoute } from '../model/route-discovery/utils'
|
|
21
|
+
import { computeConfidence } from './confidence'
|
|
22
|
+
import { ALL_ADJUSTMENT_RULES } from './adjustments'
|
|
23
|
+
import {
|
|
24
|
+
isTestOrMockFile,
|
|
25
|
+
isExampleFile,
|
|
26
|
+
isScannerOrFixtureFile,
|
|
27
|
+
isToolingDirectory,
|
|
28
|
+
isServerOnlyFile,
|
|
29
|
+
isClientBundledFile,
|
|
30
|
+
} from '../parse/file-classifier'
|
|
31
|
+
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// Depth Configurations
|
|
34
|
+
// ============================================================================
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Score thresholds per scan depth.
|
|
38
|
+
*
|
|
39
|
+
* - local: Only high-confidence findings surface. No AI.
|
|
40
|
+
* - verified: High-confidence surface directly; medium goes to AI.
|
|
41
|
+
* - deep: High-confidence surface; nearly everything goes to AI.
|
|
42
|
+
*/
|
|
43
|
+
export const DEPTH_CONFIGS: Record<ScanDepth, DepthConfig> = {
|
|
44
|
+
local: {
|
|
45
|
+
surfaceThreshold: 0.70,
|
|
46
|
+
validateThreshold: 1.0, // Effectively no validation (nothing reaches 1.0)
|
|
47
|
+
aiEnabled: false,
|
|
48
|
+
},
|
|
49
|
+
verified: {
|
|
50
|
+
surfaceThreshold: 0.70,
|
|
51
|
+
validateThreshold: 0.20,
|
|
52
|
+
aiEnabled: true,
|
|
53
|
+
},
|
|
54
|
+
deep: {
|
|
55
|
+
surfaceThreshold: 0.70,
|
|
56
|
+
validateThreshold: 0.10,
|
|
57
|
+
aiEnabled: true,
|
|
58
|
+
},
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// Context Builder
|
|
63
|
+
// ============================================================================
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Build adjustment context for a finding from file + project info.
|
|
67
|
+
*/
|
|
68
|
+
export function buildAdjustmentContext(
|
|
69
|
+
finding: Vulnerability,
|
|
70
|
+
ceResult: ContextEngineResult
|
|
71
|
+
): AdjustmentContext {
|
|
72
|
+
// Look up taint data for this finding's file
|
|
73
|
+
let taint: AdjustmentContext['taint'] = undefined
|
|
74
|
+
const fileAnalysis = ceResult.fileTaintAnalyses?.get(finding.filePath)
|
|
75
|
+
if (fileAnalysis) {
|
|
76
|
+
// Check if any taint path has a sink at the finding's line number
|
|
77
|
+
const matchingPaths = fileAnalysis.taintPaths.filter(
|
|
78
|
+
tp => tp.sink.line === finding.lineNumber
|
|
79
|
+
)
|
|
80
|
+
if (matchingPaths.length > 0) {
|
|
81
|
+
// Pick the highest-confidence unsanitised path, or any path
|
|
82
|
+
const bestPath = matchingPaths.find(p => !p.sanitised) ?? matchingPaths[0]
|
|
83
|
+
taint = {
|
|
84
|
+
confirmed: true,
|
|
85
|
+
sources: matchingPaths.map(p => p.source.sourceType),
|
|
86
|
+
sinkType: bestPath.sink.sinkType,
|
|
87
|
+
sanitised: bestPath.sanitised,
|
|
88
|
+
confidence: bestPath.confidence,
|
|
89
|
+
}
|
|
90
|
+
} else {
|
|
91
|
+
// Check cross-file taint paths (CE Phase 4) — sink-side match
|
|
92
|
+
const crossFilePaths = findCrossFileTaintMatch(ceResult, finding)
|
|
93
|
+
|
|
94
|
+
if (crossFilePaths.length > 0) {
|
|
95
|
+
const bestPath = crossFilePaths.find(p => !p.sanitised) ?? crossFilePaths[0]
|
|
96
|
+
taint = {
|
|
97
|
+
confirmed: true,
|
|
98
|
+
sources: crossFilePaths.map(p => p.source.sourceType),
|
|
99
|
+
sinkType: bestPath.sink.sinkType,
|
|
100
|
+
sanitised: bestPath.sanitised,
|
|
101
|
+
confidence: bestPath.confidence,
|
|
102
|
+
}
|
|
103
|
+
} else {
|
|
104
|
+
// File has taint analysis but no path to this finding's line
|
|
105
|
+
taint = {
|
|
106
|
+
confirmed: false,
|
|
107
|
+
sources: [],
|
|
108
|
+
sinkType: null,
|
|
109
|
+
sanitised: false,
|
|
110
|
+
confidence: null,
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
} else {
|
|
115
|
+
// No intra-file taint analysis — still check cross-file taint paths (call-site match)
|
|
116
|
+
const crossFilePaths = findCrossFileTaintMatch(ceResult, finding)
|
|
117
|
+
if (crossFilePaths.length > 0) {
|
|
118
|
+
const bestPath = crossFilePaths.find(p => !p.sanitised) ?? crossFilePaths[0]
|
|
119
|
+
taint = {
|
|
120
|
+
confirmed: true,
|
|
121
|
+
sources: crossFilePaths.map(p => p.source.sourceType),
|
|
122
|
+
sinkType: bestPath.sink.sinkType,
|
|
123
|
+
sanitised: bestPath.sanitised,
|
|
124
|
+
confidence: bestPath.confidence,
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Look up route data for this finding's file
|
|
130
|
+
let route: AdjustmentContext['route'] = undefined
|
|
131
|
+
const fileRoutes = ceResult.routeMap?.fileToRoutes.get(finding.filePath)
|
|
132
|
+
if (fileRoutes && fileRoutes.length > 0) {
|
|
133
|
+
// Find the closest route to the finding's line number
|
|
134
|
+
const closestRoute = findClosestRoute(fileRoutes, finding.lineNumber)
|
|
135
|
+
if (closestRoute) {
|
|
136
|
+
route = {
|
|
137
|
+
hasAuth: closestRoute.authMiddleware.length > 0,
|
|
138
|
+
isPublic: closestRoute.isPublic,
|
|
139
|
+
middleware: closestRoute.authMiddleware,
|
|
140
|
+
methods: closestRoute.methods,
|
|
141
|
+
hasRateLimiting: closestRoute.rateLimiting,
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Look up framework analysis for this finding's file
|
|
147
|
+
let framework: AdjustmentContext['framework'] = undefined
|
|
148
|
+
const fileFramework = ceResult.frameworkAnalyses?.get(finding.filePath)
|
|
149
|
+
if (fileFramework) {
|
|
150
|
+
const safeLinePatterns = fileFramework.safeLines.get(finding.lineNumber)
|
|
151
|
+
const unsafeLinePatterns = fileFramework.unsafeLines.get(finding.lineNumber)
|
|
152
|
+
const safeLine = safeLinePatterns?.[0]
|
|
153
|
+
const unsafeLine = unsafeLinePatterns?.[0]
|
|
154
|
+
if (safeLine || unsafeLine) {
|
|
155
|
+
const activeFrameworks: string[] = []
|
|
156
|
+
const pc2 = ceResult.projectContext
|
|
157
|
+
if (pc2.frameworks.primary) activeFrameworks.push(pc2.frameworks.primary)
|
|
158
|
+
if (pc2.frameworks.frontend && !activeFrameworks.includes(pc2.frameworks.frontend)) {
|
|
159
|
+
activeFrameworks.push(pc2.frameworks.frontend)
|
|
160
|
+
}
|
|
161
|
+
framework = {
|
|
162
|
+
safePatternMatch: safeLine ? { id: safeLine.id, reason: safeLine.reason } : null,
|
|
163
|
+
unsafePatternMatch: unsafeLine ? { id: unsafeLine.id, reason: unsafeLine.reason } : null,
|
|
164
|
+
activeFrameworks,
|
|
165
|
+
orm: ceResult.projectContext.dataAccess.orm ?? null,
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const pc = ceResult.projectContext
|
|
171
|
+
return {
|
|
172
|
+
file: {
|
|
173
|
+
isTestFile: isTestOrMockFile(finding.filePath),
|
|
174
|
+
isExampleFile: isExampleFile(finding.filePath),
|
|
175
|
+
isDocFile: /\.(md|mdx|txt|rst)$/i.test(finding.filePath),
|
|
176
|
+
isScannerCode: isScannerOrFixtureFile(finding.filePath),
|
|
177
|
+
isToolingDir: isToolingDirectory(finding.filePath),
|
|
178
|
+
isServerOnly: isServerOnlyFile(finding.filePath),
|
|
179
|
+
isClientBundled: isClientBundledFile(finding.filePath),
|
|
180
|
+
},
|
|
181
|
+
project: {
|
|
182
|
+
hasAuthMiddleware: pc.auth.hasGlobalMiddleware,
|
|
183
|
+
hasTypeScript: pc.frameworks.usesTypeScript,
|
|
184
|
+
orm: pc.dataAccess.orm ?? null,
|
|
185
|
+
validationLib: pc.dataAccess.validationLibrary ?? null,
|
|
186
|
+
},
|
|
187
|
+
lineContent: finding.lineContent,
|
|
188
|
+
filePath: finding.filePath,
|
|
189
|
+
taint,
|
|
190
|
+
route,
|
|
191
|
+
framework,
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Find cross-file taint paths matching a finding — both sink-side and call-site.
|
|
197
|
+
* Mirrors the matching logic in request-builder.ts for AI annotations.
|
|
198
|
+
*/
|
|
199
|
+
function findCrossFileTaintMatch(
|
|
200
|
+
ceResult: ContextEngineResult,
|
|
201
|
+
finding: Vulnerability
|
|
202
|
+
): CrossFileTaintPath[] {
|
|
203
|
+
return ceResult.crossFileTaintPaths?.filter(
|
|
204
|
+
cfp => (cfp.sinkFile === finding.filePath && cfp.sink.line === finding.lineNumber) ||
|
|
205
|
+
(cfp.sourceFile === finding.filePath && cfp.importLink.callLine === finding.lineNumber)
|
|
206
|
+
) ?? []
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// ============================================================================
|
|
210
|
+
// Score Findings
|
|
211
|
+
// ============================================================================
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Score a batch of findings with confidence scoring.
|
|
215
|
+
*
|
|
216
|
+
* Each finding gets a ConfidenceComputation attached as `confidence_score`.
|
|
217
|
+
* The routing field indicates whether the finding should be surfaced,
|
|
218
|
+
* validated by AI, or suppressed.
|
|
219
|
+
*/
|
|
220
|
+
export interface ScoringDiagnostics {
|
|
221
|
+
/** How many times each adjustment rule fired */
|
|
222
|
+
ruleHitCounts: Record<string, number>
|
|
223
|
+
/** Score distribution buckets */
|
|
224
|
+
scoreDistribution: { '0.0-0.2': number; '0.2-0.4': number; '0.4-0.6': number; '0.6-0.8': number; '0.8-1.0': number }
|
|
225
|
+
/** Average score per category */
|
|
226
|
+
categoryAvgScores: Record<string, { avg: number; count: number }>
|
|
227
|
+
/** Taint rule hits specifically */
|
|
228
|
+
taintRuleHits: Record<string, number>
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export function scoreFindings(
|
|
232
|
+
findings: Vulnerability[],
|
|
233
|
+
depth: ScanDepth,
|
|
234
|
+
ceResult: ContextEngineResult
|
|
235
|
+
): { scored: ScoredFinding[]; diagnostics: ScoringDiagnostics } {
|
|
236
|
+
const depthConfig = DEPTH_CONFIGS[depth]
|
|
237
|
+
const ruleHitCounts: Record<string, number> = {}
|
|
238
|
+
const taintRuleHits: Record<string, number> = {}
|
|
239
|
+
const scoreDistribution = { '0.0-0.2': 0, '0.2-0.4': 0, '0.4-0.6': 0, '0.6-0.8': 0, '0.8-1.0': 0 }
|
|
240
|
+
const categoryScoreSums: Record<string, { sum: number; count: number }> = {}
|
|
241
|
+
|
|
242
|
+
const scored = findings.map(finding => {
|
|
243
|
+
const context = buildAdjustmentContext(finding, ceResult)
|
|
244
|
+
const computation = computeConfidence(finding, context, ALL_ADJUSTMENT_RULES, depthConfig)
|
|
245
|
+
|
|
246
|
+
// Collect diagnostics
|
|
247
|
+
for (const adj of computation.adjustments) {
|
|
248
|
+
ruleHitCounts[adj.factor] = (ruleHitCounts[adj.factor] || 0) + 1
|
|
249
|
+
if (adj.source === 'taint') {
|
|
250
|
+
taintRuleHits[adj.factor] = (taintRuleHits[adj.factor] || 0) + 1
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Score distribution
|
|
255
|
+
const s = computation.score
|
|
256
|
+
if (s < 0.2) scoreDistribution['0.0-0.2']++
|
|
257
|
+
else if (s < 0.4) scoreDistribution['0.2-0.4']++
|
|
258
|
+
else if (s < 0.6) scoreDistribution['0.4-0.6']++
|
|
259
|
+
else if (s < 0.8) scoreDistribution['0.6-0.8']++
|
|
260
|
+
else scoreDistribution['0.8-1.0']++
|
|
261
|
+
|
|
262
|
+
// Per-category avg
|
|
263
|
+
const cat = finding.category
|
|
264
|
+
if (!categoryScoreSums[cat]) categoryScoreSums[cat] = { sum: 0, count: 0 }
|
|
265
|
+
categoryScoreSums[cat].sum += computation.score
|
|
266
|
+
categoryScoreSums[cat].count++
|
|
267
|
+
|
|
268
|
+
return {
|
|
269
|
+
...finding,
|
|
270
|
+
confidence_score: computation,
|
|
271
|
+
}
|
|
272
|
+
})
|
|
273
|
+
|
|
274
|
+
const categoryAvgScores: Record<string, { avg: number; count: number }> = {}
|
|
275
|
+
for (const [cat, data] of Object.entries(categoryScoreSums)) {
|
|
276
|
+
categoryAvgScores[cat] = { avg: data.sum / data.count, count: data.count }
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return {
|
|
280
|
+
scored,
|
|
281
|
+
diagnostics: { ruleHitCounts, scoreDistribution, categoryAvgScores, taintRuleHits },
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// ============================================================================
|
|
286
|
+
// Confidence Log
|
|
287
|
+
// ============================================================================
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Build structured confidence logs for a batch of scored findings.
|
|
291
|
+
* Used for debugging, tuning, and comparing with tier-based routing.
|
|
292
|
+
*/
|
|
293
|
+
export function buildConfidenceLog(scored: ScoredFinding[]): ConfidenceLog[] {
|
|
294
|
+
return scored.map(f => ({
|
|
295
|
+
findingId: `${f.filePath}:${f.lineNumber}:${f.category}`,
|
|
296
|
+
category: f.category,
|
|
297
|
+
detectorGroup: f.source ?? 'unknown',
|
|
298
|
+
base: f.confidence_score.base,
|
|
299
|
+
adjustments: f.confidence_score.adjustments,
|
|
300
|
+
final: f.confidence_score.score,
|
|
301
|
+
routing: f.confidence_score.routing,
|
|
302
|
+
filePath: f.filePath,
|
|
303
|
+
severity: f.severity,
|
|
304
|
+
}))
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Re-export types for consumer convenience
|
|
308
|
+
export type {
|
|
309
|
+
ScoredFinding,
|
|
310
|
+
ConfidenceComputation,
|
|
311
|
+
ConfidenceAdjustment,
|
|
312
|
+
ConfidenceLog,
|
|
313
|
+
AdjustmentRule,
|
|
314
|
+
AdjustmentContext,
|
|
315
|
+
DepthConfig,
|
|
316
|
+
} from './types'
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confidence Scoring Types
|
|
3
|
+
*
|
|
4
|
+
* Per-finding continuous confidence scoring (0.0–1.0) that replaces
|
|
5
|
+
* the tier-based routing system. Each finding gets a numeric score
|
|
6
|
+
* computed from baseConfidence + sum(adjustments), and routing
|
|
7
|
+
* decisions use score thresholds instead of tier membership.
|
|
8
|
+
*
|
|
9
|
+
* The adjustment system is extensible for the future Context Engine
|
|
10
|
+
* (taint, route, framework data).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { Vulnerability, ScanDepth } from '../shared/types'
|
|
14
|
+
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Confidence Adjustment
|
|
17
|
+
// ============================================================================
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* A single adjustment applied to a finding's confidence score.
|
|
21
|
+
* Records what changed the score, by how much, and why.
|
|
22
|
+
*/
|
|
23
|
+
export interface ConfidenceAdjustment {
|
|
24
|
+
/** Which adjustment rule produced this */
|
|
25
|
+
factor: string
|
|
26
|
+
/** Numeric change to score (positive = more confident, negative = less) */
|
|
27
|
+
delta: number
|
|
28
|
+
/** Human-readable explanation */
|
|
29
|
+
reason: string
|
|
30
|
+
/** Origin of this adjustment */
|
|
31
|
+
source: 'file_context' | 'auto_dismiss' | 'taint' | 'route' | 'framework' | 'detector'
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// Confidence Computation Result
|
|
36
|
+
// ============================================================================
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Full computation result for a single finding's confidence score.
|
|
40
|
+
*/
|
|
41
|
+
export interface ConfidenceComputation {
|
|
42
|
+
/** Final clamped score (0.0–1.0) */
|
|
43
|
+
score: number
|
|
44
|
+
/** Base confidence from the detector */
|
|
45
|
+
base: number
|
|
46
|
+
/** All adjustments applied */
|
|
47
|
+
adjustments: ConfidenceAdjustment[]
|
|
48
|
+
/** Routing decision based on score thresholds */
|
|
49
|
+
routing: 'surface' | 'validate' | 'suppress'
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ============================================================================
|
|
53
|
+
// Scored Finding
|
|
54
|
+
// ============================================================================
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* A vulnerability enriched with confidence scoring data.
|
|
58
|
+
* Extends the base Vulnerability with computed confidence information.
|
|
59
|
+
*/
|
|
60
|
+
export interface ScoredFinding extends Vulnerability {
|
|
61
|
+
/** Confidence computation result */
|
|
62
|
+
confidence_score: ConfidenceComputation
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ============================================================================
|
|
66
|
+
// Depth Configuration
|
|
67
|
+
// ============================================================================
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Score thresholds for each scan depth level.
|
|
71
|
+
* Determines how findings are routed based on their confidence score.
|
|
72
|
+
*/
|
|
73
|
+
export interface DepthConfig {
|
|
74
|
+
/** Minimum score to surface directly without AI validation */
|
|
75
|
+
surfaceThreshold: number
|
|
76
|
+
/** Minimum score to send to AI validation (below this = suppress) */
|
|
77
|
+
validateThreshold: number
|
|
78
|
+
/** Whether AI validation is available at this depth */
|
|
79
|
+
aiEnabled: boolean
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ============================================================================
|
|
83
|
+
// Confidence Log
|
|
84
|
+
// ============================================================================
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Structured log entry for confidence scoring decisions.
|
|
88
|
+
* Used for debugging, tuning, and audit trails.
|
|
89
|
+
*/
|
|
90
|
+
export interface ConfidenceLog {
|
|
91
|
+
/** Finding identifier (filePath:lineNumber:category) */
|
|
92
|
+
findingId: string
|
|
93
|
+
/** Vulnerability category */
|
|
94
|
+
category: string
|
|
95
|
+
/** Detector group that produced the finding */
|
|
96
|
+
detectorGroup: string
|
|
97
|
+
/** Base confidence from detector */
|
|
98
|
+
base: number
|
|
99
|
+
/** All adjustments applied */
|
|
100
|
+
adjustments: ConfidenceAdjustment[]
|
|
101
|
+
/** Final computed score */
|
|
102
|
+
final: number
|
|
103
|
+
/** Routing decision */
|
|
104
|
+
routing: 'surface' | 'validate' | 'suppress'
|
|
105
|
+
/** File path */
|
|
106
|
+
filePath: string
|
|
107
|
+
/** Severity */
|
|
108
|
+
severity: string
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ============================================================================
|
|
112
|
+
// Adjustment Rule System
|
|
113
|
+
// ============================================================================
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Context available to adjustment rules for evaluating findings.
|
|
117
|
+
*
|
|
118
|
+
* Starts minimal (file classification + basic project info).
|
|
119
|
+
* When Context Engine lands, add optional taint?, route?, framework?
|
|
120
|
+
* fields — existing rules ignore them; new rules check for presence.
|
|
121
|
+
*/
|
|
122
|
+
export interface AdjustmentContext {
|
|
123
|
+
/** File-level classification */
|
|
124
|
+
file: {
|
|
125
|
+
isTestFile: boolean
|
|
126
|
+
isExampleFile: boolean
|
|
127
|
+
isDocFile: boolean
|
|
128
|
+
isScannerCode: boolean
|
|
129
|
+
isToolingDir: boolean
|
|
130
|
+
isServerOnly: boolean
|
|
131
|
+
isClientBundled: boolean
|
|
132
|
+
}
|
|
133
|
+
/** Project-level context */
|
|
134
|
+
project: {
|
|
135
|
+
hasAuthMiddleware: boolean
|
|
136
|
+
hasTypeScript: boolean
|
|
137
|
+
orm: string | null
|
|
138
|
+
validationLib: string | null
|
|
139
|
+
}
|
|
140
|
+
/** The raw line content of the finding */
|
|
141
|
+
lineContent: string
|
|
142
|
+
/** The file path of the finding */
|
|
143
|
+
filePath: string
|
|
144
|
+
|
|
145
|
+
// Context Engine fields (optional — existing rules ignore undefined)
|
|
146
|
+
taint?: {
|
|
147
|
+
confirmed: boolean
|
|
148
|
+
sources: string[]
|
|
149
|
+
sinkType: string | null
|
|
150
|
+
sanitised: boolean
|
|
151
|
+
confidence: 'high' | 'medium' | 'low' | null
|
|
152
|
+
}
|
|
153
|
+
route?: {
|
|
154
|
+
hasAuth: boolean
|
|
155
|
+
isPublic: boolean
|
|
156
|
+
middleware: string[]
|
|
157
|
+
methods: string[]
|
|
158
|
+
hasRateLimiting: boolean
|
|
159
|
+
}
|
|
160
|
+
framework?: {
|
|
161
|
+
/** A safe-by-design pattern matches this finding's line */
|
|
162
|
+
safePatternMatch: { id: string; reason: string } | null
|
|
163
|
+
/** An unsafe-despite-framework pattern matches this finding's line */
|
|
164
|
+
unsafePatternMatch: { id: string; reason: string } | null
|
|
165
|
+
/** Which frameworks are active in the project */
|
|
166
|
+
activeFrameworks: string[]
|
|
167
|
+
/** ORM in use */
|
|
168
|
+
orm: string | null
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* A single adjustment rule that can modify a finding's confidence score.
|
|
174
|
+
* Rules are evaluated in order; all matching rules contribute their delta.
|
|
175
|
+
*/
|
|
176
|
+
export interface AdjustmentRule {
|
|
177
|
+
/** Unique name for this rule */
|
|
178
|
+
name: string
|
|
179
|
+
/** Origin category */
|
|
180
|
+
source: ConfidenceAdjustment['source']
|
|
181
|
+
/** Whether this rule applies to the given finding + context */
|
|
182
|
+
applies: (finding: Vulnerability, context: AdjustmentContext) => boolean
|
|
183
|
+
/** Score delta when rule applies (negative = less confident) */
|
|
184
|
+
delta: number
|
|
185
|
+
/** Human-readable reason */
|
|
186
|
+
reason: string
|
|
187
|
+
}
|
|
@@ -72,7 +72,7 @@ describe('Baseline Diff Computation', () => {
|
|
|
72
72
|
]
|
|
73
73
|
|
|
74
74
|
// Need to compute the hash that would match
|
|
75
|
-
const { computeFindingHash } = require('
|
|
75
|
+
const { computeFindingHash } = require('../../../postprocess/suppression/hash')
|
|
76
76
|
const hash = computeFindingHash(current[0])
|
|
77
77
|
|
|
78
78
|
const baseline = createBaseline([
|
|
@@ -119,7 +119,7 @@ describe('Baseline Diff Computation', () => {
|
|
|
119
119
|
it('should handle mixed scenario with new, fixed, and existing findings', () => {
|
|
120
120
|
// Create a finding that will be in both current and baseline
|
|
121
121
|
const existingVuln = createVuln('src/existing.ts', 10, 'xss', 'medium', 'Existing XSS')
|
|
122
|
-
const { computeFindingHash } = require('
|
|
122
|
+
const { computeFindingHash } = require('../../../postprocess/suppression/hash')
|
|
123
123
|
const existingHash = computeFindingHash(existingVuln)
|
|
124
124
|
|
|
125
125
|
// Current: one existing + one new
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import type { Vulnerability, SeverityCounts, VulnerabilitySeverity } from '../types'
|
|
7
7
|
import type { BaselineData, BaselineFinding, DiffResult } from './types'
|
|
8
|
-
import { computeFindingHash } from '
|
|
8
|
+
import { computeFindingHash } from '../../postprocess/suppression/hash'
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Compute severity counts from baseline findings
|
|
@@ -9,7 +9,7 @@ import { execFileSync } from 'child_process'
|
|
|
9
9
|
import type { ScanResult, ScanDepth, Vulnerability } from '../types'
|
|
10
10
|
import type { BaselineData, BaselineFinding } from './types'
|
|
11
11
|
import { BASELINE_FILE_PATH, OCULUM_DIR } from './types'
|
|
12
|
-
import { computeFindingHash } from '
|
|
12
|
+
import { computeFindingHash } from '../../postprocess/suppression/hash'
|
|
13
13
|
|
|
14
14
|
export interface BaselineManagerOptions {
|
|
15
15
|
/** Project root path */
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
import type { VulnerabilityCategory, Vulnerability, VulnerabilitySeverity } from './types'
|
|
19
|
-
import { severityRank } from './
|
|
19
|
+
import { severityRank } from './parsed-file'
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* Category group definitions for wildcard expansion
|
|
@@ -53,6 +53,13 @@ const ALL_CATEGORIES: VulnerabilityCategory[] = [
|
|
|
53
53
|
'ai_unverified_model',
|
|
54
54
|
'ai_unsafe_finetuning',
|
|
55
55
|
'ai_excessive_agency',
|
|
56
|
+
// Agent skill file security
|
|
57
|
+
'ai_skill_injection',
|
|
58
|
+
// OWASP Workstream 1
|
|
59
|
+
'missing_security_headers',
|
|
60
|
+
'ssrf',
|
|
61
|
+
'log_injection',
|
|
62
|
+
'xxe',
|
|
56
63
|
]
|
|
57
64
|
|
|
58
65
|
describe('Rule Metadata Registry', () => {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import type { VulnerabilityCategory } from '../types'
|
|
14
|
-
import type { FrameworkContext, DataAccessContext } from '
|
|
14
|
+
import type { FrameworkContext, DataAccessContext } from '../../model/project-context'
|
|
15
15
|
|
|
16
16
|
// ============================================================================
|
|
17
17
|
// Types
|
|
@@ -806,6 +806,100 @@ export const RULE_REGISTRY: Record<VulnerabilityCategory, RuleMetadata> = {
|
|
|
806
806
|
'https://docs.crewai.com/concepts/security',
|
|
807
807
|
],
|
|
808
808
|
},
|
|
809
|
+
// ==========================================================================
|
|
810
|
+
// OWASP Workstream 1: Classic Vulnerability Detectors
|
|
811
|
+
// ==========================================================================
|
|
812
|
+
missing_security_headers: {
|
|
813
|
+
name: 'Missing Security Headers',
|
|
814
|
+
whyItMatters:
|
|
815
|
+
'Missing HTTP security headers (CSP, HSTS, X-Frame-Options) leave the application vulnerable to clickjacking, MIME sniffing, XSS, and man-in-the-middle attacks.',
|
|
816
|
+
fixSteps: [
|
|
817
|
+
'Add helmet middleware for Express apps: app.use(helmet())',
|
|
818
|
+
'Configure Content-Security-Policy to restrict resource loading',
|
|
819
|
+
'Enable HSTS (Strict-Transport-Security) for HTTPS enforcement',
|
|
820
|
+
'Set X-Frame-Options to prevent clickjacking',
|
|
821
|
+
'Add X-Content-Type-Options: nosniff to prevent MIME sniffing',
|
|
822
|
+
],
|
|
823
|
+
evidence: 'Server configuration missing critical HTTP security headers',
|
|
824
|
+
references: [
|
|
825
|
+
'https://owasp.org/www-project-secure-headers/',
|
|
826
|
+
'https://cwe.mitre.org/data/definitions/693.html',
|
|
827
|
+
],
|
|
828
|
+
},
|
|
829
|
+
|
|
830
|
+
ssrf: {
|
|
831
|
+
name: 'Server-Side Request Forgery (SSRF)',
|
|
832
|
+
whyItMatters:
|
|
833
|
+
'SSRF allows attackers to make the server send requests to unintended locations, potentially accessing internal services, cloud metadata endpoints, or performing port scanning from within the network.',
|
|
834
|
+
fixSteps: [
|
|
835
|
+
'Validate and sanitize all user-supplied URLs before making server-side requests',
|
|
836
|
+
'Implement an allowlist of permitted domains or IP ranges',
|
|
837
|
+
'Block requests to private IP ranges (127.0.0.1, 10.x, 192.168.x, 169.254.x)',
|
|
838
|
+
'Use a URL parser to validate the scheme, host, and port',
|
|
839
|
+
'Consider using a proxy service for user-supplied URLs',
|
|
840
|
+
],
|
|
841
|
+
evidence: 'User-controlled input flows to server-side HTTP request without validation',
|
|
842
|
+
references: [
|
|
843
|
+
'https://owasp.org/www-community/attacks/Server_Side_Request_Forgery',
|
|
844
|
+
'https://cwe.mitre.org/data/definitions/918.html',
|
|
845
|
+
],
|
|
846
|
+
},
|
|
847
|
+
|
|
848
|
+
log_injection: {
|
|
849
|
+
name: 'Log Injection',
|
|
850
|
+
whyItMatters:
|
|
851
|
+
'Unsanitized user input in log statements can forge log entries, inject CRLF sequences to create fake log lines, or exploit log processing tools via injection attacks.',
|
|
852
|
+
fixSteps: [
|
|
853
|
+
'Sanitize user input before including in log messages (strip newlines, control characters)',
|
|
854
|
+
'Use structured logging (JSON format) instead of string interpolation',
|
|
855
|
+
'Parameterize log fields instead of concatenating user input',
|
|
856
|
+
'Implement log output encoding appropriate to the log format',
|
|
857
|
+
],
|
|
858
|
+
evidence: 'User-controlled request data flows directly into log statements',
|
|
859
|
+
references: [
|
|
860
|
+
'https://owasp.org/www-community/attacks/Log_Injection',
|
|
861
|
+
'https://cwe.mitre.org/data/definitions/117.html',
|
|
862
|
+
],
|
|
863
|
+
},
|
|
864
|
+
|
|
865
|
+
xxe: {
|
|
866
|
+
name: 'XML External Entity (XXE) Injection',
|
|
867
|
+
whyItMatters:
|
|
868
|
+
'XXE vulnerabilities allow attackers to read server files, perform SSRF, execute denial-of-service attacks (billion laughs), and potentially achieve remote code execution through XML parsing.',
|
|
869
|
+
fixSteps: [
|
|
870
|
+
'Disable external entity processing in your XML parser',
|
|
871
|
+
'Use defusedxml (Python) instead of standard xml library',
|
|
872
|
+
'Set factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true) in Java',
|
|
873
|
+
'Use JSON instead of XML where possible',
|
|
874
|
+
'Upgrade XML parsing libraries to versions with secure defaults',
|
|
875
|
+
],
|
|
876
|
+
evidence: 'XML parser used without disabling external entity processing',
|
|
877
|
+
references: [
|
|
878
|
+
'https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing',
|
|
879
|
+
'https://cwe.mitre.org/data/definitions/611.html',
|
|
880
|
+
],
|
|
881
|
+
},
|
|
882
|
+
|
|
883
|
+
// ==========================================================================
|
|
884
|
+
// Agent Skill File Security
|
|
885
|
+
// ==========================================================================
|
|
886
|
+
ai_skill_injection: {
|
|
887
|
+
name: 'Agent Skill Injection',
|
|
888
|
+
whyItMatters:
|
|
889
|
+
'AI agent skill/configuration files define agent behavior. Prompt injection, data exfiltration commands, or hidden execution patterns in these files can compromise the agent, exfiltrate sensitive data, or execute arbitrary code on the host system.',
|
|
890
|
+
fixSteps: [
|
|
891
|
+
'Review the skill file for any instructions that override safety guidelines',
|
|
892
|
+
'Remove any shell commands that pipe remote content to execution (curl | sh)',
|
|
893
|
+
'Remove any references to sensitive files or environment variables',
|
|
894
|
+
'Check for hidden Unicode characters using a hex editor or unicode inspector',
|
|
895
|
+
'Ensure tool descriptions do not contain injection language',
|
|
896
|
+
],
|
|
897
|
+
evidence: 'Detected prompt injection, data exfiltration, or hidden execution pattern in agent skill file',
|
|
898
|
+
references: [
|
|
899
|
+
'https://owasp.org/www-project-top-10-for-large-language-model-applications/',
|
|
900
|
+
'https://cwe.mitre.org/data/definitions/77.html',
|
|
901
|
+
],
|
|
902
|
+
},
|
|
809
903
|
}
|
|
810
904
|
|
|
811
905
|
/**
|