@oddessentials/odd-ai-reviewers 1.0.0
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/README.md +190 -0
- package/dist/__tests__/hermetic-setup.d.ts +55 -0
- package/dist/__tests__/hermetic-setup.d.ts.map +1 -0
- package/dist/__tests__/hermetic-setup.js +62 -0
- package/dist/__tests__/hermetic-setup.js.map +1 -0
- package/dist/__tests__/test-utils/hermetic.d.ts +84 -0
- package/dist/__tests__/test-utils/hermetic.d.ts.map +1 -0
- package/dist/__tests__/test-utils/hermetic.js +147 -0
- package/dist/__tests__/test-utils/hermetic.js.map +1 -0
- package/dist/agents/ai_semantic_review.d.ts +12 -0
- package/dist/agents/ai_semantic_review.d.ts.map +1 -0
- package/dist/agents/ai_semantic_review.js +317 -0
- package/dist/agents/ai_semantic_review.js.map +1 -0
- package/dist/agents/control_flow/budget.d.ts +162 -0
- package/dist/agents/control_flow/budget.d.ts.map +1 -0
- package/dist/agents/control_flow/budget.js +331 -0
- package/dist/agents/control_flow/budget.js.map +1 -0
- package/dist/agents/control_flow/cfg-builder.d.ts +26 -0
- package/dist/agents/control_flow/cfg-builder.d.ts.map +1 -0
- package/dist/agents/control_flow/cfg-builder.js +776 -0
- package/dist/agents/control_flow/cfg-builder.js.map +1 -0
- package/dist/agents/control_flow/cfg-types.d.ts +186 -0
- package/dist/agents/control_flow/cfg-types.d.ts.map +1 -0
- package/dist/agents/control_flow/cfg-types.js +114 -0
- package/dist/agents/control_flow/cfg-types.js.map +1 -0
- package/dist/agents/control_flow/finding-generator.d.ts +118 -0
- package/dist/agents/control_flow/finding-generator.d.ts.map +1 -0
- package/dist/agents/control_flow/finding-generator.js +354 -0
- package/dist/agents/control_flow/finding-generator.js.map +1 -0
- package/dist/agents/control_flow/index.d.ts +39 -0
- package/dist/agents/control_flow/index.d.ts.map +1 -0
- package/dist/agents/control_flow/index.js +270 -0
- package/dist/agents/control_flow/index.js.map +1 -0
- package/dist/agents/control_flow/logger.d.ts +333 -0
- package/dist/agents/control_flow/logger.d.ts.map +1 -0
- package/dist/agents/control_flow/logger.js +607 -0
- package/dist/agents/control_flow/logger.js.map +1 -0
- package/dist/agents/control_flow/mitigation-detector.d.ts +207 -0
- package/dist/agents/control_flow/mitigation-detector.d.ts.map +1 -0
- package/dist/agents/control_flow/mitigation-detector.js +625 -0
- package/dist/agents/control_flow/mitigation-detector.js.map +1 -0
- package/dist/agents/control_flow/mitigation-patterns.d.ts +53 -0
- package/dist/agents/control_flow/mitigation-patterns.d.ts.map +1 -0
- package/dist/agents/control_flow/mitigation-patterns.js +620 -0
- package/dist/agents/control_flow/mitigation-patterns.js.map +1 -0
- package/dist/agents/control_flow/path-analyzer.d.ts +287 -0
- package/dist/agents/control_flow/path-analyzer.d.ts.map +1 -0
- package/dist/agents/control_flow/path-analyzer.js +695 -0
- package/dist/agents/control_flow/path-analyzer.js.map +1 -0
- package/dist/agents/control_flow/pattern-validator.d.ts +132 -0
- package/dist/agents/control_flow/pattern-validator.d.ts.map +1 -0
- package/dist/agents/control_flow/pattern-validator.js +420 -0
- package/dist/agents/control_flow/pattern-validator.js.map +1 -0
- package/dist/agents/control_flow/timeout-regex.d.ts +144 -0
- package/dist/agents/control_flow/timeout-regex.d.ts.map +1 -0
- package/dist/agents/control_flow/timeout-regex.js +339 -0
- package/dist/agents/control_flow/timeout-regex.js.map +1 -0
- package/dist/agents/control_flow/types.d.ts +782 -0
- package/dist/agents/control_flow/types.d.ts.map +1 -0
- package/dist/agents/control_flow/types.js +428 -0
- package/dist/agents/control_flow/types.js.map +1 -0
- package/dist/agents/control_flow/vulnerability-detector.d.ts +85 -0
- package/dist/agents/control_flow/vulnerability-detector.d.ts.map +1 -0
- package/dist/agents/control_flow/vulnerability-detector.js +493 -0
- package/dist/agents/control_flow/vulnerability-detector.js.map +1 -0
- package/dist/agents/date-utils.d.ts +19 -0
- package/dist/agents/date-utils.d.ts.map +1 -0
- package/dist/agents/date-utils.js +29 -0
- package/dist/agents/date-utils.js.map +1 -0
- package/dist/agents/index.d.ts +25 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +50 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/json-utils.d.ts +34 -0
- package/dist/agents/json-utils.d.ts.map +1 -0
- package/dist/agents/json-utils.js +62 -0
- package/dist/agents/json-utils.js.map +1 -0
- package/dist/agents/local_llm.d.ts +24 -0
- package/dist/agents/local_llm.d.ts.map +1 -0
- package/dist/agents/local_llm.js +566 -0
- package/dist/agents/local_llm.js.map +1 -0
- package/dist/agents/metadata.d.ts +57 -0
- package/dist/agents/metadata.d.ts.map +1 -0
- package/dist/agents/metadata.js +45 -0
- package/dist/agents/metadata.js.map +1 -0
- package/dist/agents/opencode.d.ts +18 -0
- package/dist/agents/opencode.d.ts.map +1 -0
- package/dist/agents/opencode.js +364 -0
- package/dist/agents/opencode.js.map +1 -0
- package/dist/agents/path-filter.d.ts +25 -0
- package/dist/agents/path-filter.d.ts.map +1 -0
- package/dist/agents/path-filter.js +43 -0
- package/dist/agents/path-filter.js.map +1 -0
- package/dist/agents/pr_agent.d.ts +3 -0
- package/dist/agents/pr_agent.d.ts.map +1 -0
- package/dist/agents/pr_agent.js +312 -0
- package/dist/agents/pr_agent.js.map +1 -0
- package/dist/agents/retry.d.ts +12 -0
- package/dist/agents/retry.d.ts.map +1 -0
- package/dist/agents/retry.js +65 -0
- package/dist/agents/retry.js.map +1 -0
- package/dist/agents/reviewdog.d.ts +24 -0
- package/dist/agents/reviewdog.d.ts.map +1 -0
- package/dist/agents/reviewdog.js +259 -0
- package/dist/agents/reviewdog.js.map +1 -0
- package/dist/agents/security.d.ts +49 -0
- package/dist/agents/security.d.ts.map +1 -0
- package/dist/agents/security.js +302 -0
- package/dist/agents/security.js.map +1 -0
- package/dist/agents/semgrep.d.ts +8 -0
- package/dist/agents/semgrep.d.ts.map +1 -0
- package/dist/agents/semgrep.js +157 -0
- package/dist/agents/semgrep.js.map +1 -0
- package/dist/agents/types.d.ts +450 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +127 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/budget.d.ts +59 -0
- package/dist/budget.d.ts.map +1 -0
- package/dist/budget.js +82 -0
- package/dist/budget.js.map +1 -0
- package/dist/cache/key.d.ts +49 -0
- package/dist/cache/key.d.ts.map +1 -0
- package/dist/cache/key.js +71 -0
- package/dist/cache/key.js.map +1 -0
- package/dist/cache/store.d.ts +47 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +328 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cli/commands/check.d.ts +60 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +163 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/index.d.ts +12 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +12 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/local-review.d.ts +149 -0
- package/dist/cli/commands/local-review.d.ts.map +1 -0
- package/dist/cli/commands/local-review.js +755 -0
- package/dist/cli/commands/local-review.js.map +1 -0
- package/dist/cli/config-wizard.d.ts +87 -0
- package/dist/cli/config-wizard.d.ts.map +1 -0
- package/dist/cli/config-wizard.js +240 -0
- package/dist/cli/config-wizard.js.map +1 -0
- package/dist/cli/dependencies/catalog.d.ts +44 -0
- package/dist/cli/dependencies/catalog.d.ts.map +1 -0
- package/dist/cli/dependencies/catalog.js +89 -0
- package/dist/cli/dependencies/catalog.js.map +1 -0
- package/dist/cli/dependencies/checker.d.ts +42 -0
- package/dist/cli/dependencies/checker.d.ts.map +1 -0
- package/dist/cli/dependencies/checker.js +240 -0
- package/dist/cli/dependencies/checker.js.map +1 -0
- package/dist/cli/dependencies/index.d.ts +16 -0
- package/dist/cli/dependencies/index.d.ts.map +1 -0
- package/dist/cli/dependencies/index.js +16 -0
- package/dist/cli/dependencies/index.js.map +1 -0
- package/dist/cli/dependencies/messages.d.ts +58 -0
- package/dist/cli/dependencies/messages.d.ts.map +1 -0
- package/dist/cli/dependencies/messages.js +183 -0
- package/dist/cli/dependencies/messages.js.map +1 -0
- package/dist/cli/dependencies/platform.d.ts +25 -0
- package/dist/cli/dependencies/platform.d.ts.map +1 -0
- package/dist/cli/dependencies/platform.js +42 -0
- package/dist/cli/dependencies/platform.js.map +1 -0
- package/dist/cli/dependencies/schemas.d.ts +65 -0
- package/dist/cli/dependencies/schemas.d.ts.map +1 -0
- package/dist/cli/dependencies/schemas.js +42 -0
- package/dist/cli/dependencies/schemas.js.map +1 -0
- package/dist/cli/dependencies/types.d.ts +112 -0
- package/dist/cli/dependencies/types.d.ts.map +1 -0
- package/dist/cli/dependencies/types.js +6 -0
- package/dist/cli/dependencies/types.js.map +1 -0
- package/dist/cli/dependencies/version.d.ts +67 -0
- package/dist/cli/dependencies/version.d.ts.map +1 -0
- package/dist/cli/dependencies/version.js +125 -0
- package/dist/cli/dependencies/version.js.map +1 -0
- package/dist/cli/git-context.d.ts +105 -0
- package/dist/cli/git-context.d.ts.map +1 -0
- package/dist/cli/git-context.js +313 -0
- package/dist/cli/git-context.js.map +1 -0
- package/dist/cli/interactive-prompts.d.ts +126 -0
- package/dist/cli/interactive-prompts.d.ts.map +1 -0
- package/dist/cli/interactive-prompts.js +128 -0
- package/dist/cli/interactive-prompts.js.map +1 -0
- package/dist/cli/options/index.d.ts +7 -0
- package/dist/cli/options/index.d.ts.map +1 -0
- package/dist/cli/options/index.js +11 -0
- package/dist/cli/options/index.js.map +1 -0
- package/dist/cli/options/local-review-options.d.ts +221 -0
- package/dist/cli/options/local-review-options.d.ts.map +1 -0
- package/dist/cli/options/local-review-options.js +332 -0
- package/dist/cli/options/local-review-options.js.map +1 -0
- package/dist/cli/output/colors.d.ts +154 -0
- package/dist/cli/output/colors.d.ts.map +1 -0
- package/dist/cli/output/colors.js +255 -0
- package/dist/cli/output/colors.js.map +1 -0
- package/dist/cli/output/errors.d.ts +157 -0
- package/dist/cli/output/errors.d.ts.map +1 -0
- package/dist/cli/output/errors.js +266 -0
- package/dist/cli/output/errors.js.map +1 -0
- package/dist/cli/output/index.d.ts +12 -0
- package/dist/cli/output/index.d.ts.map +1 -0
- package/dist/cli/output/index.js +15 -0
- package/dist/cli/output/index.js.map +1 -0
- package/dist/cli/output/progress.d.ts +237 -0
- package/dist/cli/output/progress.d.ts.map +1 -0
- package/dist/cli/output/progress.js +405 -0
- package/dist/cli/output/progress.js.map +1 -0
- package/dist/cli/signals.d.ts +145 -0
- package/dist/cli/signals.d.ts.map +1 -0
- package/dist/cli/signals.js +223 -0
- package/dist/cli/signals.js.map +1 -0
- package/dist/cli/validation-report.d.ts +106 -0
- package/dist/cli/validation-report.d.ts.map +1 -0
- package/dist/cli/validation-report.js +108 -0
- package/dist/cli/validation-report.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +12 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/mitigation-config.d.ts +94 -0
- package/dist/config/mitigation-config.d.ts.map +1 -0
- package/dist/config/mitigation-config.js +430 -0
- package/dist/config/mitigation-config.js.map +1 -0
- package/dist/config/providers.d.ts +118 -0
- package/dist/config/providers.d.ts.map +1 -0
- package/dist/config/providers.js +229 -0
- package/dist/config/providers.js.map +1 -0
- package/dist/config/schemas.d.ts +278 -0
- package/dist/config/schemas.d.ts.map +1 -0
- package/dist/config/schemas.js +111 -0
- package/dist/config/schemas.js.map +1 -0
- package/dist/config/zero-config.d.ts +126 -0
- package/dist/config/zero-config.d.ts.map +1 -0
- package/dist/config/zero-config.js +243 -0
- package/dist/config/zero-config.js.map +1 -0
- package/dist/config.d.ts +110 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +302 -0
- package/dist/config.js.map +1 -0
- package/dist/diff.d.ts +224 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +832 -0
- package/dist/diff.js.map +1 -0
- package/dist/git-validators.d.ts +106 -0
- package/dist/git-validators.d.ts.map +1 -0
- package/dist/git-validators.js +224 -0
- package/dist/git-validators.js.map +1 -0
- package/dist/main.d.ts +61 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +704 -0
- package/dist/main.js.map +1 -0
- package/dist/phases/execute.d.ts +60 -0
- package/dist/phases/execute.d.ts.map +1 -0
- package/dist/phases/execute.js +168 -0
- package/dist/phases/execute.js.map +1 -0
- package/dist/phases/index.d.ts +9 -0
- package/dist/phases/index.d.ts.map +1 -0
- package/dist/phases/index.js +9 -0
- package/dist/phases/index.js.map +1 -0
- package/dist/phases/preflight.d.ts +40 -0
- package/dist/phases/preflight.d.ts.map +1 -0
- package/dist/phases/preflight.js +122 -0
- package/dist/phases/preflight.js.map +1 -0
- package/dist/phases/report.d.ts +51 -0
- package/dist/phases/report.d.ts.map +1 -0
- package/dist/phases/report.js +152 -0
- package/dist/phases/report.js.map +1 -0
- package/dist/policy.d.ts +33 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +34 -0
- package/dist/policy.js.map +1 -0
- package/dist/preflight.d.ts +181 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +627 -0
- package/dist/preflight.js.map +1 -0
- package/dist/report/ado.d.ts +53 -0
- package/dist/report/ado.d.ts.map +1 -0
- package/dist/report/ado.js +411 -0
- package/dist/report/ado.js.map +1 -0
- package/dist/report/agent-icons.d.ts +36 -0
- package/dist/report/agent-icons.d.ts.map +1 -0
- package/dist/report/agent-icons.js +46 -0
- package/dist/report/agent-icons.js.map +1 -0
- package/dist/report/base.d.ts +30 -0
- package/dist/report/base.d.ts.map +1 -0
- package/dist/report/base.js +64 -0
- package/dist/report/base.js.map +1 -0
- package/dist/report/formats.d.ts +206 -0
- package/dist/report/formats.d.ts.map +1 -0
- package/dist/report/formats.js +481 -0
- package/dist/report/formats.js.map +1 -0
- package/dist/report/github.d.ts +44 -0
- package/dist/report/github.d.ts.map +1 -0
- package/dist/report/github.js +409 -0
- package/dist/report/github.js.map +1 -0
- package/dist/report/line-resolver.d.ts +208 -0
- package/dist/report/line-resolver.d.ts.map +1 -0
- package/dist/report/line-resolver.js +578 -0
- package/dist/report/line-resolver.js.map +1 -0
- package/dist/report/resolution.d.ts +158 -0
- package/dist/report/resolution.d.ts.map +1 -0
- package/dist/report/resolution.js +272 -0
- package/dist/report/resolution.js.map +1 -0
- package/dist/report/sanitize.d.ts +32 -0
- package/dist/report/sanitize.d.ts.map +1 -0
- package/dist/report/sanitize.js +84 -0
- package/dist/report/sanitize.js.map +1 -0
- package/dist/report/terminal.d.ts +440 -0
- package/dist/report/terminal.d.ts.map +1 -0
- package/dist/report/terminal.js +840 -0
- package/dist/report/terminal.js.map +1 -0
- package/dist/reviewignore.d.ts +125 -0
- package/dist/reviewignore.d.ts.map +1 -0
- package/dist/reviewignore.js +335 -0
- package/dist/reviewignore.js.map +1 -0
- package/dist/security-logger.d.ts +178 -0
- package/dist/security-logger.d.ts.map +1 -0
- package/dist/security-logger.js +256 -0
- package/dist/security-logger.js.map +1 -0
- package/dist/telemetry/backends/console.d.ts +24 -0
- package/dist/telemetry/backends/console.d.ts.map +1 -0
- package/dist/telemetry/backends/console.js +54 -0
- package/dist/telemetry/backends/console.js.map +1 -0
- package/dist/telemetry/backends/jsonl.d.ts +31 -0
- package/dist/telemetry/backends/jsonl.d.ts.map +1 -0
- package/dist/telemetry/backends/jsonl.js +121 -0
- package/dist/telemetry/backends/jsonl.js.map +1 -0
- package/dist/telemetry/emitter.d.ts +43 -0
- package/dist/telemetry/emitter.d.ts.map +1 -0
- package/dist/telemetry/emitter.js +83 -0
- package/dist/telemetry/emitter.js.map +1 -0
- package/dist/telemetry/hook.d.ts +53 -0
- package/dist/telemetry/hook.d.ts.map +1 -0
- package/dist/telemetry/hook.js +118 -0
- package/dist/telemetry/hook.js.map +1 -0
- package/dist/telemetry/index.d.ts +58 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +143 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/types.d.ts +139 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/dist/telemetry/types.js +133 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/trust.d.ts +65 -0
- package/dist/trust.d.ts.map +1 -0
- package/dist/trust.js +78 -0
- package/dist/trust.js.map +1 -0
- package/dist/types/assert-never.d.ts +30 -0
- package/dist/types/assert-never.d.ts.map +1 -0
- package/dist/types/assert-never.js +32 -0
- package/dist/types/assert-never.js.map +1 -0
- package/dist/types/branded.d.ts +172 -0
- package/dist/types/branded.d.ts.map +1 -0
- package/dist/types/branded.js +262 -0
- package/dist/types/branded.js.map +1 -0
- package/dist/types/errors.d.ts +320 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +551 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +37 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +77 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/result.d.ts +323 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +423 -0
- package/dist/types/result.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in Mitigation Patterns
|
|
3
|
+
*
|
|
4
|
+
* Defines patterns for recognizing common security mitigations.
|
|
5
|
+
* These patterns are matched against AST nodes during CFG construction.
|
|
6
|
+
*
|
|
7
|
+
* Per FR-006: Each pattern maps to specific vulnerability types it mitigates.
|
|
8
|
+
* Per FR-015: All patterns are declarative and side-effect-free.
|
|
9
|
+
*/
|
|
10
|
+
import type { MitigationPattern } from './types.js';
|
|
11
|
+
export declare const inputValidationPatterns: MitigationPattern[];
|
|
12
|
+
export declare const nullSafetyPatterns: MitigationPattern[];
|
|
13
|
+
export declare const authCheckPatterns: MitigationPattern[];
|
|
14
|
+
export declare const outputEncodingPatterns: MitigationPattern[];
|
|
15
|
+
export declare const pathTraversalPatterns: MitigationPattern[];
|
|
16
|
+
/**
|
|
17
|
+
* All built-in mitigation patterns.
|
|
18
|
+
* Organized by category for easy reference and testing.
|
|
19
|
+
*/
|
|
20
|
+
export declare const BUILTIN_PATTERNS: MitigationPattern[];
|
|
21
|
+
/**
|
|
22
|
+
* Pattern lookup by ID for fast access.
|
|
23
|
+
*/
|
|
24
|
+
export declare const PATTERN_BY_ID: Map<string, {
|
|
25
|
+
id: string;
|
|
26
|
+
name: string;
|
|
27
|
+
description: string;
|
|
28
|
+
mitigates: ("injection" | "null_deref" | "auth_bypass" | "xss" | "path_traversal" | "prototype_pollution" | "ssrf")[];
|
|
29
|
+
match: {
|
|
30
|
+
type: "function_call" | "method_call" | "type_guard" | "assignment" | "typeof_check" | "instanceof_check";
|
|
31
|
+
name?: string | undefined;
|
|
32
|
+
namePattern?: string | undefined;
|
|
33
|
+
module?: string | undefined;
|
|
34
|
+
parameters?: {
|
|
35
|
+
index: number;
|
|
36
|
+
constraint: "string" | "any" | "tainted_source";
|
|
37
|
+
}[] | undefined;
|
|
38
|
+
returnConstraint?: "truthy" | "defined" | "sanitized" | undefined;
|
|
39
|
+
};
|
|
40
|
+
confidence: "high" | "medium" | "low";
|
|
41
|
+
isBuiltIn?: boolean | undefined;
|
|
42
|
+
deprecated?: boolean | undefined;
|
|
43
|
+
deprecationReason?: string | undefined;
|
|
44
|
+
}>;
|
|
45
|
+
/**
|
|
46
|
+
* Get patterns that mitigate a specific vulnerability type.
|
|
47
|
+
*/
|
|
48
|
+
export declare function getPatternsForVulnerability(vulnType: string): MitigationPattern[];
|
|
49
|
+
/**
|
|
50
|
+
* Get pattern by ID.
|
|
51
|
+
*/
|
|
52
|
+
export declare function getPatternById(id: string): MitigationPattern | undefined;
|
|
53
|
+
//# sourceMappingURL=mitigation-patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mitigation-patterns.d.ts","sourceRoot":"","sources":["../../../src/agents/control_flow/mitigation-patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAOpD,eAAO,MAAM,uBAAuB,EAAE,iBAAiB,EAqItD,CAAC;AAOF,eAAO,MAAM,kBAAkB,EAAE,iBAAiB,EAwHjD,CAAC;AAOF,eAAO,MAAM,iBAAiB,EAAE,iBAAiB,EAyIhD,CAAC;AAOF,eAAO,MAAM,sBAAsB,EAAE,iBAAiB,EAoIrD,CAAC;AAOF,eAAO,MAAM,qBAAqB,EAAE,iBAAiB,EAqDpD,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,EAM/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;EAEzB,CAAC;AAEF;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAEjF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAExE"}
|
|
@@ -0,0 +1,620 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in Mitigation Patterns
|
|
3
|
+
*
|
|
4
|
+
* Defines patterns for recognizing common security mitigations.
|
|
5
|
+
* These patterns are matched against AST nodes during CFG construction.
|
|
6
|
+
*
|
|
7
|
+
* Per FR-006: Each pattern maps to specific vulnerability types it mitigates.
|
|
8
|
+
* Per FR-015: All patterns are declarative and side-effect-free.
|
|
9
|
+
*/
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// Input Validation Patterns (T021)
|
|
12
|
+
// Mitigates: injection, xss, path_traversal, ssrf
|
|
13
|
+
// =============================================================================
|
|
14
|
+
export const inputValidationPatterns = [
|
|
15
|
+
// Zod validation
|
|
16
|
+
{
|
|
17
|
+
id: 'zod-parse',
|
|
18
|
+
name: 'Zod Schema Parse',
|
|
19
|
+
description: 'Validates input against a Zod schema, throwing on invalid input',
|
|
20
|
+
mitigates: ['injection', 'xss', 'path_traversal'],
|
|
21
|
+
match: {
|
|
22
|
+
type: 'method_call',
|
|
23
|
+
namePattern: '^parse$',
|
|
24
|
+
module: 'zod',
|
|
25
|
+
returnConstraint: 'sanitized',
|
|
26
|
+
},
|
|
27
|
+
confidence: 'high',
|
|
28
|
+
isBuiltIn: true,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: 'zod-safeParse',
|
|
32
|
+
name: 'Zod Safe Parse',
|
|
33
|
+
description: 'Validates input against a Zod schema, returning result object',
|
|
34
|
+
mitigates: ['injection', 'xss', 'path_traversal'],
|
|
35
|
+
match: {
|
|
36
|
+
type: 'method_call',
|
|
37
|
+
namePattern: '^safeParse$',
|
|
38
|
+
module: 'zod',
|
|
39
|
+
returnConstraint: 'sanitized',
|
|
40
|
+
},
|
|
41
|
+
confidence: 'high',
|
|
42
|
+
isBuiltIn: true,
|
|
43
|
+
},
|
|
44
|
+
// Joi validation
|
|
45
|
+
{
|
|
46
|
+
id: 'joi-validate',
|
|
47
|
+
name: 'Joi Schema Validate',
|
|
48
|
+
description: 'Validates input against a Joi schema',
|
|
49
|
+
mitigates: ['injection', 'xss', 'path_traversal'],
|
|
50
|
+
match: {
|
|
51
|
+
type: 'method_call',
|
|
52
|
+
namePattern: '^validate$',
|
|
53
|
+
module: 'joi',
|
|
54
|
+
returnConstraint: 'sanitized',
|
|
55
|
+
},
|
|
56
|
+
confidence: 'high',
|
|
57
|
+
isBuiltIn: true,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
id: 'joi-validateAsync',
|
|
61
|
+
name: 'Joi Async Validate',
|
|
62
|
+
description: 'Validates input asynchronously against a Joi schema',
|
|
63
|
+
mitigates: ['injection', 'xss', 'path_traversal'],
|
|
64
|
+
match: {
|
|
65
|
+
type: 'method_call',
|
|
66
|
+
namePattern: '^validateAsync$',
|
|
67
|
+
module: 'joi',
|
|
68
|
+
returnConstraint: 'sanitized',
|
|
69
|
+
},
|
|
70
|
+
confidence: 'high',
|
|
71
|
+
isBuiltIn: true,
|
|
72
|
+
},
|
|
73
|
+
// Validator.js
|
|
74
|
+
{
|
|
75
|
+
id: 'validator-escape',
|
|
76
|
+
name: 'Validator.js Escape',
|
|
77
|
+
description: 'Escapes HTML characters to prevent XSS',
|
|
78
|
+
mitigates: ['xss'],
|
|
79
|
+
match: {
|
|
80
|
+
type: 'function_call',
|
|
81
|
+
namePattern: '^escape$',
|
|
82
|
+
module: 'validator',
|
|
83
|
+
returnConstraint: 'sanitized',
|
|
84
|
+
},
|
|
85
|
+
confidence: 'high',
|
|
86
|
+
isBuiltIn: true,
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: 'validator-isEmail',
|
|
90
|
+
name: 'Validator.js Email Check',
|
|
91
|
+
description: 'Validates email format',
|
|
92
|
+
mitigates: ['injection'],
|
|
93
|
+
match: {
|
|
94
|
+
type: 'function_call',
|
|
95
|
+
namePattern: '^isEmail$',
|
|
96
|
+
module: 'validator',
|
|
97
|
+
returnConstraint: 'truthy',
|
|
98
|
+
},
|
|
99
|
+
confidence: 'medium',
|
|
100
|
+
isBuiltIn: true,
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
id: 'validator-isURL',
|
|
104
|
+
name: 'Validator.js URL Check',
|
|
105
|
+
description: 'Validates URL format',
|
|
106
|
+
mitigates: ['ssrf', 'injection'],
|
|
107
|
+
match: {
|
|
108
|
+
type: 'function_call',
|
|
109
|
+
namePattern: '^isURL$',
|
|
110
|
+
module: 'validator',
|
|
111
|
+
returnConstraint: 'truthy',
|
|
112
|
+
},
|
|
113
|
+
confidence: 'medium',
|
|
114
|
+
isBuiltIn: true,
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
id: 'validator-isAlphanumeric',
|
|
118
|
+
name: 'Validator.js Alphanumeric Check',
|
|
119
|
+
description: 'Validates input is alphanumeric only',
|
|
120
|
+
mitigates: ['injection', 'path_traversal'],
|
|
121
|
+
match: {
|
|
122
|
+
type: 'function_call',
|
|
123
|
+
namePattern: '^isAlphanumeric$',
|
|
124
|
+
module: 'validator',
|
|
125
|
+
returnConstraint: 'truthy',
|
|
126
|
+
},
|
|
127
|
+
confidence: 'high',
|
|
128
|
+
isBuiltIn: true,
|
|
129
|
+
},
|
|
130
|
+
// Parameterized queries (implicit mitigation)
|
|
131
|
+
{
|
|
132
|
+
id: 'sql-parameterized',
|
|
133
|
+
name: 'SQL Parameterized Query',
|
|
134
|
+
description: 'Uses parameterized query with placeholders ($1, ?, :param)',
|
|
135
|
+
mitigates: ['injection'],
|
|
136
|
+
match: {
|
|
137
|
+
type: 'method_call',
|
|
138
|
+
namePattern: '^(query|execute|run|prepare)$',
|
|
139
|
+
parameters: [{ index: 1, constraint: 'any' }], // Second param = values array
|
|
140
|
+
},
|
|
141
|
+
confidence: 'high',
|
|
142
|
+
isBuiltIn: true,
|
|
143
|
+
},
|
|
144
|
+
];
|
|
145
|
+
// =============================================================================
|
|
146
|
+
// Null Safety Patterns (T022)
|
|
147
|
+
// Mitigates: null_deref
|
|
148
|
+
// =============================================================================
|
|
149
|
+
export const nullSafetyPatterns = [
|
|
150
|
+
// Optional chaining
|
|
151
|
+
{
|
|
152
|
+
id: 'optional-chaining',
|
|
153
|
+
name: 'Optional Chaining',
|
|
154
|
+
description: 'Uses ?. operator for safe property access',
|
|
155
|
+
mitigates: ['null_deref'],
|
|
156
|
+
match: {
|
|
157
|
+
type: 'type_guard',
|
|
158
|
+
namePattern: '^\\?\\.', // Regex to match ?. operator
|
|
159
|
+
},
|
|
160
|
+
confidence: 'high',
|
|
161
|
+
isBuiltIn: true,
|
|
162
|
+
},
|
|
163
|
+
// Nullish coalescing
|
|
164
|
+
{
|
|
165
|
+
id: 'nullish-coalescing',
|
|
166
|
+
name: 'Nullish Coalescing',
|
|
167
|
+
description: 'Uses ?? operator to provide default value',
|
|
168
|
+
mitigates: ['null_deref'],
|
|
169
|
+
match: {
|
|
170
|
+
type: 'assignment',
|
|
171
|
+
namePattern: '^\\?\\?', // Regex to match ?? operator
|
|
172
|
+
},
|
|
173
|
+
confidence: 'high',
|
|
174
|
+
isBuiltIn: true,
|
|
175
|
+
},
|
|
176
|
+
// Nullish assignment
|
|
177
|
+
{
|
|
178
|
+
id: 'nullish-assignment',
|
|
179
|
+
name: 'Nullish Assignment',
|
|
180
|
+
description: 'Uses ??= operator for conditional assignment',
|
|
181
|
+
mitigates: ['null_deref'],
|
|
182
|
+
match: {
|
|
183
|
+
type: 'assignment',
|
|
184
|
+
namePattern: '^\\?\\?=', // Regex to match ??= operator
|
|
185
|
+
},
|
|
186
|
+
confidence: 'high',
|
|
187
|
+
isBuiltIn: true,
|
|
188
|
+
},
|
|
189
|
+
// Typeof check
|
|
190
|
+
{
|
|
191
|
+
id: 'typeof-check',
|
|
192
|
+
name: 'Typeof Check',
|
|
193
|
+
description: 'Uses typeof to check value type before access',
|
|
194
|
+
mitigates: ['null_deref'],
|
|
195
|
+
match: {
|
|
196
|
+
type: 'typeof_check',
|
|
197
|
+
},
|
|
198
|
+
confidence: 'high',
|
|
199
|
+
isBuiltIn: true,
|
|
200
|
+
},
|
|
201
|
+
// Instanceof check
|
|
202
|
+
{
|
|
203
|
+
id: 'instanceof-check',
|
|
204
|
+
name: 'Instanceof Check',
|
|
205
|
+
description: 'Uses instanceof to verify object type',
|
|
206
|
+
mitigates: ['null_deref'],
|
|
207
|
+
match: {
|
|
208
|
+
type: 'instanceof_check',
|
|
209
|
+
},
|
|
210
|
+
confidence: 'high',
|
|
211
|
+
isBuiltIn: true,
|
|
212
|
+
},
|
|
213
|
+
// Explicit null/undefined checks
|
|
214
|
+
{
|
|
215
|
+
id: 'null-check-strict',
|
|
216
|
+
name: 'Strict Null Check',
|
|
217
|
+
description: 'Checks value against null with strict equality',
|
|
218
|
+
mitigates: ['null_deref'],
|
|
219
|
+
match: {
|
|
220
|
+
type: 'type_guard',
|
|
221
|
+
namePattern: '^(!==?\\s*null|===?\\s*null)', // x !== null or x === null
|
|
222
|
+
},
|
|
223
|
+
confidence: 'high',
|
|
224
|
+
isBuiltIn: true,
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
id: 'undefined-check-strict',
|
|
228
|
+
name: 'Strict Undefined Check',
|
|
229
|
+
description: 'Checks value against undefined with strict equality',
|
|
230
|
+
mitigates: ['null_deref'],
|
|
231
|
+
match: {
|
|
232
|
+
type: 'type_guard',
|
|
233
|
+
namePattern: '^(!==?\\s*undefined|===?\\s*undefined)',
|
|
234
|
+
},
|
|
235
|
+
confidence: 'high',
|
|
236
|
+
isBuiltIn: true,
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
id: 'nullish-check',
|
|
240
|
+
name: 'Nullish Check (== null)',
|
|
241
|
+
description: 'Checks value for null or undefined using loose equality',
|
|
242
|
+
mitigates: ['null_deref'],
|
|
243
|
+
match: {
|
|
244
|
+
type: 'type_guard',
|
|
245
|
+
namePattern: '^(!=\\s*null|==\\s*null)', // x != null (catches both null and undefined)
|
|
246
|
+
},
|
|
247
|
+
confidence: 'high',
|
|
248
|
+
isBuiltIn: true,
|
|
249
|
+
},
|
|
250
|
+
// Assertion functions
|
|
251
|
+
{
|
|
252
|
+
id: 'assert-defined',
|
|
253
|
+
name: 'Assert Defined',
|
|
254
|
+
description: 'Assertion function that throws if value is null/undefined',
|
|
255
|
+
mitigates: ['null_deref'],
|
|
256
|
+
match: {
|
|
257
|
+
type: 'function_call',
|
|
258
|
+
namePattern: '^(assertDefined|assertNotNull|assertNotNullish|assert)$',
|
|
259
|
+
},
|
|
260
|
+
confidence: 'medium',
|
|
261
|
+
isBuiltIn: true,
|
|
262
|
+
},
|
|
263
|
+
];
|
|
264
|
+
// =============================================================================
|
|
265
|
+
// Auth Check Patterns (T023)
|
|
266
|
+
// Mitigates: auth_bypass
|
|
267
|
+
// =============================================================================
|
|
268
|
+
export const authCheckPatterns = [
|
|
269
|
+
// JWT verification
|
|
270
|
+
{
|
|
271
|
+
id: 'jwt-verify',
|
|
272
|
+
name: 'JWT Verify',
|
|
273
|
+
description: 'Verifies JWT token signature and claims',
|
|
274
|
+
mitigates: ['auth_bypass'],
|
|
275
|
+
match: {
|
|
276
|
+
type: 'method_call',
|
|
277
|
+
namePattern: '^verify$',
|
|
278
|
+
module: 'jsonwebtoken',
|
|
279
|
+
},
|
|
280
|
+
confidence: 'high',
|
|
281
|
+
isBuiltIn: true,
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
id: 'jwt-decode-verify',
|
|
285
|
+
name: 'JWT Decode with Verify',
|
|
286
|
+
description: 'Decodes and verifies JWT token',
|
|
287
|
+
mitigates: ['auth_bypass'],
|
|
288
|
+
match: {
|
|
289
|
+
type: 'function_call',
|
|
290
|
+
namePattern: '^(jwtVerify|verifyToken|verifyJwt)$',
|
|
291
|
+
},
|
|
292
|
+
confidence: 'medium',
|
|
293
|
+
isBuiltIn: true,
|
|
294
|
+
},
|
|
295
|
+
// Passport.js
|
|
296
|
+
{
|
|
297
|
+
id: 'passport-authenticate',
|
|
298
|
+
name: 'Passport Authenticate',
|
|
299
|
+
description: 'Passport.js authentication middleware',
|
|
300
|
+
mitigates: ['auth_bypass'],
|
|
301
|
+
match: {
|
|
302
|
+
type: 'method_call',
|
|
303
|
+
namePattern: '^authenticate$',
|
|
304
|
+
module: 'passport',
|
|
305
|
+
},
|
|
306
|
+
confidence: 'high',
|
|
307
|
+
isBuiltIn: true,
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
id: 'passport-isAuthenticated',
|
|
311
|
+
name: 'Passport isAuthenticated',
|
|
312
|
+
description: 'Checks if user is authenticated via Passport session',
|
|
313
|
+
mitigates: ['auth_bypass'],
|
|
314
|
+
match: {
|
|
315
|
+
type: 'method_call',
|
|
316
|
+
namePattern: '^isAuthenticated$',
|
|
317
|
+
returnConstraint: 'truthy',
|
|
318
|
+
},
|
|
319
|
+
confidence: 'high',
|
|
320
|
+
isBuiltIn: true,
|
|
321
|
+
},
|
|
322
|
+
// Session checks
|
|
323
|
+
{
|
|
324
|
+
id: 'session-user-check',
|
|
325
|
+
name: 'Session User Check',
|
|
326
|
+
description: 'Checks for user object in session',
|
|
327
|
+
mitigates: ['auth_bypass'],
|
|
328
|
+
match: {
|
|
329
|
+
type: 'type_guard',
|
|
330
|
+
namePattern: '^(session\\.user|req\\.session\\.user|session\\?.user)',
|
|
331
|
+
},
|
|
332
|
+
confidence: 'medium',
|
|
333
|
+
isBuiltIn: true,
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
id: 'session-id-check',
|
|
337
|
+
name: 'Session ID Check',
|
|
338
|
+
description: 'Checks for user ID in session',
|
|
339
|
+
mitigates: ['auth_bypass'],
|
|
340
|
+
match: {
|
|
341
|
+
type: 'type_guard',
|
|
342
|
+
namePattern: '^(session\\.userId|req\\.session\\.userId|session\\?.userId)',
|
|
343
|
+
},
|
|
344
|
+
confidence: 'medium',
|
|
345
|
+
isBuiltIn: true,
|
|
346
|
+
},
|
|
347
|
+
// Role/permission checks
|
|
348
|
+
{
|
|
349
|
+
id: 'role-check',
|
|
350
|
+
name: 'Role Check',
|
|
351
|
+
description: 'Checks user role for authorization',
|
|
352
|
+
mitigates: ['auth_bypass'],
|
|
353
|
+
match: {
|
|
354
|
+
type: 'type_guard',
|
|
355
|
+
namePattern: '^(user\\.role|req\\.user\\.role|\\.role\\s*===)',
|
|
356
|
+
},
|
|
357
|
+
confidence: 'medium',
|
|
358
|
+
isBuiltIn: true,
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
id: 'permission-check',
|
|
362
|
+
name: 'Permission Check',
|
|
363
|
+
description: 'Checks user permissions for authorization',
|
|
364
|
+
mitigates: ['auth_bypass'],
|
|
365
|
+
match: {
|
|
366
|
+
type: 'function_call',
|
|
367
|
+
namePattern: '^(hasPermission|checkPermission|can|authorize)$',
|
|
368
|
+
returnConstraint: 'truthy',
|
|
369
|
+
},
|
|
370
|
+
confidence: 'medium',
|
|
371
|
+
isBuiltIn: true,
|
|
372
|
+
},
|
|
373
|
+
// OAuth token verification
|
|
374
|
+
{
|
|
375
|
+
id: 'oauth-verify',
|
|
376
|
+
name: 'OAuth Token Verify',
|
|
377
|
+
description: 'Verifies OAuth access token',
|
|
378
|
+
mitigates: ['auth_bypass'],
|
|
379
|
+
match: {
|
|
380
|
+
type: 'method_call',
|
|
381
|
+
namePattern: '^(verifyAccessToken|validateToken|introspect)$',
|
|
382
|
+
},
|
|
383
|
+
confidence: 'medium',
|
|
384
|
+
isBuiltIn: true,
|
|
385
|
+
},
|
|
386
|
+
// API key validation
|
|
387
|
+
{
|
|
388
|
+
id: 'api-key-validate',
|
|
389
|
+
name: 'API Key Validation',
|
|
390
|
+
description: 'Validates API key for authentication',
|
|
391
|
+
mitigates: ['auth_bypass'],
|
|
392
|
+
match: {
|
|
393
|
+
type: 'function_call',
|
|
394
|
+
namePattern: '^(validateApiKey|verifyApiKey|isValidApiKey)$',
|
|
395
|
+
returnConstraint: 'truthy',
|
|
396
|
+
},
|
|
397
|
+
confidence: 'medium',
|
|
398
|
+
isBuiltIn: true,
|
|
399
|
+
},
|
|
400
|
+
];
|
|
401
|
+
// =============================================================================
|
|
402
|
+
// Output Encoding Patterns (T024)
|
|
403
|
+
// Mitigates: xss
|
|
404
|
+
// =============================================================================
|
|
405
|
+
export const outputEncodingPatterns = [
|
|
406
|
+
// DOMPurify
|
|
407
|
+
{
|
|
408
|
+
id: 'dompurify-sanitize',
|
|
409
|
+
name: 'DOMPurify Sanitize',
|
|
410
|
+
description: 'Sanitizes HTML to prevent XSS',
|
|
411
|
+
mitigates: ['xss'],
|
|
412
|
+
match: {
|
|
413
|
+
type: 'method_call',
|
|
414
|
+
namePattern: '^sanitize$',
|
|
415
|
+
module: 'dompurify',
|
|
416
|
+
returnConstraint: 'sanitized',
|
|
417
|
+
},
|
|
418
|
+
confidence: 'high',
|
|
419
|
+
isBuiltIn: true,
|
|
420
|
+
},
|
|
421
|
+
// Built-in encoding functions
|
|
422
|
+
{
|
|
423
|
+
id: 'encodeURI',
|
|
424
|
+
name: 'encodeURI',
|
|
425
|
+
description: 'Encodes a URI',
|
|
426
|
+
mitigates: ['xss', 'injection'],
|
|
427
|
+
match: {
|
|
428
|
+
type: 'function_call',
|
|
429
|
+
name: 'encodeURI',
|
|
430
|
+
returnConstraint: 'sanitized',
|
|
431
|
+
},
|
|
432
|
+
confidence: 'medium',
|
|
433
|
+
isBuiltIn: true,
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
id: 'encodeURIComponent',
|
|
437
|
+
name: 'encodeURIComponent',
|
|
438
|
+
description: 'Encodes a URI component',
|
|
439
|
+
mitigates: ['xss', 'injection'],
|
|
440
|
+
match: {
|
|
441
|
+
type: 'function_call',
|
|
442
|
+
name: 'encodeURIComponent',
|
|
443
|
+
returnConstraint: 'sanitized',
|
|
444
|
+
},
|
|
445
|
+
confidence: 'high',
|
|
446
|
+
isBuiltIn: true,
|
|
447
|
+
},
|
|
448
|
+
// HTML entity encoding
|
|
449
|
+
{
|
|
450
|
+
id: 'he-encode',
|
|
451
|
+
name: 'he.encode',
|
|
452
|
+
description: 'Encodes HTML entities using he library',
|
|
453
|
+
mitigates: ['xss'],
|
|
454
|
+
match: {
|
|
455
|
+
type: 'method_call',
|
|
456
|
+
namePattern: '^encode$',
|
|
457
|
+
module: 'he',
|
|
458
|
+
returnConstraint: 'sanitized',
|
|
459
|
+
},
|
|
460
|
+
confidence: 'high',
|
|
461
|
+
isBuiltIn: true,
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
id: 'he-escape',
|
|
465
|
+
name: 'he.escape',
|
|
466
|
+
description: 'Escapes HTML entities using he library',
|
|
467
|
+
mitigates: ['xss'],
|
|
468
|
+
match: {
|
|
469
|
+
type: 'method_call',
|
|
470
|
+
namePattern: '^escape$',
|
|
471
|
+
module: 'he',
|
|
472
|
+
returnConstraint: 'sanitized',
|
|
473
|
+
},
|
|
474
|
+
confidence: 'high',
|
|
475
|
+
isBuiltIn: true,
|
|
476
|
+
},
|
|
477
|
+
// lodash/underscore escape
|
|
478
|
+
{
|
|
479
|
+
id: 'lodash-escape',
|
|
480
|
+
name: 'Lodash Escape',
|
|
481
|
+
description: 'Escapes HTML using lodash/underscore',
|
|
482
|
+
mitigates: ['xss'],
|
|
483
|
+
match: {
|
|
484
|
+
type: 'method_call',
|
|
485
|
+
namePattern: '^escape$',
|
|
486
|
+
module: 'lodash',
|
|
487
|
+
returnConstraint: 'sanitized',
|
|
488
|
+
},
|
|
489
|
+
confidence: 'high',
|
|
490
|
+
isBuiltIn: true,
|
|
491
|
+
},
|
|
492
|
+
// React automatic escaping (JSX)
|
|
493
|
+
{
|
|
494
|
+
id: 'react-jsx-escape',
|
|
495
|
+
name: 'React JSX Escape',
|
|
496
|
+
description: 'React automatically escapes JSX content',
|
|
497
|
+
mitigates: ['xss'],
|
|
498
|
+
match: {
|
|
499
|
+
type: 'assignment',
|
|
500
|
+
namePattern: '^<[A-Z]', // JSX element assignment
|
|
501
|
+
},
|
|
502
|
+
confidence: 'high',
|
|
503
|
+
isBuiltIn: true,
|
|
504
|
+
},
|
|
505
|
+
// textContent (safe DOM assignment)
|
|
506
|
+
{
|
|
507
|
+
id: 'textContent-assignment',
|
|
508
|
+
name: 'textContent Assignment',
|
|
509
|
+
description: 'Assigning to textContent is safe from XSS',
|
|
510
|
+
mitigates: ['xss'],
|
|
511
|
+
match: {
|
|
512
|
+
type: 'assignment',
|
|
513
|
+
namePattern: '\\.textContent\\s*=',
|
|
514
|
+
},
|
|
515
|
+
confidence: 'high',
|
|
516
|
+
isBuiltIn: true,
|
|
517
|
+
},
|
|
518
|
+
// createTextNode (safe DOM method)
|
|
519
|
+
{
|
|
520
|
+
id: 'createTextNode',
|
|
521
|
+
name: 'createTextNode',
|
|
522
|
+
description: 'Creating text node is safe from XSS',
|
|
523
|
+
mitigates: ['xss'],
|
|
524
|
+
match: {
|
|
525
|
+
type: 'method_call',
|
|
526
|
+
name: 'createTextNode',
|
|
527
|
+
},
|
|
528
|
+
confidence: 'high',
|
|
529
|
+
isBuiltIn: true,
|
|
530
|
+
},
|
|
531
|
+
];
|
|
532
|
+
// =============================================================================
|
|
533
|
+
// Path Traversal Patterns
|
|
534
|
+
// Mitigates: path_traversal
|
|
535
|
+
// =============================================================================
|
|
536
|
+
export const pathTraversalPatterns = [
|
|
537
|
+
{
|
|
538
|
+
id: 'path-resolve',
|
|
539
|
+
name: 'Path Resolve',
|
|
540
|
+
description: 'Resolves path segments to absolute path',
|
|
541
|
+
mitigates: ['path_traversal'],
|
|
542
|
+
match: {
|
|
543
|
+
type: 'method_call',
|
|
544
|
+
namePattern: '^resolve$',
|
|
545
|
+
module: 'path',
|
|
546
|
+
},
|
|
547
|
+
confidence: 'medium',
|
|
548
|
+
isBuiltIn: true,
|
|
549
|
+
},
|
|
550
|
+
{
|
|
551
|
+
id: 'path-normalize',
|
|
552
|
+
name: 'Path Normalize',
|
|
553
|
+
description: 'Normalizes path by resolving . and ..',
|
|
554
|
+
mitigates: ['path_traversal'],
|
|
555
|
+
match: {
|
|
556
|
+
type: 'method_call',
|
|
557
|
+
namePattern: '^normalize$',
|
|
558
|
+
module: 'path',
|
|
559
|
+
},
|
|
560
|
+
confidence: 'low', // normalize alone doesn't prevent traversal
|
|
561
|
+
isBuiltIn: true,
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
id: 'path-basename',
|
|
565
|
+
name: 'Path Basename',
|
|
566
|
+
description: 'Extracts filename only, preventing directory traversal',
|
|
567
|
+
mitigates: ['path_traversal'],
|
|
568
|
+
match: {
|
|
569
|
+
type: 'method_call',
|
|
570
|
+
namePattern: '^basename$',
|
|
571
|
+
module: 'path',
|
|
572
|
+
},
|
|
573
|
+
confidence: 'high',
|
|
574
|
+
isBuiltIn: true,
|
|
575
|
+
},
|
|
576
|
+
{
|
|
577
|
+
id: 'startsWith-check',
|
|
578
|
+
name: 'Path Prefix Check',
|
|
579
|
+
description: 'Verifies path starts with allowed directory',
|
|
580
|
+
mitigates: ['path_traversal'],
|
|
581
|
+
match: {
|
|
582
|
+
type: 'method_call',
|
|
583
|
+
namePattern: '^startsWith$',
|
|
584
|
+
returnConstraint: 'truthy',
|
|
585
|
+
},
|
|
586
|
+
confidence: 'medium',
|
|
587
|
+
isBuiltIn: true,
|
|
588
|
+
},
|
|
589
|
+
];
|
|
590
|
+
// =============================================================================
|
|
591
|
+
// Aggregate Exports
|
|
592
|
+
// =============================================================================
|
|
593
|
+
/**
|
|
594
|
+
* All built-in mitigation patterns.
|
|
595
|
+
* Organized by category for easy reference and testing.
|
|
596
|
+
*/
|
|
597
|
+
export const BUILTIN_PATTERNS = [
|
|
598
|
+
...inputValidationPatterns,
|
|
599
|
+
...nullSafetyPatterns,
|
|
600
|
+
...authCheckPatterns,
|
|
601
|
+
...outputEncodingPatterns,
|
|
602
|
+
...pathTraversalPatterns,
|
|
603
|
+
];
|
|
604
|
+
/**
|
|
605
|
+
* Pattern lookup by ID for fast access.
|
|
606
|
+
*/
|
|
607
|
+
export const PATTERN_BY_ID = new Map(BUILTIN_PATTERNS.map((p) => [p.id, p]));
|
|
608
|
+
/**
|
|
609
|
+
* Get patterns that mitigate a specific vulnerability type.
|
|
610
|
+
*/
|
|
611
|
+
export function getPatternsForVulnerability(vulnType) {
|
|
612
|
+
return BUILTIN_PATTERNS.filter((p) => p.mitigates.includes(vulnType));
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* Get pattern by ID.
|
|
616
|
+
*/
|
|
617
|
+
export function getPatternById(id) {
|
|
618
|
+
return PATTERN_BY_ID.get(id);
|
|
619
|
+
}
|
|
620
|
+
//# sourceMappingURL=mitigation-patterns.js.map
|