@nahisaho/musubix-security 1.8.0 → 1.8.1
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 +27 -0
- package/dist/analyzers/ai/index.d.ts +6 -0
- package/dist/analyzers/ai/index.d.ts.map +1 -0
- package/dist/analyzers/ai/index.js +6 -0
- package/dist/analyzers/ai/index.js.map +1 -0
- package/dist/analyzers/ai/prompt-injection-detector.d.ts +152 -0
- package/dist/analyzers/ai/prompt-injection-detector.d.ts.map +1 -0
- package/dist/analyzers/ai/prompt-injection-detector.js +468 -0
- package/dist/analyzers/ai/prompt-injection-detector.js.map +1 -0
- package/dist/analyzers/api/api-security-analyzer.d.ts +263 -0
- package/dist/analyzers/api/api-security-analyzer.d.ts.map +1 -0
- package/dist/analyzers/api/api-security-analyzer.js +581 -0
- package/dist/analyzers/api/api-security-analyzer.js.map +1 -0
- package/dist/analyzers/compliance/compliance-checker.d.ts +201 -0
- package/dist/analyzers/compliance/compliance-checker.d.ts.map +1 -0
- package/dist/analyzers/compliance/compliance-checker.js +772 -0
- package/dist/analyzers/compliance/compliance-checker.js.map +1 -0
- package/dist/analyzers/container/image-scanner.d.ts +163 -0
- package/dist/analyzers/container/image-scanner.d.ts.map +1 -0
- package/dist/analyzers/container/image-scanner.js +459 -0
- package/dist/analyzers/container/image-scanner.js.map +1 -0
- package/dist/analyzers/container/index.d.ts +6 -0
- package/dist/analyzers/container/index.d.ts.map +1 -0
- package/dist/analyzers/container/index.js +6 -0
- package/dist/analyzers/container/index.js.map +1 -0
- package/dist/analyzers/dashboard/security-dashboard.d.ts +286 -0
- package/dist/analyzers/dashboard/security-dashboard.d.ts.map +1 -0
- package/dist/analyzers/dashboard/security-dashboard.js +796 -0
- package/dist/analyzers/dashboard/security-dashboard.js.map +1 -0
- package/dist/analyzers/iac/iac-checker.d.ts +124 -0
- package/dist/analyzers/iac/iac-checker.d.ts.map +1 -0
- package/dist/analyzers/iac/iac-checker.js +755 -0
- package/dist/analyzers/iac/iac-checker.js.map +1 -0
- package/dist/analyzers/iac/index.d.ts +6 -0
- package/dist/analyzers/iac/index.d.ts.map +1 -0
- package/dist/analyzers/iac/index.js +6 -0
- package/dist/analyzers/iac/index.js.map +1 -0
- package/dist/analyzers/index.d.ts +9 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +13 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/monitor/realtime-monitor.d.ts +216 -0
- package/dist/analyzers/monitor/realtime-monitor.d.ts.map +1 -0
- package/dist/analyzers/monitor/realtime-monitor.js +601 -0
- package/dist/analyzers/monitor/realtime-monitor.js.map +1 -0
- package/dist/analyzers/sast/index.d.ts +7 -0
- package/dist/analyzers/sast/index.d.ts.map +1 -0
- package/dist/analyzers/sast/index.js +7 -0
- package/dist/analyzers/sast/index.js.map +1 -0
- package/dist/analyzers/sast/interprocedural-analyzer.d.ts +276 -0
- package/dist/analyzers/sast/interprocedural-analyzer.d.ts.map +1 -0
- package/dist/analyzers/sast/interprocedural-analyzer.js +635 -0
- package/dist/analyzers/sast/interprocedural-analyzer.js.map +1 -0
- package/dist/analyzers/sast/zero-day-detector.d.ts +183 -0
- package/dist/analyzers/sast/zero-day-detector.d.ts.map +1 -0
- package/dist/analyzers/sast/zero-day-detector.js +593 -0
- package/dist/analyzers/sast/zero-day-detector.js.map +1 -0
- package/dist/analyzers/sca/dependency-scanner.d.ts +275 -0
- package/dist/analyzers/sca/dependency-scanner.d.ts.map +1 -0
- package/dist/analyzers/sca/dependency-scanner.js +642 -0
- package/dist/analyzers/sca/dependency-scanner.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +10 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/pipeline-manager.d.ts +105 -0
- package/dist/core/pipeline-manager.d.ts.map +1 -0
- package/dist/core/pipeline-manager.js +449 -0
- package/dist/core/pipeline-manager.js.map +1 -0
- package/dist/core/result-aggregator.d.ts +96 -0
- package/dist/core/result-aggregator.d.ts.map +1 -0
- package/dist/core/result-aggregator.js +462 -0
- package/dist/core/result-aggregator.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/ci-integration.d.ts +227 -0
- package/dist/integrations/ci-integration.d.ts.map +1 -0
- package/dist/integrations/ci-integration.js +472 -0
- package/dist/integrations/ci-integration.js.map +1 -0
- package/dist/integrations/git-hooks.d.ts +155 -0
- package/dist/integrations/git-hooks.d.ts.map +1 -0
- package/dist/integrations/git-hooks.js +425 -0
- package/dist/integrations/git-hooks.js.map +1 -0
- package/dist/integrations/index.d.ts +9 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +9 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/report-aggregator.d.ts +250 -0
- package/dist/integrations/report-aggregator.d.ts.map +1 -0
- package/dist/integrations/report-aggregator.js +488 -0
- package/dist/integrations/report-aggregator.js.map +1 -0
- package/dist/integrations/vscode-integration.d.ts +245 -0
- package/dist/integrations/vscode-integration.d.ts.map +1 -0
- package/dist/integrations/vscode-integration.js +449 -0
- package/dist/integrations/vscode-integration.js.map +1 -0
- package/dist/intelligence/attack-pattern-matcher.d.ts +217 -0
- package/dist/intelligence/attack-pattern-matcher.d.ts.map +1 -0
- package/dist/intelligence/attack-pattern-matcher.js +887 -0
- package/dist/intelligence/attack-pattern-matcher.js.map +1 -0
- package/dist/intelligence/index.d.ts +12 -0
- package/dist/intelligence/index.d.ts.map +1 -0
- package/dist/intelligence/index.js +18 -0
- package/dist/intelligence/index.js.map +1 -0
- package/dist/intelligence/neuro-symbolic-core.d.ts +88 -0
- package/dist/intelligence/neuro-symbolic-core.d.ts.map +1 -0
- package/dist/intelligence/neuro-symbolic-core.js +403 -0
- package/dist/intelligence/neuro-symbolic-core.js.map +1 -0
- package/dist/intelligence/predictive-analyzer.d.ts +317 -0
- package/dist/intelligence/predictive-analyzer.d.ts.map +1 -0
- package/dist/intelligence/predictive-analyzer.js +714 -0
- package/dist/intelligence/predictive-analyzer.js.map +1 -0
- package/dist/intelligence/risk-scorer.d.ts +333 -0
- package/dist/intelligence/risk-scorer.d.ts.map +1 -0
- package/dist/intelligence/risk-scorer.js +824 -0
- package/dist/intelligence/risk-scorer.js.map +1 -0
- package/dist/intelligence/security-analytics.d.ts +349 -0
- package/dist/intelligence/security-analytics.d.ts.map +1 -0
- package/dist/intelligence/security-analytics.js +813 -0
- package/dist/intelligence/security-analytics.js.map +1 -0
- package/dist/intelligence/threat-intelligence.d.ts +288 -0
- package/dist/intelligence/threat-intelligence.d.ts.map +1 -0
- package/dist/intelligence/threat-intelligence.js +639 -0
- package/dist/intelligence/threat-intelligence.js.map +1 -0
- package/dist/policy/index.d.ts +6 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +6 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/policy-engine.d.ts +254 -0
- package/dist/policy/policy-engine.d.ts.map +1 -0
- package/dist/policy/policy-engine.js +651 -0
- package/dist/policy/policy-engine.js.map +1 -0
- package/dist/remediation/auto-fixer.d.ts +179 -0
- package/dist/remediation/auto-fixer.d.ts.map +1 -0
- package/dist/remediation/auto-fixer.js +540 -0
- package/dist/remediation/auto-fixer.js.map +1 -0
- package/dist/remediation/fix-validator.d.ts +195 -0
- package/dist/remediation/fix-validator.d.ts.map +1 -0
- package/dist/remediation/fix-validator.js +462 -0
- package/dist/remediation/fix-validator.js.map +1 -0
- package/dist/remediation/index.d.ts +10 -0
- package/dist/remediation/index.d.ts.map +1 -0
- package/dist/remediation/index.js +15 -0
- package/dist/remediation/index.js.map +1 -0
- package/dist/remediation/patch-generator.d.ts +203 -0
- package/dist/remediation/patch-generator.d.ts.map +1 -0
- package/dist/remediation/patch-generator.js +533 -0
- package/dist/remediation/patch-generator.js.map +1 -0
- package/dist/remediation/remediation-planner.d.ts +262 -0
- package/dist/remediation/remediation-planner.d.ts.map +1 -0
- package/dist/remediation/remediation-planner.js +531 -0
- package/dist/remediation/remediation-planner.js.map +1 -0
- package/dist/remediation/secure-code-transformer.d.ts +222 -0
- package/dist/remediation/secure-code-transformer.d.ts.map +1 -0
- package/dist/remediation/secure-code-transformer.js +625 -0
- package/dist/remediation/secure-code-transformer.js.map +1 -0
- package/dist/types/fix.d.ts +3 -1
- package/dist/types/fix.d.ts.map +1 -1
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/interprocedural.d.ts +203 -0
- package/dist/types/interprocedural.d.ts.map +1 -0
- package/dist/types/interprocedural.js +7 -0
- package/dist/types/interprocedural.js.map +1 -0
- package/dist/types/neuro-symbolic.d.ts +179 -0
- package/dist/types/neuro-symbolic.d.ts.map +1 -0
- package/dist/types/neuro-symbolic.js +7 -0
- package/dist/types/neuro-symbolic.js.map +1 -0
- package/dist/types/pipeline.d.ts +173 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +7 -0
- package/dist/types/pipeline.js.map +1 -0
- package/dist/types/result.d.ts +134 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +25 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/vulnerability.d.ts +2 -2
- package/dist/types/vulnerability.d.ts.map +1 -1
- package/dist/types/zero-day.d.ts +146 -0
- package/dist/types/zero-day.d.ts.map +1 -0
- package/dist/types/zero-day.js +7 -0
- package/dist/types/zero-day.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compliance-checker.js","sourceRoot":"","sources":["../../../src/analyzers/compliance/compliance-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Container Image Scanner - scans container images for vulnerabilities
|
|
3
|
+
* @module @nahisaho/musubix-security/analyzers/container/image-scanner
|
|
4
|
+
* @trace DES-SEC2-CONTAINER-001, REQ-SEC2-CONTAINER-001
|
|
5
|
+
*/
|
|
6
|
+
import type { Vulnerability, Severity } from '../../types/vulnerability.js';
|
|
7
|
+
/**
|
|
8
|
+
* Container image vulnerability
|
|
9
|
+
*/
|
|
10
|
+
export interface ContainerVulnerability {
|
|
11
|
+
id: string;
|
|
12
|
+
packageName: string;
|
|
13
|
+
installedVersion: string;
|
|
14
|
+
fixedVersion?: string;
|
|
15
|
+
severity: Severity;
|
|
16
|
+
cve?: string;
|
|
17
|
+
description: string;
|
|
18
|
+
layer?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Image scan result
|
|
22
|
+
*/
|
|
23
|
+
export interface ImageScanResult {
|
|
24
|
+
image: string;
|
|
25
|
+
tag: string;
|
|
26
|
+
digest?: string;
|
|
27
|
+
vulnerabilities: ContainerVulnerability[];
|
|
28
|
+
metadata: ImageMetadata;
|
|
29
|
+
scanTime: Date;
|
|
30
|
+
scanner: 'trivy' | 'grype' | 'internal';
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Image metadata
|
|
34
|
+
*/
|
|
35
|
+
export interface ImageMetadata {
|
|
36
|
+
os?: string;
|
|
37
|
+
osVersion?: string;
|
|
38
|
+
architecture?: string;
|
|
39
|
+
size?: number;
|
|
40
|
+
layers?: number;
|
|
41
|
+
created?: Date;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Image scan options
|
|
45
|
+
*/
|
|
46
|
+
export interface ImageScanOptions {
|
|
47
|
+
/** Scanner to use (default: trivy) */
|
|
48
|
+
scanner?: 'trivy' | 'grype';
|
|
49
|
+
/** Minimum severity to report */
|
|
50
|
+
minSeverity?: Severity;
|
|
51
|
+
/** Skip update of vulnerability database */
|
|
52
|
+
skipDbUpdate?: boolean;
|
|
53
|
+
/** Scan timeout in milliseconds */
|
|
54
|
+
timeout?: number;
|
|
55
|
+
/** Include unfixed vulnerabilities */
|
|
56
|
+
includeUnfixed?: boolean;
|
|
57
|
+
/** Rule IDs to skip (e.g., ['DKR-001', 'DKR-002']) */
|
|
58
|
+
skipRules?: string[];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Dockerfile analysis result
|
|
62
|
+
*/
|
|
63
|
+
export interface DockerfileAnalysis {
|
|
64
|
+
filePath: string;
|
|
65
|
+
baseImage: string;
|
|
66
|
+
issues: DockerfileIssue[];
|
|
67
|
+
bestPractices: BestPracticeViolation[];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Dockerfile issue
|
|
71
|
+
*/
|
|
72
|
+
export interface DockerfileIssue {
|
|
73
|
+
id: string;
|
|
74
|
+
severity: Severity;
|
|
75
|
+
line: number;
|
|
76
|
+
instruction: string;
|
|
77
|
+
message: string;
|
|
78
|
+
recommendation: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Best practice violation
|
|
82
|
+
*/
|
|
83
|
+
export interface BestPracticeViolation {
|
|
84
|
+
rule: string;
|
|
85
|
+
description: string;
|
|
86
|
+
line?: number;
|
|
87
|
+
recommendation: string;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Container Image Scanner
|
|
91
|
+
* @trace DES-SEC2-CONTAINER-001
|
|
92
|
+
*/
|
|
93
|
+
export declare class ImageScanner {
|
|
94
|
+
private options;
|
|
95
|
+
constructor(options?: ImageScanOptions);
|
|
96
|
+
/**
|
|
97
|
+
* Scan a container image
|
|
98
|
+
* @trace REQ-SEC2-CONTAINER-001
|
|
99
|
+
*/
|
|
100
|
+
scan(imageRef: string, options?: ImageScanOptions): Promise<ImageScanResult>;
|
|
101
|
+
/**
|
|
102
|
+
* Analyze a Dockerfile for security issues
|
|
103
|
+
* @trace REQ-SEC2-CONTAINER-002
|
|
104
|
+
*/
|
|
105
|
+
analyzeDockerfile(dockerfilePath: string): Promise<DockerfileAnalysis>;
|
|
106
|
+
/**
|
|
107
|
+
* Convert container vulnerabilities to standard vulnerability format
|
|
108
|
+
*/
|
|
109
|
+
toVulnerabilities(result: ImageScanResult): Vulnerability[];
|
|
110
|
+
/**
|
|
111
|
+
* Parse image reference into image name and tag
|
|
112
|
+
*/
|
|
113
|
+
private parseImageRef;
|
|
114
|
+
/**
|
|
115
|
+
* Run external scanner (Trivy or Grype)
|
|
116
|
+
*/
|
|
117
|
+
private runExternalScanner;
|
|
118
|
+
/**
|
|
119
|
+
* Check if a scanner is available
|
|
120
|
+
*/
|
|
121
|
+
private isScannerAvailable;
|
|
122
|
+
/**
|
|
123
|
+
* Run Trivy scanner
|
|
124
|
+
*/
|
|
125
|
+
private runTrivy;
|
|
126
|
+
/**
|
|
127
|
+
* Run Grype scanner
|
|
128
|
+
*/
|
|
129
|
+
private runGrype;
|
|
130
|
+
/**
|
|
131
|
+
* Parse Trivy JSON output
|
|
132
|
+
*/
|
|
133
|
+
private parseTrivyOutput;
|
|
134
|
+
/**
|
|
135
|
+
* Parse Grype JSON output
|
|
136
|
+
*/
|
|
137
|
+
private parseGrypeOutput;
|
|
138
|
+
/**
|
|
139
|
+
* Get numeric severity level for comparison
|
|
140
|
+
*/
|
|
141
|
+
private getSeverityLevel;
|
|
142
|
+
/**
|
|
143
|
+
* Extract base image from Dockerfile
|
|
144
|
+
*/
|
|
145
|
+
private extractBaseImage;
|
|
146
|
+
/**
|
|
147
|
+
* Check Dockerfile for security issues
|
|
148
|
+
*/
|
|
149
|
+
private checkDockerfileIssues;
|
|
150
|
+
/**
|
|
151
|
+
* Check best practices
|
|
152
|
+
*/
|
|
153
|
+
private checkBestPractices;
|
|
154
|
+
/**
|
|
155
|
+
* Map CVE to CWE
|
|
156
|
+
*/
|
|
157
|
+
private mapCVEToCWE;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Create image scanner instance
|
|
161
|
+
*/
|
|
162
|
+
export declare function createImageScanner(options?: ImageScanOptions): ImageScanner;
|
|
163
|
+
//# sourceMappingURL=image-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-scanner.d.ts","sourceRoot":"","sources":["../../../src/analyzers/container/image-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Container Image Scanner - scans container images for vulnerabilities
|
|
3
|
+
* @module @nahisaho/musubix-security/analyzers/container/image-scanner
|
|
4
|
+
* @trace DES-SEC2-CONTAINER-001, REQ-SEC2-CONTAINER-001
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
8
|
+
/**
|
|
9
|
+
* Severity mapping from external scanners
|
|
10
|
+
*/
|
|
11
|
+
const SEVERITY_MAP = {
|
|
12
|
+
'CRITICAL': 'critical',
|
|
13
|
+
'HIGH': 'high',
|
|
14
|
+
'MEDIUM': 'medium',
|
|
15
|
+
'LOW': 'low',
|
|
16
|
+
'UNKNOWN': 'info',
|
|
17
|
+
'NEGLIGIBLE': 'info',
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Dockerfile best practice rules
|
|
21
|
+
*/
|
|
22
|
+
const DOCKERFILE_RULES = [
|
|
23
|
+
{
|
|
24
|
+
id: 'DKR-001',
|
|
25
|
+
pattern: /^FROM\s+\S+:latest\s*$/im,
|
|
26
|
+
severity: 'medium',
|
|
27
|
+
message: 'Using `:latest` tag is not recommended',
|
|
28
|
+
recommendation: 'Use a specific version tag for reproducible builds',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: 'DKR-002',
|
|
32
|
+
pattern: /^USER\s+root\s*$/im,
|
|
33
|
+
severity: 'high',
|
|
34
|
+
message: 'Running as root user',
|
|
35
|
+
recommendation: 'Create and use a non-root user',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: 'DKR-003',
|
|
39
|
+
pattern: /^RUN\s+.*apt-get\s+install.*-y(?!.*--no-install-recommends)/im,
|
|
40
|
+
severity: 'low',
|
|
41
|
+
message: 'Installing packages without --no-install-recommends',
|
|
42
|
+
recommendation: 'Add --no-install-recommends to reduce image size',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: 'DKR-004',
|
|
46
|
+
pattern: /^RUN\s+.*curl.*\|\s*(bash|sh)/im,
|
|
47
|
+
severity: 'critical',
|
|
48
|
+
message: 'Piping curl to shell is dangerous',
|
|
49
|
+
recommendation: 'Download and verify script before execution',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: 'DKR-005',
|
|
53
|
+
pattern: /^ADD\s+https?:\/\//im,
|
|
54
|
+
severity: 'medium',
|
|
55
|
+
message: 'Using ADD with URL is discouraged',
|
|
56
|
+
recommendation: 'Use RUN with curl/wget for better caching',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: 'DKR-006',
|
|
60
|
+
pattern: /^EXPOSE\s+22\s*$/im,
|
|
61
|
+
severity: 'high',
|
|
62
|
+
message: 'Exposing SSH port',
|
|
63
|
+
recommendation: 'Avoid SSH in containers; use kubectl exec or docker exec',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'DKR-007',
|
|
67
|
+
pattern: /ENV\s+.*PASSWORD|SECRET|KEY|TOKEN.*=/i,
|
|
68
|
+
severity: 'critical',
|
|
69
|
+
message: 'Hardcoded secrets in ENV',
|
|
70
|
+
recommendation: 'Use Docker secrets or environment variables at runtime',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: 'DKR-008',
|
|
74
|
+
pattern: /^COPY\s+\.\s+/im,
|
|
75
|
+
severity: 'medium',
|
|
76
|
+
message: 'Copying entire context',
|
|
77
|
+
recommendation: 'Use specific paths or .dockerignore',
|
|
78
|
+
},
|
|
79
|
+
];
|
|
80
|
+
/**
|
|
81
|
+
* Container Image Scanner
|
|
82
|
+
* @trace DES-SEC2-CONTAINER-001
|
|
83
|
+
*/
|
|
84
|
+
export class ImageScanner {
|
|
85
|
+
options;
|
|
86
|
+
constructor(options = {}) {
|
|
87
|
+
this.options = {
|
|
88
|
+
scanner: options.scanner ?? 'trivy',
|
|
89
|
+
minSeverity: options.minSeverity ?? 'low',
|
|
90
|
+
skipDbUpdate: options.skipDbUpdate ?? false,
|
|
91
|
+
timeout: options.timeout ?? 300000, // 5 minutes
|
|
92
|
+
includeUnfixed: options.includeUnfixed ?? true,
|
|
93
|
+
skipRules: options.skipRules ?? [],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Scan a container image
|
|
98
|
+
* @trace REQ-SEC2-CONTAINER-001
|
|
99
|
+
*/
|
|
100
|
+
async scan(imageRef, options) {
|
|
101
|
+
const mergedOptions = { ...this.options, ...options };
|
|
102
|
+
// Parse image reference
|
|
103
|
+
const { image, tag } = this.parseImageRef(imageRef);
|
|
104
|
+
try {
|
|
105
|
+
// Try external scanner first
|
|
106
|
+
const externalResult = await this.runExternalScanner(imageRef, mergedOptions);
|
|
107
|
+
if (externalResult) {
|
|
108
|
+
return {
|
|
109
|
+
...externalResult,
|
|
110
|
+
image,
|
|
111
|
+
tag,
|
|
112
|
+
scanTime: new Date(),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Fall back to internal scanning
|
|
118
|
+
}
|
|
119
|
+
// Internal scanning (Dockerfile analysis only without external scanner)
|
|
120
|
+
return {
|
|
121
|
+
image,
|
|
122
|
+
tag,
|
|
123
|
+
vulnerabilities: [],
|
|
124
|
+
metadata: {},
|
|
125
|
+
scanTime: new Date(),
|
|
126
|
+
scanner: 'internal',
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Analyze a Dockerfile for security issues
|
|
131
|
+
* @trace REQ-SEC2-CONTAINER-002
|
|
132
|
+
*/
|
|
133
|
+
async analyzeDockerfile(dockerfilePath) {
|
|
134
|
+
if (!existsSync(dockerfilePath)) {
|
|
135
|
+
throw new Error(`Dockerfile not found: ${dockerfilePath}`);
|
|
136
|
+
}
|
|
137
|
+
const content = readFileSync(dockerfilePath, 'utf-8');
|
|
138
|
+
const lines = content.split('\n');
|
|
139
|
+
// Extract base image
|
|
140
|
+
const baseImage = this.extractBaseImage(content);
|
|
141
|
+
// Check for issues and filter by skipRules
|
|
142
|
+
const allIssues = this.checkDockerfileIssues(content, lines);
|
|
143
|
+
const skipRules = this.options.skipRules ?? [];
|
|
144
|
+
const issues = allIssues.filter(issue => !skipRules.includes(issue.id));
|
|
145
|
+
// Check best practices
|
|
146
|
+
const bestPractices = this.checkBestPractices(content, lines);
|
|
147
|
+
return {
|
|
148
|
+
filePath: dockerfilePath,
|
|
149
|
+
baseImage,
|
|
150
|
+
issues,
|
|
151
|
+
bestPractices,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Convert container vulnerabilities to standard vulnerability format
|
|
156
|
+
*/
|
|
157
|
+
toVulnerabilities(result) {
|
|
158
|
+
return result.vulnerabilities.map((cv, index) => ({
|
|
159
|
+
id: `CONTAINER-${result.image.replace(/[^a-zA-Z0-9]/g, '-')}-${index}`,
|
|
160
|
+
type: 'dependency',
|
|
161
|
+
severity: cv.severity,
|
|
162
|
+
cwes: this.mapCVEToCWE(cv.cve),
|
|
163
|
+
owasp: ['A06:2021'], // Vulnerable and Outdated Components
|
|
164
|
+
location: {
|
|
165
|
+
file: result.image,
|
|
166
|
+
startLine: 1,
|
|
167
|
+
endLine: 1,
|
|
168
|
+
startColumn: 0,
|
|
169
|
+
endColumn: 0,
|
|
170
|
+
},
|
|
171
|
+
description: `${cv.packageName}@${cv.installedVersion}: ${cv.description}`,
|
|
172
|
+
recommendation: cv.fixedVersion
|
|
173
|
+
? `Upgrade to ${cv.packageName}@${cv.fixedVersion}`
|
|
174
|
+
: 'No fix available; consider using an alternative package',
|
|
175
|
+
confidence: 0.95,
|
|
176
|
+
ruleId: cv.cve ?? cv.id,
|
|
177
|
+
codeSnippet: `Package: ${cv.packageName}\nVersion: ${cv.installedVersion}${cv.layer ? `\nLayer: ${cv.layer}` : ''}`,
|
|
178
|
+
detectedAt: new Date(),
|
|
179
|
+
}));
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Parse image reference into image name and tag
|
|
183
|
+
*/
|
|
184
|
+
parseImageRef(imageRef) {
|
|
185
|
+
// Handle digest format
|
|
186
|
+
if (imageRef.includes('@sha256:')) {
|
|
187
|
+
const [image, digest] = imageRef.split('@');
|
|
188
|
+
return { image, tag: 'latest', digest };
|
|
189
|
+
}
|
|
190
|
+
// Handle tag format
|
|
191
|
+
const lastColon = imageRef.lastIndexOf(':');
|
|
192
|
+
if (lastColon > 0 && !imageRef.substring(lastColon).includes('/')) {
|
|
193
|
+
return {
|
|
194
|
+
image: imageRef.substring(0, lastColon),
|
|
195
|
+
tag: imageRef.substring(lastColon + 1),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
return { image: imageRef, tag: 'latest' };
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Run external scanner (Trivy or Grype)
|
|
202
|
+
*/
|
|
203
|
+
async runExternalScanner(imageRef, options) {
|
|
204
|
+
const scanner = options.scanner ?? 'trivy';
|
|
205
|
+
// Check if scanner is available
|
|
206
|
+
const isAvailable = await this.isScannerAvailable(scanner);
|
|
207
|
+
if (!isAvailable) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
if (scanner === 'trivy') {
|
|
211
|
+
return this.runTrivy(imageRef, options);
|
|
212
|
+
}
|
|
213
|
+
else if (scanner === 'grype') {
|
|
214
|
+
return this.runGrype(imageRef, options);
|
|
215
|
+
}
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Check if a scanner is available
|
|
220
|
+
*/
|
|
221
|
+
async isScannerAvailable(scanner) {
|
|
222
|
+
return new Promise((resolve) => {
|
|
223
|
+
const proc = spawn(scanner, ['--version'], { stdio: 'ignore' });
|
|
224
|
+
proc.on('close', (code) => resolve(code === 0));
|
|
225
|
+
proc.on('error', () => resolve(false));
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Run Trivy scanner
|
|
230
|
+
*/
|
|
231
|
+
async runTrivy(imageRef, options) {
|
|
232
|
+
const args = ['image', '--format', 'json'];
|
|
233
|
+
if (options.skipDbUpdate) {
|
|
234
|
+
args.push('--skip-db-update');
|
|
235
|
+
}
|
|
236
|
+
if (!options.includeUnfixed) {
|
|
237
|
+
args.push('--ignore-unfixed');
|
|
238
|
+
}
|
|
239
|
+
args.push(imageRef);
|
|
240
|
+
return new Promise((resolve, reject) => {
|
|
241
|
+
let stdout = '';
|
|
242
|
+
let stderr = '';
|
|
243
|
+
const proc = spawn('trivy', args, {
|
|
244
|
+
timeout: options.timeout,
|
|
245
|
+
});
|
|
246
|
+
proc.stdout.on('data', (data) => { stdout += data; });
|
|
247
|
+
proc.stderr.on('data', (data) => { stderr += data; });
|
|
248
|
+
proc.on('close', (code) => {
|
|
249
|
+
if (code !== 0) {
|
|
250
|
+
reject(new Error(`Trivy failed: ${stderr}`));
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
try {
|
|
254
|
+
const result = JSON.parse(stdout);
|
|
255
|
+
resolve(this.parseTrivyOutput(result, options));
|
|
256
|
+
}
|
|
257
|
+
catch (e) {
|
|
258
|
+
reject(new Error(`Failed to parse Trivy output: ${e}`));
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
proc.on('error', (err) => reject(err));
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Run Grype scanner
|
|
266
|
+
*/
|
|
267
|
+
async runGrype(imageRef, options) {
|
|
268
|
+
const args = ['-o', 'json', imageRef];
|
|
269
|
+
return new Promise((resolve, reject) => {
|
|
270
|
+
let stdout = '';
|
|
271
|
+
let stderr = '';
|
|
272
|
+
const proc = spawn('grype', args, {
|
|
273
|
+
timeout: options.timeout,
|
|
274
|
+
});
|
|
275
|
+
proc.stdout.on('data', (data) => { stdout += data; });
|
|
276
|
+
proc.stderr.on('data', (data) => { stderr += data; });
|
|
277
|
+
proc.on('close', (code) => {
|
|
278
|
+
if (code !== 0) {
|
|
279
|
+
reject(new Error(`Grype failed: ${stderr}`));
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
try {
|
|
283
|
+
const result = JSON.parse(stdout);
|
|
284
|
+
resolve(this.parseGrypeOutput(result, options));
|
|
285
|
+
}
|
|
286
|
+
catch (e) {
|
|
287
|
+
reject(new Error(`Failed to parse Grype output: ${e}`));
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
proc.on('error', (err) => reject(err));
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Parse Trivy JSON output
|
|
295
|
+
*/
|
|
296
|
+
parseTrivyOutput(output, options) {
|
|
297
|
+
const vulnerabilities = [];
|
|
298
|
+
const minSeverityLevel = this.getSeverityLevel(options.minSeverity ?? 'low');
|
|
299
|
+
// Handle Results array
|
|
300
|
+
const results = output.Results ?? [];
|
|
301
|
+
for (const result of results) {
|
|
302
|
+
const vulns = result.Vulnerabilities ?? [];
|
|
303
|
+
for (const vuln of vulns) {
|
|
304
|
+
const severity = SEVERITY_MAP[vuln.Severity?.toUpperCase()] ?? 'info';
|
|
305
|
+
if (this.getSeverityLevel(severity) < minSeverityLevel) {
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
vulnerabilities.push({
|
|
309
|
+
id: vuln.VulnerabilityID,
|
|
310
|
+
packageName: vuln.PkgName,
|
|
311
|
+
installedVersion: vuln.InstalledVersion,
|
|
312
|
+
fixedVersion: vuln.FixedVersion,
|
|
313
|
+
severity,
|
|
314
|
+
cve: vuln.VulnerabilityID?.startsWith('CVE-') ? vuln.VulnerabilityID : undefined,
|
|
315
|
+
description: vuln.Description ?? vuln.Title ?? 'No description',
|
|
316
|
+
layer: result.Target,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Extract metadata
|
|
321
|
+
const metadata = {};
|
|
322
|
+
if (output.Metadata) {
|
|
323
|
+
metadata.os = output.Metadata.OS?.Family;
|
|
324
|
+
metadata.osVersion = output.Metadata.OS?.Name;
|
|
325
|
+
metadata.architecture = output.Metadata.ImageConfig?.architecture;
|
|
326
|
+
}
|
|
327
|
+
return {
|
|
328
|
+
vulnerabilities,
|
|
329
|
+
metadata,
|
|
330
|
+
scanner: 'trivy',
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Parse Grype JSON output
|
|
335
|
+
*/
|
|
336
|
+
parseGrypeOutput(output, options) {
|
|
337
|
+
const vulnerabilities = [];
|
|
338
|
+
const minSeverityLevel = this.getSeverityLevel(options.minSeverity ?? 'low');
|
|
339
|
+
const matches = output.matches ?? [];
|
|
340
|
+
for (const match of matches) {
|
|
341
|
+
const vuln = match.vulnerability;
|
|
342
|
+
const artifact = match.artifact;
|
|
343
|
+
const severity = SEVERITY_MAP[vuln?.severity?.toUpperCase()] ?? 'info';
|
|
344
|
+
if (this.getSeverityLevel(severity) < minSeverityLevel) {
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
vulnerabilities.push({
|
|
348
|
+
id: vuln?.id ?? 'UNKNOWN',
|
|
349
|
+
packageName: artifact?.name ?? 'unknown',
|
|
350
|
+
installedVersion: artifact?.version ?? 'unknown',
|
|
351
|
+
fixedVersion: match.vulnerability?.fix?.versions?.[0],
|
|
352
|
+
severity,
|
|
353
|
+
cve: vuln?.id?.startsWith('CVE-') ? vuln.id : undefined,
|
|
354
|
+
description: vuln?.description ?? 'No description',
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
// Extract metadata
|
|
358
|
+
const metadata = {};
|
|
359
|
+
if (output.source?.target?.imageID) {
|
|
360
|
+
metadata.os = output.distro?.name;
|
|
361
|
+
metadata.osVersion = output.distro?.version;
|
|
362
|
+
}
|
|
363
|
+
return {
|
|
364
|
+
vulnerabilities,
|
|
365
|
+
metadata,
|
|
366
|
+
scanner: 'grype',
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Get numeric severity level for comparison
|
|
371
|
+
*/
|
|
372
|
+
getSeverityLevel(severity) {
|
|
373
|
+
const levels = {
|
|
374
|
+
critical: 4,
|
|
375
|
+
high: 3,
|
|
376
|
+
medium: 2,
|
|
377
|
+
low: 1,
|
|
378
|
+
info: 0,
|
|
379
|
+
};
|
|
380
|
+
return levels[severity] ?? 0;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Extract base image from Dockerfile
|
|
384
|
+
*/
|
|
385
|
+
extractBaseImage(content) {
|
|
386
|
+
const match = content.match(/^FROM\s+(\S+)/im);
|
|
387
|
+
return match?.[1] ?? 'unknown';
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Check Dockerfile for security issues
|
|
391
|
+
*/
|
|
392
|
+
checkDockerfileIssues(content, lines) {
|
|
393
|
+
const issues = [];
|
|
394
|
+
for (const rule of DOCKERFILE_RULES) {
|
|
395
|
+
const match = content.match(rule.pattern);
|
|
396
|
+
if (match) {
|
|
397
|
+
// Find line number
|
|
398
|
+
let lineNumber = 1;
|
|
399
|
+
for (let i = 0; i < lines.length; i++) {
|
|
400
|
+
if (lines[i].match(rule.pattern)) {
|
|
401
|
+
lineNumber = i + 1;
|
|
402
|
+
break;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
issues.push({
|
|
406
|
+
id: rule.id,
|
|
407
|
+
severity: rule.severity,
|
|
408
|
+
line: lineNumber,
|
|
409
|
+
instruction: match[0].trim(),
|
|
410
|
+
message: rule.message,
|
|
411
|
+
recommendation: rule.recommendation,
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return issues;
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Check best practices
|
|
419
|
+
*/
|
|
420
|
+
checkBestPractices(content, _lines) {
|
|
421
|
+
const violations = [];
|
|
422
|
+
// Check for HEALTHCHECK
|
|
423
|
+
if (!content.includes('HEALTHCHECK')) {
|
|
424
|
+
violations.push({
|
|
425
|
+
rule: 'HEALTHCHECK',
|
|
426
|
+
description: 'No HEALTHCHECK instruction found',
|
|
427
|
+
recommendation: 'Add HEALTHCHECK to enable container health monitoring',
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
// Check for multi-stage builds when large packages are installed
|
|
431
|
+
const hasInstallCommands = /apt-get install|npm install|pip install|yarn add/i.test(content);
|
|
432
|
+
const isMultiStage = (content.match(/^FROM\s+/gim) ?? []).length > 1;
|
|
433
|
+
if (hasInstallCommands && !isMultiStage) {
|
|
434
|
+
violations.push({
|
|
435
|
+
rule: 'MULTI_STAGE_BUILD',
|
|
436
|
+
description: 'Consider using multi-stage builds',
|
|
437
|
+
recommendation: 'Use multi-stage builds to reduce final image size',
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
// Check for .dockerignore mention
|
|
441
|
+
// This is a reminder, not detectable from Dockerfile alone
|
|
442
|
+
return violations;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Map CVE to CWE
|
|
446
|
+
*/
|
|
447
|
+
mapCVEToCWE(cve) {
|
|
448
|
+
// In a real implementation, this would query a CVE database
|
|
449
|
+
// For now, return a generic CWE for supply chain vulnerability
|
|
450
|
+
return cve ? ['CWE-1035'] : ['CWE-1035']; // Using Components from Untrusted Source
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Create image scanner instance
|
|
455
|
+
*/
|
|
456
|
+
export function createImageScanner(options) {
|
|
457
|
+
return new ImageScanner(options);
|
|
458
|
+
}
|
|
459
|
+
//# sourceMappingURL=image-scanner.js.map
|