@shipsafe/cli 0.1.2 → 0.2.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/dist/src/cli/scan.d.ts.map +1 -1
- package/dist/src/cli/scan.js +20 -14
- package/dist/src/cli/scan.js.map +1 -1
- package/dist/src/engines/builtin/dependencies.d.ts +11 -0
- package/dist/src/engines/builtin/dependencies.d.ts.map +1 -0
- package/dist/src/engines/builtin/dependencies.js +404 -0
- package/dist/src/engines/builtin/dependencies.js.map +1 -0
- package/dist/src/engines/builtin/patterns.d.ts +20 -0
- package/dist/src/engines/builtin/patterns.d.ts.map +1 -0
- package/dist/src/engines/builtin/patterns.js +1015 -0
- package/dist/src/engines/builtin/patterns.js.map +1 -0
- package/dist/src/engines/builtin/secrets.d.ts +11 -0
- package/dist/src/engines/builtin/secrets.d.ts.map +1 -0
- package/dist/src/engines/builtin/secrets.js +1962 -0
- package/dist/src/engines/builtin/secrets.js.map +1 -0
- package/dist/src/engines/pattern/index.d.ts.map +1 -1
- package/dist/src/engines/pattern/index.js +24 -5
- package/dist/src/engines/pattern/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/cli/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/cli/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAsED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC1E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAU1D"}
|
package/dist/src/cli/scan.js
CHANGED
|
@@ -18,26 +18,30 @@ async function formatResults(result) {
|
|
|
18
18
|
const scanners = await getAvailableScanners();
|
|
19
19
|
const graphAvailable = isGraphEngineAvailable();
|
|
20
20
|
const license = await checkLicense();
|
|
21
|
+
// Get built-in engine stats
|
|
22
|
+
const { getSecretPatternCount } = await import('../engines/builtin/secrets.js');
|
|
23
|
+
const { getPatternRuleCount } = await import('../engines/builtin/patterns.js');
|
|
21
24
|
console.log('');
|
|
22
25
|
console.log(chalk.bold(' ShipSafe Scan Results'));
|
|
23
26
|
console.log(chalk.dim(' ' + '─'.repeat(44)));
|
|
24
27
|
console.log('');
|
|
25
|
-
// Show what engines ran
|
|
26
28
|
const check = chalk.green('✓');
|
|
27
29
|
const cross = chalk.dim('✗');
|
|
28
|
-
console.log(chalk.dim(' Engines:'));
|
|
29
|
-
console.log(` ${
|
|
30
|
-
console.log(` ${
|
|
31
|
-
console.log(` ${
|
|
32
|
-
console.log(` ${graphAvailable ? check : cross} Knowledge Graph
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
30
|
+
console.log(chalk.dim(' Built-in Engines:'));
|
|
31
|
+
console.log(` ${check} Secret Scanner ${chalk.dim(`(${getSecretPatternCount()} patterns)`)}`);
|
|
32
|
+
console.log(` ${check} Vulnerability Scanner ${chalk.dim(`(${getPatternRuleCount()} rules)`)}`);
|
|
33
|
+
console.log(` ${check} Dependency Auditor`);
|
|
34
|
+
console.log(` ${graphAvailable ? check : cross} Knowledge Graph`);
|
|
35
|
+
if (scanners.semgrep || scanners.gitleaks || scanners.trivy) {
|
|
36
|
+
console.log(chalk.dim(' External (bonus):'));
|
|
37
|
+
if (scanners.semgrep)
|
|
38
|
+
console.log(` ${check} Semgrep`);
|
|
39
|
+
if (scanners.gitleaks)
|
|
40
|
+
console.log(` ${check} Gitleaks`);
|
|
41
|
+
if (scanners.trivy)
|
|
42
|
+
console.log(` ${check} Trivy`);
|
|
40
43
|
}
|
|
44
|
+
console.log('');
|
|
41
45
|
// Score
|
|
42
46
|
const duration = formatDuration(result.scan_duration_ms);
|
|
43
47
|
const scoreColor = result.score === 'A' ? chalk.green : result.score === 'B' ? chalk.yellow : chalk.red;
|
|
@@ -64,7 +68,9 @@ async function formatResults(result) {
|
|
|
64
68
|
}
|
|
65
69
|
export async function handleScanAction(options) {
|
|
66
70
|
const scope = options.scope;
|
|
67
|
-
|
|
71
|
+
if (!options.json) {
|
|
72
|
+
console.log(chalk.dim(`\n Scanning ${scope === 'staged' ? 'staged files' : 'all files'}...`));
|
|
73
|
+
}
|
|
68
74
|
const result = await runPatternEngine({
|
|
69
75
|
targetPath: process.cwd(),
|
|
70
76
|
scope,
|
package/dist/src/cli/scan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/cli/scan.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD,MAAM,eAAe,GAA+C;IAClE,QAAQ,EAAE,KAAK,CAAC,GAAG;IACnB,IAAI,EAAE,KAAK,CAAC,GAAG;IACf,MAAM,EAAE,KAAK,CAAC,MAAM;IACpB,GAAG,EAAE,KAAK,CAAC,IAAI;IACf,IAAI,EAAE,KAAK,CAAC,IAAI;CACjB,CAAC;AAEF,SAAS,cAAc,CAAC,EAAU;IAChC,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAkB;IAC7C,MAAM,QAAQ,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC9C,MAAM,cAAc,GAAG,sBAAsB,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,YAAY,EAAE,CAAC;IAErC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/cli/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Finding } from '../../types.js';
|
|
2
|
+
export interface DependencyAuditSummary {
|
|
3
|
+
total: number;
|
|
4
|
+
critical: number;
|
|
5
|
+
high: number;
|
|
6
|
+
moderate: number;
|
|
7
|
+
low: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function scanDependencies(targetPath: string): Promise<Finding[]>;
|
|
10
|
+
export declare function getDependencySummary(targetPath: string): Promise<DependencyAuditSummary>;
|
|
11
|
+
//# sourceMappingURL=dependencies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../../../src/engines/builtin/dependencies.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,gBAAgB,CAAC;AAKxD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAwZD,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,EAAE,CAAC,CA8DpB;AAID,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,sBAAsB,CAAC,CA8BjC"}
|
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { editDistance } from '../../mcp/tools/check-package.js';
|
|
4
|
+
// ── Constants ──
|
|
5
|
+
const POPULAR_PACKAGES = [
|
|
6
|
+
'react',
|
|
7
|
+
'express',
|
|
8
|
+
'lodash',
|
|
9
|
+
'axios',
|
|
10
|
+
'moment',
|
|
11
|
+
'chalk',
|
|
12
|
+
'commander',
|
|
13
|
+
'next',
|
|
14
|
+
'vue',
|
|
15
|
+
'angular',
|
|
16
|
+
'webpack',
|
|
17
|
+
'typescript',
|
|
18
|
+
'zod',
|
|
19
|
+
'prisma',
|
|
20
|
+
'drizzle',
|
|
21
|
+
'hono',
|
|
22
|
+
'fastify',
|
|
23
|
+
'vite',
|
|
24
|
+
'esbuild',
|
|
25
|
+
'rollup',
|
|
26
|
+
'jest',
|
|
27
|
+
'vitest',
|
|
28
|
+
'mocha',
|
|
29
|
+
'prettier',
|
|
30
|
+
'eslint',
|
|
31
|
+
'tailwindcss',
|
|
32
|
+
'postcss',
|
|
33
|
+
'dotenv',
|
|
34
|
+
'cors',
|
|
35
|
+
'helmet',
|
|
36
|
+
'jsonwebtoken',
|
|
37
|
+
'bcrypt',
|
|
38
|
+
'mongoose',
|
|
39
|
+
'sequelize',
|
|
40
|
+
'socket.io',
|
|
41
|
+
'redis',
|
|
42
|
+
'bull',
|
|
43
|
+
'passport',
|
|
44
|
+
'multer',
|
|
45
|
+
'sharp',
|
|
46
|
+
'puppeteer',
|
|
47
|
+
'playwright',
|
|
48
|
+
];
|
|
49
|
+
const NPM_AUDIT_URL = 'https://registry.npmjs.org/-/npm/v1/security/audits';
|
|
50
|
+
// ── Helpers ──
|
|
51
|
+
function mapNpmSeverity(npmSeverity) {
|
|
52
|
+
switch (npmSeverity) {
|
|
53
|
+
case 'critical':
|
|
54
|
+
return 'critical';
|
|
55
|
+
case 'high':
|
|
56
|
+
return 'high';
|
|
57
|
+
case 'moderate':
|
|
58
|
+
return 'medium';
|
|
59
|
+
case 'low':
|
|
60
|
+
return 'low';
|
|
61
|
+
case 'info':
|
|
62
|
+
return 'info';
|
|
63
|
+
default:
|
|
64
|
+
return 'medium';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function readJsonFile(filePath) {
|
|
68
|
+
try {
|
|
69
|
+
const content = await readFile(filePath, 'utf-8');
|
|
70
|
+
return JSON.parse(content);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function isWildcardVersion(version) {
|
|
77
|
+
return version === '*' || version === 'latest' || version === '';
|
|
78
|
+
}
|
|
79
|
+
function checkTyposquat(name) {
|
|
80
|
+
// If the package itself is a known popular package, it's not a typosquat
|
|
81
|
+
if (POPULAR_PACKAGES.includes(name.toLowerCase())) {
|
|
82
|
+
return { isTyposquat: false };
|
|
83
|
+
}
|
|
84
|
+
for (const popular of POPULAR_PACKAGES) {
|
|
85
|
+
const distance = editDistance(name.toLowerCase(), popular.toLowerCase());
|
|
86
|
+
if (distance > 0 && distance <= 2) {
|
|
87
|
+
return { isTyposquat: true, similarTo: popular };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return { isTyposquat: false };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Build the payload that the npm audit API expects.
|
|
94
|
+
* This mimics what `npm audit` sends internally.
|
|
95
|
+
*/
|
|
96
|
+
function buildAuditPayload(pkgJson, lockData) {
|
|
97
|
+
const allDeps = {
|
|
98
|
+
...pkgJson.dependencies,
|
|
99
|
+
...pkgJson.devDependencies,
|
|
100
|
+
};
|
|
101
|
+
// Build the "requires" and "dependencies" maps for the audit API
|
|
102
|
+
const requires = {};
|
|
103
|
+
const dependencies = {};
|
|
104
|
+
for (const [name, specifier] of Object.entries(allDeps)) {
|
|
105
|
+
requires[name] = specifier;
|
|
106
|
+
// Prefer the resolved version from the lockfile
|
|
107
|
+
let resolvedVersion = specifier;
|
|
108
|
+
if (lockData) {
|
|
109
|
+
// lockfileVersion 2/3 uses "packages" with "" prefix entries
|
|
110
|
+
const lockPackages = lockData.packages;
|
|
111
|
+
if (lockPackages) {
|
|
112
|
+
const lockEntry = lockPackages[`node_modules/${name}`] ?? lockPackages[name];
|
|
113
|
+
if (lockEntry?.version) {
|
|
114
|
+
resolvedVersion = lockEntry.version;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// lockfileVersion 1 uses "dependencies"
|
|
118
|
+
const lockDeps = lockData.dependencies;
|
|
119
|
+
if (lockDeps?.[name]?.version) {
|
|
120
|
+
resolvedVersion = lockDeps[name].version;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Strip semver range prefixes for the version field
|
|
124
|
+
const cleaned = resolvedVersion.replace(/^[\^~>=<\s]+/, '');
|
|
125
|
+
dependencies[name] = { version: cleaned || '0.0.0' };
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
name: pkgJson.name ?? 'unknown',
|
|
129
|
+
version: pkgJson.version ?? '0.0.0',
|
|
130
|
+
requires,
|
|
131
|
+
dependencies,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// ── Audit API call ──
|
|
135
|
+
async function callNpmAudit(pkgJson, lockData) {
|
|
136
|
+
const payload = buildAuditPayload(pkgJson, lockData);
|
|
137
|
+
try {
|
|
138
|
+
const response = await fetch(NPM_AUDIT_URL, {
|
|
139
|
+
method: 'POST',
|
|
140
|
+
headers: { 'Content-Type': 'application/json' },
|
|
141
|
+
body: JSON.stringify(payload),
|
|
142
|
+
signal: AbortSignal.timeout(15_000),
|
|
143
|
+
});
|
|
144
|
+
if (!response.ok) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
return (await response.json());
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Offline or API unreachable — fall back to local-only checks
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// ── Local checks (work offline) ──
|
|
155
|
+
function runLocalChecks(pkgJson, lockData, packageJsonPath) {
|
|
156
|
+
const findings = [];
|
|
157
|
+
const allDeps = {
|
|
158
|
+
...pkgJson.dependencies,
|
|
159
|
+
...pkgJson.devDependencies,
|
|
160
|
+
};
|
|
161
|
+
let findingIndex = 0;
|
|
162
|
+
for (const [name, versionSpec] of Object.entries(allDeps)) {
|
|
163
|
+
// 1. Wildcard / latest versions
|
|
164
|
+
if (isWildcardVersion(versionSpec)) {
|
|
165
|
+
findings.push({
|
|
166
|
+
id: `dep-wildcard-${findingIndex++}`,
|
|
167
|
+
engine: 'pattern',
|
|
168
|
+
severity: 'high',
|
|
169
|
+
type: 'dependency-wildcard-version',
|
|
170
|
+
file: packageJsonPath,
|
|
171
|
+
line: 0,
|
|
172
|
+
description: `Dependency "${name}" uses wildcard version "${versionSpec}". This allows arbitrary versions to be installed, including potentially malicious ones.`,
|
|
173
|
+
fix_suggestion: `Pin "${name}" to a specific version range (e.g., "^x.y.z") instead of "${versionSpec}".`,
|
|
174
|
+
auto_fixable: false,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
// 2. Phantom dependencies (in package.json but not in lockfile)
|
|
178
|
+
if (lockData && !isWildcardVersion(versionSpec)) {
|
|
179
|
+
const inLock = hasLockEntry(lockData, name);
|
|
180
|
+
if (!inLock) {
|
|
181
|
+
findings.push({
|
|
182
|
+
id: `dep-phantom-${findingIndex++}`,
|
|
183
|
+
engine: 'pattern',
|
|
184
|
+
severity: 'medium',
|
|
185
|
+
type: 'dependency-phantom',
|
|
186
|
+
file: packageJsonPath,
|
|
187
|
+
line: 0,
|
|
188
|
+
description: `Dependency "${name}" is declared in package.json but has no entry in the lockfile. This may indicate the lockfile is out of date or the dependency was never installed.`,
|
|
189
|
+
fix_suggestion: `Run "npm install" to regenerate the lockfile and ensure "${name}" is properly resolved.`,
|
|
190
|
+
auto_fixable: false,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// 3. Deprecated packages (from lockfile metadata)
|
|
195
|
+
if (lockData) {
|
|
196
|
+
const deprecationMsg = getDeprecationMessage(lockData, name);
|
|
197
|
+
if (deprecationMsg) {
|
|
198
|
+
findings.push({
|
|
199
|
+
id: `dep-deprecated-${findingIndex++}`,
|
|
200
|
+
engine: 'pattern',
|
|
201
|
+
severity: 'medium',
|
|
202
|
+
type: 'dependency-deprecated',
|
|
203
|
+
file: packageJsonPath,
|
|
204
|
+
line: 0,
|
|
205
|
+
description: `Dependency "${name}" is deprecated: ${deprecationMsg}`,
|
|
206
|
+
fix_suggestion: `Find an actively maintained alternative to "${name}" and migrate away from this package.`,
|
|
207
|
+
auto_fixable: false,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// 4. Typosquat detection
|
|
212
|
+
const typoCheck = checkTyposquat(name);
|
|
213
|
+
if (typoCheck.isTyposquat) {
|
|
214
|
+
findings.push({
|
|
215
|
+
id: `dep-typosquat-${findingIndex++}`,
|
|
216
|
+
engine: 'pattern',
|
|
217
|
+
severity: 'critical',
|
|
218
|
+
type: 'dependency-typosquat',
|
|
219
|
+
file: packageJsonPath,
|
|
220
|
+
line: 0,
|
|
221
|
+
description: `Dependency "${name}" looks like a typosquat of popular package "${typoCheck.similarTo}". This could be a malicious package impersonating a legitimate one.`,
|
|
222
|
+
fix_suggestion: `Verify that "${name}" is the intended package. If you meant "${typoCheck.similarTo}", replace it immediately.`,
|
|
223
|
+
auto_fixable: false,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
// 5. Very old version ranges (heuristic: major version 0 for well-known packages,
|
|
227
|
+
// or version specifiers that pin to extremely old majors)
|
|
228
|
+
const oldVersionWarning = checkForVeryOldVersion(name, versionSpec);
|
|
229
|
+
if (oldVersionWarning) {
|
|
230
|
+
findings.push({
|
|
231
|
+
id: `dep-outdated-${findingIndex++}`,
|
|
232
|
+
engine: 'pattern',
|
|
233
|
+
severity: 'low',
|
|
234
|
+
type: 'dependency-outdated',
|
|
235
|
+
file: packageJsonPath,
|
|
236
|
+
line: 0,
|
|
237
|
+
description: oldVersionWarning.description,
|
|
238
|
+
fix_suggestion: oldVersionWarning.fix,
|
|
239
|
+
auto_fixable: false,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return findings;
|
|
244
|
+
}
|
|
245
|
+
function hasLockEntry(lockData, name) {
|
|
246
|
+
// Check lockfileVersion 2/3 "packages" field
|
|
247
|
+
if (lockData.packages) {
|
|
248
|
+
if (lockData.packages[`node_modules/${name}`] ||
|
|
249
|
+
lockData.packages[name]) {
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Check lockfileVersion 1 "dependencies" field
|
|
254
|
+
if (lockData.dependencies?.[name]) {
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
function getDeprecationMessage(lockData, name) {
|
|
260
|
+
if (lockData.packages) {
|
|
261
|
+
const entry = lockData.packages[`node_modules/${name}`] ?? lockData.packages[name];
|
|
262
|
+
if (entry?.deprecated) {
|
|
263
|
+
return entry.deprecated;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Heuristic check for very old dependency versions.
|
|
270
|
+
* We track known "current" major versions for popular packages. If the installed
|
|
271
|
+
* major is 3+ behind, we flag it as likely outdated (> 3 years old in practice).
|
|
272
|
+
*/
|
|
273
|
+
const KNOWN_CURRENT_MAJORS = {
|
|
274
|
+
react: 19,
|
|
275
|
+
express: 5,
|
|
276
|
+
lodash: 4,
|
|
277
|
+
axios: 1,
|
|
278
|
+
chalk: 5,
|
|
279
|
+
commander: 12,
|
|
280
|
+
next: 15,
|
|
281
|
+
vue: 3,
|
|
282
|
+
webpack: 5,
|
|
283
|
+
typescript: 5,
|
|
284
|
+
zod: 3,
|
|
285
|
+
jest: 29,
|
|
286
|
+
eslint: 9,
|
|
287
|
+
prettier: 3,
|
|
288
|
+
tailwindcss: 4,
|
|
289
|
+
postcss: 8,
|
|
290
|
+
vite: 6,
|
|
291
|
+
esbuild: 0,
|
|
292
|
+
rollup: 4,
|
|
293
|
+
vitest: 2,
|
|
294
|
+
mocha: 10,
|
|
295
|
+
fastify: 5,
|
|
296
|
+
hono: 4,
|
|
297
|
+
mongoose: 8,
|
|
298
|
+
sequelize: 6,
|
|
299
|
+
redis: 4,
|
|
300
|
+
passport: 0,
|
|
301
|
+
sharp: 0,
|
|
302
|
+
puppeteer: 23,
|
|
303
|
+
playwright: 1,
|
|
304
|
+
};
|
|
305
|
+
function checkForVeryOldVersion(name, versionSpec) {
|
|
306
|
+
const currentMajor = KNOWN_CURRENT_MAJORS[name];
|
|
307
|
+
if (currentMajor === undefined)
|
|
308
|
+
return null;
|
|
309
|
+
// Extract the major version from the specifier
|
|
310
|
+
const match = versionSpec.match(/(\d+)/);
|
|
311
|
+
if (!match)
|
|
312
|
+
return null;
|
|
313
|
+
const installedMajor = parseInt(match[1], 10);
|
|
314
|
+
const majorsBehind = currentMajor - installedMajor;
|
|
315
|
+
// Only flag if 3+ major versions behind (likely > 3 years old)
|
|
316
|
+
if (majorsBehind >= 3) {
|
|
317
|
+
return {
|
|
318
|
+
description: `Dependency "${name}@${versionSpec}" is ${majorsBehind} major versions behind the current release (v${currentMajor}). Very old versions often have unpatched security vulnerabilities.`,
|
|
319
|
+
fix: `Update "${name}" to a recent version (current major: v${currentMajor}). Review the changelog for breaking changes before upgrading.`,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
// ── Main scanner ──
|
|
325
|
+
export async function scanDependencies(targetPath) {
|
|
326
|
+
const packageJsonPath = join(targetPath, 'package.json');
|
|
327
|
+
const lockfilePath = join(targetPath, 'package-lock.json');
|
|
328
|
+
const pkgJson = await readJsonFile(packageJsonPath);
|
|
329
|
+
if (!pkgJson) {
|
|
330
|
+
// No package.json — nothing to scan
|
|
331
|
+
return [];
|
|
332
|
+
}
|
|
333
|
+
const allDeps = {
|
|
334
|
+
...pkgJson.dependencies,
|
|
335
|
+
...pkgJson.devDependencies,
|
|
336
|
+
};
|
|
337
|
+
if (Object.keys(allDeps).length === 0) {
|
|
338
|
+
return [];
|
|
339
|
+
}
|
|
340
|
+
const lockData = await readJsonFile(lockfilePath);
|
|
341
|
+
// Run local checks (always works, even offline)
|
|
342
|
+
const localFindings = runLocalChecks(pkgJson, lockData, 'package.json');
|
|
343
|
+
// Attempt npm audit API call for known CVEs
|
|
344
|
+
const auditResponse = await callNpmAudit(pkgJson, lockData);
|
|
345
|
+
const auditFindings = [];
|
|
346
|
+
if (auditResponse?.advisories) {
|
|
347
|
+
let auditIndex = 0;
|
|
348
|
+
for (const advisory of Object.values(auditResponse.advisories)) {
|
|
349
|
+
const severity = mapNpmSeverity(advisory.severity);
|
|
350
|
+
const cveList = advisory.cves && advisory.cves.length > 0
|
|
351
|
+
? ` (${advisory.cves.join(', ')})`
|
|
352
|
+
: '';
|
|
353
|
+
const affectedVersions = advisory.findings
|
|
354
|
+
?.map((f) => f.version)
|
|
355
|
+
.filter(Boolean)
|
|
356
|
+
.join(', ') || 'unknown';
|
|
357
|
+
const patchedInfo = advisory.patched_versions && advisory.patched_versions !== '<0.0.0'
|
|
358
|
+
? `Update to ${advisory.patched_versions}.`
|
|
359
|
+
: advisory.recommendation || 'No patched version available. Consider finding an alternative package.';
|
|
360
|
+
auditFindings.push({
|
|
361
|
+
id: `dep-vuln-${advisory.id}-${auditIndex++}`,
|
|
362
|
+
engine: 'pattern',
|
|
363
|
+
severity,
|
|
364
|
+
type: 'dependency-vulnerability',
|
|
365
|
+
file: 'package.json',
|
|
366
|
+
line: 0,
|
|
367
|
+
description: `${advisory.module_name}@${affectedVersions}: ${advisory.title}${cveList}. Vulnerable versions: ${advisory.vulnerable_versions}. See: ${advisory.url}`,
|
|
368
|
+
fix_suggestion: patchedInfo,
|
|
369
|
+
auto_fixable: false,
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return [...auditFindings, ...localFindings];
|
|
374
|
+
}
|
|
375
|
+
// ── Summary helper ──
|
|
376
|
+
export async function getDependencySummary(targetPath) {
|
|
377
|
+
const findings = await scanDependencies(targetPath);
|
|
378
|
+
const summary = {
|
|
379
|
+
total: findings.length,
|
|
380
|
+
critical: 0,
|
|
381
|
+
high: 0,
|
|
382
|
+
moderate: 0,
|
|
383
|
+
low: 0,
|
|
384
|
+
};
|
|
385
|
+
for (const finding of findings) {
|
|
386
|
+
switch (finding.severity) {
|
|
387
|
+
case 'critical':
|
|
388
|
+
summary.critical++;
|
|
389
|
+
break;
|
|
390
|
+
case 'high':
|
|
391
|
+
summary.high++;
|
|
392
|
+
break;
|
|
393
|
+
case 'medium':
|
|
394
|
+
summary.moderate++;
|
|
395
|
+
break;
|
|
396
|
+
case 'low':
|
|
397
|
+
case 'info':
|
|
398
|
+
summary.low++;
|
|
399
|
+
break;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
return summary;
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../../../src/engines/builtin/dependencies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ShipSafe Built-in Vulnerability Pattern Scanner
|
|
3
|
+
*
|
|
4
|
+
* Pure TypeScript, zero external dependencies.
|
|
5
|
+
* Detects code-level vulnerabilities across TypeScript, JavaScript, and Python files.
|
|
6
|
+
*/
|
|
7
|
+
import type { Finding } from '../../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Scan files at targetPath for vulnerability patterns.
|
|
10
|
+
*
|
|
11
|
+
* @param targetPath - Directory or file path to scan.
|
|
12
|
+
* @param files - Optional pre-supplied list of file paths (skips discovery).
|
|
13
|
+
* @returns Array of findings sorted by severity (critical first).
|
|
14
|
+
*/
|
|
15
|
+
export declare function scanPatterns(targetPath: string, files?: string[]): Promise<Finding[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Returns the total number of vulnerability detection rules.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getPatternRuleCount(): number;
|
|
20
|
+
//# sourceMappingURL=patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../../src/engines/builtin/patterns.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,gBAAgB,CAAC;AA6lCxD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,OAAO,EAAE,CAAC,CA8BpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
|