npm-scan-plus 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.
Files changed (56) hide show
  1. package/.eslintrc.json +32 -0
  2. package/.github/CODEOWNERS +3 -0
  3. package/.github/workflows/ci.yml +105 -0
  4. package/.prettierrc +10 -0
  5. package/FUNDING.yml +1 -0
  6. package/PLAN.md +151 -0
  7. package/README.md +150 -0
  8. package/bin/npm-scan +13 -0
  9. package/bin/npm-scan-wrap +100 -0
  10. package/dist/cli/index.d.ts +18 -0
  11. package/dist/cli/index.d.ts.map +1 -0
  12. package/dist/cli/index.js +299 -0
  13. package/dist/cli/index.js.map +1 -0
  14. package/dist/lib/blocklist.d.ts +45 -0
  15. package/dist/lib/blocklist.d.ts.map +1 -0
  16. package/dist/lib/blocklist.js +256 -0
  17. package/dist/lib/blocklist.js.map +1 -0
  18. package/dist/lib/extended.js +314 -0
  19. package/dist/lib/extended.js.map +1 -0
  20. package/dist/lib/integrity.js +247 -0
  21. package/dist/lib/integrity.js.map +1 -0
  22. package/dist/lib/patterns.d.ts +76 -0
  23. package/dist/lib/patterns.d.ts.map +1 -0
  24. package/dist/lib/patterns.js +414 -0
  25. package/dist/lib/patterns.js.map +1 -0
  26. package/dist/lib/registry.d.ts +42 -0
  27. package/dist/lib/registry.d.ts.map +1 -0
  28. package/dist/lib/registry.js +157 -0
  29. package/dist/lib/registry.js.map +1 -0
  30. package/dist/lib/scanner.d.ts +43 -0
  31. package/dist/lib/scanner.d.ts.map +1 -0
  32. package/dist/lib/scanner.js +432 -0
  33. package/dist/lib/scanner.js.map +1 -0
  34. package/dist/lib/vuln.js +284 -0
  35. package/dist/lib/vuln.js.map +1 -0
  36. package/dist/types.d.ts +85 -0
  37. package/dist/types.d.ts.map +1 -0
  38. package/dist/types.js +6 -0
  39. package/dist/types.js.map +1 -0
  40. package/jest.config.js +18 -0
  41. package/package.json +56 -0
  42. package/src/cli/index.ts +336 -0
  43. package/src/lib/blocklist.ts +239 -0
  44. package/src/lib/extended.ts +384 -0
  45. package/src/lib/integrity.ts +253 -0
  46. package/src/lib/patterns.ts +404 -0
  47. package/src/lib/registry.ts +146 -0
  48. package/src/lib/scanner.ts +447 -0
  49. package/src/lib/vuln.ts +321 -0
  50. package/src/types.ts +102 -0
  51. package/tests/blocklist.test.ts +89 -0
  52. package/tests/extended.test.ts +204 -0
  53. package/tests/patterns.test.ts +147 -0
  54. package/tests/scanner.test.ts +116 -0
  55. package/tests/vuln.test.ts +66 -0
  56. package/tsconfig.json +20 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/lib/scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAEV,UAAU,EAGV,WAAW,EACX,qBAAqB,EAEtB,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,OAAO,CAAc;gBAEjB,OAAO,GAAE,WAAgB;IAKrC;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAiIhF;;OAEG;IACG,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAsD1E;;OAEG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAClF,GAAG,EAAE,UAAU,CAAC;QAChB,IAAI,EAAE,qBAAqB,CAAC;KAC7B,CAAC;IAgBF;;OAEG;IACH,OAAO,CAAC,YAAY;IA8BpB;;OAEG;IACH,OAAO,CAAC,eAAe;CAYxB;AAED,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAE5D;;;;;AAGD,wBAA0C"}
