secure-scan 1.2.3 → 1.2.5
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 +85 -317
- package/aur/.SRCINFO +11 -0
- package/aur/PKGBUILD +28 -0
- package/debian/changelog +10 -0
- package/debian/compat +1 -0
- package/debian/control +16 -0
- package/debian/rules +17 -0
- package/dist/cli/index.js +109 -9
- package/dist/cli/index.js.map +1 -1
- package/docs/V1.2.1-IA_Performances.md +2 -2
- package/package.json +2 -2
- package/secure-scan.config.json +2 -16
- package/src/cli/index.ts +117 -9
- package/dist/core/engine/index.d.ts +0 -5
- package/dist/core/engine/index.d.ts.map +0 -1
- package/dist/core/engine/index.js +0 -21
- package/dist/core/engine/index.js.map +0 -1
- package/dist/core/engine/ruleEngine.d.ts +0 -46
- package/dist/core/engine/ruleEngine.d.ts.map +0 -1
- package/dist/core/engine/ruleEngine.js +0 -173
- package/dist/core/engine/ruleEngine.js.map +0 -1
- package/dist/core/index.d.ts +0 -8
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -24
- package/dist/core/index.js.map +0 -1
- package/dist/core/scanner/fileScanner.d.ts +0 -31
- package/dist/core/scanner/fileScanner.d.ts.map +0 -1
- package/dist/core/scanner/fileScanner.js +0 -199
- package/dist/core/scanner/fileScanner.js.map +0 -1
- package/dist/core/scanner/index.d.ts +0 -5
- package/dist/core/scanner/index.d.ts.map +0 -1
- package/dist/core/scanner/index.js +0 -21
- package/dist/core/scanner/index.js.map +0 -1
- package/dist/core/scoring/index.d.ts +0 -5
- package/dist/core/scoring/index.d.ts.map +0 -1
- package/dist/core/scoring/index.js +0 -21
- package/dist/core/scoring/index.js.map +0 -1
- package/dist/core/scoring/riskScoring.d.ts +0 -49
- package/dist/core/scoring/riskScoring.d.ts.map +0 -1
- package/dist/core/scoring/riskScoring.js +0 -180
- package/dist/core/scoring/riskScoring.js.map +0 -1
- package/dist/core/securityScanner.d.ts +0 -47
- package/dist/core/securityScanner.d.ts.map +0 -1
- package/dist/core/securityScanner.js +0 -298
- package/dist/core/securityScanner.js.map +0 -1
- package/reporte-test.html +0 -5036
- package/src/analyzers/javascript/PROMPT_JS_ANALYZER.md +0 -267
- package/src/rules/malware/INFO.md +0 -287
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Security Scanner Orchestrator
|
|
4
|
-
* Main scanner that coordinates all analyzers
|
|
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.SecurityScanner = void 0;
|
|
41
|
-
const path = __importStar(require("path"));
|
|
42
|
-
const fs = __importStar(require("fs"));
|
|
43
|
-
const types_1 = require("../types");
|
|
44
|
-
const scanner_1 = require("../core/scanner");
|
|
45
|
-
const engine_1 = require("../core/engine");
|
|
46
|
-
const scoring_1 = require("../core/scoring");
|
|
47
|
-
const rules_1 = require("../rules");
|
|
48
|
-
const analyzers_1 = require("../analyzers");
|
|
49
|
-
const ai_1 = require("../ai");
|
|
50
|
-
const reports_1 = require("../reports");
|
|
51
|
-
const utils_1 = require("../utils");
|
|
52
|
-
const logger_1 = require("../utils/logger");
|
|
53
|
-
/**
|
|
54
|
-
* Security Scanner Class
|
|
55
|
-
* Main orchestrator for the SAST tool
|
|
56
|
-
*/
|
|
57
|
-
class SecurityScanner {
|
|
58
|
-
config;
|
|
59
|
-
fileScanner;
|
|
60
|
-
ruleEngine;
|
|
61
|
-
riskScoring;
|
|
62
|
-
aiAnalyzer;
|
|
63
|
-
constructor(config) {
|
|
64
|
-
this.config = this.normalizeConfig(config);
|
|
65
|
-
this.fileScanner = new scanner_1.FileScanner(this.config);
|
|
66
|
-
this.ruleEngine = new engine_1.RuleEngine();
|
|
67
|
-
this.riskScoring = new scoring_1.RiskScoringEngine();
|
|
68
|
-
// Initialize AI analyzer if configured
|
|
69
|
-
if (this.config.useAI && this.config.aiConfig) {
|
|
70
|
-
this.aiAnalyzer = new ai_1.AIAnalyzer(this.config.aiConfig);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Normalize and validate configuration
|
|
75
|
-
*/
|
|
76
|
-
normalizeConfig(config) {
|
|
77
|
-
return {
|
|
78
|
-
...config,
|
|
79
|
-
projectPath: path.resolve(config.projectPath),
|
|
80
|
-
exclude: config.exclude || [],
|
|
81
|
-
minSeverity: config.minSeverity || types_1.Severity.INFO,
|
|
82
|
-
verbose: config.verbose || false,
|
|
83
|
-
maxFileSize: config.maxFileSize || 5 * 1024 * 1024,
|
|
84
|
-
fileTimeout: config.fileTimeout || 30000
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Run the security scan
|
|
89
|
-
*/
|
|
90
|
-
async scan() {
|
|
91
|
-
const startTime = Date.now();
|
|
92
|
-
const scanId = (0, utils_1.generateId)();
|
|
93
|
-
(0, logger_1.logScanStart)(this.config.projectPath);
|
|
94
|
-
try {
|
|
95
|
-
// Initialize analyzers
|
|
96
|
-
await (0, analyzers_1.initializeAnalyzers)();
|
|
97
|
-
// Log available analyzers and their versions
|
|
98
|
-
const allAnalyzers = (0, analyzers_1.getAllAnalyzers)();
|
|
99
|
-
logger_1.logger.info(`🔧 Loaded ${allAnalyzers.length} security analyzers:`);
|
|
100
|
-
for (const analyzer of allAnalyzers) {
|
|
101
|
-
logger_1.logger.info(` • ${analyzer.name} v${analyzer.version} (${analyzer.languages.join(', ')})`);
|
|
102
|
-
}
|
|
103
|
-
if (this.aiAnalyzer) {
|
|
104
|
-
await this.aiAnalyzer.initialize();
|
|
105
|
-
}
|
|
106
|
-
// Load rules
|
|
107
|
-
const rules = (0, rules_1.getEnabledRules)();
|
|
108
|
-
this.ruleEngine.loadRules(rules);
|
|
109
|
-
// Scan files
|
|
110
|
-
logger_1.logger.info('📂 Scanning project files...');
|
|
111
|
-
const files = await this.fileScanner.scan();
|
|
112
|
-
if (files.length === 0) {
|
|
113
|
-
logger_1.logger.warn('⚠️ No files found to analyze');
|
|
114
|
-
return this.createEmptyResult(scanId, startTime);
|
|
115
|
-
}
|
|
116
|
-
// Analyze files
|
|
117
|
-
logger_1.logger.info('🔍 Analyzing code for vulnerabilities and malware...');
|
|
118
|
-
const allFindings = [];
|
|
119
|
-
for (let i = 0; i < files.length; i++) {
|
|
120
|
-
const file = files[i];
|
|
121
|
-
if (this.config.verbose) {
|
|
122
|
-
logger_1.logger.debug(`Analyzing: ${file.relativePath}`);
|
|
123
|
-
}
|
|
124
|
-
try {
|
|
125
|
-
const fileFindings = await this.analyzeFile(file);
|
|
126
|
-
allFindings.push(...fileFindings);
|
|
127
|
-
// Log critical findings immediately
|
|
128
|
-
for (const finding of fileFindings) {
|
|
129
|
-
if (finding.severity === types_1.Severity.CRITICAL || finding.severity === types_1.Severity.HIGH || finding.category === types_1.FindingCategory.MALWARE) {
|
|
130
|
-
(0, logger_1.logFinding)(finding.severity, finding.title, finding.location.file, finding.location.startLine, finding.category);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
catch (error) {
|
|
135
|
-
logger_1.logger.debug(`Error analyzing ${file.relativePath}: ${error}`);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
// Deduplicate findings
|
|
139
|
-
const uniqueFindings = this.ruleEngine.deduplicateFindings(allFindings);
|
|
140
|
-
// Filter by minimum severity
|
|
141
|
-
const filteredFindings = this.filterBySeverity(uniqueFindings);
|
|
142
|
-
// Sort by severity
|
|
143
|
-
const sortedFindings = this.ruleEngine.sortBySeverity(filteredFindings);
|
|
144
|
-
// Calculate statistics
|
|
145
|
-
const endTime = Date.now();
|
|
146
|
-
const stats = this.calculateStats(files, sortedFindings, startTime, endTime);
|
|
147
|
-
// Calculate risk score
|
|
148
|
-
const riskScore = this.riskScoring.calculateRiskScore(sortedFindings, files.length);
|
|
149
|
-
const riskLevel = this.riskScoring.getRiskLevel(riskScore);
|
|
150
|
-
// Create result
|
|
151
|
-
const result = {
|
|
152
|
-
projectPath: this.config.projectPath,
|
|
153
|
-
projectName: path.basename(this.config.projectPath),
|
|
154
|
-
scanId,
|
|
155
|
-
findings: sortedFindings,
|
|
156
|
-
stats,
|
|
157
|
-
riskScore,
|
|
158
|
-
riskLevel,
|
|
159
|
-
scannedFiles: files,
|
|
160
|
-
config: this.config
|
|
161
|
-
};
|
|
162
|
-
(0, logger_1.logScanComplete)(stats.totalFiles, sortedFindings.length, stats.duration, riskScore);
|
|
163
|
-
// Generate report if output path specified
|
|
164
|
-
if (this.config.outputPath) {
|
|
165
|
-
await this.generateReport(result);
|
|
166
|
-
}
|
|
167
|
-
// Cleanup
|
|
168
|
-
await (0, analyzers_1.cleanupAnalyzers)();
|
|
169
|
-
return result;
|
|
170
|
-
}
|
|
171
|
-
catch (error) {
|
|
172
|
-
logger_1.logger.error(`Scan failed: ${error}`);
|
|
173
|
-
throw error;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Analyze a single file
|
|
178
|
-
*/
|
|
179
|
-
async analyzeFile(file) {
|
|
180
|
-
const findings = [];
|
|
181
|
-
// Skip if no language detected
|
|
182
|
-
if (!file.language) {
|
|
183
|
-
return findings;
|
|
184
|
-
}
|
|
185
|
-
// Get language-specific analyzer
|
|
186
|
-
const analyzer = (0, analyzers_1.getAnalyzerForLanguage)(file.language);
|
|
187
|
-
if (analyzer) {
|
|
188
|
-
// Log analyzer version being used
|
|
189
|
-
if (this.config.verbose) {
|
|
190
|
-
logger_1.logger.debug(`Using ${analyzer.name} v${analyzer.version} for ${file.relativePath}`);
|
|
191
|
-
}
|
|
192
|
-
const rules = (0, rules_1.getEnabledRules)().filter(r => r.languages.includes(file.language));
|
|
193
|
-
const analyzerFindings = await analyzer.analyze(file, rules);
|
|
194
|
-
findings.push(...analyzerFindings);
|
|
195
|
-
}
|
|
196
|
-
// Run rule engine for generic patterns
|
|
197
|
-
const ruleFindings = await this.ruleEngine.analyzeFile(file);
|
|
198
|
-
findings.push(...ruleFindings);
|
|
199
|
-
// AI analysis if enabled
|
|
200
|
-
if (this.aiAnalyzer && this.config.useAI) {
|
|
201
|
-
const aiResult = await this.aiAnalyzer.analyze(file);
|
|
202
|
-
findings.push(...aiResult.findings);
|
|
203
|
-
}
|
|
204
|
-
return findings;
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Filter findings by minimum severity
|
|
208
|
-
*/
|
|
209
|
-
filterBySeverity(findings) {
|
|
210
|
-
if (!this.config.minSeverity) {
|
|
211
|
-
return findings;
|
|
212
|
-
}
|
|
213
|
-
return findings.filter(f => (0, utils_1.isHigherOrEqualSeverity)(f.severity, this.config.minSeverity));
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Calculate scan statistics
|
|
217
|
-
*/
|
|
218
|
-
calculateStats(files, findings, startTime, endTime) {
|
|
219
|
-
const totalLines = files.reduce((sum, f) => sum + f.lineCount, 0);
|
|
220
|
-
const filesByLanguage = {};
|
|
221
|
-
for (const file of files) {
|
|
222
|
-
const lang = file.language || 'unknown';
|
|
223
|
-
filesByLanguage[lang] = (filesByLanguage[lang] || 0) + 1;
|
|
224
|
-
}
|
|
225
|
-
const findingsBySeverity = this.riskScoring.getSeverityDistribution(findings);
|
|
226
|
-
const findingsByCategory = this.riskScoring.getCategoryDistribution(findings);
|
|
227
|
-
return {
|
|
228
|
-
totalFiles: files.length,
|
|
229
|
-
totalLines,
|
|
230
|
-
filesByLanguage,
|
|
231
|
-
findingsBySeverity,
|
|
232
|
-
findingsByCategory,
|
|
233
|
-
duration: endTime - startTime,
|
|
234
|
-
startTime: new Date(startTime),
|
|
235
|
-
endTime: new Date(endTime)
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Create empty result when no files found
|
|
240
|
-
*/
|
|
241
|
-
createEmptyResult(scanId, startTime) {
|
|
242
|
-
const endTime = Date.now();
|
|
243
|
-
return {
|
|
244
|
-
projectPath: this.config.projectPath,
|
|
245
|
-
projectName: path.basename(this.config.projectPath),
|
|
246
|
-
scanId,
|
|
247
|
-
findings: [],
|
|
248
|
-
stats: {
|
|
249
|
-
totalFiles: 0,
|
|
250
|
-
totalLines: 0,
|
|
251
|
-
filesByLanguage: {},
|
|
252
|
-
findingsBySeverity: {
|
|
253
|
-
[types_1.Severity.CRITICAL]: 0,
|
|
254
|
-
[types_1.Severity.HIGH]: 0,
|
|
255
|
-
[types_1.Severity.MEDIUM]: 0,
|
|
256
|
-
[types_1.Severity.LOW]: 0,
|
|
257
|
-
[types_1.Severity.INFO]: 0
|
|
258
|
-
},
|
|
259
|
-
findingsByCategory: {
|
|
260
|
-
[types_1.FindingCategory.MALWARE]: 0,
|
|
261
|
-
[types_1.FindingCategory.VULNERABILITY]: 0,
|
|
262
|
-
[types_1.FindingCategory.CODE_SMELL]: 0,
|
|
263
|
-
[types_1.FindingCategory.BEST_PRACTICE]: 0
|
|
264
|
-
},
|
|
265
|
-
duration: endTime - startTime,
|
|
266
|
-
startTime: new Date(startTime),
|
|
267
|
-
endTime: new Date(endTime)
|
|
268
|
-
},
|
|
269
|
-
riskScore: 0,
|
|
270
|
-
riskLevel: 'safe',
|
|
271
|
-
scannedFiles: [],
|
|
272
|
-
config: this.config
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* Generate report
|
|
277
|
-
*/
|
|
278
|
-
async generateReport(result) {
|
|
279
|
-
if (!this.config.outputPath)
|
|
280
|
-
return;
|
|
281
|
-
const outputPath = path.resolve(this.config.outputPath);
|
|
282
|
-
const ext = path.extname(outputPath).toLowerCase();
|
|
283
|
-
if (ext === '.html' || ext === '') {
|
|
284
|
-
// Pass the language configuration to the report generator
|
|
285
|
-
const reportLanguage = this.config.language || 'es';
|
|
286
|
-
const reportGenerator = new reports_1.HtmlReportGenerator(reportLanguage);
|
|
287
|
-
const finalPath = ext === '' ? `${outputPath}.html` : outputPath;
|
|
288
|
-
await reportGenerator.saveReport(result, finalPath);
|
|
289
|
-
}
|
|
290
|
-
else if (ext === '.json') {
|
|
291
|
-
fs.writeFileSync(outputPath, JSON.stringify(result, null, 2), 'utf-8');
|
|
292
|
-
logger_1.logger.info(`📁 Reporte JSON guardado en: ${outputPath}`);
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
exports.SecurityScanner = SecurityScanner;
|
|
297
|
-
exports.default = SecurityScanner;
|
|
298
|
-
//# sourceMappingURL=securityScanner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"securityScanner.js","sourceRoot":"","sources":["../../src/core/securityScanner.ts"],"names":[],"mappings":"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"}
|