@oculum/scanner 1.0.9 → 1.0.11
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/baseline/diff.d.ts +32 -0
- package/dist/baseline/diff.d.ts.map +1 -0
- package/dist/baseline/diff.js +119 -0
- package/dist/baseline/diff.js.map +1 -0
- package/dist/baseline/index.d.ts +9 -0
- package/dist/baseline/index.d.ts.map +1 -0
- package/dist/baseline/index.js +19 -0
- package/dist/baseline/index.js.map +1 -0
- package/dist/baseline/manager.d.ts +67 -0
- package/dist/baseline/manager.d.ts.map +1 -0
- package/dist/baseline/manager.js +180 -0
- package/dist/baseline/manager.js.map +1 -0
- package/dist/baseline/types.d.ts +91 -0
- package/dist/baseline/types.d.ts.map +1 -0
- package/dist/baseline/types.js +12 -0
- package/dist/baseline/types.js.map +1 -0
- package/dist/formatters/cli-terminal.d.ts +38 -0
- package/dist/formatters/cli-terminal.d.ts.map +1 -1
- package/dist/formatters/cli-terminal.js +365 -42
- package/dist/formatters/cli-terminal.js.map +1 -1
- package/dist/formatters/github-comment.d.ts +1 -1
- package/dist/formatters/github-comment.d.ts.map +1 -1
- package/dist/formatters/github-comment.js +75 -11
- package/dist/formatters/github-comment.js.map +1 -1
- package/dist/formatters/index.d.ts +1 -1
- package/dist/formatters/index.d.ts.map +1 -1
- package/dist/formatters/index.js +4 -1
- package/dist/formatters/index.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +155 -16
- package/dist/index.js.map +1 -1
- package/dist/layer1/config-audit.d.ts.map +1 -1
- package/dist/layer1/config-audit.js +20 -3
- package/dist/layer1/config-audit.js.map +1 -1
- package/dist/layer1/config-mcp-audit.d.ts +20 -0
- package/dist/layer1/config-mcp-audit.d.ts.map +1 -0
- package/dist/layer1/config-mcp-audit.js +239 -0
- package/dist/layer1/config-mcp-audit.js.map +1 -0
- package/dist/layer1/index.d.ts +1 -0
- package/dist/layer1/index.d.ts.map +1 -1
- package/dist/layer1/index.js +9 -1
- package/dist/layer1/index.js.map +1 -1
- package/dist/layer2/ai-agent-tools.d.ts.map +1 -1
- package/dist/layer2/ai-agent-tools.js +303 -0
- package/dist/layer2/ai-agent-tools.js.map +1 -1
- package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -1
- package/dist/layer2/ai-endpoint-protection.js +17 -3
- package/dist/layer2/ai-endpoint-protection.js.map +1 -1
- package/dist/layer2/ai-execution-sinks.d.ts.map +1 -1
- package/dist/layer2/ai-execution-sinks.js +462 -12
- package/dist/layer2/ai-execution-sinks.js.map +1 -1
- package/dist/layer2/ai-fingerprinting.d.ts.map +1 -1
- package/dist/layer2/ai-fingerprinting.js +3 -0
- package/dist/layer2/ai-fingerprinting.js.map +1 -1
- package/dist/layer2/ai-mcp-security.d.ts +17 -0
- package/dist/layer2/ai-mcp-security.d.ts.map +1 -0
- package/dist/layer2/ai-mcp-security.js +679 -0
- package/dist/layer2/ai-mcp-security.js.map +1 -0
- package/dist/layer2/ai-package-hallucination.d.ts +19 -0
- package/dist/layer2/ai-package-hallucination.d.ts.map +1 -0
- package/dist/layer2/ai-package-hallucination.js +696 -0
- package/dist/layer2/ai-package-hallucination.js.map +1 -0
- package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -1
- package/dist/layer2/ai-prompt-hygiene.js +495 -9
- package/dist/layer2/ai-prompt-hygiene.js.map +1 -1
- package/dist/layer2/ai-rag-safety.d.ts.map +1 -1
- package/dist/layer2/ai-rag-safety.js +372 -1
- package/dist/layer2/ai-rag-safety.js.map +1 -1
- package/dist/layer2/auth-antipatterns.d.ts.map +1 -1
- package/dist/layer2/auth-antipatterns.js +4 -0
- package/dist/layer2/auth-antipatterns.js.map +1 -1
- package/dist/layer2/byok-patterns.d.ts.map +1 -1
- package/dist/layer2/byok-patterns.js +3 -0
- package/dist/layer2/byok-patterns.js.map +1 -1
- package/dist/layer2/dangerous-functions/child-process.d.ts +16 -0
- package/dist/layer2/dangerous-functions/child-process.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/child-process.js +74 -0
- package/dist/layer2/dangerous-functions/child-process.js.map +1 -0
- package/dist/layer2/dangerous-functions/dom-xss.d.ts +29 -0
- package/dist/layer2/dangerous-functions/dom-xss.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/dom-xss.js +179 -0
- package/dist/layer2/dangerous-functions/dom-xss.js.map +1 -0
- package/dist/layer2/dangerous-functions/index.d.ts +13 -0
- package/dist/layer2/dangerous-functions/index.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/index.js +621 -0
- package/dist/layer2/dangerous-functions/index.js.map +1 -0
- package/dist/layer2/dangerous-functions/json-parse.d.ts +31 -0
- package/dist/layer2/dangerous-functions/json-parse.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/json-parse.js +319 -0
- package/dist/layer2/dangerous-functions/json-parse.js.map +1 -0
- package/dist/layer2/dangerous-functions/math-random.d.ts +61 -0
- package/dist/layer2/dangerous-functions/math-random.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/math-random.js +459 -0
- package/dist/layer2/dangerous-functions/math-random.js.map +1 -0
- package/dist/layer2/dangerous-functions/patterns.d.ts +21 -0
- package/dist/layer2/dangerous-functions/patterns.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/patterns.js +161 -0
- package/dist/layer2/dangerous-functions/patterns.js.map +1 -0
- package/dist/layer2/dangerous-functions/request-validation.d.ts +13 -0
- package/dist/layer2/dangerous-functions/request-validation.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/request-validation.js +119 -0
- package/dist/layer2/dangerous-functions/request-validation.js.map +1 -0
- package/dist/layer2/dangerous-functions/utils/control-flow.d.ts +23 -0
- package/dist/layer2/dangerous-functions/utils/control-flow.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/utils/control-flow.js +149 -0
- package/dist/layer2/dangerous-functions/utils/control-flow.js.map +1 -0
- package/dist/layer2/dangerous-functions/utils/helpers.d.ts +31 -0
- package/dist/layer2/dangerous-functions/utils/helpers.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/utils/helpers.js +124 -0
- package/dist/layer2/dangerous-functions/utils/helpers.js.map +1 -0
- package/dist/layer2/dangerous-functions/utils/index.d.ts +9 -0
- package/dist/layer2/dangerous-functions/utils/index.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/utils/index.js +23 -0
- package/dist/layer2/dangerous-functions/utils/index.js.map +1 -0
- package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts +22 -0
- package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/utils/schema-validation.js +89 -0
- package/dist/layer2/dangerous-functions/utils/schema-validation.js.map +1 -0
- package/dist/layer2/data-exposure.d.ts.map +1 -1
- package/dist/layer2/data-exposure.js +3 -0
- package/dist/layer2/data-exposure.js.map +1 -1
- package/dist/layer2/framework-checks.d.ts.map +1 -1
- package/dist/layer2/framework-checks.js +3 -0
- package/dist/layer2/framework-checks.js.map +1 -1
- package/dist/layer2/index.d.ts +3 -0
- package/dist/layer2/index.d.ts.map +1 -1
- package/dist/layer2/index.js +61 -2
- package/dist/layer2/index.js.map +1 -1
- package/dist/layer2/logic-gates.d.ts.map +1 -1
- package/dist/layer2/logic-gates.js +4 -0
- package/dist/layer2/logic-gates.js.map +1 -1
- package/dist/layer2/model-supply-chain.d.ts +20 -0
- package/dist/layer2/model-supply-chain.d.ts.map +1 -0
- package/dist/layer2/model-supply-chain.js +376 -0
- package/dist/layer2/model-supply-chain.js.map +1 -0
- package/dist/layer2/risky-imports.d.ts.map +1 -1
- package/dist/layer2/risky-imports.js +4 -0
- package/dist/layer2/risky-imports.js.map +1 -1
- package/dist/layer2/variables.d.ts.map +1 -1
- package/dist/layer2/variables.js +4 -0
- package/dist/layer2/variables.js.map +1 -1
- package/dist/layer3/anthropic/auto-dismiss.d.ts +24 -0
- package/dist/layer3/anthropic/auto-dismiss.d.ts.map +1 -0
- package/dist/layer3/anthropic/auto-dismiss.js +188 -0
- package/dist/layer3/anthropic/auto-dismiss.js.map +1 -0
- package/dist/layer3/anthropic/clients.d.ts +44 -0
- package/dist/layer3/anthropic/clients.d.ts.map +1 -0
- package/dist/layer3/anthropic/clients.js +81 -0
- package/dist/layer3/anthropic/clients.js.map +1 -0
- package/dist/layer3/anthropic/index.d.ts +41 -0
- package/dist/layer3/anthropic/index.d.ts.map +1 -0
- package/dist/layer3/anthropic/index.js +141 -0
- package/dist/layer3/anthropic/index.js.map +1 -0
- package/dist/layer3/anthropic/prompts/index.d.ts +8 -0
- package/dist/layer3/anthropic/prompts/index.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/index.js +14 -0
- package/dist/layer3/anthropic/prompts/index.js.map +1 -0
- package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts +15 -0
- package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/semantic-analysis.js +169 -0
- package/dist/layer3/anthropic/prompts/semantic-analysis.js.map +1 -0
- package/dist/layer3/anthropic/prompts/validation.d.ts +12 -0
- package/dist/layer3/anthropic/prompts/validation.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/validation.js +421 -0
- package/dist/layer3/anthropic/prompts/validation.js.map +1 -0
- package/dist/layer3/anthropic/providers/anthropic.d.ts +21 -0
- package/dist/layer3/anthropic/providers/anthropic.d.ts.map +1 -0
- package/dist/layer3/anthropic/providers/anthropic.js +266 -0
- package/dist/layer3/anthropic/providers/anthropic.js.map +1 -0
- package/dist/layer3/anthropic/providers/index.d.ts +8 -0
- package/dist/layer3/anthropic/providers/index.d.ts.map +1 -0
- package/dist/layer3/anthropic/providers/index.js +15 -0
- package/dist/layer3/anthropic/providers/index.js.map +1 -0
- package/dist/layer3/anthropic/providers/openai.d.ts +18 -0
- package/dist/layer3/anthropic/providers/openai.d.ts.map +1 -0
- package/dist/layer3/anthropic/providers/openai.js +340 -0
- package/dist/layer3/anthropic/providers/openai.js.map +1 -0
- package/dist/layer3/anthropic/request-builder.d.ts +20 -0
- package/dist/layer3/anthropic/request-builder.d.ts.map +1 -0
- package/dist/layer3/anthropic/request-builder.js +134 -0
- package/dist/layer3/anthropic/request-builder.js.map +1 -0
- package/dist/layer3/anthropic/types.d.ts +88 -0
- package/dist/layer3/anthropic/types.d.ts.map +1 -0
- package/dist/layer3/anthropic/types.js +38 -0
- package/dist/layer3/anthropic/types.js.map +1 -0
- package/dist/layer3/anthropic/utils/index.d.ts +9 -0
- package/dist/layer3/anthropic/utils/index.d.ts.map +1 -0
- package/dist/layer3/anthropic/utils/index.js +24 -0
- package/dist/layer3/anthropic/utils/index.js.map +1 -0
- package/dist/layer3/anthropic/utils/path-helpers.d.ts +21 -0
- package/dist/layer3/anthropic/utils/path-helpers.d.ts.map +1 -0
- package/dist/layer3/anthropic/utils/path-helpers.js +69 -0
- package/dist/layer3/anthropic/utils/path-helpers.js.map +1 -0
- package/dist/layer3/anthropic/utils/response-parser.d.ts +40 -0
- package/dist/layer3/anthropic/utils/response-parser.d.ts.map +1 -0
- package/dist/layer3/anthropic/utils/response-parser.js +285 -0
- package/dist/layer3/anthropic/utils/response-parser.js.map +1 -0
- package/dist/layer3/anthropic/utils/retry.d.ts +15 -0
- package/dist/layer3/anthropic/utils/retry.d.ts.map +1 -0
- package/dist/layer3/anthropic/utils/retry.js +62 -0
- package/dist/layer3/anthropic/utils/retry.js.map +1 -0
- package/dist/layer3/index.d.ts +1 -0
- package/dist/layer3/index.d.ts.map +1 -1
- package/dist/layer3/index.js +16 -6
- package/dist/layer3/index.js.map +1 -1
- package/dist/layer3/osv-check.d.ts +75 -0
- package/dist/layer3/osv-check.d.ts.map +1 -0
- package/dist/layer3/osv-check.js +308 -0
- package/dist/layer3/osv-check.js.map +1 -0
- package/dist/rules/framework-fixes.d.ts +48 -0
- package/dist/rules/framework-fixes.d.ts.map +1 -0
- package/dist/rules/framework-fixes.js +439 -0
- package/dist/rules/framework-fixes.js.map +1 -0
- package/dist/rules/index.d.ts +8 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +18 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/metadata.d.ts +43 -0
- package/dist/rules/metadata.d.ts.map +1 -0
- package/dist/rules/metadata.js +734 -0
- package/dist/rules/metadata.js.map +1 -0
- package/dist/suppression/config-loader.d.ts +74 -0
- package/dist/suppression/config-loader.d.ts.map +1 -0
- package/dist/suppression/config-loader.js +424 -0
- package/dist/suppression/config-loader.js.map +1 -0
- package/dist/suppression/hash.d.ts +48 -0
- package/dist/suppression/hash.d.ts.map +1 -0
- package/dist/suppression/hash.js +88 -0
- package/dist/suppression/hash.js.map +1 -0
- package/dist/suppression/index.d.ts +11 -0
- package/dist/suppression/index.d.ts.map +1 -0
- package/dist/suppression/index.js +39 -0
- package/dist/suppression/index.js.map +1 -0
- package/dist/suppression/inline-parser.d.ts +39 -0
- package/dist/suppression/inline-parser.d.ts.map +1 -0
- package/dist/suppression/inline-parser.js +218 -0
- package/dist/suppression/inline-parser.js.map +1 -0
- package/dist/suppression/manager.d.ts +94 -0
- package/dist/suppression/manager.d.ts.map +1 -0
- package/dist/suppression/manager.js +292 -0
- package/dist/suppression/manager.js.map +1 -0
- package/dist/suppression/types.d.ts +151 -0
- package/dist/suppression/types.d.ts.map +1 -0
- package/dist/suppression/types.js +28 -0
- package/dist/suppression/types.js.map +1 -0
- package/dist/tiers.d.ts +1 -1
- package/dist/tiers.d.ts.map +1 -1
- package/dist/tiers.js +27 -0
- package/dist/tiers.js.map +1 -1
- package/dist/types.d.ts +62 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/context-helpers.d.ts +4 -0
- package/dist/utils/context-helpers.d.ts.map +1 -1
- package/dist/utils/context-helpers.js +13 -9
- package/dist/utils/context-helpers.js.map +1 -1
- package/package.json +4 -2
- package/src/__tests__/benchmark/fixtures/layer1/mcp-config-audit.json +31 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +1489 -82
- package/src/__tests__/benchmark/fixtures/layer2/ai-mcp-security.ts +495 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-package-hallucination.ts +255 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-prompt-hygiene.ts +300 -1
- package/src/__tests__/benchmark/fixtures/layer2/ai-rag-safety.ts +139 -0
- package/src/__tests__/benchmark/fixtures/layer2/byok-patterns.ts +7 -0
- package/src/__tests__/benchmark/fixtures/layer2/data-exposure.ts +63 -0
- package/src/__tests__/benchmark/fixtures/layer2/excessive-agency.ts +221 -0
- package/src/__tests__/benchmark/fixtures/layer2/index.ts +18 -0
- package/src/__tests__/benchmark/fixtures/layer2/model-supply-chain.ts +204 -0
- package/src/__tests__/benchmark/fixtures/layer2/phase1-enhancements.ts +157 -0
- package/src/__tests__/snapshots/__snapshots__/anthropic-validation-refactor.test.ts.snap +758 -0
- package/src/__tests__/snapshots/__snapshots__/dangerous-functions-refactor.test.ts.snap +503 -0
- package/src/__tests__/snapshots/anthropic-validation-refactor.test.ts +321 -0
- package/src/__tests__/snapshots/dangerous-functions-refactor.test.ts +439 -0
- package/src/baseline/__tests__/diff.test.ts +261 -0
- package/src/baseline/__tests__/manager.test.ts +225 -0
- package/src/baseline/diff.ts +135 -0
- package/src/baseline/index.ts +29 -0
- package/src/baseline/manager.ts +230 -0
- package/src/baseline/types.ts +97 -0
- package/src/formatters/cli-terminal.ts +444 -41
- package/src/formatters/github-comment.ts +79 -11
- package/src/formatters/index.ts +4 -0
- package/src/index.ts +197 -14
- package/src/layer1/config-audit.ts +24 -3
- package/src/layer1/config-mcp-audit.ts +276 -0
- package/src/layer1/index.ts +16 -6
- package/src/layer2/ai-agent-tools.ts +336 -0
- package/src/layer2/ai-endpoint-protection.ts +16 -3
- package/src/layer2/ai-execution-sinks.ts +516 -12
- package/src/layer2/ai-fingerprinting.ts +5 -1
- package/src/layer2/ai-mcp-security.ts +730 -0
- package/src/layer2/ai-package-hallucination.ts +791 -0
- package/src/layer2/ai-prompt-hygiene.ts +547 -9
- package/src/layer2/ai-rag-safety.ts +382 -3
- package/src/layer2/auth-antipatterns.ts +5 -0
- package/src/layer2/byok-patterns.ts +5 -1
- package/src/layer2/dangerous-functions/child-process.ts +98 -0
- package/src/layer2/dangerous-functions/dom-xss.ts +220 -0
- package/src/layer2/dangerous-functions/index.ts +949 -0
- package/src/layer2/dangerous-functions/json-parse.ts +385 -0
- package/src/layer2/dangerous-functions/math-random.ts +537 -0
- package/src/layer2/dangerous-functions/patterns.ts +174 -0
- package/src/layer2/dangerous-functions/request-validation.ts +145 -0
- package/src/layer2/dangerous-functions/utils/control-flow.ts +162 -0
- package/src/layer2/dangerous-functions/utils/helpers.ts +170 -0
- package/src/layer2/dangerous-functions/utils/index.ts +25 -0
- package/src/layer2/dangerous-functions/utils/schema-validation.ts +91 -0
- package/src/layer2/data-exposure.ts +5 -1
- package/src/layer2/framework-checks.ts +5 -0
- package/src/layer2/index.ts +63 -1
- package/src/layer2/logic-gates.ts +5 -0
- package/src/layer2/model-supply-chain.ts +456 -0
- package/src/layer2/risky-imports.ts +5 -0
- package/src/layer2/variables.ts +5 -0
- package/src/layer3/__tests__/osv-check.test.ts +384 -0
- package/src/layer3/anthropic/auto-dismiss.ts +212 -0
- package/src/layer3/anthropic/clients.ts +84 -0
- package/src/layer3/anthropic/index.ts +170 -0
- package/src/layer3/anthropic/prompts/index.ts +14 -0
- package/src/layer3/anthropic/prompts/semantic-analysis.ts +173 -0
- package/src/layer3/anthropic/prompts/validation.ts +419 -0
- package/src/layer3/anthropic/providers/anthropic.ts +310 -0
- package/src/layer3/anthropic/providers/index.ts +8 -0
- package/src/layer3/anthropic/providers/openai.ts +384 -0
- package/src/layer3/anthropic/request-builder.ts +150 -0
- package/src/layer3/anthropic/types.ts +148 -0
- package/src/layer3/anthropic/utils/index.ts +26 -0
- package/src/layer3/anthropic/utils/path-helpers.ts +68 -0
- package/src/layer3/anthropic/utils/response-parser.ts +322 -0
- package/src/layer3/anthropic/utils/retry.ts +75 -0
- package/src/layer3/index.ts +18 -5
- package/src/layer3/osv-check.ts +420 -0
- package/src/rules/__tests__/framework-fixes.test.ts +689 -0
- package/src/rules/__tests__/metadata.test.ts +218 -0
- package/src/rules/framework-fixes.ts +470 -0
- package/src/rules/index.ts +21 -0
- package/src/rules/metadata.ts +831 -0
- package/src/suppression/__tests__/config-loader.test.ts +382 -0
- package/src/suppression/__tests__/hash.test.ts +166 -0
- package/src/suppression/__tests__/inline-parser.test.ts +212 -0
- package/src/suppression/__tests__/manager.test.ts +415 -0
- package/src/suppression/config-loader.ts +462 -0
- package/src/suppression/hash.ts +95 -0
- package/src/suppression/index.ts +51 -0
- package/src/suppression/inline-parser.ts +273 -0
- package/src/suppression/manager.ts +379 -0
- package/src/suppression/types.ts +174 -0
- package/src/tiers.ts +36 -0
- package/src/types.ts +90 -0
- package/src/utils/context-helpers.ts +13 -9
- package/dist/layer2/dangerous-functions.d.ts +0 -7
- package/dist/layer2/dangerous-functions.d.ts.map +0 -1
- package/dist/layer2/dangerous-functions.js +0 -1701
- package/dist/layer2/dangerous-functions.js.map +0 -1
- package/dist/layer3/anthropic.d.ts +0 -87
- package/dist/layer3/anthropic.d.ts.map +0 -1
- package/dist/layer3/anthropic.js +0 -1948
- package/dist/layer3/anthropic.js.map +0 -1
- package/dist/layer3/openai.d.ts +0 -25
- package/dist/layer3/openai.d.ts.map +0 -1
- package/dist/layer3/openai.js +0 -238
- package/dist/layer3/openai.js.map +0 -1
- package/src/layer2/dangerous-functions.ts +0 -1940
- package/src/layer3/anthropic.ts +0 -2257
package/dist/layer3/index.js
CHANGED
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
* Deep security analysis using Claude AI and package verification
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.checkPackages = exports.batchAnalyzeWithAI = exports.analyzeWithAI = void 0;
|
|
7
|
+
exports.checkPackageAdvisories = exports.checkPackages = exports.batchAnalyzeWithAI = exports.analyzeWithAI = void 0;
|
|
8
8
|
exports.runLayer3Scan = runLayer3Scan;
|
|
9
9
|
const anthropic_1 = require("./anthropic");
|
|
10
10
|
const package_check_1 = require("./package-check");
|
|
11
|
+
const osv_check_1 = require("./osv-check");
|
|
11
12
|
// File extensions that benefit most from AI analysis
|
|
12
13
|
const AI_PRIORITY_EXTENSIONS = [
|
|
13
14
|
'.ts', '.tsx', '.js', '.jsx', '.mjs',
|
|
@@ -32,14 +33,21 @@ async function runLayer3Scan(files, options = {}) {
|
|
|
32
33
|
aiAnalyzed: 0,
|
|
33
34
|
};
|
|
34
35
|
}
|
|
35
|
-
// 1. Check packages (
|
|
36
|
-
const
|
|
37
|
-
|
|
36
|
+
// 1. Check packages for hallucination/risk (package.json and requirements.txt)
|
|
37
|
+
const packageManifests = files.filter(f => f.path.endsWith('package.json') ||
|
|
38
|
+
f.path.endsWith('requirements.txt'));
|
|
39
|
+
for (const file of packageManifests) {
|
|
38
40
|
// Check for cancellation in package loop
|
|
39
41
|
if (options.cancellationToken?.cancelled)
|
|
40
42
|
break;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
+
// Run hallucination/risk check (package-check only handles package.json)
|
|
44
|
+
if (file.path.endsWith('package.json')) {
|
|
45
|
+
const packageFindings = await (0, package_check_1.checkPackages)(file.content, file.path);
|
|
46
|
+
vulnerabilities.push(...packageFindings);
|
|
47
|
+
}
|
|
48
|
+
// Run OSV advisory check (handles both npm and Python)
|
|
49
|
+
const osvFindings = await (0, osv_check_1.checkPackageAdvisories)(file.content, file.path);
|
|
50
|
+
vulnerabilities.push(...osvFindings);
|
|
43
51
|
}
|
|
44
52
|
// Check for cancellation before AI analysis
|
|
45
53
|
if (options.cancellationToken?.cancelled) {
|
|
@@ -137,4 +145,6 @@ Object.defineProperty(exports, "analyzeWithAI", { enumerable: true, get: functio
|
|
|
137
145
|
Object.defineProperty(exports, "batchAnalyzeWithAI", { enumerable: true, get: function () { return anthropic_2.batchAnalyzeWithAI; } });
|
|
138
146
|
var package_check_2 = require("./package-check");
|
|
139
147
|
Object.defineProperty(exports, "checkPackages", { enumerable: true, get: function () { return package_check_2.checkPackages; } });
|
|
148
|
+
var osv_check_2 = require("./osv-check");
|
|
149
|
+
Object.defineProperty(exports, "checkPackageAdvisories", { enumerable: true, get: function () { return osv_check_2.checkPackageAdvisories; } });
|
|
140
150
|
//# sourceMappingURL=index.js.map
|
package/dist/layer3/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/layer3/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/layer3/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer 3: OSV/Security Advisory Integration
|
|
3
|
+
* Checks packages against OSV.dev for known vulnerabilities
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Queries OSV.dev API for known malicious/vulnerable packages
|
|
7
|
+
* - Caches advisories for efficiency
|
|
8
|
+
* - Supports npm and PyPI ecosystems
|
|
9
|
+
*/
|
|
10
|
+
import type { Vulnerability, VulnerabilitySeverity } from '../types';
|
|
11
|
+
interface OSVVulnerability {
|
|
12
|
+
id: string;
|
|
13
|
+
summary?: string;
|
|
14
|
+
details?: string;
|
|
15
|
+
severity?: Array<{
|
|
16
|
+
type: string;
|
|
17
|
+
score: string;
|
|
18
|
+
}>;
|
|
19
|
+
references?: Array<{
|
|
20
|
+
type: string;
|
|
21
|
+
url: string;
|
|
22
|
+
}>;
|
|
23
|
+
affected?: Array<{
|
|
24
|
+
package: {
|
|
25
|
+
name: string;
|
|
26
|
+
ecosystem: string;
|
|
27
|
+
};
|
|
28
|
+
ranges?: Array<{
|
|
29
|
+
type: string;
|
|
30
|
+
events: Array<{
|
|
31
|
+
introduced?: string;
|
|
32
|
+
fixed?: string;
|
|
33
|
+
}>;
|
|
34
|
+
}>;
|
|
35
|
+
}>;
|
|
36
|
+
database_specific?: {
|
|
37
|
+
malicious?: boolean;
|
|
38
|
+
severity?: string;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
interface CachedAdvisory {
|
|
42
|
+
timestamp: number;
|
|
43
|
+
advisories: OSVVulnerability[];
|
|
44
|
+
}
|
|
45
|
+
declare const advisoryCache: Map<string, CachedAdvisory>;
|
|
46
|
+
/**
|
|
47
|
+
* Get cache key for a package
|
|
48
|
+
*/
|
|
49
|
+
declare function getCacheKey(name: string, ecosystem: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* Query OSV.dev for vulnerabilities affecting a single package
|
|
52
|
+
*/
|
|
53
|
+
declare function queryOSV(packageName: string, ecosystem: 'npm' | 'PyPI', version?: string): Promise<OSVVulnerability[]>;
|
|
54
|
+
/**
|
|
55
|
+
* Query OSV.dev for multiple packages in batch
|
|
56
|
+
*/
|
|
57
|
+
declare function queryOSVBatch(packages: Array<{
|
|
58
|
+
name: string;
|
|
59
|
+
ecosystem: 'npm' | 'PyPI';
|
|
60
|
+
version?: string;
|
|
61
|
+
}>): Promise<Map<string, OSVVulnerability[]>>;
|
|
62
|
+
/**
|
|
63
|
+
* Determine severity from OSV vulnerability
|
|
64
|
+
*/
|
|
65
|
+
declare function mapOSVSeverity(vuln: OSVVulnerability): VulnerabilitySeverity;
|
|
66
|
+
/**
|
|
67
|
+
* Check if vulnerability is for a malicious package
|
|
68
|
+
*/
|
|
69
|
+
declare function isMaliciousPackage(vuln: OSVVulnerability): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Check packages in a file for known vulnerabilities via OSV.dev
|
|
72
|
+
*/
|
|
73
|
+
export declare function checkPackageAdvisories(content: string, filePath: string): Promise<Vulnerability[]>;
|
|
74
|
+
export { queryOSV, queryOSVBatch, mapOSVSeverity, isMaliciousPackage, getCacheKey, advisoryCache, };
|
|
75
|
+
//# sourceMappingURL=osv-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"osv-check.d.ts","sourceRoot":"","sources":["../../src/layer3/osv-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAmCpE,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;KACd,CAAC,CAAA;IACF,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,IAAI,EAAE,MAAM,CAAA;QACZ,GAAG,EAAE,MAAM,CAAA;KACZ,CAAC,CAAA;IACF,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAA;YACZ,SAAS,EAAE,MAAM,CAAA;SAClB,CAAA;QACD,MAAM,CAAC,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAA;YACZ,MAAM,EAAE,KAAK,CAAC;gBAAE,UAAU,CAAC,EAAE,MAAM,CAAC;gBAAC,KAAK,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SACvD,CAAC,CAAA;KACH,CAAC,CAAA;IACF,iBAAiB,CAAC,EAAE;QAClB,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,CAAA;CACF;AAUD,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,gBAAgB,EAAE,CAAA;CAC/B;AAMD,QAAA,MAAM,aAAa,6BAAoC,CAAA;AAEvD;;GAEG;AACH,iBAAS,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D;AAoCD;;GAEG;AACH,iBAAe,QAAQ,CACrB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,KAAK,GAAG,MAAM,EACzB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA4C7B;AAED;;GAEG;AACH,iBAAe,aAAa,CAC1B,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC7E,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAgE1C;AAMD;;GAEG;AACH,iBAAS,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,qBAAqB,CA2BrE;AAED;;GAEG;AACH,iBAAS,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAI3D;AAMD;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,EAAE,CAAC,CAiG1B;AAGD,OAAO,EACL,QAAQ,EACR,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,aAAa,GACd,CAAA"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Layer 3: OSV/Security Advisory Integration
|
|
4
|
+
* Checks packages against OSV.dev for known vulnerabilities
|
|
5
|
+
*
|
|
6
|
+
* Features:
|
|
7
|
+
* - Queries OSV.dev API for known malicious/vulnerable packages
|
|
8
|
+
* - Caches advisories for efficiency
|
|
9
|
+
* - Supports npm and PyPI ecosystems
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.advisoryCache = void 0;
|
|
13
|
+
exports.checkPackageAdvisories = checkPackageAdvisories;
|
|
14
|
+
exports.queryOSV = queryOSV;
|
|
15
|
+
exports.queryOSVBatch = queryOSVBatch;
|
|
16
|
+
exports.mapOSVSeverity = mapOSVSeverity;
|
|
17
|
+
exports.isMaliciousPackage = isMaliciousPackage;
|
|
18
|
+
exports.getCacheKey = getCacheKey;
|
|
19
|
+
const registry_clients_1 = require("../utils/registry-clients");
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Configuration
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// OSV API endpoint
|
|
24
|
+
const OSV_API_URL = 'https://api.osv.dev/v1/query';
|
|
25
|
+
const OSV_BATCH_URL = 'https://api.osv.dev/v1/querybatch';
|
|
26
|
+
// Cache TTL (24 hours)
|
|
27
|
+
const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
28
|
+
// Maximum packages to check per scan (cost/time control)
|
|
29
|
+
const MAX_PACKAGES_TO_CHECK = 100;
|
|
30
|
+
// ============================================================================
|
|
31
|
+
// Advisory Cache
|
|
32
|
+
// ============================================================================
|
|
33
|
+
const advisoryCache = new Map();
|
|
34
|
+
exports.advisoryCache = advisoryCache;
|
|
35
|
+
/**
|
|
36
|
+
* Get cache key for a package
|
|
37
|
+
*/
|
|
38
|
+
function getCacheKey(name, ecosystem) {
|
|
39
|
+
return `${ecosystem}:${name.toLowerCase()}`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check if cached advisory is still valid
|
|
43
|
+
*/
|
|
44
|
+
function isCacheValid(cached) {
|
|
45
|
+
return Date.now() - cached.timestamp < CACHE_TTL_MS;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get cached advisories for a package
|
|
49
|
+
*/
|
|
50
|
+
function getCachedAdvisories(name, ecosystem) {
|
|
51
|
+
const key = getCacheKey(name, ecosystem);
|
|
52
|
+
const cached = advisoryCache.get(key);
|
|
53
|
+
if (cached && isCacheValid(cached)) {
|
|
54
|
+
return cached.advisories;
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Cache advisories for a package
|
|
60
|
+
*/
|
|
61
|
+
function cacheAdvisories(name, ecosystem, advisories) {
|
|
62
|
+
const key = getCacheKey(name, ecosystem);
|
|
63
|
+
advisoryCache.set(key, {
|
|
64
|
+
timestamp: Date.now(),
|
|
65
|
+
advisories,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
// ============================================================================
|
|
69
|
+
// OSV API Client
|
|
70
|
+
// ============================================================================
|
|
71
|
+
/**
|
|
72
|
+
* Query OSV.dev for vulnerabilities affecting a single package
|
|
73
|
+
*/
|
|
74
|
+
async function queryOSV(packageName, ecosystem, version) {
|
|
75
|
+
// Check cache first
|
|
76
|
+
const cached = getCachedAdvisories(packageName, ecosystem);
|
|
77
|
+
if (cached !== null) {
|
|
78
|
+
return cached;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const query = {
|
|
82
|
+
package: {
|
|
83
|
+
name: packageName,
|
|
84
|
+
ecosystem,
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
if (version) {
|
|
88
|
+
query.version = version;
|
|
89
|
+
}
|
|
90
|
+
const response = await fetch(OSV_API_URL, {
|
|
91
|
+
method: 'POST',
|
|
92
|
+
headers: {
|
|
93
|
+
'Content-Type': 'application/json',
|
|
94
|
+
},
|
|
95
|
+
body: JSON.stringify(query),
|
|
96
|
+
});
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
// Don't throw - gracefully degrade
|
|
99
|
+
cacheAdvisories(packageName, ecosystem, []);
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
const data = (await response.json());
|
|
103
|
+
const advisories = data.vulns || [];
|
|
104
|
+
// Cache the result
|
|
105
|
+
cacheAdvisories(packageName, ecosystem, advisories);
|
|
106
|
+
return advisories;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Network error - gracefully degrade
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Query OSV.dev for multiple packages in batch
|
|
115
|
+
*/
|
|
116
|
+
async function queryOSVBatch(packages) {
|
|
117
|
+
const results = new Map();
|
|
118
|
+
// Split into cached and uncached
|
|
119
|
+
const uncached = [];
|
|
120
|
+
for (let i = 0; i < packages.length; i++) {
|
|
121
|
+
const pkg = packages[i];
|
|
122
|
+
const cached = getCachedAdvisories(pkg.name, pkg.ecosystem);
|
|
123
|
+
if (cached !== null) {
|
|
124
|
+
results.set(getCacheKey(pkg.name, pkg.ecosystem), cached);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
uncached.push({ ...pkg, index: i });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (uncached.length === 0) {
|
|
131
|
+
return results;
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
const queries = uncached.map(pkg => ({
|
|
135
|
+
package: {
|
|
136
|
+
name: pkg.name,
|
|
137
|
+
ecosystem: pkg.ecosystem,
|
|
138
|
+
},
|
|
139
|
+
version: pkg.version,
|
|
140
|
+
}));
|
|
141
|
+
const response = await fetch(OSV_BATCH_URL, {
|
|
142
|
+
method: 'POST',
|
|
143
|
+
headers: {
|
|
144
|
+
'Content-Type': 'application/json',
|
|
145
|
+
},
|
|
146
|
+
body: JSON.stringify({ queries }),
|
|
147
|
+
});
|
|
148
|
+
if (!response.ok) {
|
|
149
|
+
// Gracefully degrade - return empty for all uncached
|
|
150
|
+
for (const pkg of uncached) {
|
|
151
|
+
cacheAdvisories(pkg.name, pkg.ecosystem, []);
|
|
152
|
+
results.set(getCacheKey(pkg.name, pkg.ecosystem), []);
|
|
153
|
+
}
|
|
154
|
+
return results;
|
|
155
|
+
}
|
|
156
|
+
const data = (await response.json());
|
|
157
|
+
// Process batch results
|
|
158
|
+
for (let i = 0; i < uncached.length; i++) {
|
|
159
|
+
const pkg = uncached[i];
|
|
160
|
+
const advisories = data.results[i]?.vulns || [];
|
|
161
|
+
cacheAdvisories(pkg.name, pkg.ecosystem, advisories);
|
|
162
|
+
results.set(getCacheKey(pkg.name, pkg.ecosystem), advisories);
|
|
163
|
+
}
|
|
164
|
+
return results;
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Network error - gracefully degrade
|
|
168
|
+
for (const pkg of uncached) {
|
|
169
|
+
results.set(getCacheKey(pkg.name, pkg.ecosystem), []);
|
|
170
|
+
}
|
|
171
|
+
return results;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// ============================================================================
|
|
175
|
+
// Severity Mapping
|
|
176
|
+
// ============================================================================
|
|
177
|
+
/**
|
|
178
|
+
* Determine severity from OSV vulnerability
|
|
179
|
+
*/
|
|
180
|
+
function mapOSVSeverity(vuln) {
|
|
181
|
+
// Check for malicious package (critical)
|
|
182
|
+
if (vuln.database_specific?.malicious) {
|
|
183
|
+
return 'critical';
|
|
184
|
+
}
|
|
185
|
+
// Check CVSS score
|
|
186
|
+
const cvss = vuln.severity?.find(s => s.type === 'CVSS_V3');
|
|
187
|
+
if (cvss) {
|
|
188
|
+
const score = parseFloat(cvss.score);
|
|
189
|
+
if (score >= 9.0)
|
|
190
|
+
return 'critical';
|
|
191
|
+
if (score >= 7.0)
|
|
192
|
+
return 'high';
|
|
193
|
+
if (score >= 4.0)
|
|
194
|
+
return 'medium';
|
|
195
|
+
return 'low';
|
|
196
|
+
}
|
|
197
|
+
// Check database_specific severity
|
|
198
|
+
const dbSeverity = vuln.database_specific?.severity?.toLowerCase();
|
|
199
|
+
if (dbSeverity) {
|
|
200
|
+
if (dbSeverity === 'critical')
|
|
201
|
+
return 'critical';
|
|
202
|
+
if (dbSeverity === 'high')
|
|
203
|
+
return 'high';
|
|
204
|
+
if (dbSeverity === 'moderate' || dbSeverity === 'medium')
|
|
205
|
+
return 'medium';
|
|
206
|
+
if (dbSeverity === 'low')
|
|
207
|
+
return 'low';
|
|
208
|
+
}
|
|
209
|
+
// Default to high for unknown severity (conservative)
|
|
210
|
+
return 'high';
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Check if vulnerability is for a malicious package
|
|
214
|
+
*/
|
|
215
|
+
function isMaliciousPackage(vuln) {
|
|
216
|
+
return vuln.database_specific?.malicious === true ||
|
|
217
|
+
vuln.id.startsWith('MAL-') ||
|
|
218
|
+
(vuln.summary?.toLowerCase().includes('malicious') ?? false);
|
|
219
|
+
}
|
|
220
|
+
// ============================================================================
|
|
221
|
+
// Main Check Function
|
|
222
|
+
// ============================================================================
|
|
223
|
+
/**
|
|
224
|
+
* Check packages in a file for known vulnerabilities via OSV.dev
|
|
225
|
+
*/
|
|
226
|
+
async function checkPackageAdvisories(content, filePath) {
|
|
227
|
+
const vulnerabilities = [];
|
|
228
|
+
// Determine file type
|
|
229
|
+
const fileType = (0, registry_clients_1.getPackageFileType)(filePath);
|
|
230
|
+
if (!fileType) {
|
|
231
|
+
return vulnerabilities;
|
|
232
|
+
}
|
|
233
|
+
// Extract dependencies based on file type
|
|
234
|
+
let dependencies = [];
|
|
235
|
+
if (fileType === 'npm' && filePath.endsWith('package.json')) {
|
|
236
|
+
dependencies = (0, registry_clients_1.extractNpmDependencies)(content);
|
|
237
|
+
}
|
|
238
|
+
else if (fileType === 'python') {
|
|
239
|
+
dependencies = (0, registry_clients_1.extractPythonRequirements)(content);
|
|
240
|
+
}
|
|
241
|
+
if (dependencies.length === 0) {
|
|
242
|
+
return vulnerabilities;
|
|
243
|
+
}
|
|
244
|
+
const lines = content.split('\n');
|
|
245
|
+
const ecosystem = fileType === 'npm' ? 'npm' : 'PyPI';
|
|
246
|
+
// Limit packages to check
|
|
247
|
+
const limitedDeps = dependencies.slice(0, MAX_PACKAGES_TO_CHECK);
|
|
248
|
+
// Query OSV in batch for efficiency
|
|
249
|
+
const packagesToQuery = limitedDeps.map(dep => ({
|
|
250
|
+
name: dep.name,
|
|
251
|
+
ecosystem: ecosystem,
|
|
252
|
+
version: dep.version,
|
|
253
|
+
}));
|
|
254
|
+
const advisoriesMap = await queryOSVBatch(packagesToQuery);
|
|
255
|
+
// Process results
|
|
256
|
+
for (const dep of limitedDeps) {
|
|
257
|
+
const key = getCacheKey(dep.name, ecosystem);
|
|
258
|
+
const advisories = advisoriesMap.get(key) || [];
|
|
259
|
+
if (advisories.length === 0)
|
|
260
|
+
continue;
|
|
261
|
+
// Find the most severe vulnerability
|
|
262
|
+
let mostSevere = null;
|
|
263
|
+
let highestSeverity = 'info';
|
|
264
|
+
const severityOrder = ['info', 'low', 'medium', 'high', 'critical'];
|
|
265
|
+
for (const adv of advisories) {
|
|
266
|
+
const sev = mapOSVSeverity(adv);
|
|
267
|
+
if (severityOrder.indexOf(sev) > severityOrder.indexOf(highestSeverity)) {
|
|
268
|
+
highestSeverity = sev;
|
|
269
|
+
mostSevere = adv;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (!mostSevere)
|
|
273
|
+
continue;
|
|
274
|
+
// Determine category based on malicious vs vulnerable
|
|
275
|
+
const isMalicious = advisories.some(a => isMaliciousPackage(a));
|
|
276
|
+
const category = isMalicious ? 'ai_package_malicious' : 'suspicious_package';
|
|
277
|
+
// Build description
|
|
278
|
+
const advIds = advisories.map(a => a.id).slice(0, 3).join(', ');
|
|
279
|
+
const moreCount = advisories.length > 3 ? ` +${advisories.length - 3} more` : '';
|
|
280
|
+
const description = isMalicious
|
|
281
|
+
? `Package "${dep.name}" is flagged as MALICIOUS in OSV.dev (${advIds}${moreCount}). This package may contain malware or data exfiltration code.`
|
|
282
|
+
: `Package "${dep.name}" has ${advisories.length} known security advisories (${advIds}${moreCount}). ${mostSevere.summary || 'Review before use.'}`;
|
|
283
|
+
// Build suggested fix
|
|
284
|
+
const suggestedFix = isMalicious
|
|
285
|
+
? `Remove "${dep.name}" immediately. Do not use this package.`
|
|
286
|
+
: `Update "${dep.name}" to a patched version or find an alternative. Check: https://osv.dev/list?ecosystem=${ecosystem}&q=${encodeURIComponent(dep.name)}`;
|
|
287
|
+
vulnerabilities.push({
|
|
288
|
+
id: `osv-${filePath}-${dep.name}`,
|
|
289
|
+
filePath,
|
|
290
|
+
lineNumber: dep.line,
|
|
291
|
+
lineContent: lines[dep.line - 1]?.trim() || dep.name,
|
|
292
|
+
severity: highestSeverity,
|
|
293
|
+
category,
|
|
294
|
+
title: isMalicious
|
|
295
|
+
? `Malicious package: ${dep.name}`
|
|
296
|
+
: `Vulnerable package: ${dep.name} (${advisories.length} advisories)`,
|
|
297
|
+
description,
|
|
298
|
+
suggestedFix,
|
|
299
|
+
confidence: 'high',
|
|
300
|
+
layer: 3,
|
|
301
|
+
requiresAIValidation: false, // OSV data is authoritative
|
|
302
|
+
});
|
|
303
|
+
// Rate limit between individual package queries if not using batch
|
|
304
|
+
await (0, registry_clients_1.rateLimitDelay)();
|
|
305
|
+
}
|
|
306
|
+
return vulnerabilities;
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=osv-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"osv-check.js","sourceRoot":"","sources":["../../src/layer3/osv-check.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AA6SH,wDAoGC;AAIC,4BAAQ;AACR,sCAAa;AACb,wCAAc;AACd,gDAAkB;AAClB,kCAAW;AAtZb,gEAMkC;AAElC,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,mBAAmB;AACnB,MAAM,WAAW,GAAG,8BAA8B,CAAA;AAClD,MAAM,aAAa,GAAG,mCAAmC,CAAA;AAEzD,uBAAuB;AACvB,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAExC,yDAAyD;AACzD,MAAM,qBAAqB,GAAG,GAAG,CAAA;AAuDjC,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,aAAa,GAAG,IAAI,GAAG,EAA0B,CAAA;AAwUrD,sCAAa;AAtUf;;GAEG;AACH,SAAS,WAAW,CAAC,IAAY,EAAE,SAAiB;IAClD,OAAO,GAAG,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAA;AAC7C,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,MAAsB;IAC1C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,YAAY,CAAA;AACrD,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAY,EAAE,SAAiB;IAC1D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACrC,IAAI,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,UAAU,CAAA;IAC1B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,IAAY,EAAE,SAAiB,EAAE,UAA8B;IACtF,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IACxC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE;QACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,UAAU;KACX,CAAC,CAAA;AACJ,CAAC;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;GAEG;AACH,KAAK,UAAU,QAAQ,CACrB,WAAmB,EACnB,SAAyB,EACzB,OAAgB;IAEhB,oBAAoB;IACpB,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;IAC1D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,MAAM,CAAA;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAa;YACtB,OAAO,EAAE;gBACP,IAAI,EAAE,WAAW;gBACjB,SAAS;aACV;SACF,CAAA;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;QACzB,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE;YACxC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,mCAAmC;YACnC,eAAe,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;YAC3C,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgB,CAAA;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;QAEnC,mBAAmB;QACnB,eAAe,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;QAEnD,OAAO,UAAU,CAAA;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;QACrC,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAC1B,QAA8E;IAE9E,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAA;IAErD,iCAAiC;IACjC,MAAM,QAAQ,GAAwF,EAAE,CAAA;IAExG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QACvB,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;QAC3D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAA;QAC3D,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnC,OAAO,EAAE;gBACP,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,SAAS,EAAE,GAAG,CAAC,SAAS;aACzB;YACD,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC,CAAA;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;SAClC,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,qDAAqD;YACrD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;gBAC5C,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAA;YACvD,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAqB,CAAA;QAExD,wBAAwB;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;YACvB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAA;YAC/C,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;YACpD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAA;QAC/D,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;QACrC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAA;QACvD,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,cAAc,CAAC,IAAsB;IAC5C,yCAAyC;IACzC,IAAI,IAAI,CAAC,iBAAiB,EAAE,SAAS,EAAE,CAAC;QACtC,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,mBAAmB;IACnB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAA;IAC3D,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpC,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,UAAU,CAAA;QACnC,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,MAAM,CAAA;QAC/B,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,QAAQ,CAAA;QACjC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,mCAAmC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAA;IAClE,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,UAAU,KAAK,UAAU;YAAE,OAAO,UAAU,CAAA;QAChD,IAAI,UAAU,KAAK,MAAM;YAAE,OAAO,MAAM,CAAA;QACxC,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAA;QACzE,IAAI,UAAU,KAAK,KAAK;YAAE,OAAO,KAAK,CAAA;IACxC,CAAC;IAED,sDAAsD;IACtD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAAsB;IAChD,OAAO,IAAI,CAAC,iBAAiB,EAAE,SAAS,KAAK,IAAI;QAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAC1B,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,CAAA;AAChE,CAAC;AAED,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E;;GAEG;AACI,KAAK,UAAU,sBAAsB,CAC1C,OAAe,EACf,QAAgB;IAEhB,MAAM,eAAe,GAAoB,EAAE,CAAA;IAE3C,sBAAsB;IACtB,MAAM,QAAQ,GAAG,IAAA,qCAAkB,EAAC,QAAQ,CAAC,CAAA;IAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,eAAe,CAAA;IACxB,CAAC;IAED,0CAA0C;IAC1C,IAAI,YAAY,GAA0B,EAAE,CAAA;IAE5C,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC5D,YAAY,GAAG,IAAA,yCAAsB,EAAC,OAAO,CAAC,CAAA;IAChD,CAAC;SAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,YAAY,GAAG,IAAA,4CAAyB,EAAC,OAAO,CAAC,CAAA;IACnD,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,eAAe,CAAA;IACxB,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,SAAS,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;IAErD,0BAA0B;IAC1B,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAA;IAEhE,oCAAoC;IACpC,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,SAAS,EAAE,SAA2B;QACtC,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC,CAAA;IAEH,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,eAAe,CAAC,CAAA;IAE1D,kBAAkB;IAClB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;QAE/C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QAErC,qCAAqC;QACrC,IAAI,UAAU,GAA4B,IAAI,CAAA;QAC9C,IAAI,eAAe,GAA0B,MAAM,CAAA;QACnD,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;QAEnE,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;YAC/B,IAAI,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;gBACxE,eAAe,GAAG,GAAG,CAAA;gBACrB,UAAU,GAAG,GAAG,CAAA;YAClB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,UAAU;YAAE,SAAQ;QAEzB,sDAAsD;QACtD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/D,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,oBAAoB,CAAA;QAE5E,oBAAoB;QACpB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/D,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;QAChF,MAAM,WAAW,GAAG,WAAW;YAC7B,CAAC,CAAC,YAAY,GAAG,CAAC,IAAI,yCAAyC,MAAM,GAAG,SAAS,gEAAgE;YACjJ,CAAC,CAAC,YAAY,GAAG,CAAC,IAAI,SAAS,UAAU,CAAC,MAAM,+BAA+B,MAAM,GAAG,SAAS,MAAM,UAAU,CAAC,OAAO,IAAI,oBAAoB,EAAE,CAAA;QAErJ,sBAAsB;QACtB,MAAM,YAAY,GAAG,WAAW;YAC9B,CAAC,CAAC,WAAW,GAAG,CAAC,IAAI,yCAAyC;YAC9D,CAAC,CAAC,WAAW,GAAG,CAAC,IAAI,wFAAwF,SAAS,MAAM,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAA;QAE5J,eAAe,CAAC,IAAI,CAAC;YACnB,EAAE,EAAE,OAAO,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE;YACjC,QAAQ;YACR,UAAU,EAAE,GAAG,CAAC,IAAI;YACpB,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI;YACpD,QAAQ,EAAE,eAAe;YACzB,QAAQ;YACR,KAAK,EAAE,WAAW;gBAChB,CAAC,CAAC,sBAAsB,GAAG,CAAC,IAAI,EAAE;gBAClC,CAAC,CAAC,uBAAuB,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,cAAc;YACvE,WAAW;YACX,YAAY;YACZ,UAAU,EAAE,MAAM;YAClB,KAAK,EAAE,CAAC;YACR,oBAAoB,EAAE,KAAK,EAAE,4BAA4B;SAC1D,CAAC,CAAA;QAEF,mEAAmE;QACnE,MAAM,IAAA,iCAAc,GAAE,CAAA;IACxB,CAAC;IAED,OAAO,eAAe,CAAA;AACxB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-Aware Fix Suggestions Registry (PRO-83)
|
|
3
|
+
*
|
|
4
|
+
* Provides framework-specific fix suggestions that transform generic advice
|
|
5
|
+
* into actionable guidance based on the user's detected tech stack.
|
|
6
|
+
*
|
|
7
|
+
* When a Next.js + Prisma project has a SQL injection finding, this registry
|
|
8
|
+
* provides Prisma-specific fixes instead of generic SQL advice.
|
|
9
|
+
*
|
|
10
|
+
* Falls back gracefully to generic fixes (from metadata.ts) when no match.
|
|
11
|
+
*/
|
|
12
|
+
import type { VulnerabilityCategory } from '../types';
|
|
13
|
+
import type { FrameworkContext, DataAccessContext } from '../utils/project-context-builder';
|
|
14
|
+
export type FrameworkKey = 'nextjs' | 'express' | 'fastify' | 'nestjs' | 'prisma' | 'drizzle' | 'supabase' | 'mongoose' | 'knex' | 'react' | 'vue';
|
|
15
|
+
export interface FrameworkFix {
|
|
16
|
+
/** Step-by-step fix instructions specific to this framework */
|
|
17
|
+
fixSteps: string[];
|
|
18
|
+
/** Optional code example demonstrating the fix */
|
|
19
|
+
codeExample?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Registry mapping vulnerability categories to framework-specific fixes.
|
|
23
|
+
*
|
|
24
|
+
* Structure: category -> framework -> fix
|
|
25
|
+
*
|
|
26
|
+
* Priority categories (Tier 1):
|
|
27
|
+
* - sql_injection: Fixes vary dramatically by ORM
|
|
28
|
+
* - missing_auth: Framework-specific middleware patterns
|
|
29
|
+
* - xss: React/Vue/vanilla have different approaches
|
|
30
|
+
* - hardcoded_secret: Framework-specific env handling
|
|
31
|
+
* - cors_misconfiguration: Very framework-specific
|
|
32
|
+
*/
|
|
33
|
+
export declare const FRAMEWORK_FIX_REGISTRY: Partial<Record<VulnerabilityCategory, Partial<Record<FrameworkKey, FrameworkFix>>>>;
|
|
34
|
+
/**
|
|
35
|
+
* Get framework-specific fix for a vulnerability category.
|
|
36
|
+
*
|
|
37
|
+
* Priority order for ORM-related categories (sql_injection):
|
|
38
|
+
* 1. ORM (prisma, drizzle, supabase, mongoose, knex)
|
|
39
|
+
* 2. Backend framework (nextjs, express, fastify, nestjs)
|
|
40
|
+
*
|
|
41
|
+
* Priority order for other categories:
|
|
42
|
+
* 1. Frontend framework for XSS (react, vue)
|
|
43
|
+
* 2. Backend framework for auth/cors/secrets
|
|
44
|
+
*
|
|
45
|
+
* @returns FrameworkFix if a match is found, undefined otherwise (falls back to generic)
|
|
46
|
+
*/
|
|
47
|
+
export declare function getFrameworkFix(category: VulnerabilityCategory, frameworks: FrameworkContext, dataAccess?: DataAccessContext): FrameworkFix | undefined;
|
|
48
|
+
//# sourceMappingURL=framework-fixes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-fixes.d.ts","sourceRoot":"","sources":["../../src/rules/framework-fixes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AAM3F,MAAM,MAAM,YAAY,GACpB,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAC3C,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GACvD,OAAO,GAAG,KAAK,CAAA;AAEnB,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAMD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CA+WtH,CAAA;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,qBAAqB,EAC/B,UAAU,EAAE,gBAAgB,EAC5B,UAAU,CAAC,EAAE,iBAAiB,GAC7B,YAAY,GAAG,SAAS,CAgC1B"}
|