@sulthonzh/mcp-audit 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +134 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +165 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/config-loader.d.ts +17 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +72 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/reporter/report-generator.d.ts +7 -0
- package/dist/reporter/report-generator.d.ts.map +1 -0
- package/dist/reporter/report-generator.js +240 -0
- package/dist/reporter/report-generator.js.map +1 -0
- package/dist/reporters/sarif-reporter.d.ts +18 -0
- package/dist/reporters/sarif-reporter.d.ts.map +1 -0
- package/dist/reporters/sarif-reporter.js +148 -0
- package/dist/reporters/sarif-reporter.js.map +1 -0
- package/dist/scanners/config-scanner.d.ts +11 -0
- package/dist/scanners/config-scanner.d.ts.map +1 -0
- package/dist/scanners/config-scanner.js +399 -0
- package/dist/scanners/config-scanner.js.map +1 -0
- package/dist/scanners/docker-scanner.d.ts +13 -0
- package/dist/scanners/docker-scanner.d.ts.map +1 -0
- package/dist/scanners/docker-scanner.js +384 -0
- package/dist/scanners/docker-scanner.js.map +1 -0
- package/dist/scanners/helm-scanner.d.ts +16 -0
- package/dist/scanners/helm-scanner.d.ts.map +1 -0
- package/dist/scanners/helm-scanner.js +385 -0
- package/dist/scanners/helm-scanner.js.map +1 -0
- package/dist/scanners/k8s-scanner.d.ts +14 -0
- package/dist/scanners/k8s-scanner.d.ts.map +1 -0
- package/dist/scanners/k8s-scanner.js +315 -0
- package/dist/scanners/k8s-scanner.js.map +1 -0
- package/dist/scanners/server-scanner.d.ts +13 -0
- package/dist/scanners/server-scanner.d.ts.map +1 -0
- package/dist/scanners/server-scanner.js +346 -0
- package/dist/scanners/server-scanner.js.map +1 -0
- package/dist/types/security-result.d.ts +35 -0
- package/dist/types/security-result.d.ts.map +1 -0
- package/dist/types/security-result.js +3 -0
- package/dist/types/security-result.js.map +1 -0
- package/dist/utils/logger.d.ts +19 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +71 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.scanDocker = scanDocker;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
// ---- Public API ----
|
|
12
|
+
async function scanDocker(targetPath, options = {}) {
|
|
13
|
+
const issues = [];
|
|
14
|
+
let filesScanned = 0;
|
|
15
|
+
try {
|
|
16
|
+
// Scan Dockerfiles
|
|
17
|
+
const dockerfiles = await findFiles(targetPath, ['Dockerfile', 'Dockerfile.*']);
|
|
18
|
+
for (const df of dockerfiles) {
|
|
19
|
+
filesScanned++;
|
|
20
|
+
const content = await fs_extra_1.default.readFile(df, 'utf8');
|
|
21
|
+
const rel = path_1.default.relative(targetPath, df);
|
|
22
|
+
issues.push(...checkDockerfile(content, rel));
|
|
23
|
+
}
|
|
24
|
+
// Scan docker-compose files
|
|
25
|
+
const composeFiles = await findFiles(targetPath, [
|
|
26
|
+
'docker-compose.yml', 'docker-compose.yaml',
|
|
27
|
+
'compose.yml', 'compose.yaml',
|
|
28
|
+
]);
|
|
29
|
+
for (const cf of composeFiles) {
|
|
30
|
+
filesScanned++;
|
|
31
|
+
const content = await fs_extra_1.default.readFile(cf, 'utf8');
|
|
32
|
+
const rel = path_1.default.relative(targetPath, cf);
|
|
33
|
+
issues.push(...checkComposeFile(content, rel));
|
|
34
|
+
}
|
|
35
|
+
// Scan .env files for leaked secrets
|
|
36
|
+
const envFiles = await findFiles(targetPath, ['.env', '.env.*']);
|
|
37
|
+
for (const ef of envFiles) {
|
|
38
|
+
filesScanned++;
|
|
39
|
+
const content = await fs_extra_1.default.readFile(ef, 'utf8');
|
|
40
|
+
const rel = path_1.default.relative(targetPath, ef);
|
|
41
|
+
issues.push(...checkEnvFile(content, rel));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
logger_1.logger.warn('Docker scan error:', err);
|
|
46
|
+
issues.push({
|
|
47
|
+
type: 'medium',
|
|
48
|
+
category: 'config',
|
|
49
|
+
title: 'Docker Scan Error',
|
|
50
|
+
description: `Could not complete container scan: ${err instanceof Error ? err.message : String(err)}`,
|
|
51
|
+
recommendation: 'Ensure the target path is accessible',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const high = issues.filter(i => i.type === 'high').length;
|
|
55
|
+
const medium = issues.filter(i => i.type === 'medium').length;
|
|
56
|
+
const low = issues.filter(i => i.type === 'low').length;
|
|
57
|
+
// Score: start at 100, deduct per issue
|
|
58
|
+
const score = Math.max(0, 100 - high * 25 - medium * 10 - low * 3);
|
|
59
|
+
return {
|
|
60
|
+
scanType: 'server',
|
|
61
|
+
timestamp: new Date().toISOString(),
|
|
62
|
+
target: targetPath,
|
|
63
|
+
issues,
|
|
64
|
+
score,
|
|
65
|
+
summary: {
|
|
66
|
+
configFilesFound: filesScanned,
|
|
67
|
+
highRiskIssues: high,
|
|
68
|
+
mediumRiskIssues: medium,
|
|
69
|
+
lowRiskIssues: low,
|
|
70
|
+
},
|
|
71
|
+
metadata: { scanKind: 'docker' },
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// ---- Dockerfile Checks ----
|
|
75
|
+
function checkDockerfile(content, filePath) {
|
|
76
|
+
const issues = [];
|
|
77
|
+
const lines = content.split('\n');
|
|
78
|
+
const lineNo = (idx) => idx + 1;
|
|
79
|
+
lines.forEach((line, idx) => {
|
|
80
|
+
const trimmed = line.trim();
|
|
81
|
+
const upper = trimmed.toUpperCase();
|
|
82
|
+
// Running as root
|
|
83
|
+
if (/^USER\s+ROOT/i.test(upper)) {
|
|
84
|
+
issues.push({
|
|
85
|
+
type: 'high',
|
|
86
|
+
category: 'permissions',
|
|
87
|
+
title: 'Container Runs as Root',
|
|
88
|
+
description: `Line ${lineNo(idx)}: USER root — containers should run as non-root`,
|
|
89
|
+
recommendation: 'Add a non-root user: RUN adduser --disabled-password appuser && USER appuser',
|
|
90
|
+
evidence: `${filePath}:${lineNo(idx)}`,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
// --no-auth or --insecure flags in RUN commands
|
|
94
|
+
if (/^RUN\b/i.test(trimmed)) {
|
|
95
|
+
if (/\b--no-verify-ssl\b|\b--insecure\b|\b--no-check-certificate\b/i.test(trimmed)) {
|
|
96
|
+
issues.push({
|
|
97
|
+
type: 'high',
|
|
98
|
+
category: 'transport',
|
|
99
|
+
title: 'Insecure Download in Build',
|
|
100
|
+
description: `Line ${lineNo(idx)}: skips TLS/SSL verification during build`,
|
|
101
|
+
recommendation: 'Remove --insecure/--no-verify-ssl flags and use trusted registries',
|
|
102
|
+
evidence: `${filePath}:${lineNo(idx)}`,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// curl | sh patterns
|
|
106
|
+
if (/curl.*\|\s*(sh|bash|sudo)/i.test(trimmed)) {
|
|
107
|
+
issues.push({
|
|
108
|
+
type: 'high',
|
|
109
|
+
category: 'supply-chain',
|
|
110
|
+
title: 'Pipe to Shell in Build',
|
|
111
|
+
description: `Line ${lineNo(idx)}: downloading and executing code in one step`,
|
|
112
|
+
recommendation: 'Download first, verify checksum/signature, then execute',
|
|
113
|
+
evidence: `${filePath}:${lineNo(idx)}`,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
// apt-get without --no-install-recommends
|
|
117
|
+
if (/apt-get install(?!.*--no-install-recommends)/i.test(trimmed)) {
|
|
118
|
+
issues.push({
|
|
119
|
+
type: 'low',
|
|
120
|
+
category: 'config',
|
|
121
|
+
title: 'Bloated apt-get Install',
|
|
122
|
+
description: `Line ${lineNo(idx)}: apt-get install without --no-install-recommends bloats image`,
|
|
123
|
+
recommendation: 'Use: apt-get install --no-install-recommends',
|
|
124
|
+
evidence: `${filePath}:${lineNo(idx)}`,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// EXPOSE privileged ports
|
|
129
|
+
const exposeMatch = upper.match(/^EXPOSE\s+(\d+)/);
|
|
130
|
+
if (exposeMatch && parseInt(exposeMatch[1]) < 1024) {
|
|
131
|
+
issues.push({
|
|
132
|
+
type: 'low',
|
|
133
|
+
category: 'network',
|
|
134
|
+
title: 'Privileged Port Exposed',
|
|
135
|
+
description: `Line ${lineNo(idx)}: EXPOSE ${exposeMatch[1]} — privileged port (<1024)`,
|
|
136
|
+
recommendation: 'Use high ports (>1024) and map to privileged ports at runtime if needed',
|
|
137
|
+
evidence: `${filePath}:${lineNo(idx)}`,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
// ADD from URL (use COPY instead)
|
|
141
|
+
if (/^ADD\s+https?:\/\//i.test(trimmed)) {
|
|
142
|
+
issues.push({
|
|
143
|
+
type: 'medium',
|
|
144
|
+
category: 'supply-chain',
|
|
145
|
+
title: 'ADD from Remote URL',
|
|
146
|
+
description: `Line ${lineNo(idx)}: ADD from URL is not reproducible and can't be cached`,
|
|
147
|
+
recommendation: 'Use COPY with files checked into the repo, or download + verify in a RUN step',
|
|
148
|
+
evidence: `${filePath}:${lineNo(idx)}`,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// :latest tag
|
|
152
|
+
if (/^FROM\s+.*:latest/i.test(trimmed)) {
|
|
153
|
+
issues.push({
|
|
154
|
+
type: 'medium',
|
|
155
|
+
category: 'supply-chain',
|
|
156
|
+
title: 'Floating Image Tag (:latest)',
|
|
157
|
+
description: `Line ${lineNo(idx)}: using :latest tag — non-reproducible builds`,
|
|
158
|
+
recommendation: 'Pin to a specific version, e.g. node:20.11-alpine',
|
|
159
|
+
evidence: `${filePath}:${lineNo(idx)}`,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
// Hardcoded secrets
|
|
163
|
+
if (/(?:password|secret|token|api_key|apikey)\s*=\s*\S+/i.test(trimmed) && !trimmed.startsWith('#')) {
|
|
164
|
+
issues.push({
|
|
165
|
+
type: 'high',
|
|
166
|
+
category: 'config',
|
|
167
|
+
title: 'Hardcoded Secret in Dockerfile',
|
|
168
|
+
description: `Line ${lineNo(idx)}: possible secret in plaintext`,
|
|
169
|
+
recommendation: 'Use build args, Docker secrets, or environment variables',
|
|
170
|
+
evidence: `${filePath}:${lineNo(idx)}`,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
// Check if no USER directive at all (likely running as root by default)
|
|
175
|
+
const hasUserDirective = lines.some(l => /^USER\s+/i.test(l.trim()));
|
|
176
|
+
if (!hasUserDirective && lines.some(l => /^FROM\s+/i.test(l.trim()))) {
|
|
177
|
+
issues.push({
|
|
178
|
+
type: 'medium',
|
|
179
|
+
category: 'permissions',
|
|
180
|
+
title: 'No USER Directive',
|
|
181
|
+
description: 'No USER instruction found — container will run as root by default',
|
|
182
|
+
recommendation: 'Add USER directive with a non-root user',
|
|
183
|
+
evidence: filePath,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
// Check for HEALTHCHECK
|
|
187
|
+
const hasHealthcheck = lines.some(l => /^HEALTHCHECK\b/i.test(l.trim()));
|
|
188
|
+
if (!hasHealthcheck && lines.some(l => /^FROM\s+/i.test(l.trim()))) {
|
|
189
|
+
issues.push({
|
|
190
|
+
type: 'low',
|
|
191
|
+
category: 'config',
|
|
192
|
+
title: 'No HEALTHCHECK Defined',
|
|
193
|
+
description: 'No HEALTHCHECK instruction — orchestrators cannot monitor container health',
|
|
194
|
+
recommendation: 'Add HEALTHCHECK for production containers',
|
|
195
|
+
evidence: filePath,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
return issues;
|
|
199
|
+
}
|
|
200
|
+
// ---- Docker Compose Checks ----
|
|
201
|
+
function checkComposeFile(content, filePath) {
|
|
202
|
+
const issues = [];
|
|
203
|
+
let doc;
|
|
204
|
+
try {
|
|
205
|
+
doc = js_yaml_1.default.load(content);
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
issues.push({
|
|
209
|
+
type: 'low',
|
|
210
|
+
category: 'config',
|
|
211
|
+
title: 'Invalid YAML',
|
|
212
|
+
description: `Could not parse ${filePath}`,
|
|
213
|
+
recommendation: 'Fix YAML syntax errors',
|
|
214
|
+
});
|
|
215
|
+
return issues;
|
|
216
|
+
}
|
|
217
|
+
const services = doc?.services || {};
|
|
218
|
+
for (const [name, svc] of Object.entries(services)) {
|
|
219
|
+
const s = svc;
|
|
220
|
+
// privileged: true
|
|
221
|
+
if (s.privileged === true) {
|
|
222
|
+
issues.push({
|
|
223
|
+
type: 'high',
|
|
224
|
+
category: 'permissions',
|
|
225
|
+
title: 'Privileged Container',
|
|
226
|
+
description: `Service "${name}" runs in privileged mode — full host access`,
|
|
227
|
+
recommendation: 'Remove privileged: true and use specific capabilities instead',
|
|
228
|
+
evidence: `${filePath} → services.${name}.privileged`,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
// host network
|
|
232
|
+
if (s.network_mode === 'host') {
|
|
233
|
+
issues.push({
|
|
234
|
+
type: 'high',
|
|
235
|
+
category: 'network',
|
|
236
|
+
title: 'Host Network Mode',
|
|
237
|
+
description: `Service "${name}" uses host networking — bypasses container isolation`,
|
|
238
|
+
recommendation: 'Use bridge networking with port mapping',
|
|
239
|
+
evidence: `${filePath} → services.${name}.network_mode`,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
// bind mount to sensitive host paths
|
|
243
|
+
const volumes = s.volumes || [];
|
|
244
|
+
volumes.forEach(v => {
|
|
245
|
+
const bindPath = typeof v === 'string' ? v.split(':')[0] : v?.source;
|
|
246
|
+
if (typeof bindPath === 'string') {
|
|
247
|
+
const sensitivePaths = ['/var/run/docker.sock', '/', '/etc', '/root', '/home', '/var'];
|
|
248
|
+
const risky = sensitivePaths.find(p => bindPath === p || bindPath === '/var/run/docker.sock');
|
|
249
|
+
if (risky) {
|
|
250
|
+
issues.push({
|
|
251
|
+
type: 'high',
|
|
252
|
+
category: 'filesystem',
|
|
253
|
+
title: 'Sensitive Host Mount',
|
|
254
|
+
description: `Service "${name}" mounts ${bindPath} from host`,
|
|
255
|
+
recommendation: 'Avoid mounting sensitive host paths into containers',
|
|
256
|
+
evidence: `${filePath} → services.${name}.volumes: ${v}`,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
// Docker socket mount
|
|
262
|
+
const hasSocket = volumes.some((v) => {
|
|
263
|
+
const src = typeof v === 'string' ? v.split(':')[0] : v?.source;
|
|
264
|
+
return src === '/var/run/docker.sock';
|
|
265
|
+
});
|
|
266
|
+
if (hasSocket) {
|
|
267
|
+
issues.push({
|
|
268
|
+
type: 'high',
|
|
269
|
+
category: 'permissions',
|
|
270
|
+
title: 'Docker Socket Mounted',
|
|
271
|
+
description: `Service "${name}" has access to Docker socket — equivalent to root on host`,
|
|
272
|
+
recommendation: 'Avoid mounting docker.sock; use TCP with TLS or Docker API proxy',
|
|
273
|
+
evidence: `${filePath} → services.${name}`,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
// no read_only / no resource limits
|
|
277
|
+
if (s.read_only !== true) {
|
|
278
|
+
issues.push({
|
|
279
|
+
type: 'low',
|
|
280
|
+
category: 'config',
|
|
281
|
+
title: 'Writable Container Filesystem',
|
|
282
|
+
description: `Service "${name}" has writable root filesystem`,
|
|
283
|
+
recommendation: 'Add read_only: true and use tmpfs for writable paths',
|
|
284
|
+
evidence: `${filePath} → services.${name}`,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
// Floating image tag
|
|
288
|
+
if (typeof s.image === 'string' && (s.image.endsWith(':latest') || !s.image.includes(':'))) {
|
|
289
|
+
issues.push({
|
|
290
|
+
type: 'medium',
|
|
291
|
+
category: 'supply-chain',
|
|
292
|
+
title: 'Floating Image Tag in Compose',
|
|
293
|
+
description: `Service "${name}" uses ${s.image} — non-reproducible`,
|
|
294
|
+
recommendation: 'Pin image versions: image: node:20.11-alpine',
|
|
295
|
+
evidence: `${filePath} → services.${name}.image`,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return issues;
|
|
300
|
+
}
|
|
301
|
+
// ---- .env File Checks ----
|
|
302
|
+
function checkEnvFile(content, filePath) {
|
|
303
|
+
const issues = [];
|
|
304
|
+
const lines = content.split('\n');
|
|
305
|
+
lines.forEach((line, idx) => {
|
|
306
|
+
const trimmed = line.trim();
|
|
307
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
308
|
+
return;
|
|
309
|
+
const match = trimmed.match(/^(\w+)\s*=\s*(.+)$/);
|
|
310
|
+
if (!match)
|
|
311
|
+
return;
|
|
312
|
+
const [, key, value] = match;
|
|
313
|
+
const cleanVal = value.replace(/^["']|["']$/g, '');
|
|
314
|
+
// Detect secrets in .env
|
|
315
|
+
const secretKeys = /(?:password|secret|token|api[_-]?key|private[_-]?key|auth|credential)/i;
|
|
316
|
+
if (secretKeys.test(key) && cleanVal.length > 0 && cleanVal !== 'CHANGEME' && cleanVal !== 'xxx') {
|
|
317
|
+
issues.push({
|
|
318
|
+
type: 'high',
|
|
319
|
+
category: 'config',
|
|
320
|
+
title: 'Secret in .env File',
|
|
321
|
+
description: `${key} appears to contain a secret value`,
|
|
322
|
+
recommendation: 'Use Docker secrets, vault, or CI secret management instead of .env files',
|
|
323
|
+
evidence: `${filePath}:${idx + 1} (${key}=***)`,
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
// Warn about .env not in .dockerignore
|
|
328
|
+
issues.push({
|
|
329
|
+
type: 'medium',
|
|
330
|
+
category: 'config',
|
|
331
|
+
title: '.env File Present',
|
|
332
|
+
description: `${filePath} — ensure .env is in .dockerignore to avoid leaking secrets into images`,
|
|
333
|
+
recommendation: 'Add .env to .dockerignore and use runtime environment variables or secrets',
|
|
334
|
+
evidence: filePath,
|
|
335
|
+
});
|
|
336
|
+
return issues;
|
|
337
|
+
}
|
|
338
|
+
// ---- Helpers ----
|
|
339
|
+
async function findFiles(root, patterns) {
|
|
340
|
+
const found = [];
|
|
341
|
+
async function walk(dir, depth) {
|
|
342
|
+
if (depth > 5)
|
|
343
|
+
return; // don't go too deep
|
|
344
|
+
let entries;
|
|
345
|
+
try {
|
|
346
|
+
entries = await fs_extra_1.default.readdir(dir, { withFileTypes: true });
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
for (const entry of entries) {
|
|
352
|
+
if (entry.name.startsWith('.') && entry.name !== '.env')
|
|
353
|
+
continue;
|
|
354
|
+
const full = path_1.default.join(dir, entry.name);
|
|
355
|
+
if (entry.isDirectory()) {
|
|
356
|
+
// skip node_modules and common junk dirs
|
|
357
|
+
if (['node_modules', '.git', 'dist', 'build', '__pycache__'].includes(entry.name))
|
|
358
|
+
continue;
|
|
359
|
+
await walk(full, depth + 1);
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
for (const p of patterns) {
|
|
363
|
+
if (p.includes('*')) {
|
|
364
|
+
// simple glob: Dockerfile.*
|
|
365
|
+
const prefix = p.replace(/\.\*.*/, '');
|
|
366
|
+
if (entry.name.startsWith(prefix) || matchGlob(entry.name, p)) {
|
|
367
|
+
found.push(full);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
else if (entry.name === p) {
|
|
371
|
+
found.push(full);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
await walk(root, 0);
|
|
378
|
+
return found;
|
|
379
|
+
}
|
|
380
|
+
function matchGlob(name, pattern) {
|
|
381
|
+
const re = new RegExp('^' + pattern.replace(/\./g, '\\.').replace(/\*/g, '.*') + '$');
|
|
382
|
+
return re.test(name);
|
|
383
|
+
}
|
|
384
|
+
//# sourceMappingURL=docker-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-scanner.js","sourceRoot":"","sources":["../../src/scanners/docker-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SecurityResult } from '../types/security-result';
|
|
2
|
+
/**
|
|
3
|
+
* Helm chart security scanner for MCP servers.
|
|
4
|
+
*
|
|
5
|
+
* Detects Helm chart directories (Chart.yaml present), then:
|
|
6
|
+
* - Scans values.yaml for hardcoded secrets, privileged settings, and misconfigs
|
|
7
|
+
* - Strips Go template syntax from templates/ and runs K8s manifest checks
|
|
8
|
+
* - Checks for deprecated API versions in templates
|
|
9
|
+
* - Validates Chart.yaml metadata (appVersion pinned, etc.)
|
|
10
|
+
*/
|
|
11
|
+
interface HelmScanOptions {
|
|
12
|
+
strict?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function scanHelm(targetPath: string, options?: HelmScanOptions): Promise<SecurityResult>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=helm-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helm-scanner.d.ts","sourceRoot":"","sources":["../../src/scanners/helm-scanner.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAiB,MAAM,0BAA0B,CAAC;AAEzE;;;;;;;;GAQG;AAEH,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA0UD,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CA0FzG"}
|