@oculum/scanner 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/dist/formatters/cli-terminal.d.ts +27 -0
- package/dist/formatters/cli-terminal.d.ts.map +1 -0
- package/dist/formatters/cli-terminal.js +412 -0
- package/dist/formatters/cli-terminal.js.map +1 -0
- package/dist/formatters/github-comment.d.ts +41 -0
- package/dist/formatters/github-comment.d.ts.map +1 -0
- package/dist/formatters/github-comment.js +306 -0
- package/dist/formatters/github-comment.js.map +1 -0
- package/dist/formatters/grouping.d.ts +52 -0
- package/dist/formatters/grouping.d.ts.map +1 -0
- package/dist/formatters/grouping.js +152 -0
- package/dist/formatters/grouping.js.map +1 -0
- package/dist/formatters/index.d.ts +9 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +35 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/vscode-diagnostic.d.ts +103 -0
- package/dist/formatters/vscode-diagnostic.d.ts.map +1 -0
- package/dist/formatters/vscode-diagnostic.js +151 -0
- package/dist/formatters/vscode-diagnostic.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +648 -0
- package/dist/index.js.map +1 -0
- package/dist/layer1/comments.d.ts +8 -0
- package/dist/layer1/comments.d.ts.map +1 -0
- package/dist/layer1/comments.js +203 -0
- package/dist/layer1/comments.js.map +1 -0
- package/dist/layer1/config-audit.d.ts +8 -0
- package/dist/layer1/config-audit.d.ts.map +1 -0
- package/dist/layer1/config-audit.js +252 -0
- package/dist/layer1/config-audit.js.map +1 -0
- package/dist/layer1/entropy.d.ts +8 -0
- package/dist/layer1/entropy.d.ts.map +1 -0
- package/dist/layer1/entropy.js +500 -0
- package/dist/layer1/entropy.js.map +1 -0
- package/dist/layer1/file-flags.d.ts +7 -0
- package/dist/layer1/file-flags.d.ts.map +1 -0
- package/dist/layer1/file-flags.js +112 -0
- package/dist/layer1/file-flags.js.map +1 -0
- package/dist/layer1/index.d.ts +36 -0
- package/dist/layer1/index.d.ts.map +1 -0
- package/dist/layer1/index.js +132 -0
- package/dist/layer1/index.js.map +1 -0
- package/dist/layer1/patterns.d.ts +8 -0
- package/dist/layer1/patterns.d.ts.map +1 -0
- package/dist/layer1/patterns.js +482 -0
- package/dist/layer1/patterns.js.map +1 -0
- package/dist/layer1/urls.d.ts +8 -0
- package/dist/layer1/urls.d.ts.map +1 -0
- package/dist/layer1/urls.js +296 -0
- package/dist/layer1/urls.js.map +1 -0
- package/dist/layer1/weak-crypto.d.ts +7 -0
- package/dist/layer1/weak-crypto.d.ts.map +1 -0
- package/dist/layer1/weak-crypto.js +291 -0
- package/dist/layer1/weak-crypto.js.map +1 -0
- package/dist/layer2/ai-agent-tools.d.ts +19 -0
- package/dist/layer2/ai-agent-tools.d.ts.map +1 -0
- package/dist/layer2/ai-agent-tools.js +528 -0
- package/dist/layer2/ai-agent-tools.js.map +1 -0
- package/dist/layer2/ai-endpoint-protection.d.ts +36 -0
- package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -0
- package/dist/layer2/ai-endpoint-protection.js +332 -0
- package/dist/layer2/ai-endpoint-protection.js.map +1 -0
- package/dist/layer2/ai-execution-sinks.d.ts +18 -0
- package/dist/layer2/ai-execution-sinks.d.ts.map +1 -0
- package/dist/layer2/ai-execution-sinks.js +496 -0
- package/dist/layer2/ai-execution-sinks.js.map +1 -0
- package/dist/layer2/ai-fingerprinting.d.ts +7 -0
- package/dist/layer2/ai-fingerprinting.d.ts.map +1 -0
- package/dist/layer2/ai-fingerprinting.js +654 -0
- package/dist/layer2/ai-fingerprinting.js.map +1 -0
- package/dist/layer2/ai-prompt-hygiene.d.ts +19 -0
- package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -0
- package/dist/layer2/ai-prompt-hygiene.js +356 -0
- package/dist/layer2/ai-prompt-hygiene.js.map +1 -0
- package/dist/layer2/ai-rag-safety.d.ts +21 -0
- package/dist/layer2/ai-rag-safety.d.ts.map +1 -0
- package/dist/layer2/ai-rag-safety.js +459 -0
- package/dist/layer2/ai-rag-safety.js.map +1 -0
- package/dist/layer2/ai-schema-validation.d.ts +25 -0
- package/dist/layer2/ai-schema-validation.d.ts.map +1 -0
- package/dist/layer2/ai-schema-validation.js +375 -0
- package/dist/layer2/ai-schema-validation.js.map +1 -0
- package/dist/layer2/auth-antipatterns.d.ts +20 -0
- package/dist/layer2/auth-antipatterns.d.ts.map +1 -0
- package/dist/layer2/auth-antipatterns.js +333 -0
- package/dist/layer2/auth-antipatterns.js.map +1 -0
- package/dist/layer2/byok-patterns.d.ts +12 -0
- package/dist/layer2/byok-patterns.d.ts.map +1 -0
- package/dist/layer2/byok-patterns.js +299 -0
- package/dist/layer2/byok-patterns.js.map +1 -0
- package/dist/layer2/dangerous-functions.d.ts +7 -0
- package/dist/layer2/dangerous-functions.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions.js +1375 -0
- package/dist/layer2/dangerous-functions.js.map +1 -0
- package/dist/layer2/data-exposure.d.ts +16 -0
- package/dist/layer2/data-exposure.d.ts.map +1 -0
- package/dist/layer2/data-exposure.js +279 -0
- package/dist/layer2/data-exposure.js.map +1 -0
- package/dist/layer2/framework-checks.d.ts +7 -0
- package/dist/layer2/framework-checks.d.ts.map +1 -0
- package/dist/layer2/framework-checks.js +388 -0
- package/dist/layer2/framework-checks.js.map +1 -0
- package/dist/layer2/index.d.ts +58 -0
- package/dist/layer2/index.d.ts.map +1 -0
- package/dist/layer2/index.js +380 -0
- package/dist/layer2/index.js.map +1 -0
- package/dist/layer2/logic-gates.d.ts +7 -0
- package/dist/layer2/logic-gates.d.ts.map +1 -0
- package/dist/layer2/logic-gates.js +182 -0
- package/dist/layer2/logic-gates.js.map +1 -0
- package/dist/layer2/risky-imports.d.ts +7 -0
- package/dist/layer2/risky-imports.d.ts.map +1 -0
- package/dist/layer2/risky-imports.js +161 -0
- package/dist/layer2/risky-imports.js.map +1 -0
- package/dist/layer2/variables.d.ts +8 -0
- package/dist/layer2/variables.d.ts.map +1 -0
- package/dist/layer2/variables.js +152 -0
- package/dist/layer2/variables.js.map +1 -0
- package/dist/layer3/anthropic.d.ts +83 -0
- package/dist/layer3/anthropic.d.ts.map +1 -0
- package/dist/layer3/anthropic.js +1745 -0
- package/dist/layer3/anthropic.js.map +1 -0
- package/dist/layer3/index.d.ts +24 -0
- package/dist/layer3/index.d.ts.map +1 -0
- package/dist/layer3/index.js +119 -0
- package/dist/layer3/index.js.map +1 -0
- package/dist/layer3/openai.d.ts +25 -0
- package/dist/layer3/openai.d.ts.map +1 -0
- package/dist/layer3/openai.js +238 -0
- package/dist/layer3/openai.js.map +1 -0
- package/dist/layer3/package-check.d.ts +63 -0
- package/dist/layer3/package-check.d.ts.map +1 -0
- package/dist/layer3/package-check.js +508 -0
- package/dist/layer3/package-check.js.map +1 -0
- package/dist/modes/incremental.d.ts +66 -0
- package/dist/modes/incremental.d.ts.map +1 -0
- package/dist/modes/incremental.js +200 -0
- package/dist/modes/incremental.js.map +1 -0
- package/dist/tiers.d.ts +125 -0
- package/dist/tiers.d.ts.map +1 -0
- package/dist/tiers.js +234 -0
- package/dist/tiers.js.map +1 -0
- package/dist/types.d.ts +175 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +50 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/auth-helper-detector.d.ts +56 -0
- package/dist/utils/auth-helper-detector.d.ts.map +1 -0
- package/dist/utils/auth-helper-detector.js +360 -0
- package/dist/utils/auth-helper-detector.js.map +1 -0
- package/dist/utils/context-helpers.d.ts +96 -0
- package/dist/utils/context-helpers.d.ts.map +1 -0
- package/dist/utils/context-helpers.js +493 -0
- package/dist/utils/context-helpers.js.map +1 -0
- package/dist/utils/diff-detector.d.ts +53 -0
- package/dist/utils/diff-detector.d.ts.map +1 -0
- package/dist/utils/diff-detector.js +104 -0
- package/dist/utils/diff-detector.js.map +1 -0
- package/dist/utils/diff-parser.d.ts +80 -0
- package/dist/utils/diff-parser.d.ts.map +1 -0
- package/dist/utils/diff-parser.js +202 -0
- package/dist/utils/diff-parser.js.map +1 -0
- package/dist/utils/imported-auth-detector.d.ts +37 -0
- package/dist/utils/imported-auth-detector.d.ts.map +1 -0
- package/dist/utils/imported-auth-detector.js +251 -0
- package/dist/utils/imported-auth-detector.js.map +1 -0
- package/dist/utils/middleware-detector.d.ts +55 -0
- package/dist/utils/middleware-detector.d.ts.map +1 -0
- package/dist/utils/middleware-detector.js +260 -0
- package/dist/utils/middleware-detector.js.map +1 -0
- package/dist/utils/oauth-flow-detector.d.ts +41 -0
- package/dist/utils/oauth-flow-detector.d.ts.map +1 -0
- package/dist/utils/oauth-flow-detector.js +202 -0
- package/dist/utils/oauth-flow-detector.js.map +1 -0
- package/dist/utils/path-exclusions.d.ts +55 -0
- package/dist/utils/path-exclusions.d.ts.map +1 -0
- package/dist/utils/path-exclusions.js +222 -0
- package/dist/utils/path-exclusions.js.map +1 -0
- package/dist/utils/project-context-builder.d.ts +119 -0
- package/dist/utils/project-context-builder.d.ts.map +1 -0
- package/dist/utils/project-context-builder.js +534 -0
- package/dist/utils/project-context-builder.js.map +1 -0
- package/dist/utils/registry-clients.d.ts +93 -0
- package/dist/utils/registry-clients.d.ts.map +1 -0
- package/dist/utils/registry-clients.js +273 -0
- package/dist/utils/registry-clients.js.map +1 -0
- package/dist/utils/trpc-analyzer.d.ts +78 -0
- package/dist/utils/trpc-analyzer.d.ts.map +1 -0
- package/dist/utils/trpc-analyzer.js +297 -0
- package/dist/utils/trpc-analyzer.js.map +1 -0
- package/package.json +45 -0
- package/src/__tests__/benchmark/fixtures/false-positives.ts +227 -0
- package/src/__tests__/benchmark/fixtures/index.ts +68 -0
- package/src/__tests__/benchmark/fixtures/layer1/config-audit.ts +364 -0
- package/src/__tests__/benchmark/fixtures/layer1/hardcoded-secrets.ts +173 -0
- package/src/__tests__/benchmark/fixtures/layer1/high-entropy.ts +234 -0
- package/src/__tests__/benchmark/fixtures/layer1/index.ts +31 -0
- package/src/__tests__/benchmark/fixtures/layer1/sensitive-urls.ts +90 -0
- package/src/__tests__/benchmark/fixtures/layer1/weak-crypto.ts +197 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-agent-tools.ts +170 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-endpoint-protection.ts +418 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +189 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-fingerprinting.ts +316 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-prompt-hygiene.ts +178 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-rag-safety.ts +184 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-schema-validation.ts +434 -0
- package/src/__tests__/benchmark/fixtures/layer2/auth-antipatterns.ts +159 -0
- package/src/__tests__/benchmark/fixtures/layer2/byok-patterns.ts +112 -0
- package/src/__tests__/benchmark/fixtures/layer2/dangerous-functions.ts +246 -0
- package/src/__tests__/benchmark/fixtures/layer2/data-exposure.ts +168 -0
- package/src/__tests__/benchmark/fixtures/layer2/framework-checks.ts +346 -0
- package/src/__tests__/benchmark/fixtures/layer2/index.ts +67 -0
- package/src/__tests__/benchmark/fixtures/layer2/injection-vulnerabilities.ts +239 -0
- package/src/__tests__/benchmark/fixtures/layer2/logic-gates.ts +246 -0
- package/src/__tests__/benchmark/fixtures/layer2/risky-imports.ts +231 -0
- package/src/__tests__/benchmark/fixtures/layer2/variables.ts +167 -0
- package/src/__tests__/benchmark/index.ts +29 -0
- package/src/__tests__/benchmark/run-benchmark.ts +144 -0
- package/src/__tests__/benchmark/run-depth-validation.ts +206 -0
- package/src/__tests__/benchmark/run-real-world-test.ts +243 -0
- package/src/__tests__/benchmark/security-benchmark-script.ts +1737 -0
- package/src/__tests__/benchmark/tier-integration-script.ts +177 -0
- package/src/__tests__/benchmark/types.ts +144 -0
- package/src/__tests__/benchmark/utils/test-runner.ts +475 -0
- package/src/__tests__/regression/known-false-positives.test.ts +467 -0
- package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +178 -0
- package/src/__tests__/snapshots/scan-depth.test.ts +258 -0
- package/src/__tests__/validation/analyze-results.ts +542 -0
- package/src/__tests__/validation/extract-for-triage.ts +146 -0
- package/src/__tests__/validation/fp-deep-analysis.ts +327 -0
- package/src/__tests__/validation/run-validation.ts +364 -0
- package/src/__tests__/validation/triage-template.md +132 -0
- package/src/formatters/cli-terminal.ts +446 -0
- package/src/formatters/github-comment.ts +382 -0
- package/src/formatters/grouping.ts +190 -0
- package/src/formatters/index.ts +47 -0
- package/src/formatters/vscode-diagnostic.ts +243 -0
- package/src/index.ts +823 -0
- package/src/layer1/comments.ts +218 -0
- package/src/layer1/config-audit.ts +289 -0
- package/src/layer1/entropy.ts +583 -0
- package/src/layer1/file-flags.ts +127 -0
- package/src/layer1/index.ts +181 -0
- package/src/layer1/patterns.ts +516 -0
- package/src/layer1/urls.ts +334 -0
- package/src/layer1/weak-crypto.ts +328 -0
- package/src/layer2/ai-agent-tools.ts +601 -0
- package/src/layer2/ai-endpoint-protection.ts +387 -0
- package/src/layer2/ai-execution-sinks.ts +580 -0
- package/src/layer2/ai-fingerprinting.ts +758 -0
- package/src/layer2/ai-prompt-hygiene.ts +411 -0
- package/src/layer2/ai-rag-safety.ts +511 -0
- package/src/layer2/ai-schema-validation.ts +421 -0
- package/src/layer2/auth-antipatterns.ts +394 -0
- package/src/layer2/byok-patterns.ts +336 -0
- package/src/layer2/dangerous-functions.ts +1563 -0
- package/src/layer2/data-exposure.ts +315 -0
- package/src/layer2/framework-checks.ts +433 -0
- package/src/layer2/index.ts +473 -0
- package/src/layer2/logic-gates.ts +206 -0
- package/src/layer2/risky-imports.ts +186 -0
- package/src/layer2/variables.ts +166 -0
- package/src/layer3/anthropic.ts +2030 -0
- package/src/layer3/index.ts +130 -0
- package/src/layer3/package-check.ts +604 -0
- package/src/modes/incremental.ts +293 -0
- package/src/tiers.ts +318 -0
- package/src/types.ts +284 -0
- package/src/utils/auth-helper-detector.ts +443 -0
- package/src/utils/context-helpers.ts +535 -0
- package/src/utils/diff-detector.ts +135 -0
- package/src/utils/diff-parser.ts +272 -0
- package/src/utils/imported-auth-detector.ts +320 -0
- package/src/utils/middleware-detector.ts +333 -0
- package/src/utils/oauth-flow-detector.ts +246 -0
- package/src/utils/path-exclusions.ts +266 -0
- package/src/utils/project-context-builder.ts +707 -0
- package/src/utils/registry-clients.ts +351 -0
- package/src/utils/trpc-analyzer.ts +382 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-helper-detector.js","sourceRoot":"","sources":["../../src/utils/auth-helper-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Context Helpers
|
|
3
|
+
* Centralized utility functions for detecting file and code context
|
|
4
|
+
* Used across Layer 1 and Layer 2 scanners to reduce false positives
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Check if file is server-only (not bundled to client)
|
|
8
|
+
* Server-only files can safely use service role keys and other admin secrets
|
|
9
|
+
*/
|
|
10
|
+
export declare function isServerOnlyFile(filePath: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Check if file is a test, mock, or fixture file
|
|
13
|
+
* These files often contain fake secrets and should have lower severity
|
|
14
|
+
*/
|
|
15
|
+
export declare function isTestOrMockFile(filePath: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Check if file is an example/sample/template file
|
|
18
|
+
* These files should be skipped or have significantly reduced severity
|
|
19
|
+
*/
|
|
20
|
+
export declare function isExampleFile(filePath: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Check if file is in an examples/demo directory
|
|
23
|
+
* Stronger check than isExampleFile - specifically for directories
|
|
24
|
+
* These are typically tutorial/demo code, not production patterns
|
|
25
|
+
*/
|
|
26
|
+
export declare function isExampleDirectory(filePath: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Check if file is library/framework code (base classes, utilities)
|
|
29
|
+
* Library code is intentionally generic - consumers add security
|
|
30
|
+
* This applies to: langchain, vercel/ai, llamaindex, etc.
|
|
31
|
+
*/
|
|
32
|
+
export declare function isLibraryCode(filePath: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Check if file is a fixture file (test data, mock responses)
|
|
35
|
+
* Fixtures contain fake data and should have reduced severity
|
|
36
|
+
*/
|
|
37
|
+
export declare function isFixtureFile(filePath: string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Check if file is documentation (README, CHANGELOG, etc.)
|
|
40
|
+
* These files should typically be skipped for security scanning
|
|
41
|
+
*/
|
|
42
|
+
export declare function isDocumentationFile(filePath: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Check if file is scanner code, fixture, or rule definition
|
|
45
|
+
* Avoid flagging the scanner's own code/test cases
|
|
46
|
+
*/
|
|
47
|
+
export declare function isScannerOrFixtureFile(filePath: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Check if file is likely client-bundled (exposed to browser)
|
|
50
|
+
*/
|
|
51
|
+
export declare function isClientBundledFile(filePath: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Check if line uses environment variable reference (not hardcoded)
|
|
54
|
+
*/
|
|
55
|
+
export declare function isEnvVarReference(line: string): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Check if line uses NEXT_PUBLIC_ prefix (client-exposed)
|
|
58
|
+
*/
|
|
59
|
+
export declare function isNextPublicEnvVar(line: string): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Check if line is a comment
|
|
62
|
+
*/
|
|
63
|
+
export declare function isComment(lineContent: string): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Check if value/line appears to be a placeholder
|
|
66
|
+
*/
|
|
67
|
+
export declare function isPlaceholderValue(value: string, line: string): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Check if line/path indicates a public endpoint (health, webhook, cron)
|
|
70
|
+
* These don't need authentication
|
|
71
|
+
*/
|
|
72
|
+
export declare function isPublicEndpoint(lineContent: string, filePath: string): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Check if webhook has signature verification nearby
|
|
75
|
+
*/
|
|
76
|
+
export declare function hasWebhookSignatureVerification(lines: string[], lineIndex: number, windowSize?: number): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Check if there's an auth check nearby (bidirectional search)
|
|
79
|
+
*/
|
|
80
|
+
export declare function hasAuthCheckNearby(lines: string[], lineIndex: number, windowSize?: number): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Check if this appears to be a BYOK (user-provided key) context
|
|
83
|
+
* BYOK is a feature, not a vulnerability, unless improperly handled
|
|
84
|
+
*/
|
|
85
|
+
export declare function isBYOKContext(lineContent: string, filePath: string): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Check if key is being stored/handled properly (not exposed)
|
|
88
|
+
*/
|
|
89
|
+
export declare function isKeyProperlyHandled(lineContent: string, lines: string[], lineIndex: number): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Check if this is a service role key usage that's acceptable
|
|
92
|
+
* Server-only + env var = acceptable
|
|
93
|
+
* Client exposure = critical
|
|
94
|
+
*/
|
|
95
|
+
export declare function getServiceRoleKeyContext(lineContent: string, filePath: string): 'safe_server' | 'needs_review' | 'client_exposure';
|
|
96
|
+
//# sourceMappingURL=context-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/context-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAoB1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAmB1D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAWvD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAY5D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAkBvD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAcvD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAY7D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAahE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAmB7D;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAWvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAWtD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAkBvE;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAiD/E;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,MAAW,GAAG,OAAO,CA0BpH;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,MAAW,GAAG,OAAO,CA0CvG;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAiD5E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CA6BrG;AAMD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,aAAa,GAAG,cAAc,GAAG,iBAAiB,CAuBpD"}
|
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared Context Helpers
|
|
4
|
+
* Centralized utility functions for detecting file and code context
|
|
5
|
+
* Used across Layer 1 and Layer 2 scanners to reduce false positives
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.isServerOnlyFile = isServerOnlyFile;
|
|
9
|
+
exports.isTestOrMockFile = isTestOrMockFile;
|
|
10
|
+
exports.isExampleFile = isExampleFile;
|
|
11
|
+
exports.isExampleDirectory = isExampleDirectory;
|
|
12
|
+
exports.isLibraryCode = isLibraryCode;
|
|
13
|
+
exports.isFixtureFile = isFixtureFile;
|
|
14
|
+
exports.isDocumentationFile = isDocumentationFile;
|
|
15
|
+
exports.isScannerOrFixtureFile = isScannerOrFixtureFile;
|
|
16
|
+
exports.isClientBundledFile = isClientBundledFile;
|
|
17
|
+
exports.isEnvVarReference = isEnvVarReference;
|
|
18
|
+
exports.isNextPublicEnvVar = isNextPublicEnvVar;
|
|
19
|
+
exports.isComment = isComment;
|
|
20
|
+
exports.isPlaceholderValue = isPlaceholderValue;
|
|
21
|
+
exports.isPublicEndpoint = isPublicEndpoint;
|
|
22
|
+
exports.hasWebhookSignatureVerification = hasWebhookSignatureVerification;
|
|
23
|
+
exports.hasAuthCheckNearby = hasAuthCheckNearby;
|
|
24
|
+
exports.isBYOKContext = isBYOKContext;
|
|
25
|
+
exports.isKeyProperlyHandled = isKeyProperlyHandled;
|
|
26
|
+
exports.getServiceRoleKeyContext = getServiceRoleKeyContext;
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// File Path Context Detection
|
|
29
|
+
// ============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* Check if file is server-only (not bundled to client)
|
|
32
|
+
* Server-only files can safely use service role keys and other admin secrets
|
|
33
|
+
*/
|
|
34
|
+
function isServerOnlyFile(filePath) {
|
|
35
|
+
const serverPatterns = [
|
|
36
|
+
/lib\/supabase\/(server|admin|middleware)\.(ts|js)$/i,
|
|
37
|
+
/\/api\//i, // Next.js API routes
|
|
38
|
+
/\/server\//i, // Server directories
|
|
39
|
+
/\.server\.(ts|js|tsx|jsx)$/i, // .server.ts files
|
|
40
|
+
/\/actions\//i, // Server actions
|
|
41
|
+
/middleware\.(ts|js)$/i, // Middleware files
|
|
42
|
+
/\/cron\//i, // Cron jobs
|
|
43
|
+
/\/workers?\//i, // Worker files
|
|
44
|
+
/\/scripts?\//i, // Scripts
|
|
45
|
+
/\/seed\//i, // Database seeds
|
|
46
|
+
/\/migrations?\//i, // Database migrations
|
|
47
|
+
/\/lib\/[^/]+\/server/i, // lib/*/server patterns
|
|
48
|
+
/\/utils\/server/i, // utils/server
|
|
49
|
+
/\/helpers\/server/i, // helpers/server
|
|
50
|
+
/\.action\.(ts|js)$/i, // .action.ts files
|
|
51
|
+
/route\.(ts|js)$/i, // Next.js route handlers
|
|
52
|
+
];
|
|
53
|
+
return serverPatterns.some(pattern => pattern.test(filePath));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check if file is a test, mock, or fixture file
|
|
57
|
+
* These files often contain fake secrets and should have lower severity
|
|
58
|
+
*/
|
|
59
|
+
function isTestOrMockFile(filePath) {
|
|
60
|
+
const testPatterns = [
|
|
61
|
+
/\.(test|spec)\.(ts|tsx|js|jsx)$/i,
|
|
62
|
+
/\/__tests__\//i,
|
|
63
|
+
/\/test\//i,
|
|
64
|
+
/\/tests\//i,
|
|
65
|
+
/\/mock/i,
|
|
66
|
+
/\/mocks\//i,
|
|
67
|
+
/\/fixtures?\//i,
|
|
68
|
+
/\.mock\.(ts|tsx|js|jsx)$/i,
|
|
69
|
+
/\.stub\.(ts|tsx|js|jsx)$/i,
|
|
70
|
+
/\.(stories|story)\.(ts|tsx|js|jsx)$/i, // Storybook
|
|
71
|
+
/\/e2e\//i, // E2E tests
|
|
72
|
+
/\/cypress\//i, // Cypress tests
|
|
73
|
+
/\/playwright\//i, // Playwright tests
|
|
74
|
+
/\/vitest\//i, // Vitest
|
|
75
|
+
/\/jest\//i, // Jest
|
|
76
|
+
];
|
|
77
|
+
return testPatterns.some(pattern => pattern.test(filePath));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Check if file is an example/sample/template file
|
|
81
|
+
* These files should be skipped or have significantly reduced severity
|
|
82
|
+
*/
|
|
83
|
+
function isExampleFile(filePath) {
|
|
84
|
+
return (filePath.includes('.example') ||
|
|
85
|
+
filePath.includes('.sample') ||
|
|
86
|
+
filePath.includes('.template') ||
|
|
87
|
+
filePath.includes('README') ||
|
|
88
|
+
filePath.includes('/examples/') ||
|
|
89
|
+
filePath.includes('/example/') ||
|
|
90
|
+
filePath.includes('/demo/') ||
|
|
91
|
+
filePath.includes('/demos/'));
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Check if file is in an examples/demo directory
|
|
95
|
+
* Stronger check than isExampleFile - specifically for directories
|
|
96
|
+
* These are typically tutorial/demo code, not production patterns
|
|
97
|
+
*/
|
|
98
|
+
function isExampleDirectory(filePath) {
|
|
99
|
+
const examplePatterns = [
|
|
100
|
+
/\/examples?\//i,
|
|
101
|
+
/\/demos?\//i,
|
|
102
|
+
/\/templates?\//i,
|
|
103
|
+
/\/samples?\//i,
|
|
104
|
+
/\/tutorials?\//i,
|
|
105
|
+
/\/cookbook\//i,
|
|
106
|
+
/\/quickstart\//i,
|
|
107
|
+
/\/getting-started\//i,
|
|
108
|
+
];
|
|
109
|
+
return examplePatterns.some(pattern => pattern.test(filePath));
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Check if file is library/framework code (base classes, utilities)
|
|
113
|
+
* Library code is intentionally generic - consumers add security
|
|
114
|
+
* This applies to: langchain, vercel/ai, llamaindex, etc.
|
|
115
|
+
*/
|
|
116
|
+
function isLibraryCode(filePath) {
|
|
117
|
+
const libraryPatterns = [
|
|
118
|
+
// Package source directories in monorepos
|
|
119
|
+
/\/libs\/[^/]+\/src\//i,
|
|
120
|
+
/\/packages\/[^/]+\/src\//i,
|
|
121
|
+
// Common library patterns
|
|
122
|
+
/\/langchain-/i,
|
|
123
|
+
/\/llamaindex/i,
|
|
124
|
+
// Source files that aren't examples or tests
|
|
125
|
+
/\/src\/(?!.*(?:examples?|demos?|tests?)\/).*\.(ts|js)$/i,
|
|
126
|
+
];
|
|
127
|
+
// Must match library pattern AND not be example/test
|
|
128
|
+
return (libraryPatterns.some(pattern => pattern.test(filePath)) &&
|
|
129
|
+
!isExampleDirectory(filePath) &&
|
|
130
|
+
!isTestOrMockFile(filePath));
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Check if file is a fixture file (test data, mock responses)
|
|
134
|
+
* Fixtures contain fake data and should have reduced severity
|
|
135
|
+
*/
|
|
136
|
+
function isFixtureFile(filePath) {
|
|
137
|
+
const fixturePatterns = [
|
|
138
|
+
/__fixtures__\//i,
|
|
139
|
+
/\.fixture\./i,
|
|
140
|
+
/fixtures?\//i,
|
|
141
|
+
/testdata\//i,
|
|
142
|
+
/test-data\//i,
|
|
143
|
+
/test_data\//i,
|
|
144
|
+
/mock-data\//i,
|
|
145
|
+
/mockdata\//i,
|
|
146
|
+
/\.mock\./i,
|
|
147
|
+
/\.stub\./i,
|
|
148
|
+
];
|
|
149
|
+
return fixturePatterns.some(pattern => pattern.test(filePath));
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Check if file is documentation (README, CHANGELOG, etc.)
|
|
153
|
+
* These files should typically be skipped for security scanning
|
|
154
|
+
*/
|
|
155
|
+
function isDocumentationFile(filePath) {
|
|
156
|
+
const docPatterns = [
|
|
157
|
+
/README/i,
|
|
158
|
+
/CHANGELOG/i,
|
|
159
|
+
/CONTRIBUTING/i,
|
|
160
|
+
/LICENSE/i,
|
|
161
|
+
/\.md$/i,
|
|
162
|
+
/\.mdx$/i,
|
|
163
|
+
/\/docs\//i,
|
|
164
|
+
/\/documentation\//i,
|
|
165
|
+
];
|
|
166
|
+
return docPatterns.some(pattern => pattern.test(filePath));
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Check if file is scanner code, fixture, or rule definition
|
|
170
|
+
* Avoid flagging the scanner's own code/test cases
|
|
171
|
+
*/
|
|
172
|
+
function isScannerOrFixtureFile(filePath) {
|
|
173
|
+
const scannerPatterns = [
|
|
174
|
+
/\/scanner\//i,
|
|
175
|
+
/\/detector\//i,
|
|
176
|
+
/\/security\//i,
|
|
177
|
+
/\/rules?\//i,
|
|
178
|
+
/\/patterns?\//i,
|
|
179
|
+
/\/fixtures?\//i,
|
|
180
|
+
/\/testdata\//i,
|
|
181
|
+
/\/test-data\//i,
|
|
182
|
+
/\/test_data\//i,
|
|
183
|
+
];
|
|
184
|
+
return scannerPatterns.some(pattern => pattern.test(filePath));
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Check if file is likely client-bundled (exposed to browser)
|
|
188
|
+
*/
|
|
189
|
+
function isClientBundledFile(filePath) {
|
|
190
|
+
// Files in these locations are typically client-bundled
|
|
191
|
+
const clientPatterns = [
|
|
192
|
+
/\/components\//i,
|
|
193
|
+
/\/pages\//i, // Next.js pages (can be SSR, but code visible)
|
|
194
|
+
/\/app\/.*page\.(ts|tsx|js|jsx)$/i, // Next.js app router pages
|
|
195
|
+
/\/hooks\//i,
|
|
196
|
+
/\/contexts?\//i,
|
|
197
|
+
/\/providers?\//i,
|
|
198
|
+
/\/stores?\//i, // State management
|
|
199
|
+
/\.client\.(ts|js|tsx|jsx)$/i, // .client.ts files
|
|
200
|
+
];
|
|
201
|
+
// But not if they're also server files
|
|
202
|
+
if (isServerOnlyFile(filePath)) {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
return clientPatterns.some(pattern => pattern.test(filePath));
|
|
206
|
+
}
|
|
207
|
+
// ============================================================================
|
|
208
|
+
// Code Line Context Detection
|
|
209
|
+
// ============================================================================
|
|
210
|
+
/**
|
|
211
|
+
* Check if line uses environment variable reference (not hardcoded)
|
|
212
|
+
*/
|
|
213
|
+
function isEnvVarReference(line) {
|
|
214
|
+
return (/process\.env\.[A-Z_]+/.test(line) ||
|
|
215
|
+
/\$\{?[A-Z_]+\}?/.test(line) ||
|
|
216
|
+
/import\.meta\.env\.[A-Z_]+/.test(line) ||
|
|
217
|
+
/Deno\.env\.get\(/.test(line) ||
|
|
218
|
+
/os\.environ\[/.test(line) || // Python
|
|
219
|
+
/os\.getenv\(/.test(line) || // Python
|
|
220
|
+
/ENV\[['"]/.test(line) || // Ruby
|
|
221
|
+
/env\(["']/.test(line) // Laravel PHP
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Check if line uses NEXT_PUBLIC_ prefix (client-exposed)
|
|
226
|
+
*/
|
|
227
|
+
function isNextPublicEnvVar(line) {
|
|
228
|
+
return /NEXT_PUBLIC_[A-Z_]+/.test(line);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Check if line is a comment
|
|
232
|
+
*/
|
|
233
|
+
function isComment(lineContent) {
|
|
234
|
+
const trimmed = lineContent.trim();
|
|
235
|
+
return (trimmed.startsWith('//') ||
|
|
236
|
+
trimmed.startsWith('#') ||
|
|
237
|
+
trimmed.startsWith('*') ||
|
|
238
|
+
trimmed.startsWith('/*') ||
|
|
239
|
+
trimmed.startsWith('"""') ||
|
|
240
|
+
trimmed.startsWith("'''") ||
|
|
241
|
+
trimmed.startsWith('<!--'));
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Check if value/line appears to be a placeholder
|
|
245
|
+
*/
|
|
246
|
+
function isPlaceholderValue(value, line) {
|
|
247
|
+
const placeholderPatterns = [
|
|
248
|
+
/xxx/i,
|
|
249
|
+
/your[-_]?/i,
|
|
250
|
+
/YOUR[-_]?/i,
|
|
251
|
+
/placeholder/i,
|
|
252
|
+
/example/i,
|
|
253
|
+
/REPLACE[-_]?/i,
|
|
254
|
+
/CHANGEME/i,
|
|
255
|
+
/<[a-z_-]+>/i, // <your-api-key>
|
|
256
|
+
/\[\s*[a-z_-]+\s*\]/i, // [API_KEY]
|
|
257
|
+
/todo/i,
|
|
258
|
+
/fixme/i,
|
|
259
|
+
];
|
|
260
|
+
return placeholderPatterns.some(pattern => pattern.test(value) || pattern.test(line));
|
|
261
|
+
}
|
|
262
|
+
// ============================================================================
|
|
263
|
+
// Security Context Detection
|
|
264
|
+
// ============================================================================
|
|
265
|
+
/**
|
|
266
|
+
* Check if line/path indicates a public endpoint (health, webhook, cron)
|
|
267
|
+
* These don't need authentication
|
|
268
|
+
*/
|
|
269
|
+
function isPublicEndpoint(lineContent, filePath) {
|
|
270
|
+
// Health check patterns
|
|
271
|
+
const healthCheckPatterns = [
|
|
272
|
+
/\/health\/?["'`]?/i,
|
|
273
|
+
/\/healthz\/?["'`]?/i,
|
|
274
|
+
/\/ready\/?["'`]?/i,
|
|
275
|
+
/\/readyz\/?["'`]?/i,
|
|
276
|
+
/\/live\/?["'`]?/i,
|
|
277
|
+
/\/livez\/?["'`]?/i,
|
|
278
|
+
/\/ping\/?["'`]?/i,
|
|
279
|
+
/\/status\/?["'`]?/i,
|
|
280
|
+
/\/api\/health/i,
|
|
281
|
+
/\/api\/status/i,
|
|
282
|
+
/\/_health/i,
|
|
283
|
+
];
|
|
284
|
+
// Webhook patterns
|
|
285
|
+
const webhookPatterns = [
|
|
286
|
+
/\/webhook/i,
|
|
287
|
+
/\/webhooks\//i,
|
|
288
|
+
/\/callback/i,
|
|
289
|
+
/\/stripe\/webhook/i,
|
|
290
|
+
/\/github\/webhook/i,
|
|
291
|
+
/\/clerk\/webhook/i,
|
|
292
|
+
];
|
|
293
|
+
// Cron/scheduled job patterns
|
|
294
|
+
const cronPatterns = [
|
|
295
|
+
/\/cron\//i,
|
|
296
|
+
/\/scheduled\//i,
|
|
297
|
+
/\/tasks?\//i,
|
|
298
|
+
/\/jobs?\//i,
|
|
299
|
+
];
|
|
300
|
+
// Check line content
|
|
301
|
+
const allPatterns = [...healthCheckPatterns, ...webhookPatterns, ...cronPatterns];
|
|
302
|
+
if (allPatterns.some(pattern => pattern.test(lineContent))) {
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
// Check file path
|
|
306
|
+
if (filePath.includes('/health') ||
|
|
307
|
+
filePath.includes('/webhook') ||
|
|
308
|
+
filePath.includes('/cron') ||
|
|
309
|
+
filePath.includes('/scheduled')) {
|
|
310
|
+
return true;
|
|
311
|
+
}
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Check if webhook has signature verification nearby
|
|
316
|
+
*/
|
|
317
|
+
function hasWebhookSignatureVerification(lines, lineIndex, windowSize = 15) {
|
|
318
|
+
const signaturePatterns = [
|
|
319
|
+
/verifySignature/i,
|
|
320
|
+
/validateSignature/i,
|
|
321
|
+
/checkSignature/i,
|
|
322
|
+
/signature.*verify/i,
|
|
323
|
+
/verify.*signature/i,
|
|
324
|
+
/hmac/i,
|
|
325
|
+
/x-hub-signature/i,
|
|
326
|
+
/stripe-signature/i,
|
|
327
|
+
/svix-signature/i,
|
|
328
|
+
/webhook.*secret/i,
|
|
329
|
+
/constructEvent/i, // Stripe webhook verification
|
|
330
|
+
/Webhook\.verify/i, // Generic webhook verify
|
|
331
|
+
];
|
|
332
|
+
const start = Math.max(0, lineIndex - windowSize);
|
|
333
|
+
const end = Math.min(lines.length, lineIndex + windowSize);
|
|
334
|
+
for (let i = start; i < end; i++) {
|
|
335
|
+
if (signaturePatterns.some(pattern => pattern.test(lines[i]))) {
|
|
336
|
+
return true;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return false;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Check if there's an auth check nearby (bidirectional search)
|
|
343
|
+
*/
|
|
344
|
+
function hasAuthCheckNearby(lines, lineIndex, windowSize = 20) {
|
|
345
|
+
const authPatterns = [
|
|
346
|
+
/authorization/i,
|
|
347
|
+
/bearer\s+token/i,
|
|
348
|
+
/req\.user/i,
|
|
349
|
+
/request\.user/i,
|
|
350
|
+
/\.user\s*[=!]/,
|
|
351
|
+
/isAuthenticated/i,
|
|
352
|
+
/requireAuth/i,
|
|
353
|
+
/ensureAuth/i,
|
|
354
|
+
/checkAuth/i,
|
|
355
|
+
/verifyToken/i,
|
|
356
|
+
/validateToken/i,
|
|
357
|
+
/checkPermission/i,
|
|
358
|
+
/getServerSession/i,
|
|
359
|
+
/middleware.*auth/i,
|
|
360
|
+
/session\.user/i,
|
|
361
|
+
/currentUser/i,
|
|
362
|
+
/getSession\(/i,
|
|
363
|
+
/useSession\(/i,
|
|
364
|
+
/auth\(\)/i, // Next-Auth auth()
|
|
365
|
+
/withAuth/i,
|
|
366
|
+
/protected/i,
|
|
367
|
+
/verifySignature/i, // Webhook signature
|
|
368
|
+
/checkApiKey/i,
|
|
369
|
+
/validateApiKey/i,
|
|
370
|
+
/requireRole/i,
|
|
371
|
+
/hasRole/i,
|
|
372
|
+
/isAdmin/i,
|
|
373
|
+
];
|
|
374
|
+
// Search bidirectionally
|
|
375
|
+
const start = Math.max(0, lineIndex - windowSize);
|
|
376
|
+
const end = Math.min(lines.length, lineIndex + windowSize);
|
|
377
|
+
for (let i = start; i < end; i++) {
|
|
378
|
+
if (authPatterns.some(pattern => pattern.test(lines[i]))) {
|
|
379
|
+
return true;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return false;
|
|
383
|
+
}
|
|
384
|
+
// ============================================================================
|
|
385
|
+
// BYOK (Bring Your Own Key) Context Detection
|
|
386
|
+
// ============================================================================
|
|
387
|
+
/**
|
|
388
|
+
* Check if this appears to be a BYOK (user-provided key) context
|
|
389
|
+
* BYOK is a feature, not a vulnerability, unless improperly handled
|
|
390
|
+
*/
|
|
391
|
+
function isBYOKContext(lineContent, filePath) {
|
|
392
|
+
// Common BYOK patterns
|
|
393
|
+
const byokPatterns = [
|
|
394
|
+
/user.*api.*key/i,
|
|
395
|
+
/customer.*key/i,
|
|
396
|
+
/your.*api.*key/i,
|
|
397
|
+
/provide.*key/i,
|
|
398
|
+
/enter.*key/i,
|
|
399
|
+
/input.*key/i,
|
|
400
|
+
/form.*key/i,
|
|
401
|
+
/settings.*key/i,
|
|
402
|
+
/config.*key.*user/i,
|
|
403
|
+
/BYOK/i,
|
|
404
|
+
/bring.*your.*own/i,
|
|
405
|
+
];
|
|
406
|
+
// Form/input contexts
|
|
407
|
+
const inputPatterns = [
|
|
408
|
+
/input.*type/i,
|
|
409
|
+
/onChange/i,
|
|
410
|
+
/onSubmit/i,
|
|
411
|
+
/handleSubmit/i,
|
|
412
|
+
/useState.*key/i,
|
|
413
|
+
/form.*data/i,
|
|
414
|
+
];
|
|
415
|
+
// Settings/config UI patterns
|
|
416
|
+
const settingsPatterns = [
|
|
417
|
+
/\/settings\//i,
|
|
418
|
+
/\/config\//i,
|
|
419
|
+
/\/preferences\//i,
|
|
420
|
+
/\/profile\//i,
|
|
421
|
+
];
|
|
422
|
+
// Check line content
|
|
423
|
+
if (byokPatterns.some(p => p.test(lineContent)) ||
|
|
424
|
+
inputPatterns.some(p => p.test(lineContent))) {
|
|
425
|
+
return true;
|
|
426
|
+
}
|
|
427
|
+
// Check file path
|
|
428
|
+
if (settingsPatterns.some(p => p.test(filePath))) {
|
|
429
|
+
// In settings files, look for user input context
|
|
430
|
+
if (inputPatterns.some(p => p.test(lineContent))) {
|
|
431
|
+
return true;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
return false;
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Check if key is being stored/handled properly (not exposed)
|
|
438
|
+
*/
|
|
439
|
+
function isKeyProperlyHandled(lineContent, lines, lineIndex) {
|
|
440
|
+
// Proper handling patterns (encryption, secure storage, etc.)
|
|
441
|
+
const properHandlingPatterns = [
|
|
442
|
+
/encrypt/i,
|
|
443
|
+
/hash/i,
|
|
444
|
+
/secure.*storage/i,
|
|
445
|
+
/keychain/i,
|
|
446
|
+
/vault/i,
|
|
447
|
+
/secretsManager/i,
|
|
448
|
+
/kms/i,
|
|
449
|
+
/\.env/i,
|
|
450
|
+
];
|
|
451
|
+
// Check current line
|
|
452
|
+
if (properHandlingPatterns.some(p => p.test(lineContent))) {
|
|
453
|
+
return true;
|
|
454
|
+
}
|
|
455
|
+
// Check nearby lines (5 lines before and after)
|
|
456
|
+
const start = Math.max(0, lineIndex - 5);
|
|
457
|
+
const end = Math.min(lines.length, lineIndex + 5);
|
|
458
|
+
for (let i = start; i < end; i++) {
|
|
459
|
+
if (properHandlingPatterns.some(p => p.test(lines[i]))) {
|
|
460
|
+
return true;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
return false;
|
|
464
|
+
}
|
|
465
|
+
// ============================================================================
|
|
466
|
+
// Service Role Key Context
|
|
467
|
+
// ============================================================================
|
|
468
|
+
/**
|
|
469
|
+
* Check if this is a service role key usage that's acceptable
|
|
470
|
+
* Server-only + env var = acceptable
|
|
471
|
+
* Client exposure = critical
|
|
472
|
+
*/
|
|
473
|
+
function getServiceRoleKeyContext(lineContent, filePath) {
|
|
474
|
+
const isServer = isServerOnlyFile(filePath);
|
|
475
|
+
const usesEnvVar = isEnvVarReference(lineContent);
|
|
476
|
+
const isClientFile = isClientBundledFile(filePath);
|
|
477
|
+
const isNextPublic = isNextPublicEnvVar(lineContent);
|
|
478
|
+
// NEXT_PUBLIC_ service role key = always critical (client exposure)
|
|
479
|
+
if (isNextPublic) {
|
|
480
|
+
return 'client_exposure';
|
|
481
|
+
}
|
|
482
|
+
// Server-only file using env var = safe
|
|
483
|
+
if (isServer && usesEnvVar) {
|
|
484
|
+
return 'safe_server';
|
|
485
|
+
}
|
|
486
|
+
// Client-bundled file = exposure risk
|
|
487
|
+
if (isClientFile) {
|
|
488
|
+
return 'client_exposure';
|
|
489
|
+
}
|
|
490
|
+
// Hardcoded or ambiguous = needs review
|
|
491
|
+
return 'needs_review';
|
|
492
|
+
}
|
|
493
|
+
//# sourceMappingURL=context-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-helpers.js","sourceRoot":"","sources":["../../src/utils/context-helpers.ts"],"names":[],"mappings":"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"}
|