@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,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Layer 2: Risky Import/Package Analysis
|
|
4
|
+
* Detects imports of packages known to have security concerns or deprecated
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.detectRiskyImports = detectRiskyImports;
|
|
8
|
+
const RISKY_PACKAGES = [
|
|
9
|
+
// Known vulnerable or deprecated packages
|
|
10
|
+
{
|
|
11
|
+
name: 'request (deprecated)',
|
|
12
|
+
pattern: /require\s*\(\s*['"]request['"]\s*\)|from\s+['"]request['"]/gi,
|
|
13
|
+
severity: 'medium',
|
|
14
|
+
description: 'The "request" package is deprecated and no longer maintained',
|
|
15
|
+
suggestedFix: 'Migrate to fetch, axios, or node-fetch',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'node-uuid (deprecated)',
|
|
19
|
+
pattern: /require\s*\(\s*['"]node-uuid['"]\s*\)|from\s+['"]node-uuid['"]/gi,
|
|
20
|
+
severity: 'low',
|
|
21
|
+
description: 'node-uuid is deprecated in favor of uuid package',
|
|
22
|
+
suggestedFix: 'Use the "uuid" package instead',
|
|
23
|
+
},
|
|
24
|
+
// Packages with known security issues
|
|
25
|
+
{
|
|
26
|
+
name: 'lodash (full import)',
|
|
27
|
+
pattern: /require\s*\(\s*['"]lodash['"]\s*\)|import\s+\*?\s*(?:as\s+)?\w+\s+from\s+['"]lodash['"]/gi,
|
|
28
|
+
severity: 'low',
|
|
29
|
+
description: 'Full lodash import increases bundle size and attack surface',
|
|
30
|
+
suggestedFix: 'Import specific functions: import get from "lodash/get"',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'moment.js (deprecated)',
|
|
34
|
+
pattern: /require\s*\(\s*['"]moment['"]\s*\)|from\s+['"]moment['"]/gi,
|
|
35
|
+
severity: 'low',
|
|
36
|
+
description: 'Moment.js is in maintenance mode, consider alternatives',
|
|
37
|
+
suggestedFix: 'Use date-fns, dayjs, or native Intl APIs',
|
|
38
|
+
},
|
|
39
|
+
// Security-focused sandbox packages - info only (these are used for security, not risky)
|
|
40
|
+
{
|
|
41
|
+
name: 'vm2 (sandbox)',
|
|
42
|
+
pattern: /require\s*\(\s*['"]vm2['"]\s*\)|from\s+['"]vm2['"]/gi,
|
|
43
|
+
severity: 'info',
|
|
44
|
+
description: 'vm2 is a sandboxing library. While it has had sandbox escape vulnerabilities historically, using it is generally safer than running untrusted code directly. Keep vm2 updated.',
|
|
45
|
+
suggestedFix: 'Keep vm2 updated to the latest version. For maximum isolation, consider isolated-vm or running in a separate process.',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'serialize-javascript (RCE risk)',
|
|
49
|
+
pattern: /require\s*\(\s*['"]serialize-javascript['"]\s*\)|from\s+['"]serialize-javascript['"]/gi,
|
|
50
|
+
severity: 'medium',
|
|
51
|
+
description: 'serialize-javascript can be dangerous if output is not properly handled',
|
|
52
|
+
suggestedFix: 'Ensure serialized output is not directly executed or use JSON.stringify',
|
|
53
|
+
},
|
|
54
|
+
// Crypto-related risky imports
|
|
55
|
+
{
|
|
56
|
+
name: 'crypto-js (outdated patterns)',
|
|
57
|
+
pattern: /require\s*\(\s*['"]crypto-js['"]\s*\)|from\s+['"]crypto-js['"]/gi,
|
|
58
|
+
severity: 'low',
|
|
59
|
+
description: 'crypto-js may use outdated crypto patterns',
|
|
60
|
+
suggestedFix: 'Prefer Node.js built-in crypto module or Web Crypto API',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'bcrypt-nodejs (deprecated)',
|
|
64
|
+
pattern: /require\s*\(\s*['"]bcrypt-nodejs['"]\s*\)|from\s+['"]bcrypt-nodejs['"]/gi,
|
|
65
|
+
severity: 'medium',
|
|
66
|
+
description: 'bcrypt-nodejs is deprecated and unmaintained',
|
|
67
|
+
suggestedFix: 'Use bcrypt or bcryptjs instead',
|
|
68
|
+
},
|
|
69
|
+
// SQL/Database risky patterns
|
|
70
|
+
{
|
|
71
|
+
name: 'mysql (prefer mysql2)',
|
|
72
|
+
pattern: /require\s*\(\s*['"]mysql['"]\s*\)|from\s+['"]mysql['"]/gi,
|
|
73
|
+
severity: 'low',
|
|
74
|
+
description: 'mysql package is less maintained than mysql2',
|
|
75
|
+
suggestedFix: 'Consider using mysql2 for better security and performance',
|
|
76
|
+
},
|
|
77
|
+
// Python risky imports
|
|
78
|
+
{
|
|
79
|
+
name: 'pickle (unsafe deserialization)',
|
|
80
|
+
pattern: /^import\s+pickle|^from\s+pickle\s+import/gim,
|
|
81
|
+
severity: 'high',
|
|
82
|
+
description: 'pickle can execute arbitrary code during deserialization',
|
|
83
|
+
suggestedFix: 'Use JSON or other safe serialization formats for untrusted data',
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: 'yaml unsafe load',
|
|
87
|
+
pattern: /yaml\.load\s*\([^)]*\)(?!.*Loader)/gi,
|
|
88
|
+
severity: 'high',
|
|
89
|
+
description: 'yaml.load without Loader parameter can execute arbitrary code',
|
|
90
|
+
suggestedFix: 'Use yaml.safe_load() or specify Loader=yaml.SafeLoader',
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: 'subprocess shell=True',
|
|
94
|
+
pattern: /subprocess\.(call|run|Popen|check_output)\s*\([^)]*shell\s*=\s*True/gi,
|
|
95
|
+
severity: 'high',
|
|
96
|
+
description: 'subprocess with shell=True is vulnerable to shell injection',
|
|
97
|
+
suggestedFix: 'Use shell=False and pass arguments as a list',
|
|
98
|
+
},
|
|
99
|
+
// Telemetry/tracking packages (privacy concern)
|
|
100
|
+
{
|
|
101
|
+
name: 'Analytics package',
|
|
102
|
+
pattern: /require\s*\(\s*['"](analytics|segment|mixpanel|amplitude)['"]\s*\)|from\s+['"](analytics|segment|mixpanel|amplitude)['"]/gi,
|
|
103
|
+
severity: 'low',
|
|
104
|
+
description: 'Analytics package detected - ensure user consent is obtained',
|
|
105
|
+
suggestedFix: 'Implement proper consent mechanisms for user tracking',
|
|
106
|
+
},
|
|
107
|
+
// Outdated/vulnerable web frameworks
|
|
108
|
+
{
|
|
109
|
+
name: 'express-jwt (CVE history)',
|
|
110
|
+
pattern: /require\s*\(\s*['"]express-jwt['"]\s*\)|from\s+['"]express-jwt['"]/gi,
|
|
111
|
+
severity: 'medium',
|
|
112
|
+
description: 'express-jwt has had security vulnerabilities - ensure latest version',
|
|
113
|
+
suggestedFix: 'Update to latest version and consider jose or jsonwebtoken directly',
|
|
114
|
+
},
|
|
115
|
+
// Dangerous native modules
|
|
116
|
+
{
|
|
117
|
+
name: 'node-gyp native module',
|
|
118
|
+
pattern: /require\s*\(\s*['"]node-gyp['"]\s*\)|from\s+['"]node-gyp['"]/gi,
|
|
119
|
+
severity: 'low',
|
|
120
|
+
description: 'Native modules can introduce platform-specific vulnerabilities',
|
|
121
|
+
suggestedFix: 'Audit native dependencies and keep them updated',
|
|
122
|
+
},
|
|
123
|
+
];
|
|
124
|
+
// Check if line is a comment
|
|
125
|
+
function isComment(line) {
|
|
126
|
+
const trimmed = line.trim();
|
|
127
|
+
return (trimmed.startsWith('//') ||
|
|
128
|
+
trimmed.startsWith('#') ||
|
|
129
|
+
trimmed.startsWith('*') ||
|
|
130
|
+
trimmed.startsWith('/*'));
|
|
131
|
+
}
|
|
132
|
+
function detectRiskyImports(content, filePath) {
|
|
133
|
+
const vulnerabilities = [];
|
|
134
|
+
const lines = content.split('\n');
|
|
135
|
+
lines.forEach((line, index) => {
|
|
136
|
+
// Skip comment lines
|
|
137
|
+
if (isComment(line))
|
|
138
|
+
return;
|
|
139
|
+
for (const pkg of RISKY_PACKAGES) {
|
|
140
|
+
const regex = new RegExp(pkg.pattern.source, pkg.pattern.flags);
|
|
141
|
+
if (regex.test(line)) {
|
|
142
|
+
vulnerabilities.push({
|
|
143
|
+
id: `risky-import-${filePath}-${index + 1}-${pkg.name}`,
|
|
144
|
+
filePath,
|
|
145
|
+
lineNumber: index + 1,
|
|
146
|
+
lineContent: line.trim(),
|
|
147
|
+
severity: pkg.severity,
|
|
148
|
+
category: 'suspicious_package',
|
|
149
|
+
title: `Risky package: ${pkg.name}`,
|
|
150
|
+
description: pkg.description,
|
|
151
|
+
suggestedFix: pkg.suggestedFix,
|
|
152
|
+
confidence: 'high',
|
|
153
|
+
layer: 2,
|
|
154
|
+
});
|
|
155
|
+
break; // Only report once per line
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
return vulnerabilities;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=risky-imports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risky-imports.js","sourceRoot":"","sources":["../../src/layer2/risky-imports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer 2: Variable Heuristics
|
|
3
|
+
* Identifies variable names associated with sensitive data
|
|
4
|
+
*/
|
|
5
|
+
import type { Vulnerability, SensitiveVariablePattern } from '../types';
|
|
6
|
+
export declare const SENSITIVE_VARIABLE_PATTERNS: SensitiveVariablePattern[];
|
|
7
|
+
export declare function detectSensitiveVariables(content: string, filePath: string): Vulnerability[];
|
|
8
|
+
//# sourceMappingURL=variables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../../src/layer2/variables.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAGvE,eAAO,MAAM,2BAA2B,EAAE,wBAAwB,EA0DjE,CAAA;AAqDD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,aAAa,EAAE,CA2CjB"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Layer 2: Variable Heuristics
|
|
4
|
+
* Identifies variable names associated with sensitive data
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.SENSITIVE_VARIABLE_PATTERNS = void 0;
|
|
8
|
+
exports.detectSensitiveVariables = detectSensitiveVariables;
|
|
9
|
+
// Patterns for sensitive variable names
|
|
10
|
+
exports.SENSITIVE_VARIABLE_PATTERNS = [
|
|
11
|
+
// Password-related
|
|
12
|
+
{
|
|
13
|
+
pattern: /\b(password|passwd|pwd|pass)\s*[=:]/gi,
|
|
14
|
+
severity: 'high',
|
|
15
|
+
description: 'Variable name suggests password storage',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
pattern: /\b(user_?password|admin_?password|db_?password|database_?password)\s*[=:]/gi,
|
|
19
|
+
severity: 'critical',
|
|
20
|
+
description: 'Variable name suggests database/admin password',
|
|
21
|
+
},
|
|
22
|
+
// Token-related
|
|
23
|
+
{
|
|
24
|
+
pattern: /\b(auth_?token|access_?token|refresh_?token|bearer_?token)\s*[=:]/gi,
|
|
25
|
+
severity: 'high',
|
|
26
|
+
description: 'Variable name suggests authentication token',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
pattern: /\b(api_?token|api_?key|apikey)\s*[=:]/gi,
|
|
30
|
+
severity: 'high',
|
|
31
|
+
description: 'Variable name suggests API key/token',
|
|
32
|
+
},
|
|
33
|
+
// Secret-related
|
|
34
|
+
{
|
|
35
|
+
pattern: /\b(secret|secret_?key|private_?key|signing_?key)\s*[=:]/gi,
|
|
36
|
+
severity: 'high',
|
|
37
|
+
description: 'Variable name suggests secret/private key',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
pattern: /\b(client_?secret|app_?secret|jwt_?secret)\s*[=:]/gi,
|
|
41
|
+
severity: 'critical',
|
|
42
|
+
description: 'Variable name suggests application secret',
|
|
43
|
+
},
|
|
44
|
+
// Credential-related
|
|
45
|
+
{
|
|
46
|
+
pattern: /\b(credential|credentials|creds)\s*[=:]/gi,
|
|
47
|
+
severity: 'high',
|
|
48
|
+
description: 'Variable name suggests credentials',
|
|
49
|
+
},
|
|
50
|
+
// Connection strings
|
|
51
|
+
{
|
|
52
|
+
pattern: /\b(connection_?string|conn_?string|database_?url|db_?url)\s*[=:]/gi,
|
|
53
|
+
severity: 'high',
|
|
54
|
+
description: 'Variable name suggests database connection string',
|
|
55
|
+
},
|
|
56
|
+
// Encryption keys
|
|
57
|
+
{
|
|
58
|
+
pattern: /\b(encryption_?key|decrypt_?key|cipher_?key|aes_?key)\s*[=:]/gi,
|
|
59
|
+
severity: 'critical',
|
|
60
|
+
description: 'Variable name suggests encryption key',
|
|
61
|
+
},
|
|
62
|
+
// SSH/Certificate
|
|
63
|
+
{
|
|
64
|
+
pattern: /\b(ssh_?key|private_?key|cert_?key|ssl_?key)\s*[=:]/gi,
|
|
65
|
+
severity: 'critical',
|
|
66
|
+
description: 'Variable name suggests SSH/SSL key',
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
// Check if the value looks like a placeholder or env var reference
|
|
70
|
+
function isPlaceholderOrEnvRef(line) {
|
|
71
|
+
const safePatterns = [
|
|
72
|
+
/[=:]\s*['"]?\s*$/, // Empty value
|
|
73
|
+
/[=:]\s*['"]?xxx/i, // xxx placeholder
|
|
74
|
+
/[=:]\s*['"]?your[-_]/i, // your-xxx placeholder
|
|
75
|
+
/[=:]\s*['"]?<[^>]+>/, // <placeholder>
|
|
76
|
+
/[=:]\s*['"]?\$\{/, // ${VAR} template
|
|
77
|
+
/[=:]\s*['"]?process\.env/, // process.env reference
|
|
78
|
+
/[=:]\s*['"]?env\(/, // env() function
|
|
79
|
+
/[=:]\s*['"]?getenv/i, // getenv function
|
|
80
|
+
/[=:]\s*['"]?os\.environ/, // Python os.environ
|
|
81
|
+
/[=:]\s*['"]?ENV\[/, // Ruby ENV
|
|
82
|
+
/[=:]\s*null\b/i, // null value
|
|
83
|
+
/[=:]\s*undefined\b/, // undefined value
|
|
84
|
+
/[=:]\s*None\b/, // Python None
|
|
85
|
+
/[=:]\s*['"]?TODO/i, // TODO placeholder
|
|
86
|
+
/[=:]\s*['"]?CHANGEME/i, // CHANGEME placeholder
|
|
87
|
+
/[=:]\s*['"]?REPLACE/i, // REPLACE placeholder
|
|
88
|
+
/\?\s*.*\s*:\s*/, // Ternary operator (conditional assignment)
|
|
89
|
+
/\|\|/, // OR fallback (e.g., ENV_VAR || '')
|
|
90
|
+
/\?\?/, // Nullish coalescing
|
|
91
|
+
/[A-Z_]{3,}_(?:KEY|TOKEN|SECRET)/, // References to env var constants
|
|
92
|
+
];
|
|
93
|
+
return safePatterns.some(pattern => pattern.test(line));
|
|
94
|
+
}
|
|
95
|
+
// Check if line is a comment
|
|
96
|
+
function isComment(line) {
|
|
97
|
+
const trimmed = line.trim();
|
|
98
|
+
return (trimmed.startsWith('//') ||
|
|
99
|
+
trimmed.startsWith('#') ||
|
|
100
|
+
trimmed.startsWith('*') ||
|
|
101
|
+
trimmed.startsWith('/*') ||
|
|
102
|
+
trimmed.startsWith('"""') ||
|
|
103
|
+
trimmed.startsWith("'''") ||
|
|
104
|
+
trimmed.startsWith('<!--'));
|
|
105
|
+
}
|
|
106
|
+
// Check if it's a type definition or interface
|
|
107
|
+
function isTypeDefinition(line) {
|
|
108
|
+
return (/^\s*(type|interface|class)\s/.test(line) ||
|
|
109
|
+
/:\s*(string|number|boolean|any)\s*[;,}]/.test(line) ||
|
|
110
|
+
/\?\s*:\s*\w+/.test(line));
|
|
111
|
+
}
|
|
112
|
+
function detectSensitiveVariables(content, filePath) {
|
|
113
|
+
const vulnerabilities = [];
|
|
114
|
+
const lines = content.split('\n');
|
|
115
|
+
lines.forEach((line, index) => {
|
|
116
|
+
// Skip comments
|
|
117
|
+
if (isComment(line))
|
|
118
|
+
return;
|
|
119
|
+
// Skip type definitions
|
|
120
|
+
if (isTypeDefinition(line))
|
|
121
|
+
return;
|
|
122
|
+
// Skip if it's a placeholder/env reference
|
|
123
|
+
if (isPlaceholderOrEnvRef(line))
|
|
124
|
+
return;
|
|
125
|
+
for (const pattern of exports.SENSITIVE_VARIABLE_PATTERNS) {
|
|
126
|
+
const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags);
|
|
127
|
+
if (regex.test(line)) {
|
|
128
|
+
// Extract the actual value to check if it's hardcoded
|
|
129
|
+
const valueMatch = line.match(/[=:]\s*['"]([^'"]+)['"]/i);
|
|
130
|
+
if (valueMatch && valueMatch[1].length > 3) {
|
|
131
|
+
// Has a non-trivial hardcoded value
|
|
132
|
+
vulnerabilities.push({
|
|
133
|
+
id: `var-${filePath}-${index + 1}`,
|
|
134
|
+
filePath,
|
|
135
|
+
lineNumber: index + 1,
|
|
136
|
+
lineContent: line.trim(),
|
|
137
|
+
severity: pattern.severity,
|
|
138
|
+
category: 'sensitive_variable',
|
|
139
|
+
title: 'Sensitive variable with hardcoded value',
|
|
140
|
+
description: pattern.description + '. The value appears to be hardcoded rather than loaded from environment.',
|
|
141
|
+
suggestedFix: 'Move this sensitive value to an environment variable or secure secrets manager.',
|
|
142
|
+
confidence: 'medium',
|
|
143
|
+
layer: 2,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
break; // Only report once per line
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
return vulnerabilities;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=variables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variables.js","sourceRoot":"","sources":["../../src/layer2/variables.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer 3: AI Semantic Analysis
|
|
3
|
+
* Uses Claude to perform deep security analysis including:
|
|
4
|
+
* - Taint analysis (data flow from sources to sinks)
|
|
5
|
+
* - Business logic flaw detection
|
|
6
|
+
* - Missing authorization checks
|
|
7
|
+
* - Cryptography validation
|
|
8
|
+
* - Data exposure detection
|
|
9
|
+
* - Framework-specific deep analysis
|
|
10
|
+
*/
|
|
11
|
+
import type { Vulnerability, ScanFile } from '../types';
|
|
12
|
+
import { type ProjectContext } from '../utils/project-context-builder';
|
|
13
|
+
export interface ValidationStats {
|
|
14
|
+
/** Total findings processed (input) */
|
|
15
|
+
totalFindings: number;
|
|
16
|
+
/** Findings that went through AI validation */
|
|
17
|
+
validatedFindings: number;
|
|
18
|
+
/** Findings confirmed as true positives */
|
|
19
|
+
confirmedFindings: number;
|
|
20
|
+
/** Findings dismissed as false positives */
|
|
21
|
+
dismissedFindings: number;
|
|
22
|
+
/** Findings with severity adjusted down */
|
|
23
|
+
downgradedFindings: number;
|
|
24
|
+
/** Findings auto-dismissed before AI (test files, etc.) */
|
|
25
|
+
autoDismissedFindings: number;
|
|
26
|
+
/** Estimated input tokens used */
|
|
27
|
+
estimatedInputTokens: number;
|
|
28
|
+
/** Estimated output tokens used */
|
|
29
|
+
estimatedOutputTokens: number;
|
|
30
|
+
/** Estimated cost in USD (based on Haiku pricing) */
|
|
31
|
+
estimatedCost: number;
|
|
32
|
+
/** Number of API calls made */
|
|
33
|
+
apiCalls: number;
|
|
34
|
+
/** Cache creation tokens (first write to cache) */
|
|
35
|
+
cacheCreationTokens: number;
|
|
36
|
+
/** Cache read tokens (subsequent reads from cache) */
|
|
37
|
+
cacheReadTokens: number;
|
|
38
|
+
/** Cache hit rate (0-1) */
|
|
39
|
+
cacheHitRate: number;
|
|
40
|
+
}
|
|
41
|
+
export interface AIValidationResult {
|
|
42
|
+
vulnerabilities: Vulnerability[];
|
|
43
|
+
stats: ValidationStats;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Apply smart auto-dismiss rules to filter obvious false positives
|
|
47
|
+
* Returns findings that should be sent to AI validation
|
|
48
|
+
*/
|
|
49
|
+
export declare function applyAutoDismissRules(findings: Vulnerability[]): {
|
|
50
|
+
toValidate: Vulnerability[];
|
|
51
|
+
dismissed: Array<{
|
|
52
|
+
finding: Vulnerability;
|
|
53
|
+
rule: string;
|
|
54
|
+
reason: string;
|
|
55
|
+
}>;
|
|
56
|
+
};
|
|
57
|
+
export interface Layer3Context {
|
|
58
|
+
/** Middleware configuration from project scan */
|
|
59
|
+
middlewareConfig?: {
|
|
60
|
+
hasAuthMiddleware: boolean;
|
|
61
|
+
authType?: string;
|
|
62
|
+
protectedPaths: string[];
|
|
63
|
+
};
|
|
64
|
+
/** Auth helper context */
|
|
65
|
+
authHelpers?: {
|
|
66
|
+
hasThrowingHelpers: boolean;
|
|
67
|
+
summary: string;
|
|
68
|
+
};
|
|
69
|
+
/** Additional context string */
|
|
70
|
+
additionalContext?: string;
|
|
71
|
+
}
|
|
72
|
+
export declare function analyzeWithAI(file: ScanFile, context?: Layer3Context): Promise<Vulnerability[]>;
|
|
73
|
+
export declare function batchAnalyzeWithAI(files: ScanFile[], context?: Layer3Context, maxConcurrent?: number): Promise<Vulnerability[]>;
|
|
74
|
+
/**
|
|
75
|
+
* Validate Layer 1/2 findings using AI with HIGH-CONTEXT validation
|
|
76
|
+
*
|
|
77
|
+
* Key improvements over previous version:
|
|
78
|
+
* 1. Sends FULL FILE CONTENT (not just snippets) for better context
|
|
79
|
+
* 2. Includes PROJECT CONTEXT (auth patterns, data access, etc.)
|
|
80
|
+
* 3. Uses generalised rules from Section 3 of the security model
|
|
81
|
+
*/
|
|
82
|
+
export declare function validateFindingsWithAI(findings: Vulnerability[], files: ScanFile[], projectContext?: ProjectContext): Promise<AIValidationResult>;
|
|
83
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/layer3/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAgD,QAAQ,EAAoB,MAAM,UAAU,CAAA;AASvH,OAAO,EAAiD,KAAK,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAQrH,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAA;IACrB,+CAA+C;IAC/C,iBAAiB,EAAE,MAAM,CAAA;IACzB,2CAA2C;IAC3C,iBAAiB,EAAE,MAAM,CAAA;IACzB,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,CAAA;IACzB,2CAA2C;IAC3C,kBAAkB,EAAE,MAAM,CAAA;IAC1B,2DAA2D;IAC3D,qBAAqB,EAAE,MAAM,CAAA;IAC7B,kCAAkC;IAClC,oBAAoB,EAAE,MAAM,CAAA;IAC5B,mCAAmC;IACnC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAA;IACrB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,mDAAmD;IACnD,mBAAmB,EAAE,MAAM,CAAA;IAC3B,sDAAsD;IACtD,eAAe,EAAE,MAAM,CAAA;IACvB,2BAA2B;IAC3B,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,aAAa,EAAE,CAAA;IAChC,KAAK,EAAE,eAAe,CAAA;CACvB;AAyLD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG;IAChE,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,SAAS,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,aAAa,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC3E,CAyBA;AAyID,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,gBAAgB,CAAC,EAAE;QACjB,iBAAiB,EAAE,OAAO,CAAA;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,cAAc,EAAE,MAAM,EAAE,CAAA;KACzB,CAAA;IACD,0BAA0B;IAC1B,WAAW,CAAC,EAAE;QACZ,kBAAkB,EAAE,OAAO,CAAA;QAC3B,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,gCAAgC;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAoCD,wBAAsB,aAAa,CACjC,IAAI,EAAE,QAAQ,EACd,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,aAAa,EAAE,CAAC,CA+D1B;AAiED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,QAAQ,EAAE,EACjB,OAAO,CAAC,EAAE,aAAa,EACvB,aAAa,GAAE,MAAU,GACxB,OAAO,CAAC,aAAa,EAAE,CAAC,CAqB1B;AAgrBD;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,aAAa,EAAE,EACzB,KAAK,EAAE,QAAQ,EAAE,EACjB,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,kBAAkB,CAAC,CAoT7B"}
|