@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
|
@@ -3,16 +3,19 @@
|
|
|
3
3
|
* Detects hardcoded sensitive URLs that may indicate security issues
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { Vulnerability } from '
|
|
7
|
-
import type { ParsedFile } from '
|
|
8
|
-
import { isTestConfigFile, isPythonFile, isInsidePythonDocstring } from '
|
|
6
|
+
import type { Vulnerability } from '../../shared/types'
|
|
7
|
+
import type { ParsedFile } from '../../shared/parsed-file'
|
|
8
|
+
import { isTestConfigFile, isPythonFile, isInsidePythonDocstring } from '../../parse/file-classifier'
|
|
9
9
|
import {
|
|
10
10
|
getEnvironmentContext,
|
|
11
11
|
isInPlaceholderAttribute,
|
|
12
12
|
isDefaultParameterValue,
|
|
13
13
|
getLocalhostSeverity,
|
|
14
|
-
} from '
|
|
15
|
-
import { getRouteProtectionContext } from '
|
|
14
|
+
} from '../../shared/environment-context'
|
|
15
|
+
import { getRouteProtectionContext } from '../../model/route-hierarchy'
|
|
16
|
+
|
|
17
|
+
const BASE_CONFIDENCE_WEBHOOK = 0.55
|
|
18
|
+
const BASE_CONFIDENCE_LOCALHOST = 0.30
|
|
16
19
|
|
|
17
20
|
// Check if file is documentation/README/example
|
|
18
21
|
function isDocumentationFile(filePath: string): boolean {
|
|
@@ -459,7 +462,9 @@ export function detectSensitiveURLs(
|
|
|
459
462
|
description: description + (adjustedSeverity === 'high' ? ' (in production config!)' : ' (in dev/config file)'),
|
|
460
463
|
suggestedFix: 'Move URLs to environment variables or configuration files. Use process.env.API_URL pattern.',
|
|
461
464
|
confidence: adjustedSeverity === 'high' ? 'high' : 'low',
|
|
465
|
+
baseConfidence: BASE_CONFIDENCE_LOCALHOST,
|
|
462
466
|
layer: 1,
|
|
467
|
+
source: 'config' as const,
|
|
463
468
|
})
|
|
464
469
|
} else {
|
|
465
470
|
// Normal URL handling (non-localhost)
|
|
@@ -495,7 +500,9 @@ export function detectSensitiveURLs(
|
|
|
495
500
|
description: description + contextNote,
|
|
496
501
|
suggestedFix: 'Move URLs to environment variables or configuration files. Use process.env.API_URL pattern.',
|
|
497
502
|
confidence: inTestFile ? 'low' : 'medium',
|
|
503
|
+
baseConfidence: BASE_CONFIDENCE_WEBHOOK,
|
|
498
504
|
layer: 1,
|
|
505
|
+
source: 'config' as const,
|
|
499
506
|
requiresAIValidation,
|
|
500
507
|
})
|
|
501
508
|
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detection Stage — Runs Layer 1 + Layer 2 detectors and handles localhost aggregation.
|
|
3
|
+
*
|
|
4
|
+
* Returns raw findings before noisy aggregation/enrichment (those are called
|
|
5
|
+
* by the orchestrator to keep stage boundaries clean).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type {
|
|
9
|
+
ScanFile,
|
|
10
|
+
Vulnerability,
|
|
11
|
+
CancellationToken,
|
|
12
|
+
DetectorContext,
|
|
13
|
+
ProgressCallback,
|
|
14
|
+
} from '../shared/types'
|
|
15
|
+
import { runLayer1Scan, type Layer1Result } from './secrets'
|
|
16
|
+
import { runLayer2Scan, type Layer2Result } from './structural'
|
|
17
|
+
import { aggregateLocalhostFindings } from './config/urls'
|
|
18
|
+
import type { MiddlewareAuthConfig } from '../model/middleware-detector'
|
|
19
|
+
import type { FileAuthImports } from '../model/imported-auth-detector'
|
|
20
|
+
import type { FilterPipeline } from '../postprocess/filtering/pipeline'
|
|
21
|
+
|
|
22
|
+
export interface DetectorInput {
|
|
23
|
+
files: ScanFile[]
|
|
24
|
+
middlewareConfig?: MiddlewareAuthConfig
|
|
25
|
+
fileAuthImports?: Map<string, FileAuthImports>
|
|
26
|
+
detectorContext: DetectorContext
|
|
27
|
+
onProgress?: ProgressCallback
|
|
28
|
+
cancellationToken?: CancellationToken
|
|
29
|
+
filterPipeline: FilterPipeline
|
|
30
|
+
repoName: string
|
|
31
|
+
quiet: boolean
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface DetectorOutput {
|
|
35
|
+
/** Combined Layer 1 + Layer 2 findings (after localhost aggregation) */
|
|
36
|
+
findings: Vulnerability[]
|
|
37
|
+
/** Phase timing */
|
|
38
|
+
phaseTiming: { layer1?: number; layer2?: number }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const fid = (v: Pick<Vulnerability, 'filePath' | 'lineNumber' | 'category'>) =>
|
|
42
|
+
`${v.filePath}:${v.lineNumber}:${v.category}`
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Run all detectors (Layer 1 + Layer 2) and return combined raw findings.
|
|
46
|
+
*/
|
|
47
|
+
export async function runDetectors(input: DetectorInput): Promise<DetectorOutput> {
|
|
48
|
+
const {
|
|
49
|
+
files,
|
|
50
|
+
middlewareConfig,
|
|
51
|
+
fileAuthImports,
|
|
52
|
+
detectorContext,
|
|
53
|
+
onProgress,
|
|
54
|
+
cancellationToken,
|
|
55
|
+
filterPipeline,
|
|
56
|
+
repoName,
|
|
57
|
+
quiet,
|
|
58
|
+
} = input
|
|
59
|
+
|
|
60
|
+
const log = (message: string) => {
|
|
61
|
+
if (!quiet) console.log(message)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const reportProgress = (
|
|
65
|
+
status: 'layer1' | 'layer2',
|
|
66
|
+
message: string,
|
|
67
|
+
vulnerabilitiesFound: number = 0
|
|
68
|
+
) => {
|
|
69
|
+
if (onProgress) {
|
|
70
|
+
onProgress({
|
|
71
|
+
status,
|
|
72
|
+
message,
|
|
73
|
+
filesProcessed: files.length,
|
|
74
|
+
totalFiles: files.length,
|
|
75
|
+
vulnerabilitiesFound,
|
|
76
|
+
})
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const phaseTiming: { layer1?: number; layer2?: number } = {}
|
|
81
|
+
|
|
82
|
+
// Layer 1: Surface Scan
|
|
83
|
+
const layer1Start = Date.now()
|
|
84
|
+
reportProgress('layer1', 'Running surface scan (patterns, entropy, config)...')
|
|
85
|
+
let layer1Result = await runLayer1Scan(files, onProgress, cancellationToken)
|
|
86
|
+
|
|
87
|
+
// Aggregate repeated localhost findings
|
|
88
|
+
const layer1RawCount = layer1Result.vulnerabilities.length
|
|
89
|
+
const layer1BeforeAggregation = layer1Result.vulnerabilities
|
|
90
|
+
layer1Result = {
|
|
91
|
+
...layer1Result,
|
|
92
|
+
vulnerabilities: aggregateLocalhostFindings(layer1Result.vulnerabilities)
|
|
93
|
+
}
|
|
94
|
+
if (filterPipeline.isEnabled) {
|
|
95
|
+
const afterIds = new Set(layer1Result.vulnerabilities.map(fid))
|
|
96
|
+
for (const v of layer1BeforeAggregation) {
|
|
97
|
+
if (!afterIds.has(fid(v))) {
|
|
98
|
+
filterPipeline.record(fid(v), { stage: 'localhost_aggregation', action: 'aggregated', reason: 'Aggregated repeated localhost finding' })
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
phaseTiming.layer1 = Date.now() - layer1Start
|
|
103
|
+
log(`[Layer1] repo=${repoName} findings_raw=${layer1RawCount} findings_deduped=${layer1Result.vulnerabilities.length} duration=${phaseTiming.layer1}ms`)
|
|
104
|
+
|
|
105
|
+
// Layer 2: Structural Scan
|
|
106
|
+
const layer2Start = Date.now()
|
|
107
|
+
reportProgress('layer2', 'Running structural scan (variables, logic gates)...', layer1Result.vulnerabilities.length)
|
|
108
|
+
const layer2Result = await runLayer2Scan(
|
|
109
|
+
files,
|
|
110
|
+
{ middlewareConfig, fileAuthImports, detectorContext },
|
|
111
|
+
onProgress,
|
|
112
|
+
cancellationToken
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
// Format heuristic breakdown for logging
|
|
116
|
+
const heuristicBreakdown = Object.entries(layer2Result.stats.raw)
|
|
117
|
+
.filter(([, count]) => count > 0)
|
|
118
|
+
.map(([name, count]) => `${name}:${count}`)
|
|
119
|
+
.join(',')
|
|
120
|
+
phaseTiming.layer2 = Date.now() - layer2Start
|
|
121
|
+
log(`[Layer2] repo=${repoName} findings_raw=${Object.values(layer2Result.stats.raw).reduce((a, b) => a + b, 0)} findings_deduped=${layer2Result.vulnerabilities.length} duration=${phaseTiming.layer2}ms heuristic_breakdown={${heuristicBreakdown}}`)
|
|
122
|
+
|
|
123
|
+
// Combine Layer 1 and Layer 2 findings
|
|
124
|
+
const findings = [...layer1Result.vulnerabilities, ...layer2Result.vulnerabilities]
|
|
125
|
+
|
|
126
|
+
return { findings, phaseTiming }
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Re-export layer results for external consumers
|
|
130
|
+
export { runLayer1Scan, type Layer1Result } from './secrets'
|
|
131
|
+
export { runLayer2Scan, type Layer2Result } from './structural'
|
|
@@ -3,8 +3,11 @@
|
|
|
3
3
|
* Scans configuration files for security misconfigurations
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { ConfigRule, ConfigViolation, Vulnerability } from '
|
|
7
|
-
import type { ParsedFile } from '
|
|
6
|
+
import type { ConfigRule, ConfigViolation, Vulnerability } from '../../shared/types'
|
|
7
|
+
import type { ParsedFile } from '../../shared/parsed-file'
|
|
8
|
+
|
|
9
|
+
// Base confidence for configuration audit findings
|
|
10
|
+
const BASE_CONFIDENCE = 0.50
|
|
8
11
|
|
|
9
12
|
// Configuration audit rules
|
|
10
13
|
export const CONFIG_RULES: ConfigRule[] = [
|
|
@@ -336,7 +339,9 @@ export function auditConfiguration(
|
|
|
336
339
|
description: violation.message,
|
|
337
340
|
suggestedFix: getConfigFix(rule.name, violation),
|
|
338
341
|
confidence: 'high',
|
|
342
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
339
343
|
layer: 1,
|
|
344
|
+
source: 'secrets' as const,
|
|
340
345
|
})
|
|
341
346
|
}
|
|
342
347
|
}
|
|
@@ -13,15 +13,18 @@
|
|
|
13
13
|
* - Insecure transport (http:// instead of https://)
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import type { Vulnerability, VulnerabilitySeverity, VulnerabilityCategory } from '
|
|
17
|
-
import type { ParsedFile } from '
|
|
16
|
+
import type { Vulnerability, VulnerabilitySeverity, VulnerabilityCategory } from '../../shared/types'
|
|
17
|
+
import type { ParsedFile } from '../../shared/parsed-file'
|
|
18
18
|
import {
|
|
19
19
|
isComment,
|
|
20
20
|
isTestOrMockFile,
|
|
21
21
|
isDocumentationFile,
|
|
22
22
|
isScannerOrFixtureFile,
|
|
23
23
|
isExampleDirectory,
|
|
24
|
-
} from '
|
|
24
|
+
} from '../../parse/file-classifier'
|
|
25
|
+
|
|
26
|
+
// Base confidence for MCP configuration audit findings
|
|
27
|
+
const BASE_CONFIDENCE = 0.50
|
|
25
28
|
|
|
26
29
|
// ============================================================================
|
|
27
30
|
// Configuration File Detection
|
|
@@ -268,7 +271,9 @@ export function detectMCPConfigIssues(
|
|
|
268
271
|
description,
|
|
269
272
|
suggestedFix: pattern.suggestedFix,
|
|
270
273
|
confidence: pattern.category === 'ai_mcp_config_secrets' ? 'high' : 'medium',
|
|
274
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
271
275
|
layer: 1,
|
|
276
|
+
source: 'secrets' as const,
|
|
272
277
|
requiresAIValidation: severity !== 'info' && severity !== 'low',
|
|
273
278
|
})
|
|
274
279
|
}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* Uses Shannon entropy to detect potential secrets that don't match known patterns
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { Vulnerability } from '
|
|
7
|
-
import type { ParsedFile } from '
|
|
6
|
+
import type { Vulnerability } from '../../shared/types'
|
|
7
|
+
import type { ParsedFile } from '../../shared/parsed-file'
|
|
8
8
|
import {
|
|
9
9
|
isTestOrMockFile,
|
|
10
10
|
isComment,
|
|
@@ -12,7 +12,10 @@ import {
|
|
|
12
12
|
isExampleFile,
|
|
13
13
|
isFixtureFile,
|
|
14
14
|
isExampleDirectory,
|
|
15
|
-
} from '
|
|
15
|
+
} from '../../parse/file-classifier'
|
|
16
|
+
|
|
17
|
+
// Base confidence for entropy-based findings (statistical, requires AI validation)
|
|
18
|
+
const BASE_CONFIDENCE = 0.30
|
|
16
19
|
|
|
17
20
|
// Shannon entropy calculation
|
|
18
21
|
export function calculateEntropy(str: string): number {
|
|
@@ -152,19 +155,23 @@ function isTemplateWithCode(str: string, lineContent: string): boolean {
|
|
|
152
155
|
if (!lineContent.includes('`') && !lineContent.includes('${')) {
|
|
153
156
|
return false
|
|
154
157
|
}
|
|
155
|
-
|
|
158
|
+
|
|
159
|
+
// Multiple interpolations (3+) = formatting string, not a secret
|
|
160
|
+
const interpolationCount = (lineContent.match(/\$\{/g) || []).length
|
|
161
|
+
if (interpolationCount >= 3) {
|
|
162
|
+
return true
|
|
163
|
+
}
|
|
164
|
+
|
|
156
165
|
// Common code patterns inside template literals that create high entropy
|
|
157
166
|
const codePatterns = [
|
|
158
|
-
/\$\{[^}]
|
|
167
|
+
/\$\{[^}]*\.\w+\s*\(/, // Method call inside interpolation: ${x.foo()}
|
|
168
|
+
/\$\{\w+\s*\(/, // Function call inside interpolation: ${funcName(...)}
|
|
159
169
|
/\$\{[^}]*\?\.[^}]*\}/, // Optional chaining
|
|
160
170
|
/\$\{[^}]*\s*\?\s*[^:]+\s*:\s*[^}]+\}/, // Ternary operators
|
|
161
171
|
/var\s*\(\s*\$\{/, // CSS var() with template
|
|
162
|
-
/\$\{
|
|
163
|
-
/\$\{[^}]*\.map\s*\(/i,
|
|
164
|
-
/\$\{[^}]*\.filter\s*\(/i,
|
|
165
|
-
/\$\{new\s+Date\(\)/i, // Date formatting
|
|
172
|
+
/\$\{new\s+\w+\(/i, // Constructor calls: ${new Date()}
|
|
166
173
|
]
|
|
167
|
-
|
|
174
|
+
|
|
168
175
|
return codePatterns.some(pattern => pattern.test(lineContent))
|
|
169
176
|
}
|
|
170
177
|
|
|
@@ -332,11 +339,14 @@ function isDocumentationFile(filePath: string): boolean {
|
|
|
332
339
|
return docPatterns.some(p => p.test(filePath))
|
|
333
340
|
}
|
|
334
341
|
|
|
335
|
-
// Check if string is a
|
|
342
|
+
// Check if string is a logging/output statement content
|
|
336
343
|
function isDebugLogContent(lineContent: string): boolean {
|
|
337
344
|
const debugPatterns = [
|
|
338
345
|
/console\.(log|debug|info|warn|error)\s*\(/i,
|
|
339
346
|
/logger\.(log|debug|info|warn|error)\s*\(/i,
|
|
347
|
+
/\bthis\.log\s*\(/i, // Instance method logging
|
|
348
|
+
/\bcore\.(info|debug|warning|error|notice)\s*\(/i, // GitHub Actions core
|
|
349
|
+
/\bvscode\.window\.show(Information|Warning|Error)Message\s*\(/i, // VS Code API
|
|
340
350
|
/\[.*Debug.*\]/i,
|
|
341
351
|
/\[.*Log.*\]/i,
|
|
342
352
|
]
|
|
@@ -841,7 +851,9 @@ export function detectHighEntropyStrings(
|
|
|
841
851
|
description: `High-entropy string found (entropy: ${entropy.toFixed(2)}). This may be a hardcoded secret, API key, or password.${inTestFile ? ' (in test file)' : ''}`,
|
|
842
852
|
suggestedFix: 'Move this value to an environment variable and access it via process.env',
|
|
843
853
|
confidence,
|
|
854
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
844
855
|
layer: 1,
|
|
856
|
+
source: 'secrets' as const,
|
|
845
857
|
requiresAIValidation: true, // Entropy findings must be validated by AI
|
|
846
858
|
})
|
|
847
859
|
}
|
|
@@ -4,29 +4,24 @@
|
|
|
4
4
|
* file flags, comment analysis, URL detection, and weak crypto detection
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import type { Vulnerability, ScanFile, CancellationToken } from '
|
|
8
|
-
import type { ProgressCallback } from '
|
|
7
|
+
import type { Vulnerability, ScanFile, CancellationToken } from '../../shared/types'
|
|
8
|
+
import type { ProgressCallback } from '../../shared/types'
|
|
9
9
|
import { detectHighEntropyStrings } from './entropy'
|
|
10
10
|
import { detectKnownPatterns } from './patterns'
|
|
11
11
|
import { auditConfiguration } from './config-audit'
|
|
12
|
-
import { detectDangerousFiles } from '
|
|
13
|
-
import { detectAICommentPatterns } from '
|
|
14
|
-
import { detectSensitiveURLs } from '
|
|
12
|
+
import { detectDangerousFiles } from '../config/file-flags'
|
|
13
|
+
import { detectAICommentPatterns } from '../config/comments'
|
|
14
|
+
import { detectSensitiveURLs } from '../config/urls'
|
|
15
15
|
import { detectWeakCrypto } from './weak-crypto'
|
|
16
16
|
import { detectMCPConfigIssues } from './config-mcp-audit'
|
|
17
|
-
import {
|
|
18
|
-
|
|
19
|
-
computeTierStats,
|
|
20
|
-
formatTierStats,
|
|
21
|
-
getLayer1DetectorTier,
|
|
22
|
-
type Layer1DetectorName,
|
|
23
|
-
} from '../tiers'
|
|
17
|
+
import { detectAgentSkillInjection } from '../config/agent-skill-injection'
|
|
18
|
+
// Tier system removed in Phase 2B — confidence scoring handles routing
|
|
24
19
|
import {
|
|
25
20
|
filterFindingsByPath,
|
|
26
21
|
type ExclusionConfig,
|
|
27
|
-
} from '
|
|
28
|
-
import { severityRank } from '
|
|
29
|
-
import { ParsedFile } from '
|
|
22
|
+
} from '../../parse/path-exclusions'
|
|
23
|
+
import { severityRank } from '../../shared/parsed-file'
|
|
24
|
+
import { ParsedFile } from '../../shared/parsed-file'
|
|
30
25
|
|
|
31
26
|
/**
|
|
32
27
|
* Layer 1 detector stats for raw finding counts before deduplication
|
|
@@ -36,8 +31,6 @@ export interface Layer1Stats {
|
|
|
36
31
|
raw: Record<string, number>
|
|
37
32
|
/** Deduped finding counts per category */
|
|
38
33
|
deduped: Record<string, number>
|
|
39
|
-
/** Tier breakdown of deduped findings */
|
|
40
|
-
tiers: TierStats
|
|
41
34
|
/** Number of findings suppressed by path exclusions */
|
|
42
35
|
suppressedByPath: number
|
|
43
36
|
}
|
|
@@ -50,8 +43,18 @@ export interface Layer1Result {
|
|
|
50
43
|
stats: Layer1Stats
|
|
51
44
|
}
|
|
52
45
|
|
|
53
|
-
//
|
|
54
|
-
type Layer1StatsRecord =
|
|
46
|
+
// Layer 1 detector stat keys
|
|
47
|
+
type Layer1StatsRecord = {
|
|
48
|
+
known_secrets: number
|
|
49
|
+
weak_crypto: number
|
|
50
|
+
sensitive_urls: number
|
|
51
|
+
entropy: number
|
|
52
|
+
config_audit: number
|
|
53
|
+
file_flags: number
|
|
54
|
+
ai_comments: number
|
|
55
|
+
mcp_config: number
|
|
56
|
+
agent_skill: number
|
|
57
|
+
}
|
|
55
58
|
|
|
56
59
|
// Process a single file through all Layer 1 detectors
|
|
57
60
|
function processFileLayer1(file: ScanFile): {
|
|
@@ -67,6 +70,7 @@ function processFileLayer1(file: ScanFile): {
|
|
|
67
70
|
file_flags: 0,
|
|
68
71
|
ai_comments: 0,
|
|
69
72
|
mcp_config: 0,
|
|
73
|
+
agent_skill: 0,
|
|
70
74
|
}
|
|
71
75
|
|
|
72
76
|
// Create ParsedFile once for all detectors to share
|
|
@@ -80,6 +84,7 @@ function processFileLayer1(file: ScanFile): {
|
|
|
80
84
|
const urlFindings = detectSensitiveURLs(file.content, file.path, { parsed })
|
|
81
85
|
const cryptoFindings = detectWeakCrypto(file.content, file.path, { parsed })
|
|
82
86
|
const mcpConfigFindings = detectMCPConfigIssues(file.content, file.path, { parsed })
|
|
87
|
+
const agentSkillFindings = detectAgentSkillInjection(file.content, file.path, { parsed })
|
|
83
88
|
|
|
84
89
|
stats.entropy = entropyFindings.length
|
|
85
90
|
stats.known_secrets = patternFindings.length
|
|
@@ -89,6 +94,7 @@ function processFileLayer1(file: ScanFile): {
|
|
|
89
94
|
stats.sensitive_urls = urlFindings.length
|
|
90
95
|
stats.weak_crypto = cryptoFindings.length
|
|
91
96
|
stats.mcp_config = mcpConfigFindings.length
|
|
97
|
+
stats.agent_skill = agentSkillFindings.length
|
|
92
98
|
|
|
93
99
|
return {
|
|
94
100
|
findings: [
|
|
@@ -100,6 +106,7 @@ function processFileLayer1(file: ScanFile): {
|
|
|
100
106
|
...urlFindings,
|
|
101
107
|
...cryptoFindings,
|
|
102
108
|
...mcpConfigFindings,
|
|
109
|
+
...agentSkillFindings,
|
|
103
110
|
],
|
|
104
111
|
stats,
|
|
105
112
|
}
|
|
@@ -128,6 +135,7 @@ export async function runLayer1Scan(
|
|
|
128
135
|
file_flags: 0,
|
|
129
136
|
ai_comments: 0,
|
|
130
137
|
mcp_config: 0,
|
|
138
|
+
agent_skill: 0,
|
|
131
139
|
}
|
|
132
140
|
|
|
133
141
|
// Track progress for frequent updates
|
|
@@ -180,13 +188,6 @@ export async function runLayer1Scan(
|
|
|
180
188
|
dedupedStats[cat] = (dedupedStats[cat] || 0) + 1
|
|
181
189
|
}
|
|
182
190
|
|
|
183
|
-
// Compute tier breakdown (all Layer 1 findings have layer: 1)
|
|
184
|
-
const tierStats = computeTierStats(
|
|
185
|
-
uniqueVulnerabilities.map(v => ({ category: v.category, layer: 1 as const }))
|
|
186
|
-
)
|
|
187
|
-
|
|
188
|
-
// Heuristic breakdown available in stats.raw and stats.tiers for debugging
|
|
189
|
-
|
|
190
191
|
return {
|
|
191
192
|
vulnerabilities: uniqueVulnerabilities,
|
|
192
193
|
filesScanned: files.length,
|
|
@@ -194,7 +195,6 @@ export async function runLayer1Scan(
|
|
|
194
195
|
stats: {
|
|
195
196
|
raw: rawStats,
|
|
196
197
|
deduped: dedupedStats,
|
|
197
|
-
tiers: tierStats,
|
|
198
198
|
suppressedByPath: suppressed.length,
|
|
199
199
|
},
|
|
200
200
|
}
|
|
@@ -222,8 +222,9 @@ function deduplicateFindings(vulnerabilities: Vulnerability[]): Vulnerability[]
|
|
|
222
222
|
export { detectHighEntropyStrings } from './entropy'
|
|
223
223
|
export { detectKnownPatterns } from './patterns'
|
|
224
224
|
export { auditConfiguration } from './config-audit'
|
|
225
|
-
export { detectDangerousFiles } from '
|
|
226
|
-
export { detectAICommentPatterns } from '
|
|
227
|
-
export { detectSensitiveURLs } from '
|
|
225
|
+
export { detectDangerousFiles } from '../config/file-flags'
|
|
226
|
+
export { detectAICommentPatterns } from '../config/comments'
|
|
227
|
+
export { detectSensitiveURLs } from '../config/urls'
|
|
228
228
|
export { detectWeakCrypto } from './weak-crypto'
|
|
229
229
|
export { detectMCPConfigIssues } from './config-mcp-audit'
|
|
230
|
+
export { detectAgentSkillInjection } from '../config/agent-skill-injection'
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* Curated library of high-fidelity regex patterns for detecting secrets
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { SecretPattern, Vulnerability } from '
|
|
7
|
-
import type { ParsedFile } from '
|
|
6
|
+
import type { SecretPattern, Vulnerability } from '../../shared/types'
|
|
7
|
+
import type { ParsedFile } from '../../shared/parsed-file'
|
|
8
8
|
import {
|
|
9
9
|
isServerOnlyFile,
|
|
10
10
|
isExampleFile,
|
|
@@ -18,7 +18,12 @@ import {
|
|
|
18
18
|
getServiceRoleKeyContext,
|
|
19
19
|
isPythonFile,
|
|
20
20
|
isInsidePythonDocstring,
|
|
21
|
-
} from '
|
|
21
|
+
} from '../../parse/file-classifier'
|
|
22
|
+
|
|
23
|
+
// Base confidence for known API key format patterns (AWS, GitHub, Stripe, etc.)
|
|
24
|
+
const BASE_CONFIDENCE_KNOWN = 0.70
|
|
25
|
+
// Base confidence for generic secret patterns (api_key=, secret_key=, etc.)
|
|
26
|
+
const BASE_CONFIDENCE_GENERIC = 0.50
|
|
22
27
|
|
|
23
28
|
// Check if file is documentation/README
|
|
24
29
|
function isDocumentationFile(filePath: string): boolean {
|
|
@@ -543,7 +548,9 @@ export function detectKnownPatterns(
|
|
|
543
548
|
description: adjustedDescription,
|
|
544
549
|
suggestedFix: 'Move this secret to an environment variable. Never commit secrets to version control.',
|
|
545
550
|
confidence: adjustedConfidence,
|
|
551
|
+
baseConfidence: isGenericPattern ? BASE_CONFIDENCE_GENERIC : BASE_CONFIDENCE_KNOWN,
|
|
546
552
|
layer: 1,
|
|
553
|
+
source: 'secrets' as const,
|
|
547
554
|
requiresAIValidation: finalRequiresAIValidation,
|
|
548
555
|
})
|
|
549
556
|
}
|
|
@@ -3,8 +3,11 @@
|
|
|
3
3
|
* Detects usage of deprecated or weak cryptographic algorithms
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { Vulnerability } from '
|
|
7
|
-
import type { ParsedFile } from '
|
|
6
|
+
import type { Vulnerability } from '../../shared/types'
|
|
7
|
+
import type { ParsedFile } from '../../shared/parsed-file'
|
|
8
|
+
|
|
9
|
+
// Base confidence for weak cryptography findings
|
|
10
|
+
const BASE_CONFIDENCE = 0.45
|
|
8
11
|
|
|
9
12
|
// Weak/deprecated cryptographic patterns
|
|
10
13
|
const WEAK_CRYPTO_PATTERNS = [
|
|
@@ -469,7 +472,9 @@ export function detectWeakCrypto(
|
|
|
469
472
|
description,
|
|
470
473
|
suggestedFix: fix,
|
|
471
474
|
confidence: 'high',
|
|
475
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
472
476
|
layer: 1,
|
|
477
|
+
source: 'secrets' as const,
|
|
473
478
|
})
|
|
474
479
|
break // Only report one crypto issue per line
|
|
475
480
|
}
|
|
@@ -8,17 +8,19 @@
|
|
|
8
8
|
* - Properly classifies public endpoints
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import type { Vulnerability, VulnerabilitySeverity } from '
|
|
12
|
-
import type { ParsedFile } from '
|
|
13
|
-
import type { MiddlewareAuthConfig } from '
|
|
14
|
-
import { isRouteProtectedByMiddleware, getRoutePathFromFile } from '
|
|
15
|
-
import type { AuthHelper, AuthHelperContext } from '
|
|
16
|
-
import { hasAuthHelperCallBefore, isUserIdAlreadyValidated } from '
|
|
17
|
-
import type { FileAuthImports } from '
|
|
18
|
-
import { isScannerOrFixtureFile } from '
|
|
19
|
-
import { getRouteProtectionContext, isAuthenticatedOnlyComponent } from '
|
|
20
|
-
import { is2FAOrValidation } from '
|
|
21
|
-
import { isPasswordErrorCode, hasPasswordValueInError } from '
|
|
11
|
+
import type { Vulnerability, VulnerabilitySeverity } from '../../shared/types'
|
|
12
|
+
import type { ParsedFile } from '../../shared/parsed-file'
|
|
13
|
+
import type { MiddlewareAuthConfig } from '../../model/middleware-detector'
|
|
14
|
+
import { isRouteProtectedByMiddleware, getRoutePathFromFile } from '../../model/middleware-detector'
|
|
15
|
+
import type { AuthHelper, AuthHelperContext } from '../../model/auth-helper-detector'
|
|
16
|
+
import { hasAuthHelperCallBefore, isUserIdAlreadyValidated } from '../../model/auth-helper-detector'
|
|
17
|
+
import type { FileAuthImports } from '../../model/imported-auth-detector'
|
|
18
|
+
import { isScannerOrFixtureFile } from '../../parse/file-classifier'
|
|
19
|
+
import { getRouteProtectionContext, isAuthenticatedOnlyComponent } from '../../model/route-hierarchy'
|
|
20
|
+
import { is2FAOrValidation } from '../../shared/schema-semantics'
|
|
21
|
+
import { isPasswordErrorCode, hasPasswordValueInError } from '../../shared/intent-detector'
|
|
22
|
+
|
|
23
|
+
const BASE_CONFIDENCE = 0.40
|
|
22
24
|
|
|
23
25
|
interface AuthAntiPattern {
|
|
24
26
|
name: string
|
|
@@ -457,7 +459,9 @@ export function detectAuthAntipatterns(
|
|
|
457
459
|
description: `This route is within a protected route hierarchy (${routeHierarchy.protectionSource.join(', ')}). Authentication is likely handled by parent layout/middleware.`,
|
|
458
460
|
suggestedFix: 'Verify parent layout enforces authentication. If not, add auth check here.',
|
|
459
461
|
confidence: 'low',
|
|
462
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
460
463
|
layer: 2,
|
|
464
|
+
source: 'structural' as const,
|
|
461
465
|
})
|
|
462
466
|
break // Only report once per line
|
|
463
467
|
}
|
|
@@ -504,7 +508,9 @@ export function detectAuthAntipatterns(
|
|
|
504
508
|
description: 'This appears to be a public endpoint (health check, webhook, cron, etc.). Verify this is intentionally public and consider rate limiting if needed.',
|
|
505
509
|
suggestedFix: 'If this is a webhook or cron endpoint, ensure it has appropriate authentication (API keys, signatures, etc.). Health checks typically do not need auth.',
|
|
506
510
|
confidence: 'low',
|
|
511
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
507
512
|
layer: 2,
|
|
513
|
+
source: 'structural' as const,
|
|
508
514
|
})
|
|
509
515
|
break // Only report once per line
|
|
510
516
|
}
|
|
@@ -522,7 +528,9 @@ export function detectAuthAntipatterns(
|
|
|
522
528
|
description: pattern.description + ' (auth check detected in nearby lines)',
|
|
523
529
|
suggestedFix: pattern.suggestedFix,
|
|
524
530
|
confidence: 'low',
|
|
531
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
525
532
|
layer: 2,
|
|
533
|
+
source: 'structural' as const,
|
|
526
534
|
})
|
|
527
535
|
break // Only report once per line
|
|
528
536
|
}
|
|
@@ -543,7 +551,9 @@ export function detectAuthAntipatterns(
|
|
|
543
551
|
description: pattern.description,
|
|
544
552
|
suggestedFix: pattern.suggestedFix,
|
|
545
553
|
confidence,
|
|
554
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
546
555
|
layer: 2,
|
|
556
|
+
source: 'structural' as const,
|
|
547
557
|
})
|
|
548
558
|
break // Only report once per line
|
|
549
559
|
}
|
|
@@ -578,7 +588,9 @@ export function detectAuthAntipatterns(
|
|
|
578
588
|
description: 'Actual password value may be included in error message, exposing sensitive data.',
|
|
579
589
|
suggestedFix: 'Never include actual password values in error messages. Use error codes instead.',
|
|
580
590
|
confidence: 'high',
|
|
591
|
+
baseConfidence: BASE_CONFIDENCE,
|
|
581
592
|
layer: 2,
|
|
593
|
+
source: 'structural' as const,
|
|
582
594
|
})
|
|
583
595
|
}
|
|
584
596
|
}
|