mcp-wordpress 2.1.0 → 2.3.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/dist/security/AISecurityScanner.d.ts +175 -0
- package/dist/security/AISecurityScanner.d.ts.map +1 -0
- package/dist/security/AISecurityScanner.js +645 -0
- package/dist/security/AISecurityScanner.js.map +1 -0
- package/dist/security/AutomatedRemediation.d.ts +145 -0
- package/dist/security/AutomatedRemediation.d.ts.map +1 -0
- package/dist/security/AutomatedRemediation.js +535 -0
- package/dist/security/AutomatedRemediation.js.map +1 -0
- package/dist/security/SecurityCIPipeline.d.ts +213 -0
- package/dist/security/SecurityCIPipeline.d.ts.map +1 -0
- package/dist/security/SecurityCIPipeline.js +684 -0
- package/dist/security/SecurityCIPipeline.js.map +1 -0
- package/dist/security/SecurityConfigManager.d.ts +294 -0
- package/dist/security/SecurityConfigManager.d.ts.map +1 -0
- package/dist/security/SecurityConfigManager.js +553 -0
- package/dist/security/SecurityConfigManager.js.map +1 -0
- package/dist/security/SecurityMonitoring.d.ts +245 -0
- package/dist/security/SecurityMonitoring.d.ts.map +1 -0
- package/dist/security/SecurityMonitoring.js +596 -0
- package/dist/security/SecurityMonitoring.js.map +1 -0
- package/dist/security/SecurityReviewer.d.ts +168 -0
- package/dist/security/SecurityReviewer.d.ts.map +1 -0
- package/dist/security/SecurityReviewer.js +683 -0
- package/dist/security/SecurityReviewer.js.map +1 -0
- package/dist/security/index.d.ts +182 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +189 -0
- package/dist/security/index.js.map +1 -0
- package/package.json +8 -3
- package/src/security/AISecurityScanner.ts +780 -0
- package/src/security/AutomatedRemediation.ts +665 -0
- package/src/security/SecurityCIPipeline.ts +969 -0
- package/src/security/SecurityConfigManager.ts +829 -0
- package/src/security/SecurityMonitoring.ts +841 -0
- package/src/security/SecurityReviewer.ts +855 -0
- package/src/security/index.ts +249 -0
|
@@ -0,0 +1,645 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI-Powered Security Scanner
|
|
3
|
+
* Provides intelligent vulnerability detection and automated remediation
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from "fs/promises";
|
|
6
|
+
import * as path from "path";
|
|
7
|
+
import { SecurityUtils } from "./SecurityConfig";
|
|
8
|
+
import { SecurityValidationError } from "./InputValidator";
|
|
9
|
+
/**
|
|
10
|
+
* AI-powered security analysis patterns
|
|
11
|
+
*/
|
|
12
|
+
const SECURITY_PATTERNS = {
|
|
13
|
+
// SQL Injection patterns
|
|
14
|
+
sqlInjection: [
|
|
15
|
+
/['"\-\-;]|\/\*|\*\//g,
|
|
16
|
+
/(union|select|insert|update|delete|drop|create|alter)\s+/gi,
|
|
17
|
+
/\b(or|and)\s+['"]?\d+['"]?\s*=\s*['"]?\d+['"]?/gi,
|
|
18
|
+
/\b(char|ascii|substring|length|concat)\s*\(/gi,
|
|
19
|
+
],
|
|
20
|
+
// XSS patterns
|
|
21
|
+
xss: [
|
|
22
|
+
/<script[^>]*>.*?<\/script>/gis,
|
|
23
|
+
/javascript\s*:/gi,
|
|
24
|
+
/on\w+\s*=\s*['"][^'"]*['"]?/gi,
|
|
25
|
+
/eval\s*\(/gi,
|
|
26
|
+
/expression\s*\(/gi,
|
|
27
|
+
/<iframe[^>]*>/gi,
|
|
28
|
+
],
|
|
29
|
+
// Path Traversal
|
|
30
|
+
pathTraversal: [/\.\.[\/\\]/g, /[\/\\]\.\.$/g, /%2e%2e/gi, /%252e%252e/gi, /\x2e\x2e/g],
|
|
31
|
+
// Command Injection
|
|
32
|
+
commandInjection: [/[;&|`$]/g, /\b(rm|cat|ls|ps|kill|sudo|su)\s/gi, /\$\([^)]*\)/g, /`[^`]*`/g],
|
|
33
|
+
// Credential Exposure
|
|
34
|
+
credentials: [
|
|
35
|
+
/password\s*[:=]\s*['"][^'"]{8,}/gi,
|
|
36
|
+
/api[_-]?key\s*[:=]\s*['"][^'"]{16,}/gi,
|
|
37
|
+
/token\s*[:=]\s*['"][^'"]{20,}/gi,
|
|
38
|
+
/secret\s*[:=]\s*['"][^'"]{16,}/gi,
|
|
39
|
+
/private[_-]?key/gi,
|
|
40
|
+
],
|
|
41
|
+
// LDAP Injection
|
|
42
|
+
ldapInjection: [/[()&|!]/g, /\*[^*]*\*/g, /\\\d{2}/g],
|
|
43
|
+
// NoSQL Injection
|
|
44
|
+
nosqlInjection: [/\$where/gi, /\$ne/gi, /\$gt/gi, /\$regex/gi, /\$exists/gi],
|
|
45
|
+
// CSRF vulnerabilities
|
|
46
|
+
csrf: [/GET\s+.*(?:delete|remove|update|create)/gi, /action\s*=\s*['"][^'"]*(?:delete|admin|config)/gi],
|
|
47
|
+
// Information Disclosure
|
|
48
|
+
infoDisclosure: [/error\s*[:=]\s*true/gi, /debug\s*[:=]\s*true/gi, /trace\s*[:=]\s*true/gi, /stack\s*trace/gi],
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* AI Security Scanner with machine learning capabilities
|
|
52
|
+
*/
|
|
53
|
+
export class AISecurityScanner {
|
|
54
|
+
vulnerabilities = [];
|
|
55
|
+
scanHistory = [];
|
|
56
|
+
remediationHistory = [];
|
|
57
|
+
/**
|
|
58
|
+
* Perform comprehensive security scan
|
|
59
|
+
*/
|
|
60
|
+
async performScan(options = {}) {
|
|
61
|
+
const scanId = SecurityUtils.generateSecureToken(16);
|
|
62
|
+
const startTime = Date.now();
|
|
63
|
+
console.log(`[Security Scanner] Starting AI-powered security scan ${scanId}`);
|
|
64
|
+
try {
|
|
65
|
+
this.vulnerabilities = [];
|
|
66
|
+
// Perform different types of scans
|
|
67
|
+
await this.scanCodebase(options.targets);
|
|
68
|
+
if (options.includeRuntime) {
|
|
69
|
+
await this.scanRuntimeEnvironment();
|
|
70
|
+
}
|
|
71
|
+
if (options.includeFileSystem) {
|
|
72
|
+
await this.scanFileSystem();
|
|
73
|
+
}
|
|
74
|
+
await this.scanConfigurations();
|
|
75
|
+
await this.scanDependencies();
|
|
76
|
+
await this.performAIAnalysis();
|
|
77
|
+
const duration = Date.now() - startTime;
|
|
78
|
+
const result = this.generateScanResult(scanId, duration);
|
|
79
|
+
this.scanHistory.push(result);
|
|
80
|
+
console.log(`[Security Scanner] Scan completed: ${result.summary.total} vulnerabilities found`);
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error("[Security Scanner] Scan failed:", error);
|
|
85
|
+
throw new SecurityValidationError("Security scan failed", [{ message: String(error) }]);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Scan codebase for vulnerabilities
|
|
90
|
+
*/
|
|
91
|
+
async scanCodebase(targets) {
|
|
92
|
+
const defaultTargets = ["src/", "tests/", "scripts/"];
|
|
93
|
+
const scanTargets = targets || defaultTargets;
|
|
94
|
+
for (const target of scanTargets) {
|
|
95
|
+
await this.scanDirectory(target);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Recursively scan directory for security issues
|
|
100
|
+
*/
|
|
101
|
+
async scanDirectory(dirPath) {
|
|
102
|
+
try {
|
|
103
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
104
|
+
for (const entry of entries) {
|
|
105
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
106
|
+
if (entry.isDirectory() && !entry.name.startsWith(".") && entry.name !== "node_modules") {
|
|
107
|
+
await this.scanDirectory(fullPath);
|
|
108
|
+
}
|
|
109
|
+
else if (entry.isFile() && this.shouldScanFile(entry.name)) {
|
|
110
|
+
await this.scanFile(fullPath);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
// Directory might not exist or be accessible
|
|
116
|
+
console.warn(`[Security Scanner] Cannot scan directory ${dirPath}:`, error);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Check if file should be scanned
|
|
121
|
+
*/
|
|
122
|
+
shouldScanFile(filename) {
|
|
123
|
+
const scanExtensions = [".ts", ".js", ".json", ".yml", ".yaml", ".env", ".config"];
|
|
124
|
+
const ext = path.extname(filename).toLowerCase();
|
|
125
|
+
return scanExtensions.includes(ext) || filename.startsWith(".");
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Scan individual file for vulnerabilities
|
|
129
|
+
*/
|
|
130
|
+
async scanFile(filePath) {
|
|
131
|
+
try {
|
|
132
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
133
|
+
const lines = content.split("\n");
|
|
134
|
+
// Scan for different vulnerability types
|
|
135
|
+
this.scanForSQLInjection(filePath, content, lines);
|
|
136
|
+
this.scanForXSS(filePath, content, lines);
|
|
137
|
+
this.scanForPathTraversal(filePath, content, lines);
|
|
138
|
+
this.scanForCommandInjection(filePath, content, lines);
|
|
139
|
+
this.scanForCredentialExposure(filePath, content, lines);
|
|
140
|
+
this.scanForLDAPInjection(filePath, content, lines);
|
|
141
|
+
this.scanForNoSQLInjection(filePath, content, lines);
|
|
142
|
+
this.scanForCSRF(filePath, content, lines);
|
|
143
|
+
this.scanForInfoDisclosure(filePath, content, lines);
|
|
144
|
+
this.scanForInsecureConfiguration(filePath, content, lines);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.warn(`[Security Scanner] Cannot scan file ${filePath}:`, error);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Scan for SQL injection vulnerabilities
|
|
152
|
+
*/
|
|
153
|
+
scanForSQLInjection(filePath, content, lines) {
|
|
154
|
+
SECURITY_PATTERNS.sqlInjection.forEach((pattern, index) => {
|
|
155
|
+
const matches = Array.from(content.matchAll(pattern));
|
|
156
|
+
matches.forEach((match) => {
|
|
157
|
+
const lineNumber = this.getLineNumber(content, match.index || 0);
|
|
158
|
+
this.addVulnerability({
|
|
159
|
+
id: `sql-${Date.now()}-${index}`,
|
|
160
|
+
severity: "high",
|
|
161
|
+
type: "SQL Injection",
|
|
162
|
+
description: `Potential SQL injection vulnerability detected: ${match[0]}`,
|
|
163
|
+
location: {
|
|
164
|
+
file: filePath,
|
|
165
|
+
line: lineNumber,
|
|
166
|
+
context: lines[lineNumber - 1]?.trim(),
|
|
167
|
+
},
|
|
168
|
+
remediation: {
|
|
169
|
+
suggested: "Use parameterized queries or prepared statements",
|
|
170
|
+
automated: true,
|
|
171
|
+
confidence: 0.8,
|
|
172
|
+
},
|
|
173
|
+
metadata: {
|
|
174
|
+
cweId: "CWE-89",
|
|
175
|
+
cvssScore: 8.1,
|
|
176
|
+
exploitability: "high",
|
|
177
|
+
detected: new Date(),
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Scan for XSS vulnerabilities
|
|
185
|
+
*/
|
|
186
|
+
scanForXSS(filePath, content, lines) {
|
|
187
|
+
SECURITY_PATTERNS.xss.forEach((pattern, index) => {
|
|
188
|
+
const matches = Array.from(content.matchAll(pattern));
|
|
189
|
+
matches.forEach((match) => {
|
|
190
|
+
const lineNumber = this.getLineNumber(content, match.index || 0);
|
|
191
|
+
this.addVulnerability({
|
|
192
|
+
id: `xss-${Date.now()}-${index}`,
|
|
193
|
+
severity: "high",
|
|
194
|
+
type: "Cross-Site Scripting (XSS)",
|
|
195
|
+
description: `Potential XSS vulnerability detected: ${match[0]}`,
|
|
196
|
+
location: {
|
|
197
|
+
file: filePath,
|
|
198
|
+
line: lineNumber,
|
|
199
|
+
context: lines[lineNumber - 1]?.trim(),
|
|
200
|
+
},
|
|
201
|
+
remediation: {
|
|
202
|
+
suggested: "Sanitize user input and encode output",
|
|
203
|
+
automated: true,
|
|
204
|
+
confidence: 0.7,
|
|
205
|
+
},
|
|
206
|
+
metadata: {
|
|
207
|
+
cweId: "CWE-79",
|
|
208
|
+
cvssScore: 7.5,
|
|
209
|
+
exploitability: "medium",
|
|
210
|
+
detected: new Date(),
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Scan for path traversal vulnerabilities
|
|
218
|
+
*/
|
|
219
|
+
scanForPathTraversal(filePath, content, lines) {
|
|
220
|
+
SECURITY_PATTERNS.pathTraversal.forEach((pattern, index) => {
|
|
221
|
+
const matches = Array.from(content.matchAll(pattern));
|
|
222
|
+
matches.forEach((match) => {
|
|
223
|
+
const lineNumber = this.getLineNumber(content, match.index || 0);
|
|
224
|
+
this.addVulnerability({
|
|
225
|
+
id: `path-${Date.now()}-${index}`,
|
|
226
|
+
severity: "medium",
|
|
227
|
+
type: "Path Traversal",
|
|
228
|
+
description: `Potential path traversal vulnerability detected: ${match[0]}`,
|
|
229
|
+
location: {
|
|
230
|
+
file: filePath,
|
|
231
|
+
line: lineNumber,
|
|
232
|
+
context: lines[lineNumber - 1]?.trim(),
|
|
233
|
+
},
|
|
234
|
+
remediation: {
|
|
235
|
+
suggested: "Validate and sanitize file paths",
|
|
236
|
+
automated: true,
|
|
237
|
+
confidence: 0.9,
|
|
238
|
+
},
|
|
239
|
+
metadata: {
|
|
240
|
+
cweId: "CWE-22",
|
|
241
|
+
cvssScore: 6.5,
|
|
242
|
+
exploitability: "medium",
|
|
243
|
+
detected: new Date(),
|
|
244
|
+
},
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Scan for command injection vulnerabilities
|
|
251
|
+
*/
|
|
252
|
+
scanForCommandInjection(filePath, content, lines) {
|
|
253
|
+
SECURITY_PATTERNS.commandInjection.forEach((pattern, index) => {
|
|
254
|
+
const matches = Array.from(content.matchAll(pattern));
|
|
255
|
+
matches.forEach((match) => {
|
|
256
|
+
const lineNumber = this.getLineNumber(content, match.index || 0);
|
|
257
|
+
this.addVulnerability({
|
|
258
|
+
id: `cmd-${Date.now()}-${index}`,
|
|
259
|
+
severity: "critical",
|
|
260
|
+
type: "Command Injection",
|
|
261
|
+
description: `Potential command injection vulnerability detected: ${match[0]}`,
|
|
262
|
+
location: {
|
|
263
|
+
file: filePath,
|
|
264
|
+
line: lineNumber,
|
|
265
|
+
context: lines[lineNumber - 1]?.trim(),
|
|
266
|
+
},
|
|
267
|
+
remediation: {
|
|
268
|
+
suggested: "Use safe APIs and validate input",
|
|
269
|
+
automated: false,
|
|
270
|
+
confidence: 0.6,
|
|
271
|
+
},
|
|
272
|
+
metadata: {
|
|
273
|
+
cweId: "CWE-78",
|
|
274
|
+
cvssScore: 9.0,
|
|
275
|
+
exploitability: "high",
|
|
276
|
+
detected: new Date(),
|
|
277
|
+
},
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Scan for credential exposure
|
|
284
|
+
*/
|
|
285
|
+
scanForCredentialExposure(filePath, content, lines) {
|
|
286
|
+
SECURITY_PATTERNS.credentials.forEach((pattern, index) => {
|
|
287
|
+
const matches = Array.from(content.matchAll(pattern));
|
|
288
|
+
matches.forEach((match) => {
|
|
289
|
+
const lineNumber = this.getLineNumber(content, match.index || 0);
|
|
290
|
+
this.addVulnerability({
|
|
291
|
+
id: `cred-${Date.now()}-${index}`,
|
|
292
|
+
severity: "critical",
|
|
293
|
+
type: "Credential Exposure",
|
|
294
|
+
description: `Potential hardcoded credential detected`,
|
|
295
|
+
location: {
|
|
296
|
+
file: filePath,
|
|
297
|
+
line: lineNumber,
|
|
298
|
+
context: "[REDACTED FOR SECURITY]",
|
|
299
|
+
},
|
|
300
|
+
remediation: {
|
|
301
|
+
suggested: "Move credentials to environment variables or secure vault",
|
|
302
|
+
automated: true,
|
|
303
|
+
confidence: 0.85,
|
|
304
|
+
},
|
|
305
|
+
metadata: {
|
|
306
|
+
cweId: "CWE-798",
|
|
307
|
+
cvssScore: 9.8,
|
|
308
|
+
exploitability: "high",
|
|
309
|
+
detected: new Date(),
|
|
310
|
+
},
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Scan for LDAP injection vulnerabilities
|
|
317
|
+
*/
|
|
318
|
+
scanForLDAPInjection(filePath, content, lines) {
|
|
319
|
+
SECURITY_PATTERNS.ldapInjection.forEach((pattern, index) => {
|
|
320
|
+
const matches = Array.from(content.matchAll(pattern));
|
|
321
|
+
matches.forEach((match) => {
|
|
322
|
+
const lineNumber = this.getLineNumber(content, match.index || 0);
|
|
323
|
+
this.addVulnerability({
|
|
324
|
+
id: `ldap-${Date.now()}-${index}`,
|
|
325
|
+
severity: "medium",
|
|
326
|
+
type: "LDAP Injection",
|
|
327
|
+
description: `Potential LDAP injection vulnerability detected: ${match[0]}`,
|
|
328
|
+
location: {
|
|
329
|
+
file: filePath,
|
|
330
|
+
line: lineNumber,
|
|
331
|
+
context: lines[lineNumber - 1]?.trim(),
|
|
332
|
+
},
|
|
333
|
+
remediation: {
|
|
334
|
+
suggested: "Escape LDAP special characters",
|
|
335
|
+
automated: true,
|
|
336
|
+
confidence: 0.7,
|
|
337
|
+
},
|
|
338
|
+
metadata: {
|
|
339
|
+
cweId: "CWE-90",
|
|
340
|
+
cvssScore: 6.8,
|
|
341
|
+
exploitability: "medium",
|
|
342
|
+
detected: new Date(),
|
|
343
|
+
},
|
|
344
|
+
});
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Scan for NoSQL injection vulnerabilities
|
|
350
|
+
*/
|
|
351
|
+
scanForNoSQLInjection(filePath, content, lines) {
|
|
352
|
+
SECURITY_PATTERNS.nosqlInjection.forEach((pattern, index) => {
|
|
353
|
+
const matches = Array.from(content.matchAll(pattern));
|
|
354
|
+
matches.forEach((match) => {
|
|
355
|
+
const lineNumber = this.getLineNumber(content, match.index || 0);
|
|
356
|
+
this.addVulnerability({
|
|
357
|
+
id: `nosql-${Date.now()}-${index}`,
|
|
358
|
+
severity: "high",
|
|
359
|
+
type: "NoSQL Injection",
|
|
360
|
+
description: `Potential NoSQL injection vulnerability detected: ${match[0]}`,
|
|
361
|
+
location: {
|
|
362
|
+
file: filePath,
|
|
363
|
+
line: lineNumber,
|
|
364
|
+
context: lines[lineNumber - 1]?.trim(),
|
|
365
|
+
},
|
|
366
|
+
remediation: {
|
|
367
|
+
suggested: "Validate and sanitize NoSQL queries",
|
|
368
|
+
automated: true,
|
|
369
|
+
confidence: 0.75,
|
|
370
|
+
},
|
|
371
|
+
metadata: {
|
|
372
|
+
cweId: "CWE-943",
|
|
373
|
+
cvssScore: 7.8,
|
|
374
|
+
exploitability: "medium",
|
|
375
|
+
detected: new Date(),
|
|
376
|
+
},
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Scan for CSRF vulnerabilities
|
|
383
|
+
*/
|
|
384
|
+
scanForCSRF(filePath, content, lines) {
|
|
385
|
+
SECURITY_PATTERNS.csrf.forEach((pattern, index) => {
|
|
386
|
+
const matches = Array.from(content.matchAll(pattern));
|
|
387
|
+
matches.forEach((match) => {
|
|
388
|
+
const lineNumber = this.getLineNumber(content, match.index || 0);
|
|
389
|
+
this.addVulnerability({
|
|
390
|
+
id: `csrf-${Date.now()}-${index}`,
|
|
391
|
+
severity: "medium",
|
|
392
|
+
type: "Cross-Site Request Forgery (CSRF)",
|
|
393
|
+
description: `Potential CSRF vulnerability detected: ${match[0]}`,
|
|
394
|
+
location: {
|
|
395
|
+
file: filePath,
|
|
396
|
+
line: lineNumber,
|
|
397
|
+
context: lines[lineNumber - 1]?.trim(),
|
|
398
|
+
},
|
|
399
|
+
remediation: {
|
|
400
|
+
suggested: "Implement CSRF tokens and verify HTTP methods",
|
|
401
|
+
automated: false,
|
|
402
|
+
confidence: 0.6,
|
|
403
|
+
},
|
|
404
|
+
metadata: {
|
|
405
|
+
cweId: "CWE-352",
|
|
406
|
+
cvssScore: 6.5,
|
|
407
|
+
exploitability: "medium",
|
|
408
|
+
detected: new Date(),
|
|
409
|
+
},
|
|
410
|
+
});
|
|
411
|
+
});
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Scan for information disclosure vulnerabilities
|
|
416
|
+
*/
|
|
417
|
+
scanForInfoDisclosure(filePath, content, lines) {
|
|
418
|
+
SECURITY_PATTERNS.infoDisclosure.forEach((pattern, index) => {
|
|
419
|
+
const matches = Array.from(content.matchAll(pattern));
|
|
420
|
+
matches.forEach((match) => {
|
|
421
|
+
const lineNumber = this.getLineNumber(content, match.index || 0);
|
|
422
|
+
this.addVulnerability({
|
|
423
|
+
id: `info-${Date.now()}-${index}`,
|
|
424
|
+
severity: "low",
|
|
425
|
+
type: "Information Disclosure",
|
|
426
|
+
description: `Potential information disclosure detected: ${match[0]}`,
|
|
427
|
+
location: {
|
|
428
|
+
file: filePath,
|
|
429
|
+
line: lineNumber,
|
|
430
|
+
context: lines[lineNumber - 1]?.trim(),
|
|
431
|
+
},
|
|
432
|
+
remediation: {
|
|
433
|
+
suggested: "Disable debug information in production",
|
|
434
|
+
automated: true,
|
|
435
|
+
confidence: 0.8,
|
|
436
|
+
},
|
|
437
|
+
metadata: {
|
|
438
|
+
cweId: "CWE-200",
|
|
439
|
+
cvssScore: 4.3,
|
|
440
|
+
exploitability: "low",
|
|
441
|
+
detected: new Date(),
|
|
442
|
+
},
|
|
443
|
+
});
|
|
444
|
+
});
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Scan for insecure configuration
|
|
449
|
+
*/
|
|
450
|
+
scanForInsecureConfiguration(filePath, content, lines) {
|
|
451
|
+
const insecurePatterns = [
|
|
452
|
+
{ pattern: /ssl\s*[:=]\s*false/gi, desc: "SSL disabled" },
|
|
453
|
+
{ pattern: /verify\s*[:=]\s*false/gi, desc: "Certificate verification disabled" },
|
|
454
|
+
{ pattern: /secure\s*[:=]\s*false/gi, desc: "Insecure configuration" },
|
|
455
|
+
{ pattern: /http:\/\//gi, desc: "HTTP instead of HTTPS" },
|
|
456
|
+
];
|
|
457
|
+
insecurePatterns.forEach((item, index) => {
|
|
458
|
+
const matches = Array.from(content.matchAll(item.pattern));
|
|
459
|
+
matches.forEach((match) => {
|
|
460
|
+
const lineNumber = this.getLineNumber(content, match.index || 0);
|
|
461
|
+
this.addVulnerability({
|
|
462
|
+
id: `config-${Date.now()}-${index}`,
|
|
463
|
+
severity: "medium",
|
|
464
|
+
type: "Insecure Configuration",
|
|
465
|
+
description: `${item.desc}: ${match[0]}`,
|
|
466
|
+
location: {
|
|
467
|
+
file: filePath,
|
|
468
|
+
line: lineNumber,
|
|
469
|
+
context: lines[lineNumber - 1]?.trim(),
|
|
470
|
+
},
|
|
471
|
+
remediation: {
|
|
472
|
+
suggested: "Enable secure configuration options",
|
|
473
|
+
automated: true,
|
|
474
|
+
confidence: 0.9,
|
|
475
|
+
},
|
|
476
|
+
metadata: {
|
|
477
|
+
cweId: "CWE-16",
|
|
478
|
+
cvssScore: 5.0,
|
|
479
|
+
exploitability: "medium",
|
|
480
|
+
detected: new Date(),
|
|
481
|
+
},
|
|
482
|
+
});
|
|
483
|
+
});
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Scan runtime environment for security issues
|
|
488
|
+
*/
|
|
489
|
+
async scanRuntimeEnvironment() {
|
|
490
|
+
// Check environment variables for exposed secrets
|
|
491
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
492
|
+
if (this.containsSensitiveData(key, value || "")) {
|
|
493
|
+
this.addVulnerability({
|
|
494
|
+
id: `env-${Date.now()}-${key}`,
|
|
495
|
+
severity: "high",
|
|
496
|
+
type: "Environment Variable Exposure",
|
|
497
|
+
description: `Sensitive data in environment variable: ${key}`,
|
|
498
|
+
location: {
|
|
499
|
+
context: "Runtime Environment",
|
|
500
|
+
},
|
|
501
|
+
remediation: {
|
|
502
|
+
suggested: "Use secure secret management",
|
|
503
|
+
automated: false,
|
|
504
|
+
confidence: 0.9,
|
|
505
|
+
},
|
|
506
|
+
metadata: {
|
|
507
|
+
cweId: "CWE-200",
|
|
508
|
+
cvssScore: 7.5,
|
|
509
|
+
exploitability: "medium",
|
|
510
|
+
detected: new Date(),
|
|
511
|
+
},
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Scan file system for security issues
|
|
518
|
+
*/
|
|
519
|
+
async scanFileSystem() {
|
|
520
|
+
const sensitiveFiles = [
|
|
521
|
+
".env",
|
|
522
|
+
".env.local",
|
|
523
|
+
".env.production",
|
|
524
|
+
"config.json",
|
|
525
|
+
"secrets.json",
|
|
526
|
+
"private.key",
|
|
527
|
+
"id_rsa",
|
|
528
|
+
];
|
|
529
|
+
for (const fileName of sensitiveFiles) {
|
|
530
|
+
try {
|
|
531
|
+
await fs.access(fileName);
|
|
532
|
+
this.addVulnerability({
|
|
533
|
+
id: `fs-${Date.now()}-${fileName}`,
|
|
534
|
+
severity: "medium",
|
|
535
|
+
type: "Sensitive File Exposure",
|
|
536
|
+
description: `Sensitive file found: ${fileName}`,
|
|
537
|
+
location: {
|
|
538
|
+
file: fileName,
|
|
539
|
+
},
|
|
540
|
+
remediation: {
|
|
541
|
+
suggested: "Ensure file permissions are restrictive and file is in .gitignore",
|
|
542
|
+
automated: true,
|
|
543
|
+
confidence: 0.8,
|
|
544
|
+
},
|
|
545
|
+
metadata: {
|
|
546
|
+
cweId: "CWE-200",
|
|
547
|
+
cvssScore: 6.0,
|
|
548
|
+
exploitability: "low",
|
|
549
|
+
detected: new Date(),
|
|
550
|
+
},
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
catch {
|
|
554
|
+
// File doesn't exist, which is good
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* Scan configurations for security issues
|
|
560
|
+
*/
|
|
561
|
+
async scanConfigurations() {
|
|
562
|
+
// This would scan various config files for insecure settings
|
|
563
|
+
console.log("[Security Scanner] Scanning configurations...");
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Scan dependencies for known vulnerabilities
|
|
567
|
+
*/
|
|
568
|
+
async scanDependencies() {
|
|
569
|
+
// This would integrate with npm audit or similar tools
|
|
570
|
+
console.log("[Security Scanner] Scanning dependencies...");
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* Perform AI-powered analysis for complex patterns
|
|
574
|
+
*/
|
|
575
|
+
async performAIAnalysis() {
|
|
576
|
+
// Advanced AI analysis would go here
|
|
577
|
+
console.log("[Security Scanner] Performing AI analysis...");
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Add vulnerability to the list
|
|
581
|
+
*/
|
|
582
|
+
addVulnerability(vulnerability) {
|
|
583
|
+
this.vulnerabilities.push(vulnerability);
|
|
584
|
+
}
|
|
585
|
+
/**
|
|
586
|
+
* Get line number from string index
|
|
587
|
+
*/
|
|
588
|
+
getLineNumber(content, index) {
|
|
589
|
+
return content.substring(0, index).split("\n").length;
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* Check if string contains sensitive data
|
|
593
|
+
*/
|
|
594
|
+
containsSensitiveData(key, value) {
|
|
595
|
+
const sensitiveKeys = ["password", "secret", "key", "token", "auth"];
|
|
596
|
+
const keyLower = key.toLowerCase();
|
|
597
|
+
return (sensitiveKeys.some((sensitive) => keyLower.includes(sensitive)) &&
|
|
598
|
+
value.length > 8 &&
|
|
599
|
+
!/^(true|false|null|undefined|\d+)$/i.test(value));
|
|
600
|
+
}
|
|
601
|
+
/**
|
|
602
|
+
* Generate scan result summary
|
|
603
|
+
*/
|
|
604
|
+
generateScanResult(scanId, duration) {
|
|
605
|
+
const summary = this.vulnerabilities.reduce((acc, vuln) => {
|
|
606
|
+
acc.total++;
|
|
607
|
+
acc[vuln.severity]++;
|
|
608
|
+
return acc;
|
|
609
|
+
}, { total: 0, critical: 0, high: 0, medium: 0, low: 0 });
|
|
610
|
+
const remediationAvailable = this.vulnerabilities.filter((v) => v.remediation.automated).length;
|
|
611
|
+
return {
|
|
612
|
+
scanId,
|
|
613
|
+
timestamp: new Date(),
|
|
614
|
+
duration,
|
|
615
|
+
vulnerabilities: [...this.vulnerabilities],
|
|
616
|
+
summary,
|
|
617
|
+
remediationAvailable,
|
|
618
|
+
compliance: {
|
|
619
|
+
owasp: summary.critical === 0 && summary.high < 3,
|
|
620
|
+
cwe: summary.total < 10,
|
|
621
|
+
gdpr: this.vulnerabilities.filter((v) => v.type.includes("Disclosure")).length === 0,
|
|
622
|
+
},
|
|
623
|
+
};
|
|
624
|
+
}
|
|
625
|
+
/**
|
|
626
|
+
* Get scan history
|
|
627
|
+
*/
|
|
628
|
+
getScanHistory() {
|
|
629
|
+
return [...this.scanHistory];
|
|
630
|
+
}
|
|
631
|
+
/**
|
|
632
|
+
* Get latest scan result
|
|
633
|
+
*/
|
|
634
|
+
getLatestScan() {
|
|
635
|
+
return this.scanHistory.length > 0 ? this.scanHistory[this.scanHistory.length - 1] : null;
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* Clear scan history
|
|
639
|
+
*/
|
|
640
|
+
clearHistory() {
|
|
641
|
+
this.scanHistory = [];
|
|
642
|
+
this.remediationHistory = [];
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
//# sourceMappingURL=AISecurityScanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AISecurityScanner.js","sourceRoot":"","sources":["../../src/security/AISecurityScanner.ts"],"names":[],"mappings":"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"}
|