scriptguard 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +430 -0
- package/dist/ai/analyzers/false-positive-filter.d.ts +15 -0
- package/dist/ai/analyzers/false-positive-filter.d.ts.map +1 -0
- package/dist/ai/analyzers/false-positive-filter.js +162 -0
- package/dist/ai/analyzers/false-positive-filter.js.map +1 -0
- package/dist/ai/analyzers/insight-generator.d.ts +7 -0
- package/dist/ai/analyzers/insight-generator.d.ts.map +1 -0
- package/dist/ai/analyzers/insight-generator.js +384 -0
- package/dist/ai/analyzers/insight-generator.js.map +1 -0
- package/dist/ai/analyzers/threat-detector.d.ts +7 -0
- package/dist/ai/analyzers/threat-detector.d.ts.map +1 -0
- package/dist/ai/analyzers/threat-detector.js +249 -0
- package/dist/ai/analyzers/threat-detector.js.map +1 -0
- package/dist/ai/gemini-client.d.ts +47 -0
- package/dist/ai/gemini-client.d.ts.map +1 -0
- package/dist/ai/gemini-client.js +222 -0
- package/dist/ai/gemini-client.js.map +1 -0
- package/dist/ai/index.d.ts +8 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +19 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/prompts.d.ts +11 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +212 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +283 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/scanners/index.d.ts +10 -0
- package/dist/scanners/index.d.ts.map +1 -0
- package/dist/scanners/index.js +202 -0
- package/dist/scanners/index.js.map +1 -0
- package/dist/scanners/lifecycle.d.ts +10 -0
- package/dist/scanners/lifecycle.d.ts.map +1 -0
- package/dist/scanners/lifecycle.js +202 -0
- package/dist/scanners/lifecycle.js.map +1 -0
- package/dist/scanners/patterns.d.ts +4 -0
- package/dist/scanners/patterns.d.ts.map +1 -0
- package/dist/scanners/patterns.js +188 -0
- package/dist/scanners/patterns.js.map +1 -0
- package/dist/types/index.d.ts +123 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +46 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/** ScriptGuard — CLI entry point */
|
|
4
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
+
if (k2 === undefined) k2 = k;
|
|
6
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
+
}
|
|
10
|
+
Object.defineProperty(o, k2, desc);
|
|
11
|
+
}) : (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
o[k2] = m[k];
|
|
14
|
+
}));
|
|
15
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
16
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
17
|
+
}) : function(o, v) {
|
|
18
|
+
o["default"] = v;
|
|
19
|
+
});
|
|
20
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
21
|
+
var ownKeys = function(o) {
|
|
22
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
23
|
+
var ar = [];
|
|
24
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
25
|
+
return ar;
|
|
26
|
+
};
|
|
27
|
+
return ownKeys(o);
|
|
28
|
+
};
|
|
29
|
+
return function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
})();
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
const commander_1 = require("commander");
|
|
39
|
+
const fs = __importStar(require("node:fs"));
|
|
40
|
+
const path = __importStar(require("node:path"));
|
|
41
|
+
const index_js_1 = require("./scanners/index.js");
|
|
42
|
+
const RISK_ICONS = {
|
|
43
|
+
low: '⚪',
|
|
44
|
+
medium: '🟡',
|
|
45
|
+
high: '🟠',
|
|
46
|
+
critical: '🔴',
|
|
47
|
+
};
|
|
48
|
+
const RISK_COLORS = {
|
|
49
|
+
low: '\x1b[37m',
|
|
50
|
+
medium: '\x1b[33m',
|
|
51
|
+
high: '\x1b[38;5;208m',
|
|
52
|
+
critical: '\x1b[31m',
|
|
53
|
+
};
|
|
54
|
+
const RESET = '\x1b[0m';
|
|
55
|
+
const BOLD = '\x1b[1m';
|
|
56
|
+
const DIM = '\x1b[2m';
|
|
57
|
+
const GREEN = '\x1b[32m';
|
|
58
|
+
function bold(text) {
|
|
59
|
+
return `${BOLD}${text}${RESET}`;
|
|
60
|
+
}
|
|
61
|
+
function dim(text) {
|
|
62
|
+
return `${DIM}${text}${RESET}`;
|
|
63
|
+
}
|
|
64
|
+
function colorRisk(level) {
|
|
65
|
+
return `${RISK_COLORS[level]}${level.toUpperCase()}${RESET}`;
|
|
66
|
+
}
|
|
67
|
+
function formatTable(result) {
|
|
68
|
+
const lines = [];
|
|
69
|
+
lines.push('');
|
|
70
|
+
lines.push(bold(' 🔒 ScriptGuard — npm Lifecycle Script Security Scanner'));
|
|
71
|
+
lines.push('');
|
|
72
|
+
lines.push(` Scanned ${bold(String(result.totalPackages))} packages (${result.packagesWithScripts} with lifecycle scripts) in ${result.scanDurationMs}ms`);
|
|
73
|
+
lines.push('');
|
|
74
|
+
if (result.totalFindings === 0) {
|
|
75
|
+
lines.push(` ${GREEN}✅ No suspicious lifecycle scripts detected${RESET}`);
|
|
76
|
+
lines.push('');
|
|
77
|
+
return lines.join('\n');
|
|
78
|
+
}
|
|
79
|
+
// Summary
|
|
80
|
+
lines.push(bold(' Summary'));
|
|
81
|
+
lines.push(` Overall Risk: ${colorRisk(result.overallRiskLevel)} (${result.overallRiskScore}/100)`);
|
|
82
|
+
lines.push(` Findings: ${result.totalFindings} total — ${RISK_ICONS.critical} ${result.findingsByLevel.critical} critical | ${RISK_ICONS.high} ${result.findingsByLevel.high} high | ${RISK_ICONS.medium} ${result.findingsByLevel.medium} medium | ${RISK_ICONS.low} ${result.findingsByLevel.low} low`);
|
|
83
|
+
// AI Analysis Summary
|
|
84
|
+
if (result.aiAnalysis) {
|
|
85
|
+
lines.push('');
|
|
86
|
+
lines.push(bold(' AI Analysis'));
|
|
87
|
+
lines.push(` False positives filtered: ${GREEN}${result.aiAnalysis.totalFalsePositivesFiltered}${RESET}`);
|
|
88
|
+
lines.push(` New threats detected: ${RISK_ICONS.high} ${result.aiAnalysis.totalNewThreatsDetected}${RESET}`);
|
|
89
|
+
lines.push(` Tokens used: ${dim(String(result.aiAnalysis.totalTokensUsed))}`);
|
|
90
|
+
lines.push(` AI duration: ${dim(result.aiAnalysis.durationMs + 'ms')}`);
|
|
91
|
+
}
|
|
92
|
+
lines.push('');
|
|
93
|
+
// Per-package findings
|
|
94
|
+
lines.push(bold(' Findings'));
|
|
95
|
+
lines.push(' ' + '─'.repeat(70));
|
|
96
|
+
for (const analysis of result.analyses) {
|
|
97
|
+
if (analysis.findings.length === 0)
|
|
98
|
+
continue;
|
|
99
|
+
lines.push('');
|
|
100
|
+
lines.push(` ${bold(analysis.name)}${dim('@' + analysis.version)} ${colorRisk(analysis.riskLevel)} [${analysis.riskScore}/100]`);
|
|
101
|
+
for (const finding of analysis.findings) {
|
|
102
|
+
lines.push(` ${RISK_ICONS[finding.riskLevel]} ${colorRisk(finding.riskLevel)} ${finding.pattern}`);
|
|
103
|
+
lines.push(` ${dim(finding.description)}`);
|
|
104
|
+
if (finding.match) {
|
|
105
|
+
const truncated = finding.match.length > 60 ? finding.match.substring(0, 57) + '...' : finding.match;
|
|
106
|
+
lines.push(` ${dim('Match:')} ${truncated}`);
|
|
107
|
+
}
|
|
108
|
+
// Display AI insights if available
|
|
109
|
+
if (finding.aiAnalysis && finding.aiAnalysis.insights.length > 0) {
|
|
110
|
+
for (const insight of finding.aiAnalysis.insights) {
|
|
111
|
+
const insightIcon = insight.type === 'false-positive' ? '✅' : '⚠️';
|
|
112
|
+
lines.push(` ${dim(insightIcon)} ${dim(insight.description)}`);
|
|
113
|
+
if (insight.attackTechnique) {
|
|
114
|
+
lines.push(` ${dim('Technique:')} ${dim(insight.attackTechnique)}`);
|
|
115
|
+
}
|
|
116
|
+
if (insight.remediation) {
|
|
117
|
+
lines.push(` ${dim('Remediation:')} ${dim(insight.remediation.substring(0, 80) + (insight.remediation.length > 80 ? '...' : ''))}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
lines.push('');
|
|
124
|
+
lines.push(' ' + '─'.repeat(70));
|
|
125
|
+
if (result.aiAnalysis) {
|
|
126
|
+
lines.push(` ${dim('Run with --format json for machine-readable output')}`);
|
|
127
|
+
lines.push(` ${dim('Run with --ai to enable AI analysis')}`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
lines.push(` ${dim('Run with --format json for machine-readable output')}`);
|
|
131
|
+
lines.push(` ${dim('Run with --ai to enable AI analysis (requires GOOGLE_AI_API_KEY)')}`);
|
|
132
|
+
}
|
|
133
|
+
lines.push('');
|
|
134
|
+
return lines.join('\n');
|
|
135
|
+
}
|
|
136
|
+
function formatJson(result) {
|
|
137
|
+
return JSON.stringify(result, null, 2);
|
|
138
|
+
}
|
|
139
|
+
function formatSarif(result) {
|
|
140
|
+
const sarif = {
|
|
141
|
+
$schema: 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/sarif-2.1/schema/sarif-schema-2.1.0.json',
|
|
142
|
+
version: '2.1.0',
|
|
143
|
+
runs: [{
|
|
144
|
+
tool: {
|
|
145
|
+
driver: {
|
|
146
|
+
name: 'ScriptGuard',
|
|
147
|
+
version: '1.0.0',
|
|
148
|
+
informationUri: 'https://github.com/ferrierepete/scriptguard',
|
|
149
|
+
rules: result.analyses.flatMap((a) => a.findings.map((f) => ({
|
|
150
|
+
id: f.pattern,
|
|
151
|
+
shortDescription: { text: f.description },
|
|
152
|
+
defaultConfiguration: { level: sarifLevel(f.riskLevel) },
|
|
153
|
+
}))),
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
results: result.analyses.flatMap((a) => a.findings.map((f) => ({
|
|
157
|
+
ruleId: f.pattern,
|
|
158
|
+
level: sarifLevel(f.riskLevel),
|
|
159
|
+
message: { text: `[${a.name}] ${f.scriptName}: ${f.description}` },
|
|
160
|
+
locations: [{
|
|
161
|
+
physicalLocation: {
|
|
162
|
+
artifactLocation: { uri: `node_modules/${a.name}/package.json` },
|
|
163
|
+
},
|
|
164
|
+
}],
|
|
165
|
+
}))),
|
|
166
|
+
}],
|
|
167
|
+
};
|
|
168
|
+
return JSON.stringify(sarif, null, 2);
|
|
169
|
+
}
|
|
170
|
+
function sarifLevel(level) {
|
|
171
|
+
switch (level) {
|
|
172
|
+
case 'critical':
|
|
173
|
+
case 'high': return 'error';
|
|
174
|
+
case 'medium': return 'warning';
|
|
175
|
+
case 'low': return 'note';
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const program = new commander_1.Command();
|
|
179
|
+
program
|
|
180
|
+
.name('scriptguard')
|
|
181
|
+
.description('Security scanner for npm package lifecycle scripts')
|
|
182
|
+
.version('1.0.0');
|
|
183
|
+
program
|
|
184
|
+
.command('scan')
|
|
185
|
+
.description('Scan installed npm packages for malicious lifecycle scripts')
|
|
186
|
+
.option('-p, --path <path>', 'Project path', process.cwd())
|
|
187
|
+
.option('--include-dev', 'Include devDependencies', false)
|
|
188
|
+
.option('--min-risk <level>', 'Minimum risk level to report (low/medium/high/critical)', 'low')
|
|
189
|
+
.option('--fail-on <level>', 'Exit with code 1 if findings at or above this level', '')
|
|
190
|
+
.option('-f, --format <format>', 'Output format (table/json/sarif)', 'table')
|
|
191
|
+
.option('--ai', 'Enable AI analysis with Gemini API')
|
|
192
|
+
.option('--ai-mode <mode>', 'AI analysis depth (basic/standard/thorough)', 'standard')
|
|
193
|
+
.option('--ai-mitigation', 'Include remediation recommendations in AI output', true)
|
|
194
|
+
.option('--ai-max-tokens <number>', 'Maximum tokens per AI request', '1000')
|
|
195
|
+
.option('--ai-timeout <ms>', 'AI request timeout in milliseconds', '10000')
|
|
196
|
+
.action(async (opts) => {
|
|
197
|
+
const minRisk = (opts.minRisk || 'low');
|
|
198
|
+
const format = opts.format || 'table';
|
|
199
|
+
const failLevel = opts.failOn ? opts.failOn : undefined;
|
|
200
|
+
// Check for AI API key if AI is enabled
|
|
201
|
+
if (opts.ai && !process.env.GOOGLE_AI_API_KEY) {
|
|
202
|
+
console.error('\n ❌ Error: GOOGLE_AI_API_KEY environment variable not set');
|
|
203
|
+
console.error(' Get your key at: https://makersuite.google.com/app/apikey\n');
|
|
204
|
+
console.error(' Then run: export GOOGLE_AI_API_KEY=your_key_here\n');
|
|
205
|
+
process.exit(2);
|
|
206
|
+
}
|
|
207
|
+
try {
|
|
208
|
+
// Build AI options if enabled
|
|
209
|
+
const aiOptions = opts.ai ? {
|
|
210
|
+
enabled: true,
|
|
211
|
+
mode: opts.aiMode || 'standard',
|
|
212
|
+
mitigation: opts.aiMitigation !== false,
|
|
213
|
+
maxTokens: parseInt(opts.aiMaxTokens || '1000'),
|
|
214
|
+
timeout: parseInt(opts.aiTimeout || '10000'),
|
|
215
|
+
} : undefined;
|
|
216
|
+
let result = await (0, index_js_1.scanProject)({
|
|
217
|
+
path: opts.path || process.cwd(),
|
|
218
|
+
includeDev: opts.includeDev || false,
|
|
219
|
+
minRiskLevel: minRisk,
|
|
220
|
+
format,
|
|
221
|
+
failLevel,
|
|
222
|
+
ai: aiOptions,
|
|
223
|
+
});
|
|
224
|
+
if (minRisk !== 'low') {
|
|
225
|
+
result = {
|
|
226
|
+
...result,
|
|
227
|
+
analyses: (0, index_js_1.filterByRiskLevel)(result.analyses, minRisk),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
const output = format === 'json' ? formatJson(result)
|
|
231
|
+
: format === 'sarif' ? formatSarif(result)
|
|
232
|
+
: formatTable(result);
|
|
233
|
+
console.log(output);
|
|
234
|
+
if (failLevel && (0, index_js_1.shouldFail)(result, failLevel)) {
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
console.error(`\n ❌ Error: ${err.message}\n`);
|
|
240
|
+
process.exit(2);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
program
|
|
244
|
+
.command('check')
|
|
245
|
+
.description('Check a single package.json for risky lifecycle scripts')
|
|
246
|
+
.argument('<path>', 'Path to package.json')
|
|
247
|
+
.option('-f, --format <format>', 'Output format (table/json/sarif)', 'table')
|
|
248
|
+
.action((filePath, opts) => {
|
|
249
|
+
const resolved = path.resolve(filePath);
|
|
250
|
+
if (!fs.existsSync(resolved)) {
|
|
251
|
+
console.error(`\n ❌ File not found: ${resolved}\n`);
|
|
252
|
+
process.exit(2);
|
|
253
|
+
}
|
|
254
|
+
const result = (0, index_js_1.scanPackageJson)(resolved);
|
|
255
|
+
const format = opts.format || 'table';
|
|
256
|
+
const output = format === 'json' ? formatJson(result)
|
|
257
|
+
: format === 'sarif' ? formatSarif(result)
|
|
258
|
+
: formatTable(result);
|
|
259
|
+
console.log(output);
|
|
260
|
+
});
|
|
261
|
+
program
|
|
262
|
+
.command('patterns')
|
|
263
|
+
.description('List all detection patterns')
|
|
264
|
+
.action(async () => {
|
|
265
|
+
const { PATTERN_RULES } = await import('./scanners/patterns.js');
|
|
266
|
+
console.log('\n 🔒 ScriptGuard Detection Patterns\n');
|
|
267
|
+
const byCategory = new Map();
|
|
268
|
+
for (const rule of PATTERN_RULES) {
|
|
269
|
+
const list = byCategory.get(rule.category) || [];
|
|
270
|
+
list.push(rule);
|
|
271
|
+
byCategory.set(rule.category, list);
|
|
272
|
+
}
|
|
273
|
+
for (const [category, rules] of byCategory) {
|
|
274
|
+
console.log(` ${bold(category.toUpperCase())}`);
|
|
275
|
+
for (const rule of rules) {
|
|
276
|
+
console.log(` ${RISK_ICONS[rule.riskLevel]} ${rule.name} ${dim('[' + rule.riskLevel + ']')}`);
|
|
277
|
+
console.log(` ${dim(rule.description)}`);
|
|
278
|
+
}
|
|
279
|
+
console.log('');
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
program.parse();
|
|
283
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** ScriptGuard — Public API exports */
|
|
2
|
+
export { scanProject, scanPackageJson, shouldFail, filterByRiskLevel } from './scanners/index.js';
|
|
3
|
+
export { analyzePackage, scanInstalledPackages, scanSinglePackage } from './scanners/lifecycle.js';
|
|
4
|
+
export { PATTERN_RULES } from './scanners/patterns.js';
|
|
5
|
+
export type { Finding, PackageAnalysis, ScanResult, ScanOptions, PatternRule, RiskLevel, } from './types/index.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAEvC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,YAAY,EACV,OAAO,EACP,eAAe,EACf,UAAU,EACV,WAAW,EACX,WAAW,EACX,SAAS,GACV,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** ScriptGuard — Public API exports */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.PATTERN_RULES = exports.scanSinglePackage = exports.scanInstalledPackages = exports.analyzePackage = exports.filterByRiskLevel = exports.shouldFail = exports.scanPackageJson = exports.scanProject = void 0;
|
|
5
|
+
var index_js_1 = require("./scanners/index.js");
|
|
6
|
+
Object.defineProperty(exports, "scanProject", { enumerable: true, get: function () { return index_js_1.scanProject; } });
|
|
7
|
+
Object.defineProperty(exports, "scanPackageJson", { enumerable: true, get: function () { return index_js_1.scanPackageJson; } });
|
|
8
|
+
Object.defineProperty(exports, "shouldFail", { enumerable: true, get: function () { return index_js_1.shouldFail; } });
|
|
9
|
+
Object.defineProperty(exports, "filterByRiskLevel", { enumerable: true, get: function () { return index_js_1.filterByRiskLevel; } });
|
|
10
|
+
var lifecycle_js_1 = require("./scanners/lifecycle.js");
|
|
11
|
+
Object.defineProperty(exports, "analyzePackage", { enumerable: true, get: function () { return lifecycle_js_1.analyzePackage; } });
|
|
12
|
+
Object.defineProperty(exports, "scanInstalledPackages", { enumerable: true, get: function () { return lifecycle_js_1.scanInstalledPackages; } });
|
|
13
|
+
Object.defineProperty(exports, "scanSinglePackage", { enumerable: true, get: function () { return lifecycle_js_1.scanSinglePackage; } });
|
|
14
|
+
var patterns_js_1 = require("./scanners/patterns.js");
|
|
15
|
+
Object.defineProperty(exports, "PATTERN_RULES", { enumerable: true, get: function () { return patterns_js_1.PATTERN_RULES; } });
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,uCAAuC;;;AAEvC,gDAAkG;AAAzF,uGAAA,WAAW,OAAA;AAAE,2GAAA,eAAe,OAAA;AAAE,sGAAA,UAAU,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AACpE,wDAAmG;AAA1F,8GAAA,cAAc,OAAA;AAAE,qHAAA,qBAAqB,OAAA;AAAE,iHAAA,iBAAiB,OAAA;AACjE,sDAAuD;AAA9C,4GAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** ScriptGuard — Aggregate scanner */
|
|
2
|
+
import type { ScanResult, ScanOptions, RiskLevel, PackageAnalysis, AIOptions } from '../types/index.js';
|
|
3
|
+
export declare function scanProject(options: ScanOptions & {
|
|
4
|
+
ai?: AIOptions;
|
|
5
|
+
}): Promise<ScanResult>;
|
|
6
|
+
export declare function scanProjectSync(options: ScanOptions): ScanResult;
|
|
7
|
+
export declare function scanPackageJson(filePath: string): ScanResult;
|
|
8
|
+
export declare function shouldFail(result: ScanResult, failLevel?: RiskLevel): boolean;
|
|
9
|
+
export declare function filterByRiskLevel(analyses: PackageAnalysis[], minLevel: RiskLevel): PackageAnalysis[];
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanners/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAkB,MAAM,mBAAmB,CAAC;AAsDxH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG;IAAE,EAAE,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAiBhG;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,CAIhE;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAS5D;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAM7E;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,QAAQ,EAAE,SAAS,GAAG,eAAe,EAAE,CAQrG"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** ScriptGuard — Aggregate scanner */
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.scanProject = scanProject;
|
|
38
|
+
exports.scanProjectSync = scanProjectSync;
|
|
39
|
+
exports.scanPackageJson = scanPackageJson;
|
|
40
|
+
exports.shouldFail = shouldFail;
|
|
41
|
+
exports.filterByRiskLevel = filterByRiskLevel;
|
|
42
|
+
const lifecycle_js_1 = require("./lifecycle.js");
|
|
43
|
+
const index_js_1 = require("../ai/index.js");
|
|
44
|
+
const fs = __importStar(require("node:fs"));
|
|
45
|
+
const path = __importStar(require("node:path"));
|
|
46
|
+
const RISK_LEVEL_ORDER = {
|
|
47
|
+
low: 0,
|
|
48
|
+
medium: 1,
|
|
49
|
+
high: 2,
|
|
50
|
+
critical: 3,
|
|
51
|
+
};
|
|
52
|
+
function aggregateResults(analyses, startTime) {
|
|
53
|
+
const totalFindings = analyses.reduce((sum, a) => sum + a.findings.length, 0);
|
|
54
|
+
const findingsByLevel = { low: 0, medium: 0, high: 0, critical: 0 };
|
|
55
|
+
for (const a of analyses) {
|
|
56
|
+
for (const f of a.findings) {
|
|
57
|
+
findingsByLevel[f.riskLevel]++;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const packagesWithScripts = analyses.filter((a) => Object.keys(a.scripts).length > 0).length;
|
|
61
|
+
let overallRiskScore = 0;
|
|
62
|
+
if (analyses.length > 0) {
|
|
63
|
+
const total = analyses.reduce((sum, a) => sum + a.riskScore, 0);
|
|
64
|
+
overallRiskScore = Math.round(total / analyses.length);
|
|
65
|
+
// Weight by max finding
|
|
66
|
+
const maxScore = Math.max(...analyses.map((a) => a.riskScore));
|
|
67
|
+
overallRiskScore = Math.min(100, Math.round(overallRiskScore * 0.3 + maxScore * 0.7));
|
|
68
|
+
}
|
|
69
|
+
let overallRiskLevel = 'low';
|
|
70
|
+
if (findingsByLevel.critical > 0)
|
|
71
|
+
overallRiskLevel = 'critical';
|
|
72
|
+
else if (findingsByLevel.high > 0)
|
|
73
|
+
overallRiskLevel = 'high';
|
|
74
|
+
else if (findingsByLevel.medium > 0)
|
|
75
|
+
overallRiskLevel = 'medium';
|
|
76
|
+
return {
|
|
77
|
+
totalPackages: analyses.length,
|
|
78
|
+
packagesWithScripts,
|
|
79
|
+
analyses,
|
|
80
|
+
totalFindings,
|
|
81
|
+
findingsByLevel,
|
|
82
|
+
overallRiskScore,
|
|
83
|
+
overallRiskLevel,
|
|
84
|
+
scanDurationMs: Date.now() - startTime,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
async function scanProject(options) {
|
|
88
|
+
const startTime = Date.now();
|
|
89
|
+
const analyses = (0, lifecycle_js_1.scanInstalledPackages)(options.path, options.includeDev);
|
|
90
|
+
let result = aggregateResults(analyses, startTime);
|
|
91
|
+
// Phase 2: AI analysis (opt-in)
|
|
92
|
+
if (options.ai?.enabled) {
|
|
93
|
+
try {
|
|
94
|
+
result = await enrichWithAI(result, options.ai);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
// Graceful degradation - return regex-only results on AI failure
|
|
98
|
+
console.warn(`\n ⚠️ AI analysis failed: ${error.message}`);
|
|
99
|
+
console.warn(' Continuing with regex-based scanning only.\n');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
function scanProjectSync(options) {
|
|
105
|
+
const startTime = Date.now();
|
|
106
|
+
const analyses = (0, lifecycle_js_1.scanInstalledPackages)(options.path, options.includeDev);
|
|
107
|
+
return aggregateResults(analyses, startTime);
|
|
108
|
+
}
|
|
109
|
+
function scanPackageJson(filePath) {
|
|
110
|
+
const startTime = Date.now();
|
|
111
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
112
|
+
const analysis = (0, lifecycle_js_1.analyzePackage)(JSON.parse(content).name || path.basename(path.dirname(filePath)), JSON.parse(content).version || 'unknown', JSON.parse(content).scripts || {});
|
|
113
|
+
return aggregateResults([analysis], startTime);
|
|
114
|
+
}
|
|
115
|
+
function shouldFail(result, failLevel) {
|
|
116
|
+
if (!failLevel)
|
|
117
|
+
return false;
|
|
118
|
+
const threshold = RISK_LEVEL_ORDER[failLevel];
|
|
119
|
+
return result.analyses.some((a) => a.findings.some((f) => RISK_LEVEL_ORDER[f.riskLevel] >= threshold));
|
|
120
|
+
}
|
|
121
|
+
function filterByRiskLevel(analyses, minLevel) {
|
|
122
|
+
const threshold = RISK_LEVEL_ORDER[minLevel];
|
|
123
|
+
return analyses
|
|
124
|
+
.map((a) => ({
|
|
125
|
+
...a,
|
|
126
|
+
findings: a.findings.filter((f) => RISK_LEVEL_ORDER[f.riskLevel] >= threshold),
|
|
127
|
+
}))
|
|
128
|
+
.filter((a) => a.findings.length > 0);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Enrich scan results with AI analysis
|
|
132
|
+
*/
|
|
133
|
+
async function enrichWithAI(result, aiOptions) {
|
|
134
|
+
const aiStartTime = Date.now();
|
|
135
|
+
// Prepare batch request with packages that have findings or lifecycle scripts
|
|
136
|
+
const packagesToAnalyze = result.analyses.filter(a => a.findings.length > 0 || Object.keys(a.scripts).length > 0);
|
|
137
|
+
if (packagesToAnalyze.length === 0) {
|
|
138
|
+
return result;
|
|
139
|
+
}
|
|
140
|
+
// Build batch request
|
|
141
|
+
const batchRequest = {
|
|
142
|
+
packages: packagesToAnalyze.map(a => ({
|
|
143
|
+
name: a.name,
|
|
144
|
+
version: a.version,
|
|
145
|
+
scripts: a.scripts,
|
|
146
|
+
findings: a.findings,
|
|
147
|
+
})),
|
|
148
|
+
mode: aiOptions.mode || 'standard',
|
|
149
|
+
};
|
|
150
|
+
// Call Gemini API
|
|
151
|
+
const client = (0, index_js_1.getGeminiClient)(aiOptions.apiKey);
|
|
152
|
+
const aiResponse = await client.analyzeBatch(batchRequest);
|
|
153
|
+
// Merge AI results back into analyses
|
|
154
|
+
const aiAnalyses = new Map(aiResponse.analyses.map(a => [`${a.package}@${a.version}`, a]));
|
|
155
|
+
let totalFalsePositivesFiltered = 0;
|
|
156
|
+
let totalNewThreatsDetected = 0;
|
|
157
|
+
for (const analysis of result.analyses) {
|
|
158
|
+
const key = `${analysis.name}@${analysis.version}`;
|
|
159
|
+
const aiAnalysis = aiAnalyses.get(key);
|
|
160
|
+
if (aiAnalysis) {
|
|
161
|
+
// Add AI analysis to findings
|
|
162
|
+
for (const finding of analysis.findings) {
|
|
163
|
+
finding.aiAnalysis = aiAnalysis;
|
|
164
|
+
}
|
|
165
|
+
totalFalsePositivesFiltered += aiAnalysis.falsePositivesFiltered;
|
|
166
|
+
totalNewThreatsDetected += aiAnalysis.newThreatsDetected;
|
|
167
|
+
// Update risk score based on AI insights
|
|
168
|
+
if (aiAnalysis.insights.length > 0) {
|
|
169
|
+
const maxInsightSeverity = aiAnalysis.insights.reduce((max, insight) => {
|
|
170
|
+
const severityOrder = { low: 0, medium: 1, high: 2, critical: 3 };
|
|
171
|
+
return Math.max(max, severityOrder[insight.severity]);
|
|
172
|
+
}, 0);
|
|
173
|
+
// Adjust risk score based on AI confidence
|
|
174
|
+
if (maxInsightSeverity >= 3 && aiAnalysis.confidence > 0.7) {
|
|
175
|
+
analysis.riskScore = Math.min(100, analysis.riskScore + 20);
|
|
176
|
+
}
|
|
177
|
+
else if (maxInsightSeverity === 0 && aiAnalysis.falsePositivesFiltered > 0) {
|
|
178
|
+
// Lower risk if AI identified false positives
|
|
179
|
+
analysis.riskScore = Math.max(0, analysis.riskScore - 30);
|
|
180
|
+
}
|
|
181
|
+
// Recalculate risk level
|
|
182
|
+
if (analysis.riskScore >= 75)
|
|
183
|
+
analysis.riskLevel = 'critical';
|
|
184
|
+
else if (analysis.riskScore >= 50)
|
|
185
|
+
analysis.riskLevel = 'high';
|
|
186
|
+
else if (analysis.riskScore >= 25)
|
|
187
|
+
analysis.riskLevel = 'medium';
|
|
188
|
+
else
|
|
189
|
+
analysis.riskLevel = 'low';
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Add AI summary to result
|
|
194
|
+
result.aiAnalysis = {
|
|
195
|
+
totalTokensUsed: aiResponse.totalTokensUsed,
|
|
196
|
+
totalFalsePositivesFiltered,
|
|
197
|
+
totalNewThreatsDetected,
|
|
198
|
+
durationMs: Date.now() - aiStartTime,
|
|
199
|
+
};
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanners/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** ScriptGuard — Lifecycle script parser — reads package.json files from node_modules */
|
|
2
|
+
import type { PackageAnalysis, RiskLevel } from '../types/index.js';
|
|
3
|
+
declare function extractLifecycleScripts(scripts: Record<string, string>): Record<string, string>;
|
|
4
|
+
declare function calculateRiskScore(findings: PackageAnalysis['findings']): number;
|
|
5
|
+
declare function riskLevelFromScore(score: number): RiskLevel;
|
|
6
|
+
export declare function analyzePackage(name: string, version: string, scripts: Record<string, string>): PackageAnalysis;
|
|
7
|
+
export declare function scanInstalledPackages(projectPath: string, includeDev?: boolean): PackageAnalysis[];
|
|
8
|
+
export declare function scanSinglePackage(pkgJsonContent: string): PackageAnalysis;
|
|
9
|
+
export { extractLifecycleScripts, calculateRiskScore, riskLevelFromScore };
|
|
10
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/scanners/lifecycle.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAIzF,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAoCpE,iBAAS,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQxF;AA4BD,iBAAS,kBAAkB,CAAC,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,GAAG,MAAM,CAKzE;AAED,iBAAS,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAKpD;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,eAAe,CAgCjB;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,eAAe,EAAE,CAuDhG;AAED,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,eAAe,CAOzE;AAED,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC"}
|