vaspera 2.9.0 → 2.10.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/CHANGELOG.md +122 -7
- package/README.md +58 -1
- package/dist/__tests__/autofix/branch-manager.test.d.ts +2 -0
- package/dist/__tests__/autofix/branch-manager.test.d.ts.map +1 -0
- package/dist/__tests__/autofix/branch-manager.test.js +60 -0
- package/dist/__tests__/autofix/branch-manager.test.js.map +1 -0
- package/dist/__tests__/autofix/commit-generator.test.d.ts +2 -0
- package/dist/__tests__/autofix/commit-generator.test.d.ts.map +1 -0
- package/dist/__tests__/autofix/commit-generator.test.js +147 -0
- package/dist/__tests__/autofix/commit-generator.test.js.map +1 -0
- package/dist/__tests__/autofix/constitution.test.d.ts +9 -0
- package/dist/__tests__/autofix/constitution.test.d.ts.map +1 -0
- package/dist/__tests__/autofix/constitution.test.js +421 -0
- package/dist/__tests__/autofix/constitution.test.js.map +1 -0
- package/dist/__tests__/autofix/pr-generator.test.d.ts +2 -0
- package/dist/__tests__/autofix/pr-generator.test.d.ts.map +1 -0
- package/dist/__tests__/autofix/pr-generator.test.js +152 -0
- package/dist/__tests__/autofix/pr-generator.test.js.map +1 -0
- package/dist/__tests__/property-test-helpers.d.ts +87 -0
- package/dist/__tests__/property-test-helpers.d.ts.map +1 -0
- package/dist/__tests__/property-test-helpers.js +136 -0
- package/dist/__tests__/property-test-helpers.js.map +1 -0
- package/dist/__tests__/scanners/dast/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/dast/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/dast/index.test.js +183 -0
- package/dist/__tests__/scanners/dast/index.test.js.map +1 -0
- package/dist/__tests__/scanners/dast/nuclei.test.d.ts +2 -0
- package/dist/__tests__/scanners/dast/nuclei.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/dast/nuclei.test.js +166 -0
- package/dist/__tests__/scanners/dast/nuclei.test.js.map +1 -0
- package/dist/__tests__/scanners/dast/zap.test.d.ts +2 -0
- package/dist/__tests__/scanners/dast/zap.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/dast/zap.test.js +158 -0
- package/dist/__tests__/scanners/dast/zap.test.js.map +1 -0
- package/dist/__tests__/scanners/fp-feedback.test.d.ts +2 -0
- package/dist/__tests__/scanners/fp-feedback.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/fp-feedback.test.js +202 -0
- package/dist/__tests__/scanners/fp-feedback.test.js.map +1 -0
- package/dist/__tests__/scanners/fp-filter.property.test.d.ts +9 -0
- package/dist/__tests__/scanners/fp-filter.property.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/fp-filter.property.test.js +253 -0
- package/dist/__tests__/scanners/fp-filter.property.test.js.map +1 -0
- package/dist/__tests__/scanners/fp-filter.test.d.ts +2 -0
- package/dist/__tests__/scanners/fp-filter.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/fp-filter.test.js +234 -0
- package/dist/__tests__/scanners/fp-filter.test.js.map +1 -0
- package/dist/__tests__/scanners/fp-tracker.test.d.ts +2 -0
- package/dist/__tests__/scanners/fp-tracker.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/fp-tracker.test.js +262 -0
- package/dist/__tests__/scanners/fp-tracker.test.js.map +1 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.d.ts +10 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.js +238 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.js.map +1 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.test.d.ts +2 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.test.js +55 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.test.js.map +1 -0
- package/dist/__tests__/scanners/logic/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/logic/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/logic/index.test.js +165 -0
- package/dist/__tests__/scanners/logic/index.test.js.map +1 -0
- package/dist/__tests__/scanners/logic/types.test.d.ts +2 -0
- package/dist/__tests__/scanners/logic/types.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/logic/types.test.js +85 -0
- package/dist/__tests__/scanners/logic/types.test.js.map +1 -0
- package/dist/action/pr-comment.test.js +4 -0
- package/dist/action/pr-comment.test.js.map +1 -1
- package/dist/action/sarif-upload.test.js +4 -0
- package/dist/action/sarif-upload.test.js.map +1 -1
- package/dist/autofix/branch-manager.d.ts +115 -0
- package/dist/autofix/branch-manager.d.ts.map +1 -0
- package/dist/autofix/branch-manager.js +308 -0
- package/dist/autofix/branch-manager.js.map +1 -0
- package/dist/autofix/commit-generator.d.ts +55 -0
- package/dist/autofix/commit-generator.d.ts.map +1 -0
- package/dist/autofix/commit-generator.js +277 -0
- package/dist/autofix/commit-generator.js.map +1 -0
- package/dist/autofix/constitution.d.ts +77 -0
- package/dist/autofix/constitution.d.ts.map +1 -0
- package/dist/autofix/constitution.js +261 -0
- package/dist/autofix/constitution.js.map +1 -0
- package/dist/autofix/constitution.schema.d.ts +441 -0
- package/dist/autofix/constitution.schema.d.ts.map +1 -0
- package/dist/autofix/constitution.schema.js +144 -0
- package/dist/autofix/constitution.schema.js.map +1 -0
- package/dist/autofix/index.d.ts +13 -0
- package/dist/autofix/index.d.ts.map +1 -0
- package/dist/autofix/index.js +15 -0
- package/dist/autofix/index.js.map +1 -0
- package/dist/autofix/pr-generator.d.ts +57 -0
- package/dist/autofix/pr-generator.d.ts.map +1 -0
- package/dist/autofix/pr-generator.js +597 -0
- package/dist/autofix/pr-generator.js.map +1 -0
- package/dist/autofix/types.d.ts +151 -0
- package/dist/autofix/types.d.ts.map +1 -0
- package/dist/autofix/types.js +22 -0
- package/dist/autofix/types.js.map +1 -0
- package/dist/eval/fixtures.d.ts +20 -0
- package/dist/eval/fixtures.d.ts.map +1 -1
- package/dist/eval/fixtures.js +430 -0
- package/dist/eval/fixtures.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +84 -1
- package/dist/index.js.map +1 -1
- package/dist/scanners/cache.d.ts.map +1 -1
- package/dist/scanners/cache.js +4 -0
- package/dist/scanners/cache.js.map +1 -1
- package/dist/scanners/dast/index.d.ts +39 -0
- package/dist/scanners/dast/index.d.ts.map +1 -0
- package/dist/scanners/dast/index.js +259 -0
- package/dist/scanners/dast/index.js.map +1 -0
- package/dist/scanners/dast/nuclei.d.ts +26 -0
- package/dist/scanners/dast/nuclei.d.ts.map +1 -0
- package/dist/scanners/dast/nuclei.js +354 -0
- package/dist/scanners/dast/nuclei.js.map +1 -0
- package/dist/scanners/dast/types.d.ts +306 -0
- package/dist/scanners/dast/types.d.ts.map +1 -0
- package/dist/scanners/dast/types.js +52 -0
- package/dist/scanners/dast/types.js.map +1 -0
- package/dist/scanners/dast/zap.d.ts +26 -0
- package/dist/scanners/dast/zap.d.ts.map +1 -0
- package/dist/scanners/dast/zap.js +453 -0
- package/dist/scanners/dast/zap.js.map +1 -0
- package/dist/scanners/fp-feedback.d.ts +140 -0
- package/dist/scanners/fp-feedback.d.ts.map +1 -0
- package/dist/scanners/fp-feedback.js +292 -0
- package/dist/scanners/fp-feedback.js.map +1 -0
- package/dist/scanners/fp-filter.d.ts +94 -0
- package/dist/scanners/fp-filter.d.ts.map +1 -0
- package/dist/scanners/fp-filter.js +397 -0
- package/dist/scanners/fp-filter.js.map +1 -0
- package/dist/scanners/fp-tracker.d.ts +125 -0
- package/dist/scanners/fp-tracker.d.ts.map +1 -0
- package/dist/scanners/fp-tracker.js +330 -0
- package/dist/scanners/fp-tracker.js.map +1 -0
- package/dist/scanners/index.d.ts.map +1 -1
- package/dist/scanners/index.js +56 -0
- package/dist/scanners/index.js.map +1 -1
- package/dist/scanners/index.test.js +6 -6
- package/dist/scanners/index.test.js.map +1 -1
- package/dist/scanners/logic/auth-flow-analyzer.d.ts +18 -0
- package/dist/scanners/logic/auth-flow-analyzer.d.ts.map +1 -0
- package/dist/scanners/logic/auth-flow-analyzer.js +384 -0
- package/dist/scanners/logic/auth-flow-analyzer.js.map +1 -0
- package/dist/scanners/logic/endpoint-analyzer.d.ts +29 -0
- package/dist/scanners/logic/endpoint-analyzer.d.ts.map +1 -0
- package/dist/scanners/logic/endpoint-analyzer.js +528 -0
- package/dist/scanners/logic/endpoint-analyzer.js.map +1 -0
- package/dist/scanners/logic/index.d.ts +41 -0
- package/dist/scanners/logic/index.d.ts.map +1 -0
- package/dist/scanners/logic/index.js +268 -0
- package/dist/scanners/logic/index.js.map +1 -0
- package/dist/scanners/logic/types.d.ts +254 -0
- package/dist/scanners/logic/types.d.ts.map +1 -0
- package/dist/scanners/logic/types.js +142 -0
- package/dist/scanners/logic/types.js.map +1 -0
- package/dist/scanners/types.d.ts +1 -1
- package/dist/scanners/types.d.ts.map +1 -1
- package/dist/scanners/types.js +4 -0
- package/dist/scanners/types.js.map +1 -1
- package/dist/telemetry/usage.d.ts +1 -1
- package/dist/telemetry/usage.d.ts.map +1 -1
- package/dist/telemetry/usage.js +14 -6
- package/dist/telemetry/usage.js.map +1 -1
- package/package.json +6 -8
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nuclei Scanner Integration
|
|
3
|
+
*
|
|
4
|
+
* Integrates with ProjectDiscovery's Nuclei for dynamic
|
|
5
|
+
* application security testing using template-based scanning.
|
|
6
|
+
*
|
|
7
|
+
* @module scanners/dast/nuclei
|
|
8
|
+
*/
|
|
9
|
+
import spawn from "cross-spawn";
|
|
10
|
+
import { logger } from "../../logger.js";
|
|
11
|
+
import { NUCLEI_SEVERITY_MAPPING } from "./types.js";
|
|
12
|
+
/**
|
|
13
|
+
* Check if Nuclei is available
|
|
14
|
+
*/
|
|
15
|
+
export async function checkNucleiAvailable() {
|
|
16
|
+
return new Promise((resolve) => {
|
|
17
|
+
const child = spawn("nuclei", ["-version"], { timeout: 10000 });
|
|
18
|
+
let stdout = "";
|
|
19
|
+
let stderr = "";
|
|
20
|
+
child.stdout?.on("data", (data) => {
|
|
21
|
+
stdout += data.toString();
|
|
22
|
+
});
|
|
23
|
+
child.stderr?.on("data", (data) => {
|
|
24
|
+
stderr += data.toString();
|
|
25
|
+
});
|
|
26
|
+
child.on("close", (code) => {
|
|
27
|
+
if (code === 0) {
|
|
28
|
+
// Parse version from output (e.g., "Nuclei Engine Version: v3.1.0")
|
|
29
|
+
const versionMatch = (stdout + stderr).match(/v?\d+\.\d+\.\d+/);
|
|
30
|
+
const version = versionMatch ? versionMatch[0] : "unknown";
|
|
31
|
+
resolve({
|
|
32
|
+
scanner: "nuclei",
|
|
33
|
+
available: true,
|
|
34
|
+
version,
|
|
35
|
+
path: "nuclei",
|
|
36
|
+
features: {
|
|
37
|
+
passiveScan: true,
|
|
38
|
+
activeScan: true,
|
|
39
|
+
apiScan: true,
|
|
40
|
+
authentication: true,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
resolve({
|
|
46
|
+
scanner: "nuclei",
|
|
47
|
+
available: false,
|
|
48
|
+
error: "Nuclei not found. Install via: go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest",
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
child.on("error", () => {
|
|
53
|
+
resolve({
|
|
54
|
+
scanner: "nuclei",
|
|
55
|
+
available: false,
|
|
56
|
+
error: "Nuclei not found. Install via: go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest",
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Build Nuclei command arguments
|
|
63
|
+
*/
|
|
64
|
+
function buildNucleiArgs(target, policy) {
|
|
65
|
+
const args = [
|
|
66
|
+
"-u", target.url,
|
|
67
|
+
"-json", // JSON output
|
|
68
|
+
"-silent", // Minimal output
|
|
69
|
+
"-no-color", // No ANSI colors
|
|
70
|
+
];
|
|
71
|
+
// Add severity filter based on risk threshold
|
|
72
|
+
if (policy.riskThreshold) {
|
|
73
|
+
const severityMap = {
|
|
74
|
+
high: "critical,high",
|
|
75
|
+
medium: "critical,high,medium",
|
|
76
|
+
low: "critical,high,medium,low",
|
|
77
|
+
informational: "critical,high,medium,low,info",
|
|
78
|
+
};
|
|
79
|
+
args.push("-severity", severityMap[policy.riskThreshold] || "critical,high,medium");
|
|
80
|
+
}
|
|
81
|
+
// Add specific templates if provided
|
|
82
|
+
if (policy.templates && policy.templates.length > 0) {
|
|
83
|
+
for (const template of policy.templates) {
|
|
84
|
+
args.push("-t", template);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Add template tags
|
|
88
|
+
if (policy.templateTags && policy.templateTags.length > 0) {
|
|
89
|
+
args.push("-tags", policy.templateTags.join(","));
|
|
90
|
+
}
|
|
91
|
+
// Exclude tags
|
|
92
|
+
if (policy.excludeTags && policy.excludeTags.length > 0) {
|
|
93
|
+
args.push("-etags", policy.excludeTags.join(","));
|
|
94
|
+
}
|
|
95
|
+
// Passive-only mode (no active exploitation)
|
|
96
|
+
if (policy.passiveOnly) {
|
|
97
|
+
args.push("-passive");
|
|
98
|
+
}
|
|
99
|
+
// Rate limiting
|
|
100
|
+
if (policy.requestDelay && policy.requestDelay > 0) {
|
|
101
|
+
// Nuclei uses rate-limit as requests per second
|
|
102
|
+
const rps = Math.floor(1000 / policy.requestDelay);
|
|
103
|
+
args.push("-rate-limit", String(Math.max(1, rps)));
|
|
104
|
+
}
|
|
105
|
+
// Concurrency
|
|
106
|
+
if (policy.threads) {
|
|
107
|
+
args.push("-concurrency", String(policy.threads));
|
|
108
|
+
}
|
|
109
|
+
// Add custom headers
|
|
110
|
+
if (target.headers) {
|
|
111
|
+
for (const [key, value] of Object.entries(target.headers)) {
|
|
112
|
+
args.push("-header", `${key}: ${value}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Add authentication header
|
|
116
|
+
if (target.authentication) {
|
|
117
|
+
const auth = target.authentication;
|
|
118
|
+
switch (auth.type) {
|
|
119
|
+
case "bearer":
|
|
120
|
+
if (auth.credentials.token) {
|
|
121
|
+
args.push("-header", `Authorization: Bearer ${auth.credentials.token}`);
|
|
122
|
+
}
|
|
123
|
+
break;
|
|
124
|
+
case "basic":
|
|
125
|
+
if (auth.credentials.username && auth.credentials.password) {
|
|
126
|
+
const encoded = Buffer.from(`${auth.credentials.username}:${auth.credentials.password}`).toString("base64");
|
|
127
|
+
args.push("-header", `Authorization: Basic ${encoded}`);
|
|
128
|
+
}
|
|
129
|
+
break;
|
|
130
|
+
case "api-key":
|
|
131
|
+
if (auth.credentials.apiKey && auth.credentials.apiKeyHeader) {
|
|
132
|
+
args.push("-header", `${auth.credentials.apiKeyHeader}: ${auth.credentials.apiKey}`);
|
|
133
|
+
}
|
|
134
|
+
break;
|
|
135
|
+
case "cookie":
|
|
136
|
+
if (auth.credentials.cookie) {
|
|
137
|
+
args.push("-header", `Cookie: ${auth.credentials.cookie}`);
|
|
138
|
+
}
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return args;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Parse Nuclei JSON line output to DASTFinding
|
|
146
|
+
*/
|
|
147
|
+
export function parseNucleiResult(result) {
|
|
148
|
+
const severity = NUCLEI_SEVERITY_MAPPING[result.info.severity] || "info";
|
|
149
|
+
// Extract CWE and CVE IDs
|
|
150
|
+
const cweIds = result.info.classification?.["cwe-id"]?.map((id) => id.startsWith("CWE-") ? id : `CWE-${id}`);
|
|
151
|
+
const cveIds = result.info.classification?.["cve-id"];
|
|
152
|
+
// Build references array
|
|
153
|
+
const references = [];
|
|
154
|
+
if (result.info.reference) {
|
|
155
|
+
references.push(...result.info.reference);
|
|
156
|
+
}
|
|
157
|
+
if (result["template-url"]) {
|
|
158
|
+
references.push(result["template-url"]);
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
scanner: "nuclei",
|
|
162
|
+
ruleId: `nuclei-${result["template-id"]}`,
|
|
163
|
+
name: result.info.name,
|
|
164
|
+
description: result.info.description || `${result.info.name} detected`,
|
|
165
|
+
severity,
|
|
166
|
+
confidence: getConfidenceFromSeverity(result.info.severity),
|
|
167
|
+
url: result.matched || result.host,
|
|
168
|
+
method: extractMethod(result.request),
|
|
169
|
+
evidence: result["extracted-results"]?.join("\n"),
|
|
170
|
+
cweIds,
|
|
171
|
+
cveIds,
|
|
172
|
+
references,
|
|
173
|
+
tags: result.info.tags,
|
|
174
|
+
timestamp: result.timestamp || new Date().toISOString(),
|
|
175
|
+
rawOutput: result,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Extract HTTP method from curl command or request
|
|
180
|
+
*/
|
|
181
|
+
function extractMethod(request) {
|
|
182
|
+
if (!request)
|
|
183
|
+
return undefined;
|
|
184
|
+
const methodMatch = request.match(/^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\s/);
|
|
185
|
+
return methodMatch ? methodMatch[1] : undefined;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get confidence score based on severity
|
|
189
|
+
*/
|
|
190
|
+
function getConfidenceFromSeverity(severity) {
|
|
191
|
+
switch (severity.toLowerCase()) {
|
|
192
|
+
case "critical":
|
|
193
|
+
return 95;
|
|
194
|
+
case "high":
|
|
195
|
+
return 90;
|
|
196
|
+
case "medium":
|
|
197
|
+
return 80;
|
|
198
|
+
case "low":
|
|
199
|
+
return 70;
|
|
200
|
+
default:
|
|
201
|
+
return 60;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Run Nuclei scan
|
|
206
|
+
*/
|
|
207
|
+
export async function runNuclei(target, policy = {}) {
|
|
208
|
+
const startTime = new Date();
|
|
209
|
+
const mergedPolicy = { ...{ passiveOnly: true, maxDuration: 300, riskThreshold: "medium" }, ...policy };
|
|
210
|
+
logger.info("nuclei.scan_start", {
|
|
211
|
+
target: target.url,
|
|
212
|
+
passiveOnly: mergedPolicy.passiveOnly,
|
|
213
|
+
});
|
|
214
|
+
// Check availability
|
|
215
|
+
const availability = await checkNucleiAvailable();
|
|
216
|
+
if (!availability.available) {
|
|
217
|
+
return {
|
|
218
|
+
scanner: "nuclei",
|
|
219
|
+
target,
|
|
220
|
+
findings: [],
|
|
221
|
+
duration: Date.now() - startTime.getTime(),
|
|
222
|
+
success: false,
|
|
223
|
+
error: availability.error || "Nuclei not available",
|
|
224
|
+
stats: {
|
|
225
|
+
requestCount: 0,
|
|
226
|
+
urlsDiscovered: 0,
|
|
227
|
+
uniqueFindings: 0,
|
|
228
|
+
bySeverity: {},
|
|
229
|
+
},
|
|
230
|
+
startTime: startTime.toISOString(),
|
|
231
|
+
endTime: new Date().toISOString(),
|
|
232
|
+
policy: mergedPolicy,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
return new Promise((resolve) => {
|
|
236
|
+
const args = buildNucleiArgs(target, mergedPolicy);
|
|
237
|
+
logger.debug("nuclei.command", { args: args.join(" ") });
|
|
238
|
+
const child = spawn("nuclei", args, {
|
|
239
|
+
timeout: (mergedPolicy.maxDuration || 300) * 1000,
|
|
240
|
+
});
|
|
241
|
+
let stdout = "";
|
|
242
|
+
let stderr = "";
|
|
243
|
+
child.stdout?.on("data", (data) => {
|
|
244
|
+
stdout += data.toString();
|
|
245
|
+
});
|
|
246
|
+
child.stderr?.on("data", (data) => {
|
|
247
|
+
stderr += data.toString();
|
|
248
|
+
});
|
|
249
|
+
child.on("close", (code) => {
|
|
250
|
+
const endTime = new Date();
|
|
251
|
+
const findings = [];
|
|
252
|
+
// Parse JSON lines output
|
|
253
|
+
const lines = stdout.split("\n").filter(Boolean);
|
|
254
|
+
for (const line of lines) {
|
|
255
|
+
try {
|
|
256
|
+
const result = JSON.parse(line);
|
|
257
|
+
findings.push(parseNucleiResult(result));
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
// Skip non-JSON lines
|
|
261
|
+
logger.debug("nuclei.parse_skip", { line: line.slice(0, 100) });
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Calculate stats
|
|
265
|
+
const bySeverity = {};
|
|
266
|
+
for (const finding of findings) {
|
|
267
|
+
bySeverity[finding.severity] = (bySeverity[finding.severity] || 0) + 1;
|
|
268
|
+
}
|
|
269
|
+
const success = code === 0 || findings.length > 0;
|
|
270
|
+
const result = {
|
|
271
|
+
scanner: "nuclei",
|
|
272
|
+
target,
|
|
273
|
+
findings,
|
|
274
|
+
duration: endTime.getTime() - startTime.getTime(),
|
|
275
|
+
success,
|
|
276
|
+
error: !success && stderr ? stderr.slice(0, 500) : undefined,
|
|
277
|
+
stats: {
|
|
278
|
+
requestCount: 0, // Not available from Nuclei output
|
|
279
|
+
urlsDiscovered: new Set(findings.map((f) => f.url)).size,
|
|
280
|
+
uniqueFindings: findings.length,
|
|
281
|
+
bySeverity,
|
|
282
|
+
},
|
|
283
|
+
version: availability.version,
|
|
284
|
+
startTime: startTime.toISOString(),
|
|
285
|
+
endTime: endTime.toISOString(),
|
|
286
|
+
policy: mergedPolicy,
|
|
287
|
+
};
|
|
288
|
+
logger.info("nuclei.scan_complete", {
|
|
289
|
+
findings: findings.length,
|
|
290
|
+
duration: result.duration,
|
|
291
|
+
success,
|
|
292
|
+
});
|
|
293
|
+
resolve(result);
|
|
294
|
+
});
|
|
295
|
+
child.on("error", (error) => {
|
|
296
|
+
const endTime = new Date();
|
|
297
|
+
resolve({
|
|
298
|
+
scanner: "nuclei",
|
|
299
|
+
target,
|
|
300
|
+
findings: [],
|
|
301
|
+
duration: endTime.getTime() - startTime.getTime(),
|
|
302
|
+
success: false,
|
|
303
|
+
error: String(error),
|
|
304
|
+
stats: {
|
|
305
|
+
requestCount: 0,
|
|
306
|
+
urlsDiscovered: 0,
|
|
307
|
+
uniqueFindings: 0,
|
|
308
|
+
bySeverity: {},
|
|
309
|
+
},
|
|
310
|
+
version: availability.version,
|
|
311
|
+
startTime: startTime.toISOString(),
|
|
312
|
+
endTime: endTime.toISOString(),
|
|
313
|
+
policy: mergedPolicy,
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Get Nuclei installation instructions
|
|
320
|
+
*/
|
|
321
|
+
export function getNucleiInstallInstructions() {
|
|
322
|
+
return `
|
|
323
|
+
# Nuclei Installation
|
|
324
|
+
|
|
325
|
+
## Go (Recommended)
|
|
326
|
+
\`\`\`bash
|
|
327
|
+
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
|
|
328
|
+
\`\`\`
|
|
329
|
+
|
|
330
|
+
## Homebrew (macOS)
|
|
331
|
+
\`\`\`bash
|
|
332
|
+
brew install nuclei
|
|
333
|
+
\`\`\`
|
|
334
|
+
|
|
335
|
+
## Docker
|
|
336
|
+
\`\`\`bash
|
|
337
|
+
docker pull projectdiscovery/nuclei:latest
|
|
338
|
+
\`\`\`
|
|
339
|
+
|
|
340
|
+
## Binary Download
|
|
341
|
+
Download from https://github.com/projectdiscovery/nuclei/releases
|
|
342
|
+
|
|
343
|
+
## Update Templates
|
|
344
|
+
\`\`\`bash
|
|
345
|
+
nuclei -update-templates
|
|
346
|
+
\`\`\`
|
|
347
|
+
|
|
348
|
+
## Verify Installation
|
|
349
|
+
\`\`\`bash
|
|
350
|
+
nuclei -version
|
|
351
|
+
\`\`\`
|
|
352
|
+
`;
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=nuclei.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nuclei.js","sourceRoot":"","sources":["../../../src/scanners/dast/nuclei.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DAST Scanner Types
|
|
3
|
+
*
|
|
4
|
+
* Types for Dynamic Application Security Testing integrations
|
|
5
|
+
* with OWASP ZAP and Nuclei.
|
|
6
|
+
*
|
|
7
|
+
* @module scanners/dast/types
|
|
8
|
+
*/
|
|
9
|
+
import type { Severity } from "../../certification/types.js";
|
|
10
|
+
/**
|
|
11
|
+
* DAST scanner types
|
|
12
|
+
*/
|
|
13
|
+
export type DASTScanner = "zap" | "nuclei";
|
|
14
|
+
/**
|
|
15
|
+
* Authentication types for DAST scans
|
|
16
|
+
*/
|
|
17
|
+
export type AuthType = "none" | "basic" | "bearer" | "cookie" | "oauth2" | "api-key";
|
|
18
|
+
/**
|
|
19
|
+
* Target for DAST scanning
|
|
20
|
+
*/
|
|
21
|
+
export interface DASTTarget {
|
|
22
|
+
/** Base URL to scan */
|
|
23
|
+
url: string;
|
|
24
|
+
/** Optional name for the target */
|
|
25
|
+
name?: string;
|
|
26
|
+
/** Authentication configuration */
|
|
27
|
+
authentication?: DASTAuthentication;
|
|
28
|
+
/** Custom headers to include */
|
|
29
|
+
headers?: Record<string, string>;
|
|
30
|
+
/** URL patterns to include in scan scope */
|
|
31
|
+
scope?: string[];
|
|
32
|
+
/** URL patterns to exclude from scan */
|
|
33
|
+
exclude?: string[];
|
|
34
|
+
/** OpenAPI/Swagger spec URL for API scanning */
|
|
35
|
+
openApiUrl?: string;
|
|
36
|
+
/** GraphQL endpoint for GraphQL scanning */
|
|
37
|
+
graphqlUrl?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Authentication configuration
|
|
41
|
+
*/
|
|
42
|
+
export interface DASTAuthentication {
|
|
43
|
+
/** Authentication type */
|
|
44
|
+
type: AuthType;
|
|
45
|
+
/** Credentials based on auth type */
|
|
46
|
+
credentials: {
|
|
47
|
+
/** Username for basic auth */
|
|
48
|
+
username?: string;
|
|
49
|
+
/** Password for basic auth */
|
|
50
|
+
password?: string;
|
|
51
|
+
/** Bearer token */
|
|
52
|
+
token?: string;
|
|
53
|
+
/** Cookie string */
|
|
54
|
+
cookie?: string;
|
|
55
|
+
/** API key */
|
|
56
|
+
apiKey?: string;
|
|
57
|
+
/** API key header name */
|
|
58
|
+
apiKeyHeader?: string;
|
|
59
|
+
/** OAuth2 client ID */
|
|
60
|
+
clientId?: string;
|
|
61
|
+
/** OAuth2 client secret */
|
|
62
|
+
clientSecret?: string;
|
|
63
|
+
/** OAuth2 token URL */
|
|
64
|
+
tokenUrl?: string;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Scan policy/configuration
|
|
69
|
+
*/
|
|
70
|
+
export interface DASTPolicy {
|
|
71
|
+
/** Only run passive scans (no active attacks) */
|
|
72
|
+
passiveOnly?: boolean;
|
|
73
|
+
/** Risk threshold to report */
|
|
74
|
+
riskThreshold?: "high" | "medium" | "low" | "informational";
|
|
75
|
+
/** Maximum scan duration in seconds */
|
|
76
|
+
maxDuration?: number;
|
|
77
|
+
/** Specific Nuclei template paths or tags */
|
|
78
|
+
templates?: string[];
|
|
79
|
+
/** Nuclei template tags to include */
|
|
80
|
+
templateTags?: string[];
|
|
81
|
+
/** Nuclei template tags to exclude */
|
|
82
|
+
excludeTags?: string[];
|
|
83
|
+
/** ZAP scan policy name */
|
|
84
|
+
zapPolicy?: string;
|
|
85
|
+
/** Enable AJAX spider for JavaScript-heavy apps */
|
|
86
|
+
ajaxSpider?: boolean;
|
|
87
|
+
/** Maximum depth for spidering */
|
|
88
|
+
maxDepth?: number;
|
|
89
|
+
/** Maximum children per node for spidering */
|
|
90
|
+
maxChildren?: number;
|
|
91
|
+
/** Delay between requests in milliseconds */
|
|
92
|
+
requestDelay?: number;
|
|
93
|
+
/** Number of concurrent threads */
|
|
94
|
+
threads?: number;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Default DAST policy
|
|
98
|
+
*/
|
|
99
|
+
export declare const DEFAULT_DAST_POLICY: DASTPolicy;
|
|
100
|
+
/**
|
|
101
|
+
* A finding from a DAST scanner
|
|
102
|
+
*/
|
|
103
|
+
export interface DASTFinding {
|
|
104
|
+
/** Which scanner found this */
|
|
105
|
+
scanner: DASTScanner;
|
|
106
|
+
/** Rule/template ID */
|
|
107
|
+
ruleId: string;
|
|
108
|
+
/** Human-readable name */
|
|
109
|
+
name: string;
|
|
110
|
+
/** Description of the vulnerability */
|
|
111
|
+
description: string;
|
|
112
|
+
/** Severity level */
|
|
113
|
+
severity: Severity;
|
|
114
|
+
/** Confidence level (0-100) */
|
|
115
|
+
confidence: number;
|
|
116
|
+
/** Affected URL */
|
|
117
|
+
url: string;
|
|
118
|
+
/** HTTP method */
|
|
119
|
+
method?: string;
|
|
120
|
+
/** Attack parameter/input */
|
|
121
|
+
parameter?: string;
|
|
122
|
+
/** Evidence/proof of vulnerability */
|
|
123
|
+
evidence?: string;
|
|
124
|
+
/** Attack payload used */
|
|
125
|
+
attack?: string;
|
|
126
|
+
/** CWE IDs */
|
|
127
|
+
cweIds?: string[];
|
|
128
|
+
/** CVE IDs */
|
|
129
|
+
cveIds?: string[];
|
|
130
|
+
/** Reference URLs */
|
|
131
|
+
references?: string[];
|
|
132
|
+
/** Suggested solution */
|
|
133
|
+
solution?: string;
|
|
134
|
+
/** Raw scanner output */
|
|
135
|
+
rawOutput?: Record<string, unknown>;
|
|
136
|
+
/** Tags/labels */
|
|
137
|
+
tags?: string[];
|
|
138
|
+
/** Timestamp when found */
|
|
139
|
+
timestamp: string;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Result from running a DAST scanner
|
|
143
|
+
*/
|
|
144
|
+
export interface DASTScanResult {
|
|
145
|
+
/** Scanner used */
|
|
146
|
+
scanner: DASTScanner;
|
|
147
|
+
/** Target that was scanned */
|
|
148
|
+
target: DASTTarget;
|
|
149
|
+
/** Findings discovered */
|
|
150
|
+
findings: DASTFinding[];
|
|
151
|
+
/** Scan duration in milliseconds */
|
|
152
|
+
duration: number;
|
|
153
|
+
/** Whether scan completed successfully */
|
|
154
|
+
success: boolean;
|
|
155
|
+
/** Error message if failed */
|
|
156
|
+
error?: string;
|
|
157
|
+
/** Scan statistics */
|
|
158
|
+
stats: {
|
|
159
|
+
/** Total requests made */
|
|
160
|
+
requestCount: number;
|
|
161
|
+
/** URLs discovered */
|
|
162
|
+
urlsDiscovered: number;
|
|
163
|
+
/** Unique findings */
|
|
164
|
+
uniqueFindings: number;
|
|
165
|
+
/** Findings by severity */
|
|
166
|
+
bySeverity: Partial<Record<Severity, number>>;
|
|
167
|
+
};
|
|
168
|
+
/** Scanner version */
|
|
169
|
+
version?: string;
|
|
170
|
+
/** Scan start time */
|
|
171
|
+
startTime: string;
|
|
172
|
+
/** Scan end time */
|
|
173
|
+
endTime: string;
|
|
174
|
+
/** Policy used */
|
|
175
|
+
policy: DASTPolicy;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Aggregated results from multiple DAST scanners
|
|
179
|
+
*/
|
|
180
|
+
export interface AggregatedDASTResult {
|
|
181
|
+
/** Timestamp */
|
|
182
|
+
timestamp: string;
|
|
183
|
+
/** Target scanned */
|
|
184
|
+
target: DASTTarget;
|
|
185
|
+
/** Results from each scanner */
|
|
186
|
+
scanners: DASTScanResult[];
|
|
187
|
+
/** Total findings across all scanners */
|
|
188
|
+
totalFindings: number;
|
|
189
|
+
/** Deduplicated findings */
|
|
190
|
+
uniqueFindings: DASTFinding[];
|
|
191
|
+
/** Findings by severity */
|
|
192
|
+
bySeverity: Partial<Record<Severity, number>>;
|
|
193
|
+
/** Findings by scanner */
|
|
194
|
+
byScanner: Record<DASTScanner, number>;
|
|
195
|
+
/** Total scan duration */
|
|
196
|
+
totalDuration: number;
|
|
197
|
+
/** Whether all scanners succeeded */
|
|
198
|
+
allSucceeded: boolean;
|
|
199
|
+
/** Scanners that failed */
|
|
200
|
+
failedScanners: DASTScanner[];
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* DAST scanner availability status
|
|
204
|
+
*/
|
|
205
|
+
export interface DASTAvailability {
|
|
206
|
+
scanner: DASTScanner;
|
|
207
|
+
available: boolean;
|
|
208
|
+
version?: string;
|
|
209
|
+
path?: string;
|
|
210
|
+
error?: string;
|
|
211
|
+
features?: {
|
|
212
|
+
passiveScan: boolean;
|
|
213
|
+
activeScan: boolean;
|
|
214
|
+
apiScan: boolean;
|
|
215
|
+
authentication: boolean;
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Options for running DAST scans
|
|
220
|
+
*/
|
|
221
|
+
export interface DASTScanOptions {
|
|
222
|
+
/** Scanners to run */
|
|
223
|
+
scanners?: DASTScanner[];
|
|
224
|
+
/** Scan policy */
|
|
225
|
+
policy?: DASTPolicy;
|
|
226
|
+
/** Output format */
|
|
227
|
+
outputFormat?: "json" | "sarif" | "html";
|
|
228
|
+
/** Save report to file */
|
|
229
|
+
reportPath?: string;
|
|
230
|
+
/** Verbose output */
|
|
231
|
+
verbose?: boolean;
|
|
232
|
+
/** Confirmation that scan is authorized */
|
|
233
|
+
authorized: boolean;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* ZAP-specific alert structure
|
|
237
|
+
*/
|
|
238
|
+
export interface ZAPAlert {
|
|
239
|
+
sourceid: string;
|
|
240
|
+
other: string;
|
|
241
|
+
method: string;
|
|
242
|
+
evidence: string;
|
|
243
|
+
pluginId: string;
|
|
244
|
+
cweid: string;
|
|
245
|
+
confidence: string;
|
|
246
|
+
wascid: string;
|
|
247
|
+
description: string;
|
|
248
|
+
messageId: string;
|
|
249
|
+
inputVector: string;
|
|
250
|
+
url: string;
|
|
251
|
+
tags: Record<string, string>;
|
|
252
|
+
reference: string;
|
|
253
|
+
solution: string;
|
|
254
|
+
alert: string;
|
|
255
|
+
param: string;
|
|
256
|
+
attack: string;
|
|
257
|
+
name: string;
|
|
258
|
+
risk: string;
|
|
259
|
+
id: string;
|
|
260
|
+
alertRef: string;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Nuclei-specific result structure
|
|
264
|
+
*/
|
|
265
|
+
export interface NucleiResult {
|
|
266
|
+
template: string;
|
|
267
|
+
"template-url"?: string;
|
|
268
|
+
"template-id": string;
|
|
269
|
+
"template-path"?: string;
|
|
270
|
+
info: {
|
|
271
|
+
name: string;
|
|
272
|
+
author: string[];
|
|
273
|
+
tags: string[];
|
|
274
|
+
description?: string;
|
|
275
|
+
reference?: string[];
|
|
276
|
+
severity: string;
|
|
277
|
+
metadata?: Record<string, unknown>;
|
|
278
|
+
classification?: {
|
|
279
|
+
"cve-id"?: string[];
|
|
280
|
+
"cwe-id"?: string[];
|
|
281
|
+
};
|
|
282
|
+
};
|
|
283
|
+
type: string;
|
|
284
|
+
host: string;
|
|
285
|
+
matched: string;
|
|
286
|
+
"extracted-results"?: string[];
|
|
287
|
+
ip?: string;
|
|
288
|
+
timestamp: string;
|
|
289
|
+
matcher?: string;
|
|
290
|
+
"curl-command"?: string;
|
|
291
|
+
request?: string;
|
|
292
|
+
response?: string;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Map ZAP risk levels to severity
|
|
296
|
+
*/
|
|
297
|
+
export declare const ZAP_RISK_MAPPING: Record<string, Severity>;
|
|
298
|
+
/**
|
|
299
|
+
* Map ZAP confidence levels to numeric values
|
|
300
|
+
*/
|
|
301
|
+
export declare const ZAP_CONFIDENCE_MAPPING: Record<string, number>;
|
|
302
|
+
/**
|
|
303
|
+
* Map Nuclei severity to vaspera severity
|
|
304
|
+
*/
|
|
305
|
+
export declare const NUCLEI_SEVERITY_MAPPING: Record<string, Severity>;
|
|
306
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/scanners/dast/types.ts"],"names":[],"mappings":"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"}
|