@@ -0,0 +1,432 @@
1
+ "use strict";
2
+ /**
3
+ * Core scanner module
4
+ * Pre and post-install security scanning for npm packages
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.Scanner = void 0;
41
+ exports.createScanner = createScanner;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const registry_1 = require("./registry");
45
+ const blocklist_1 = require("./blocklist");
46
+ const patterns_1 = require("./patterns");
47
+ const vuln_1 = require("./vuln");
48
+ const extended_1 = require("./extended");
49
+ const integrity_1 = require("./integrity");
50
+ /**
51
+ * Main scanner class
52
+ */
53
+ class Scanner {
54
+ registry;
55
+ options;
56
+ vulnChecker;
57
+ constructor(options = {}) {
58
+ this.options = options;
59
+ this.registry = (0, registry_1.createRegistryClient)({ registry: options.registry });
60
+ this.vulnChecker = (0, vuln_1.createVulnerabilityChecker)(process.env.GITHUB_TOKEN);
61
+ }
62
+ /**
63
+ * Pre-install scan: Check a package before installation
64
+ */
65
+ async preInstallScan(packageName, version) {
66
+ const threats = [];
67
+ let score = 0;
68
+ // 1. Check blocklist
69
+ const blocklistEntry = blocklist_1.blocklistManager.isBlocklisted(packageName);
70
+ if (blocklistEntry) {
71
+ threats.push({
72
+ type: 'blocklisted',
73
+ severity: blocklistEntry.severity,
74
+ message: `Package is blocklisted: ${blocklistEntry.reason}`,
75
+ details: `Source: ${blocklistEntry.source || 'internal'}`
76
+ });
77
+ score += blocklistEntry.severity === 'critical' ? 100 : 75;
78
+ }
79
+ // 2. Check typosquatting
80
+ const typosquatMatches = blocklist_1.blocklistManager.detectTyposquatting(packageName);
81
+ if (typosquatMatches.length > 0) {
82
+ threats.push({
83
+ type: 'typosquatting',
84
+ severity: 'high',
85
+ message: `Possible typosquatting of "${typosquatMatches.join(', ')}"`,
86
+ details: 'This package name is similar to popular packages - may be attempting to confuse users'
87
+ });
88
+ score += 60;
89
+ }
90
+ // 3. Fetch metadata
91
+ let rawMetadata;
92
+ try {
93
+ rawMetadata = await this.registry.getPackageMetadata(packageName, version);
94
+ }
95
+ catch (e) {
96
+ threats.push({
97
+ type: 'supply_chain',
98
+ severity: 'medium',
99
+ message: `Could not fetch package metadata: ${e.message}`
100
+ });
101
+ return {
102
+ packageName,
103
+ version: version || 'unknown',
104
+ status: 'warning',
105
+ threats,
106
+ score: Math.min(score, 100)
107
+ };
108
+ }
109
+ const metadata = {
110
+ name: rawMetadata.name,
111
+ version: rawMetadata['dist-tags']?.latest || version || 'unknown',
112
+ description: rawMetadata.description,
113
+ publisher: rawMetadata.publisher,
114
+ maintainers: rawMetadata.maintainers,
115
+ repository: rawMetadata.repository,
116
+ homepage: rawMetadata.homepage,
117
+ license: rawMetadata.license
118
+ };
119
+ // Get latest version data
120
+ const latestVersion = rawMetadata.versions?.[metadata.version] || {};
121
+ metadata.dependencies = latestVersion.dependencies;
122
+ metadata.devDependencies = latestVersion.devDependencies;
123
+ metadata.peerDependencies = latestVersion.peerDependencies;
124
+ metadata.scripts = latestVersion.scripts;
125
+ metadata.time = rawMetadata.time;
126
+ // 4. Check for suspicious scripts
127
+ if (metadata.scripts) {
128
+ const suspiciousScripts = ['postinstall', 'preinstall', 'postpublish', 'preuninstall', 'postuninstall'];
129
+ for (const script of suspiciousScripts) {
130
+ if (metadata.scripts?.[script]) {
131
+ const isComplex = metadata.scripts?.[script].length > 100 ||
132
+ /curl|wget|npm\|pipe|\$\(|\||\&\&/.test(metadata.scripts?.[script] || '');
133
+ threats.push({
134
+ type: 'suspicious_script',
135
+ severity: isComplex ? 'high' : 'medium',
136
+ message: `Package has "${script}" script that runs automatically`,
137
+ details: metadata.scripts?.[script].substring(0, 100)
138
+ });
139
+ score += isComplex ? 40 : 20;
140
+ }
141
+ }
142
+ }
143
+ // 5. Check publisher reputation
144
+ if (!metadata.publisher && !metadata.maintainers?.length) {
145
+ threats.push({
146
+ type: 'unknown_publisher',
147
+ severity: 'medium',
148
+ message: 'Package has no verified publisher information'
149
+ });
150
+ score += 15;
151
+ }
152
+ // 6. Check version age
153
+ if (metadata.time?.created) {
154
+ const created = new Date(metadata.time.created);
155
+ const daysSince = (Date.now() - created.getTime()) / (1000 * 60 * 60 * 24);
156
+ if (daysSince < 7 && !metadata.maintainers?.length) {
157
+ threats.push({
158
+ type: 'supply_chain',
159
+ severity: 'medium',
160
+ message: `Package was published less than ${Math.floor(daysSince)} days ago with no maintainers`
161
+ });
162
+ score += 20;
163
+ }
164
+ }
165
+ // 7. Check dependencies
166
+ if (metadata.dependencies) {
167
+ const depCount = Object.keys(metadata.dependencies).length;
168
+ if (depCount > 100) {
169
+ threats.push({
170
+ type: 'supply_chain',
171
+ severity: 'low',
172
+ message: `Package has ${depCount} dependencies - large attack surface`
173
+ });
174
+ score += 10;
175
+ }
176
+ // Check for dependency confusion
177
+ for (const dep of Object.keys(metadata.dependencies)) {
178
+ if (dep.startsWith('@') && !dep.includes('/')) {
179
+ threats.push({
180
+ type: 'dependency_confusion',
181
+ severity: 'medium',
182
+ message: `Scoped dependency "@${dep}" may be internal package confusion`
183
+ });
184
+ score += 15;
185
+ break;
186
+ }
187
+ }
188
+ }
189
+ // 8. Check vulnerability databases (OSV, GitHub Advisory, npm Audit)
190
+ if (this.options.checkVulnerabilities !== false) {
191
+ try {
192
+ const vulnResult = await this.vulnChecker.checkPackage(packageName, version || metadata.version);
193
+ for (const vuln of vulnResult.vulnerabilities) {
194
+ if (vuln.id.startsWith('CVE-') || vuln.id.startsWith('GHSA-')) {
195
+ threats.push({
196
+ type: 'vulnerability',
197
+ severity: vuln.severity,
198
+ message: `${vuln.source.toUpperCase()} vulnerability: ${vuln.id}`,
199
+ details: vuln.summary || vuln.details,
200
+ location: vuln.patched_versions ? `Fixed in: ${vuln.patched_versions}` : undefined
201
+ });
202
+ if (vuln.severity === 'critical')
203
+ score += 50;
204
+ else if (vuln.severity === 'high')
205
+ score += 30;
206
+ else if (vuln.severity === 'medium')
207
+ score += 15;
208
+ else
209
+ score += 5;
210
+ }
211
+ }
212
+ }
213
+ catch (e) {
214
+ // Vulnerability check failed, continue without
215
+ }
216
+ }
217
+ // 9. License analysis
218
+ const licenseAnalysis = (0, extended_1.analyzeLicense)(metadata.license);
219
+ if (licenseAnalysis.risk === 'high') {
220
+ threats.push({
221
+ type: 'supply_chain',
222
+ severity: 'medium',
223
+ message: `License risk: ${licenseAnalysis.details}`,
224
+ details: metadata.license
225
+ });
226
+ score += 20;
227
+ }
228
+ else if (licenseAnalysis.risk === 'critical') {
229
+ threats.push({
230
+ type: 'supply_chain',
231
+ severity: 'high',
232
+ message: `License: ${licenseAnalysis.details}`,
233
+ details: metadata.license
234
+ });
235
+ score += 40;
236
+ }
237
+ // 10. Maintainer trust check
238
+ const mainterTrust = (0, extended_1.checkMaintainerTrust)(metadata.maintainers, metadata.publisher);
239
+ if (!mainterTrust.isTrusted && mainterTrust.score < 30) {
240
+ threats.push({
241
+ type: 'unknown_publisher',
242
+ severity: 'medium',
243
+ message: `Maintainer trust: ${mainterTrust.details}`
244
+ });
245
+ score += 15;
246
+ }
247
+ // 11. Repository validation
248
+ if (metadata.repository) {
249
+ const repoCheck = await (0, extended_1.validateRepository)(metadata.repository.url, packageName);
250
+ if (!repoCheck.valid) {
251
+ for (const issue of repoCheck.issues) {
252
+ threats.push({
253
+ type: 'supply_chain',
254
+ severity: 'medium',
255
+ message: `Repository issue: ${issue}`,
256
+ details: repoCheck.details
257
+ });
258
+ score += 10;
259
+ }
260
+ }
261
+ }
262
+ // 12. Deprecated dependency check
263
+ const depAnalysis = (0, extended_1.analyzeDependencies)(metadata.dependencies, metadata.devDependencies);
264
+ if (depAnalysis.outdatedCount > 0) {
265
+ threats.push({
266
+ type: 'supply_chain',
267
+ severity: 'low',
268
+ message: `${depAnalysis.outdatedCount} deprecated/outdated dependencies`,
269
+ details: depAnalysis.details.slice(0, 3).join('; ')
270
+ });
271
+ score += depAnalysis.outdatedCount * 2;
272
+ }
273
+ // 13. Package integrity check
274
+ const integrityChecked = await (0, integrity_1.fullIntegrityCheck)(packageName, version || metadata.version);
275
+ const integrity = integrityChecked.integrity;
276
+ const sizeInfo = integrityChecked.size;
277
+ const tarballInfo = integrityChecked.tarball;
278
+ if (!integrity.valid) {
279
+ threats.push({
280
+ type: 'supply_chain',
281
+ severity: 'high',
282
+ message: `Integrity check failed: ${integrity.details}`,
283
+ details: `Expected: ${integrity.expectedHash?.substring(0, 20)}...`
284
+ });
285
+ score += 50;
286
+ }
287
+ if (sizeInfo.suspicious) {
288
+ threats.push({
289
+ type: 'supply_chain',
290
+ severity: 'medium',
291
+ message: sizeInfo.details
292
+ });
293
+ score += 20;
294
+ }
295
+ if (tarballInfo.hasNativeCode) {
296
+ // Native code is usually fine for big packages, but warn
297
+ threats.push({
298
+ type: 'supply_chain',
299
+ severity: 'low',
300
+ message: 'Package contains native code'
301
+ });
302
+ score += 5;
303
+ }
304
+ // Determine status
305
+ const status = this.determineStatus(threats, score);
306
+ return {
307
+ packageName,
308
+ version: metadata?.version || version || 'unknown',
309
+ status,
310
+ threats,
311
+ metadata,
312
+ score
313
+ };
314
+ }
315
+ /**
316
+ * Post-install scan: Scan downloaded packages
317
+ */
318
+ async postInstallScan(folderPath) {
319
+ const startTime = Date.now();
320
+ const scanFolder = folderPath || path.join(process.cwd(), 'node_modules');
321
+ const allThreats = [];
322
+ let scannedPackages = 0;
323
+ if (!fs.existsSync(scanFolder)) {
324
+ throw new Error(`node_modules folder not found: ${scanFolder}`);
325
+ }
326
+ // Find all packages
327
+ const packages = this.findPackages(scanFolder);
328
+ for (const pkg of packages) {
329
+ scannedPackages++;
330
+ // Scan package directory
331
+ if (fs.existsSync(pkg)) {
332
+ const files = (0, patterns_1.scanDirectory)(pkg);
333
+ for (const [filePath, content] of files) {
334
+ const fileThreats = (0, patterns_1.scanFile)(filePath, content);
335
+ allThreats.push(...fileThreats.map(t => ({
336
+ ...t,
337
+ package: pkg.split(path.sep).slice(-2).join(path.sep)
338
+ })));
339
+ }
340
+ // Check package.json
341
+ const packageJsonPath = path.join(pkg, 'package.json');
342
+ if (fs.existsSync(packageJsonPath)) {
343
+ try {
344
+ const pkgJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
345
+ if (pkgJson.scripts) {
346
+ const scriptThreats = (0, patterns_1.scanPackageJsonScripts)(pkgJson.scripts);
347
+ allThreats.push(...scriptThreats.map(t => ({
348
+ ...t,
349
+ package: pkg.split(path.sep).slice(-2).join(path.sep)
350
+ })));
351
+ }
352
+ }
353
+ catch (e) {
354
+ // Skip invalid package.json
355
+ }
356
+ }
357
+ }
358
+ }
359
+ return {
360
+ scannedPackages,
361
+ threats: allThreats,
362
+ duration: Date.now() - startTime
363
+ };
364
+ }
365
+ /**
366
+ * Full scan: Pre-scan, then install, then post-scan
367
+ */
368
+ async fullScan(packageName, version, folderPath) {
369
+ const pre = await this.preInstallScan(packageName, version);
370
+ if (pre.status === 'blocked') {
371
+ return { pre, post: { scannedPackages: 0, threats: [], duration: 0 } };
372
+ }
373
+ // Run post-install scan if folder provided
374
+ let post = { scannedPackages: 0, threats: [], duration: 0 };
375
+ if (folderPath) {
376
+ post = await this.postInstallScan(folderPath);
377
+ }
378
+ return { pre, post };
379
+ }
380
+ /**
381
+ * Find all packages in node_modules
382
+ */
383
+ findPackages(nodeModulesPath) {
384
+ const packages = [];
385
+ function findPkgs(dir, depth = 0) {
386
+ if (depth > 3)
387
+ return; // Limit depth
388
+ try {
389
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
390
+ for (const entry of entries) {
391
+ if (entry.isDirectory()) {
392
+ const fullPath = path.join(dir, entry.name);
393
+ // Skip scoped packages at root level
394
+ if (entry.name.startsWith('@')) {
395
+ findPkgs(fullPath, depth + 1);
396
+ }
397
+ else if (fs.existsSync(path.join(fullPath, 'package.json'))) {
398
+ packages.push(fullPath);
399
+ }
400
+ }
401
+ }
402
+ }
403
+ catch (e) {
404
+ // Skip inaccessible
405
+ }
406
+ }
407
+ findPkgs(nodeModulesPath);
408
+ return packages;
409
+ }
410
+ /**
411
+ * Determine overall status from threats and score
412
+ */
413
+ determineStatus(threats, score) {
414
+ if (threats.some(t => t.type === 'blocklisted')) {
415
+ return 'blocked';
416
+ }
417
+ if (score >= 60 || threats.some(t => t.severity === 'critical')) {
418
+ return 'danger';
419
+ }
420
+ if (score >= 30 || threats.some(t => t.severity === 'high')) {
421
+ return 'warning';
422
+ }
423
+ return 'safe';
424
+ }
425
+ }
426
+ exports.Scanner = Scanner;
427
+ function createScanner(options) {
428
+ return new Scanner(options);
429
+ }
430
+ // Export for CLI
431
+ exports.default = { Scanner, createScanner };
432
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/lib/scanner.ts"],"names":[],"mappings":"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"}