0xray 4.0.34 → 4.0.35
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/.grok-plugin/plugin.json +1 -1
- package/.xray/codex.json +12 -4
- package/.xray/features.json +1 -1
- package/AGENTS-consumer.md +6 -6
- package/AGENTS.md +5 -5
- package/README.md +2 -2
- package/dist/AGENTS.md +5 -5
- package/dist/CHANGELOG.md +16 -0
- package/dist/README.md +2 -2
- package/dist/cli/index.js +2 -5
- package/dist/governance/governance-service.js +1 -1
- package/dist/integrations/base/README.md +1 -9
- package/dist/integrations/base/index.d.ts +0 -1
- package/dist/integrations/base/index.js +0 -2
- package/dist/integrations/governance/index.js +31 -8
- package/dist/integrations/grok/hooks/grok-hook-utils.js +1 -1
- package/dist/integrations/grok/hooks/session-start.js +12 -0
- package/dist/integrations/hooks/goggles-pipeline.mjs +62 -11
- package/dist/integrations/hooks/host-truth.mjs +74 -0
- package/dist/integrations/hooks/station-hook-runtime.cjs +3 -0
- package/dist/integrations/openclaw/plugin/xray-pre-tool/package.json +1 -1
- package/dist/mcps/knowledge-skills/storyteller.server.js +0 -1
- package/dist/nucleus/delegation-gate.d.ts +2 -2
- package/dist/nucleus/delegation-gate.js +13 -2
- package/dist/nucleus/work-freshness.mjs +189 -0
- package/dist/processors/implementations/agents-md-validation-processor.js +1 -1
- package/docs-site/docs/plates/boot.md +17 -2
- package/docs-site/docs/plates/governance.md +3 -2
- package/docs-site/docs/plates/index.md +3 -1
- package/docs-site/docs/plates/memory-recall.md +26 -35
- package/docs-site/docs/plates/orchestration.md +39 -35
- package/docs-site/docs/plates/processor.md +34 -36
- package/docs-site/docs/plates/reporting.md +3 -8
- package/docs-site/docs/plates/routing.md +22 -11
- package/package.json +2 -2
- package/scripts/foundry/release.mjs +48 -5
- package/scripts/mjs/test-consumer-readiness.mjs +1 -0
- package/scripts/mjs/test-mcp-functionality.mjs +14 -9
- package/scripts/node/basic-security-audit.cjs +0 -1
- package/scripts/node/bridge-mcp-wiring.cjs +66 -3
- package/scripts/node/postinstall.cjs +1 -1
- package/scripts/node/prepare-consumer.cjs +11 -7
- package/scripts/node/setup-dev.cjs +18 -26
- package/scripts/node/validate-mcp-connectivity.js +2 -1
- package/src/integrations/openclaw/plugin/xray-pre-tool/package.json +1 -1
- package/src/mcps/knowledge-skills/storyteller.server.ts +0 -1
- package/xray/agents_template.md +5 -5
- package/xray/codex.json +12 -4
- package/xray/features.json +1 -1
- package/dist/agents/known-names.d.ts +0 -26
- package/dist/agents/known-names.js +0 -72
- package/dist/analytics/consent-manager.d.ts +0 -92
- package/dist/analytics/consent-manager.js +0 -257
- package/dist/benchmark/performance-benchmark.d.ts +0 -103
- package/dist/benchmark/performance-benchmark.js +0 -373
- package/dist/cli/commands/analytics-disable.d.ts +0 -9
- package/dist/cli/commands/analytics-disable.js +0 -72
- package/dist/cli/commands/analytics-enable-action.d.ts +0 -8
- package/dist/cli/commands/analytics-enable-action.js +0 -82
- package/dist/cli/commands/analytics-preview.d.ts +0 -9
- package/dist/cli/commands/analytics-preview.js +0 -106
- package/dist/cli/commands/analytics-status.d.ts +0 -9
- package/dist/cli/commands/analytics-status.js +0 -68
- package/dist/cli/commands/enforce.d.ts +0 -12
- package/dist/cli/commands/enforce.js +0 -78
- package/dist/cli/commands/govern.d.ts +0 -29
- package/dist/cli/commands/govern.js +0 -149
- package/dist/cli/commands/security-audit.d.ts +0 -23
- package/dist/cli/commands/security-audit.js +0 -219
- package/dist/cli/server.d.ts +0 -1
- package/dist/cli/server.js +0 -147
- package/dist/config/routing-mappings.d.ts +0 -26
- package/dist/config/routing-mappings.js +0 -151
- package/dist/core/bridge.mjs +0 -922
- package/dist/core/trace-context.d.ts +0 -12
- package/dist/core/trace-context.js +0 -33
- package/dist/enforcement/index.d.ts +0 -22
- package/dist/enforcement/index.js +0 -40
- package/dist/enforcement/loaders/index.d.ts +0 -36
- package/dist/enforcement/loaders/index.js +0 -39
- package/dist/enforcement/test-auto-healing.d.ts +0 -83
- package/dist/enforcement/test-auto-healing.js +0 -325
- package/dist/inference/index.d.ts +0 -10
- package/dist/inference/index.js +0 -5
- package/dist/infrastructure/iac-validator.d.ts +0 -150
- package/dist/infrastructure/iac-validator.js +0 -465
- package/dist/infrastructure/schemas/cloud-schemas.d.ts +0 -482
- package/dist/infrastructure/schemas/cloud-schemas.js +0 -488
- package/dist/integrations/base/ExampleIntegration.d.ts +0 -46
- package/dist/integrations/base/ExampleIntegration.js +0 -180
- package/dist/integrations/enforcement-gate.d.ts +0 -44
- package/dist/integrations/enforcement-gate.js +0 -348
- package/dist/mcps/connection/connection-manager.d.ts +0 -39
- package/dist/mcps/connection/connection-manager.js +0 -79
- package/dist/mcps/index.d.ts +0 -17
- package/dist/mcps/index.js +0 -65
- package/dist/mcps/orchestrator/index.d.ts +0 -6
- package/dist/mcps/orchestrator/index.js +0 -5
- package/dist/metrics/index.d.ts +0 -6
- package/dist/metrics/index.js +0 -6
- package/dist/orchestrator/self-direction-activation.d.ts +0 -108
- package/dist/orchestrator/self-direction-activation.js +0 -244
- package/dist/orchestrator/universal-registry-bridge.d.ts +0 -84
- package/dist/orchestrator/universal-registry-bridge.js +0 -246
- package/dist/performance/performance-budget-enforcer.d.ts +0 -157
- package/dist/performance/performance-budget-enforcer.js +0 -433
- package/dist/performance/performance-regression-tester.d.ts +0 -107
- package/dist/performance/performance-regression-tester.js +0 -341
- package/dist/postprocessor/analysis/CodeChangeAnalyzer.d.ts +0 -11
- package/dist/postprocessor/analysis/CodeChangeAnalyzer.js +0 -50
- package/dist/postprocessor/config/ProcessorConfigLoader.d.ts +0 -44
- package/dist/postprocessor/config/ProcessorConfigLoader.js +0 -16
- package/dist/postprocessor/integration.d.ts +0 -156
- package/dist/postprocessor/integration.js +0 -194
- package/dist/postprocessor/metamorphosis/index.d.ts +0 -2
- package/dist/postprocessor/metamorphosis/index.js +0 -1
- package/dist/postprocessor/redeploy/RetryHandler.d.ts +0 -49
- package/dist/postprocessor/redeploy/RetryHandler.js +0 -118
- package/dist/processors/implementations/session-capture-processor.d.ts +0 -14
- package/dist/processors/implementations/session-capture-processor.js +0 -37
- package/dist/public/XrayService.d.ts +0 -17
- package/dist/public/XrayService.js +0 -40
- package/dist/public/index.d.ts +0 -4
- package/dist/public/index.js +0 -2
- package/dist/security/comprehensive-security-audit.d.ts +0 -157
- package/dist/security/comprehensive-security-audit.js +0 -1004
- package/dist/security/index.d.ts +0 -13
- package/dist/security/index.js +0 -13
- package/dist/security/security-agent-coordinator.d.ts +0 -71
- package/dist/security/security-agent-coordinator.js +0 -203
- package/dist/security/security-hardening-system.d.ts +0 -238
- package/dist/security/security-hardening-system.js +0 -726
- package/dist/security/security-orchestration-layer.d.ts +0 -118
- package/dist/security/security-orchestration-layer.js +0 -495
- package/dist/testing/memory-regression-suite.d.ts +0 -105
- package/dist/testing/memory-regression-suite.js +0 -258
- package/dist/tools/assess-complexity-tool.d.ts +0 -28
- package/dist/tools/assess-complexity-tool.js +0 -44
- package/dist/tools/query-routing-tool.d.ts +0 -17
- package/dist/tools/query-routing-tool.js +0 -59
- package/dist/utils/batch-operations.d.ts +0 -25
- package/dist/utils/batch-operations.js +0 -292
- package/dist/utils/task-graph.d.ts +0 -29
- package/dist/utils/task-graph.js +0 -106
- package/dist/utils/test-template-generator.d.ts +0 -25
- package/dist/utils/test-template-generator.js +0 -178
- package/dist/utils/token-manager.d.ts +0 -48
- package/dist/utils/token-manager.js +0 -163
- package/dist/validation/agent-config-validator.d.ts +0 -110
- package/dist/validation/agent-config-validator.js +0 -280
- package/dist/validation/orchestration-flow-validator.d.ts +0 -87
- package/dist/validation/orchestration-flow-validator.js +0 -606
- package/src/mcps/connection/connection-manager.ts +0 -91
- package/src/mcps/index.ts +0 -80
- package/src/mcps/orchestrator/index.ts +0 -29
|
@@ -1,1004 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 0xRay Comprehensive Security Audit System
|
|
3
|
-
*
|
|
4
|
-
* Multi-agent security audit system with vulnerability scanning,
|
|
5
|
-
* automated remediation, compliance checking, and weighted voting
|
|
6
|
-
* for architectural decisions.
|
|
7
|
-
*
|
|
8
|
-
*/
|
|
9
|
-
import { readFileSync, readdirSync, statSync, writeFileSync } from "fs";
|
|
10
|
-
import { join } from "path";
|
|
11
|
-
import { frameworkLogger } from "../core/framework-logger.js";
|
|
12
|
-
export class ComprehensiveSecurityAuditSystem {
|
|
13
|
-
config;
|
|
14
|
-
vulnerabilities = [];
|
|
15
|
-
architecturalDecisions = [];
|
|
16
|
-
agentVotes = new Map();
|
|
17
|
-
severityWeights = {
|
|
18
|
-
critical: 20,
|
|
19
|
-
high: 10,
|
|
20
|
-
medium: 5,
|
|
21
|
-
low: 2,
|
|
22
|
-
info: 0,
|
|
23
|
-
};
|
|
24
|
-
defaultAgentWeights = {
|
|
25
|
-
"security-auditor": 0.35,
|
|
26
|
-
"code-analyzer": 0.30,
|
|
27
|
-
"testing-lead": 0.20,
|
|
28
|
-
"architect": 0.15,
|
|
29
|
-
};
|
|
30
|
-
dangerousPatterns = [
|
|
31
|
-
{
|
|
32
|
-
pattern: /eval\s*\(/g,
|
|
33
|
-
severity: "critical",
|
|
34
|
-
category: "injection",
|
|
35
|
-
cwe: "CWE-95",
|
|
36
|
-
owasp: "A03:2021-Injection",
|
|
37
|
-
title: "Code Injection via eval()",
|
|
38
|
-
impact: "Arbitrary code execution possible",
|
|
39
|
-
recommendation: "Avoid eval(). Use safer alternatives like JSON.parse() for data",
|
|
40
|
-
autoRemediation: {
|
|
41
|
-
action: "Replace eval() with safe alternative",
|
|
42
|
-
automated: false,
|
|
43
|
-
estimatedEffort: "medium",
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
pattern: /Function\s*\(/g,
|
|
48
|
-
severity: "critical",
|
|
49
|
-
category: "injection",
|
|
50
|
-
cwe: "CWE-95",
|
|
51
|
-
owasp: "A03:2021-Injection",
|
|
52
|
-
title: "Dynamic Function Creation",
|
|
53
|
-
impact: "Arbitrary code execution possible",
|
|
54
|
-
recommendation: "Use direct function calls instead of dynamic construction",
|
|
55
|
-
autoRemediation: {
|
|
56
|
-
action: "Replace Function() with named function",
|
|
57
|
-
automated: false,
|
|
58
|
-
estimatedEffort: "medium",
|
|
59
|
-
},
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
pattern: /child_process\.exec\s*\(/g,
|
|
63
|
-
severity: "critical",
|
|
64
|
-
category: "injection",
|
|
65
|
-
cwe: "CWE-78",
|
|
66
|
-
owasp: "A03:2021-Injection",
|
|
67
|
-
title: "Command Injection via exec()",
|
|
68
|
-
impact: "OS command injection possible",
|
|
69
|
-
recommendation: "Use execFile() with validated arguments or avoid shell commands",
|
|
70
|
-
autoRemediation: {
|
|
71
|
-
action: "Replace exec() with execFile()",
|
|
72
|
-
automated: false,
|
|
73
|
-
estimatedEffort: "low",
|
|
74
|
-
},
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
pattern: /child_process\.spawn\s*\(/g,
|
|
78
|
-
severity: "high",
|
|
79
|
-
category: "injection",
|
|
80
|
-
cwe: "CWE-78",
|
|
81
|
-
owasp: "A03:2021-Injection",
|
|
82
|
-
title: "Potential Command Injection via spawn()",
|
|
83
|
-
impact: "Shell injection possible with user input",
|
|
84
|
-
recommendation: "Validate all spawn arguments, avoid shell: true",
|
|
85
|
-
autoRemediation: {
|
|
86
|
-
action: "Add argument validation",
|
|
87
|
-
automated: false,
|
|
88
|
-
estimatedEffort: "low",
|
|
89
|
-
},
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
pattern: /execSync\s*\(/g,
|
|
93
|
-
severity: "high",
|
|
94
|
-
category: "injection",
|
|
95
|
-
cwe: "CWE-78",
|
|
96
|
-
owasp: "A03:2021-Injection",
|
|
97
|
-
title: "Command Injection via execSync()",
|
|
98
|
-
impact: "Synchronous OS command injection",
|
|
99
|
-
recommendation: "Use execFileSync() or avoid shell execution",
|
|
100
|
-
autoRemediation: {
|
|
101
|
-
action: "Replace execSync() with execFileSync()",
|
|
102
|
-
automated: false,
|
|
103
|
-
estimatedEffort: "low",
|
|
104
|
-
},
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
pattern: /password\s*[:=]\s*['"][^'"]+['"]/gi,
|
|
108
|
-
severity: "high",
|
|
109
|
-
category: "sensitive-data-exposure",
|
|
110
|
-
cwe: "CWE-798",
|
|
111
|
-
owasp: "A02:2021-Cryptographic Failures",
|
|
112
|
-
title: "Hardcoded Password Detected",
|
|
113
|
-
impact: "Credentials exposed in source code",
|
|
114
|
-
recommendation: "Use environment variables or secure secret management",
|
|
115
|
-
autoRemediation: {
|
|
116
|
-
action: "Move to environment variable",
|
|
117
|
-
automated: true,
|
|
118
|
-
estimatedEffort: "low",
|
|
119
|
-
},
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
pattern: /api[_-]?key\s*[:=]\s*['"][^'"]+['"]/gi,
|
|
123
|
-
severity: "high",
|
|
124
|
-
category: "sensitive-data-exposure",
|
|
125
|
-
cwe: "CWE-798",
|
|
126
|
-
owasp: "A02:2021-Cryptographic Failures",
|
|
127
|
-
title: "Hardcoded API Key Detected",
|
|
128
|
-
impact: "API keys exposed in source code",
|
|
129
|
-
recommendation: "Use environment variables or secure vault",
|
|
130
|
-
autoRemediation: {
|
|
131
|
-
action: "Move to environment variable",
|
|
132
|
-
automated: true,
|
|
133
|
-
estimatedEffort: "low",
|
|
134
|
-
},
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
pattern: /secret\s*[:=]\s*['"][^'"]+['"]/gi,
|
|
138
|
-
severity: "high",
|
|
139
|
-
category: "sensitive-data-exposure",
|
|
140
|
-
cwe: "CWE-798",
|
|
141
|
-
owasp: "A02:2021-Cryptographic Failures",
|
|
142
|
-
title: "Hardcoded Secret Detected",
|
|
143
|
-
impact: "Secrets exposed in source code",
|
|
144
|
-
recommendation: "Use secure secret management solution",
|
|
145
|
-
autoRemediation: {
|
|
146
|
-
action: "Move to secure vault",
|
|
147
|
-
automated: true,
|
|
148
|
-
estimatedEffort: "low",
|
|
149
|
-
},
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
pattern: /token\s*[:=]\s*['"][^'"]+['"]/gi,
|
|
153
|
-
severity: "medium",
|
|
154
|
-
category: "sensitive-data-exposure",
|
|
155
|
-
cwe: "CWE-798",
|
|
156
|
-
owasp: "A02:2021-Cryptographic Failures",
|
|
157
|
-
title: "Hardcoded Token Detected",
|
|
158
|
-
impact: "Tokens exposed in source code",
|
|
159
|
-
recommendation: "Use secure token storage or environment variables",
|
|
160
|
-
autoRemediation: {
|
|
161
|
-
action: "Move to environment variable",
|
|
162
|
-
automated: true,
|
|
163
|
-
estimatedEffort: "low",
|
|
164
|
-
},
|
|
165
|
-
},
|
|
166
|
-
{
|
|
167
|
-
pattern: /Math\.random\s*\(/g,
|
|
168
|
-
severity: "medium",
|
|
169
|
-
category: "cryptography",
|
|
170
|
-
cwe: "CWE-338",
|
|
171
|
-
owasp: "A02:2021-Cryptographic Failures",
|
|
172
|
-
title: "Weak Random Number Generation",
|
|
173
|
-
impact: "Predictable random values for security-sensitive operations",
|
|
174
|
-
recommendation: "Use crypto.randomBytes() or crypto.randomUUID()",
|
|
175
|
-
autoRemediation: {
|
|
176
|
-
action: "Replace with crypto.randomBytes()",
|
|
177
|
-
automated: true,
|
|
178
|
-
estimatedEffort: "low",
|
|
179
|
-
},
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
pattern: /md5\s*\(/gi,
|
|
183
|
-
severity: "high",
|
|
184
|
-
category: "cryptography",
|
|
185
|
-
cwe: "CWE-328",
|
|
186
|
-
owasp: "A02:2021-Cryptographic Failures",
|
|
187
|
-
title: "Weak Hashing Algorithm (MD5)",
|
|
188
|
-
impact: "MD5 is cryptographically broken",
|
|
189
|
-
recommendation: "Use SHA-256+ or bcrypt/argon2 for passwords",
|
|
190
|
-
autoRemediation: {
|
|
191
|
-
action: "Replace with SHA-256 or bcrypt",
|
|
192
|
-
automated: false,
|
|
193
|
-
estimatedEffort: "medium",
|
|
194
|
-
},
|
|
195
|
-
},
|
|
196
|
-
{
|
|
197
|
-
pattern: /sha1\s*\(/gi,
|
|
198
|
-
severity: "medium",
|
|
199
|
-
category: "cryptography",
|
|
200
|
-
cwe: "CWE-328",
|
|
201
|
-
owasp: "A02:2021-Cryptographic Failures",
|
|
202
|
-
title: "Weak Hashing Algorithm (SHA-1)",
|
|
203
|
-
impact: "SHA-1 is deprecated for security purposes",
|
|
204
|
-
recommendation: "Use SHA-256+ or bcrypt/argon2 for passwords",
|
|
205
|
-
autoRemediation: {
|
|
206
|
-
action: "Replace with SHA-256 or bcrypt",
|
|
207
|
-
automated: false,
|
|
208
|
-
estimatedEffort: "medium",
|
|
209
|
-
},
|
|
210
|
-
},
|
|
211
|
-
{
|
|
212
|
-
pattern: /console\.log\s*\([^)]*(password|secret|token|key)[^)]*\)/gi,
|
|
213
|
-
severity: "high",
|
|
214
|
-
category: "data-protection",
|
|
215
|
-
cwe: "CWE-532",
|
|
216
|
-
owasp: "A09:2021-Security Logging and Monitoring Failures",
|
|
217
|
-
title: "Sensitive Data Logging",
|
|
218
|
-
impact: "Credentials exposed in logs",
|
|
219
|
-
recommendation: "Never log sensitive data. Redact or mask sensitive values",
|
|
220
|
-
autoRemediation: {
|
|
221
|
-
action: "Remove sensitive data from log statement",
|
|
222
|
-
automated: false,
|
|
223
|
-
estimatedEffort: "low",
|
|
224
|
-
},
|
|
225
|
-
},
|
|
226
|
-
{
|
|
227
|
-
pattern: /http:\/\//g,
|
|
228
|
-
severity: "high",
|
|
229
|
-
category: "data-protection",
|
|
230
|
-
cwe: "CWE-319",
|
|
231
|
-
owasp: "A02:2021-Cryptographic Failures",
|
|
232
|
-
title: "Insecure HTTP Connection",
|
|
233
|
-
impact: "Data transmitted in plaintext",
|
|
234
|
-
recommendation: "Use HTTPS for all external connections",
|
|
235
|
-
autoRemediation: {
|
|
236
|
-
action: "Replace http:// with https://",
|
|
237
|
-
automated: true,
|
|
238
|
-
estimatedEffort: "low",
|
|
239
|
-
},
|
|
240
|
-
},
|
|
241
|
-
{
|
|
242
|
-
pattern: /cors.*\*|CORS.*\*|allow-all/gi,
|
|
243
|
-
severity: "medium",
|
|
244
|
-
category: "security-misconfiguration",
|
|
245
|
-
cwe: "CWE-942",
|
|
246
|
-
owasp: "A05:2021-Security Misconfiguration",
|
|
247
|
-
title: "Overly Permissive CORS Configuration",
|
|
248
|
-
impact: "Any origin can access resources",
|
|
249
|
-
recommendation: "Specify allowed origins explicitly",
|
|
250
|
-
autoRemediation: {
|
|
251
|
-
action: "Configure specific allowed origins",
|
|
252
|
-
automated: false,
|
|
253
|
-
estimatedEffort: "low",
|
|
254
|
-
},
|
|
255
|
-
},
|
|
256
|
-
{
|
|
257
|
-
pattern: /DEBUG\s*[:=]\s*true/gi,
|
|
258
|
-
severity: "medium",
|
|
259
|
-
category: "security-misconfiguration",
|
|
260
|
-
cwe: "CWE-489",
|
|
261
|
-
owasp: "A05:2021-Security Misconfiguration",
|
|
262
|
-
title: "Debug Mode Enabled",
|
|
263
|
-
impact: "Sensitive information may be exposed",
|
|
264
|
-
recommendation: "Disable debug mode in production",
|
|
265
|
-
autoRemediation: {
|
|
266
|
-
action: "Disable DEBUG in production",
|
|
267
|
-
automated: true,
|
|
268
|
-
estimatedEffort: "low",
|
|
269
|
-
},
|
|
270
|
-
},
|
|
271
|
-
{
|
|
272
|
-
pattern: /\.\.[/\\]/,
|
|
273
|
-
severity: "high",
|
|
274
|
-
category: "injection",
|
|
275
|
-
cwe: "CWE-22",
|
|
276
|
-
owasp: "A01:2021-Broken Access Control",
|
|
277
|
-
title: "Potential Path Traversal",
|
|
278
|
-
impact: "Unauthorized file access possible",
|
|
279
|
-
recommendation: "Validate and sanitize all file paths. Use path.resolve()",
|
|
280
|
-
autoRemediation: {
|
|
281
|
-
action: "Add path validation",
|
|
282
|
-
automated: false,
|
|
283
|
-
estimatedEffort: "medium",
|
|
284
|
-
},
|
|
285
|
-
},
|
|
286
|
-
{
|
|
287
|
-
pattern: /path\.join\s*\(\s*.*,\s*.*\.\./g,
|
|
288
|
-
severity: "high",
|
|
289
|
-
category: "injection",
|
|
290
|
-
cwe: "CWE-22",
|
|
291
|
-
owasp: "A01:2021-Broken Access Control",
|
|
292
|
-
title: "Path Traversal via path.join()",
|
|
293
|
-
impact: "Directory traversal attack possible",
|
|
294
|
-
recommendation: "Validate paths and use allowlists",
|
|
295
|
-
autoRemediation: {
|
|
296
|
-
action: "Add path validation and sanitization",
|
|
297
|
-
automated: false,
|
|
298
|
-
estimatedEffort: "medium",
|
|
299
|
-
},
|
|
300
|
-
},
|
|
301
|
-
];
|
|
302
|
-
constructor(config) {
|
|
303
|
-
this.config = {
|
|
304
|
-
includeDependencies: true,
|
|
305
|
-
enableAutoRemediation: true,
|
|
306
|
-
enableWeightedVoting: true,
|
|
307
|
-
complianceStandards: ["owasp-top-10", "cwe"],
|
|
308
|
-
agentWeights: this.defaultAgentWeights,
|
|
309
|
-
...config,
|
|
310
|
-
scanDepth: config.scanDepth ?? "medium",
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
async runAudit() {
|
|
314
|
-
const startTime = Date.now();
|
|
315
|
-
const auditId = `security-audit-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
|
|
316
|
-
frameworkLogger.log("comprehensive-security-audit", "audit-start", "info", {
|
|
317
|
-
auditId,
|
|
318
|
-
projectPath: this.config.projectPath,
|
|
319
|
-
config: this.config,
|
|
320
|
-
});
|
|
321
|
-
const files = this.getProjectFiles();
|
|
322
|
-
this.vulnerabilities = [];
|
|
323
|
-
for (const file of files) {
|
|
324
|
-
const fileVulns = await this.auditFile(file);
|
|
325
|
-
this.vulnerabilities.push(...fileVulns);
|
|
326
|
-
}
|
|
327
|
-
if (this.config.includeDependencies) {
|
|
328
|
-
this.vulnerabilities.push(...this.auditDependencies());
|
|
329
|
-
}
|
|
330
|
-
const complianceResults = this.checkCompliance();
|
|
331
|
-
const remediation = this.generateRemediationPlan();
|
|
332
|
-
if (this.config.enableWeightedVoting) {
|
|
333
|
-
await this.collectAgentVotes();
|
|
334
|
-
this.resolveArchitecturalDecisions();
|
|
335
|
-
}
|
|
336
|
-
const report = {
|
|
337
|
-
metadata: {
|
|
338
|
-
auditId,
|
|
339
|
-
timestamp: new Date(),
|
|
340
|
-
projectPath: this.config.projectPath,
|
|
341
|
-
totalFilesScanned: files.length,
|
|
342
|
-
duration: Date.now() - startTime,
|
|
343
|
-
},
|
|
344
|
-
summary: this.calculateSummary(),
|
|
345
|
-
vulnerabilities: this.vulnerabilities,
|
|
346
|
-
compliance: complianceResults,
|
|
347
|
-
remediation,
|
|
348
|
-
architecturalDecisions: this.architecturalDecisions,
|
|
349
|
-
agentConsensus: this.config.enableWeightedVoting
|
|
350
|
-
? this.calculateAgentConsensus()
|
|
351
|
-
: undefined,
|
|
352
|
-
};
|
|
353
|
-
if (this.config.outputPath) {
|
|
354
|
-
this.saveReport(report);
|
|
355
|
-
}
|
|
356
|
-
frameworkLogger.log("comprehensive-security-audit", "audit-complete", "info", {
|
|
357
|
-
auditId,
|
|
358
|
-
totalVulnerabilities: this.vulnerabilities.length,
|
|
359
|
-
securityScore: report.summary.securityScore,
|
|
360
|
-
});
|
|
361
|
-
return report;
|
|
362
|
-
}
|
|
363
|
-
getProjectFiles() {
|
|
364
|
-
const files = [];
|
|
365
|
-
const skipDirs = [
|
|
366
|
-
"node_modules",
|
|
367
|
-
".git",
|
|
368
|
-
"dist",
|
|
369
|
-
"build",
|
|
370
|
-
".next",
|
|
371
|
-
".nuxt",
|
|
372
|
-
"coverage",
|
|
373
|
-
".opencode",
|
|
374
|
-
"var",
|
|
375
|
-
"ci-test-env",
|
|
376
|
-
];
|
|
377
|
-
const traverse = (dir) => {
|
|
378
|
-
try {
|
|
379
|
-
const items = readdirSync(dir);
|
|
380
|
-
for (const item of items) {
|
|
381
|
-
const fullPath = join(dir, item);
|
|
382
|
-
const stat = statSync(fullPath);
|
|
383
|
-
if (stat.isDirectory()) {
|
|
384
|
-
if (!skipDirs.includes(item) && !item.startsWith(".")) {
|
|
385
|
-
traverse(fullPath);
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
else if (stat.isFile()) {
|
|
389
|
-
const ext = item.slice(item.lastIndexOf("."));
|
|
390
|
-
if ([".ts", ".tsx", ".js", ".jsx", ".json"].includes(ext)) {
|
|
391
|
-
files.push(fullPath);
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
catch {
|
|
397
|
-
// Skip inaccessible directories
|
|
398
|
-
}
|
|
399
|
-
};
|
|
400
|
-
traverse(this.config.projectPath);
|
|
401
|
-
return files;
|
|
402
|
-
}
|
|
403
|
-
async auditFile(filePath) {
|
|
404
|
-
const vulnerabilities = [];
|
|
405
|
-
try {
|
|
406
|
-
const content = readFileSync(filePath, "utf-8");
|
|
407
|
-
const lines = content.split("\n");
|
|
408
|
-
for (let i = 0; i < lines.length; i++) {
|
|
409
|
-
const line = lines[i];
|
|
410
|
-
if (!line)
|
|
411
|
-
continue;
|
|
412
|
-
for (const rule of this.dangerousPatterns) {
|
|
413
|
-
if (rule.pattern.test(line)) {
|
|
414
|
-
const vuln = this.createVulnerability(rule, filePath, i + 1, line);
|
|
415
|
-
if (!this.isFalsePositive(vuln, filePath)) {
|
|
416
|
-
vulnerabilities.push(vuln);
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
vulnerabilities.push(...this.auditImports(content, filePath));
|
|
422
|
-
}
|
|
423
|
-
catch {
|
|
424
|
-
// Skip files that can't be read
|
|
425
|
-
}
|
|
426
|
-
return vulnerabilities;
|
|
427
|
-
}
|
|
428
|
-
createVulnerability(rule, filePath, line, codeSnippet) {
|
|
429
|
-
return {
|
|
430
|
-
id: `VULN-${rule.category}-${filePath}-${line}`,
|
|
431
|
-
title: rule.title,
|
|
432
|
-
severity: rule.severity,
|
|
433
|
-
category: rule.category,
|
|
434
|
-
cwe: rule.cwe,
|
|
435
|
-
owasp: rule.owasp,
|
|
436
|
-
file: filePath,
|
|
437
|
-
line,
|
|
438
|
-
description: `Pattern detected: ${rule.title}`,
|
|
439
|
-
impact: rule.impact,
|
|
440
|
-
recommendation: rule.recommendation,
|
|
441
|
-
codeSnippet: codeSnippet.trim(),
|
|
442
|
-
confidence: 85,
|
|
443
|
-
autoRemediation: rule.autoRemediation
|
|
444
|
-
? [
|
|
445
|
-
{
|
|
446
|
-
step: 1,
|
|
447
|
-
action: rule.autoRemediation.action,
|
|
448
|
-
code: rule.autoRemediation.code,
|
|
449
|
-
file: filePath,
|
|
450
|
-
line,
|
|
451
|
-
estimatedEffort: rule.autoRemediation.estimatedEffort,
|
|
452
|
-
automated: rule.autoRemediation.automated,
|
|
453
|
-
},
|
|
454
|
-
]
|
|
455
|
-
: undefined,
|
|
456
|
-
};
|
|
457
|
-
}
|
|
458
|
-
isFalsePositive(vuln, filePath) {
|
|
459
|
-
if (filePath.includes("security-auditor") && vuln.category === "injection") {
|
|
460
|
-
return true;
|
|
461
|
-
}
|
|
462
|
-
if (filePath.includes("__tests__")) {
|
|
463
|
-
return true;
|
|
464
|
-
}
|
|
465
|
-
if (vuln.codeSnippet.includes("'eval(')") || vuln.codeSnippet.includes('"eval(')) {
|
|
466
|
-
return true;
|
|
467
|
-
}
|
|
468
|
-
return false;
|
|
469
|
-
}
|
|
470
|
-
auditImports(content, filePath) {
|
|
471
|
-
const vulnerabilities = [];
|
|
472
|
-
const dangerousImports = ["crypto", "tls", "cluster", "worker_threads", "vm"];
|
|
473
|
-
for (const imp of dangerousImports) {
|
|
474
|
-
const patterns = [
|
|
475
|
-
new RegExp(`import.*from.*['"]${imp}['"]`),
|
|
476
|
-
new RegExp(`require\\s*\\(\\s*['"]${imp}['"]\\s*\\)`),
|
|
477
|
-
];
|
|
478
|
-
for (const pattern of patterns) {
|
|
479
|
-
if (pattern.test(content)) {
|
|
480
|
-
vulnerabilities.push({
|
|
481
|
-
id: `IMP-${imp}-${filePath}`,
|
|
482
|
-
title: `Dangerous Import: ${imp}`,
|
|
483
|
-
severity: "info",
|
|
484
|
-
category: "security-misconfiguration",
|
|
485
|
-
cwe: "CWE-350",
|
|
486
|
-
file: filePath,
|
|
487
|
-
line: 1,
|
|
488
|
-
description: `Import of sensitive module: ${imp}`,
|
|
489
|
-
impact: "Module usage should be reviewed for security implications",
|
|
490
|
-
recommendation: "Ensure proper access controls and validation when using this module",
|
|
491
|
-
codeSnippet: content.match(pattern)?.[0] || "",
|
|
492
|
-
confidence: 70,
|
|
493
|
-
});
|
|
494
|
-
break;
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
return vulnerabilities;
|
|
499
|
-
}
|
|
500
|
-
auditDependencies() {
|
|
501
|
-
const vulnerabilities = [];
|
|
502
|
-
try {
|
|
503
|
-
const packagePath = join(this.config.projectPath, "package.json");
|
|
504
|
-
const packageJson = JSON.parse(readFileSync(packagePath, "utf-8"));
|
|
505
|
-
const allDeps = {
|
|
506
|
-
...packageJson.dependencies,
|
|
507
|
-
...packageJson.devDependencies,
|
|
508
|
-
};
|
|
509
|
-
for (const [dep, version] of Object.entries(allDeps)) {
|
|
510
|
-
if (typeof version === "string" && (version === "*" || version === "latest")) {
|
|
511
|
-
vulnerabilities.push({
|
|
512
|
-
id: `DEP-${dep}`,
|
|
513
|
-
title: `Unpinned Dependency: ${dep}`,
|
|
514
|
-
severity: "medium",
|
|
515
|
-
category: "dependency-vulnerability",
|
|
516
|
-
cwe: "CWE-1104",
|
|
517
|
-
file: packagePath,
|
|
518
|
-
line: 1,
|
|
519
|
-
description: `Dependency version not pinned: ${dep}`,
|
|
520
|
-
impact: "May receive vulnerable updates without review",
|
|
521
|
-
recommendation: "Pin to specific version range for reproducibility",
|
|
522
|
-
codeSnippet: `${dep}: "${version}"`,
|
|
523
|
-
confidence: 90,
|
|
524
|
-
});
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
catch {
|
|
529
|
-
// Skip if package.json not found
|
|
530
|
-
}
|
|
531
|
-
return vulnerabilities;
|
|
532
|
-
}
|
|
533
|
-
checkCompliance() {
|
|
534
|
-
const results = [];
|
|
535
|
-
const standards = this.config.complianceStandards ?? ["owasp-top-10", "cwe"];
|
|
536
|
-
for (const standard of standards) {
|
|
537
|
-
results.push(this.evaluateStandard(standard));
|
|
538
|
-
}
|
|
539
|
-
return results;
|
|
540
|
-
}
|
|
541
|
-
evaluateStandard(standard) {
|
|
542
|
-
const vulnsByCategory = this.groupByCategory();
|
|
543
|
-
switch (standard) {
|
|
544
|
-
case "owasp-top-10":
|
|
545
|
-
return this.evaluateOWASP(vulnsByCategory);
|
|
546
|
-
case "cwe":
|
|
547
|
-
return this.evaluateCWE();
|
|
548
|
-
case "nist":
|
|
549
|
-
return this.evaluateNIST();
|
|
550
|
-
case "iso-27001":
|
|
551
|
-
return this.evaluateISO27001();
|
|
552
|
-
case "pci-dss":
|
|
553
|
-
return this.evaluatePCIDSS();
|
|
554
|
-
default:
|
|
555
|
-
return {
|
|
556
|
-
standard,
|
|
557
|
-
passed: true,
|
|
558
|
-
score: 100,
|
|
559
|
-
findings: [],
|
|
560
|
-
recommendations: [],
|
|
561
|
-
};
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
evaluateOWASP(vulnsByCategory) {
|
|
565
|
-
const owaspChecks = {
|
|
566
|
-
"A01:2021-Broken Access Control": ["authorization", "injection"],
|
|
567
|
-
"A02:2021-Cryptographic Failures": ["cryptography", "sensitive-data-exposure"],
|
|
568
|
-
"A03:2021-Injection": ["injection", "input-validation"],
|
|
569
|
-
"A04:2021-Insecure Design": ["configuration"],
|
|
570
|
-
"A05:2021-Security Misconfiguration": ["security-misconfiguration"],
|
|
571
|
-
"A06:2021-Vulnerable Components": ["dependency-vulnerability"],
|
|
572
|
-
"A07:2021-Authentication Failures": ["authentication"],
|
|
573
|
-
"A08:2021-Software Integrity Failures": ["dependency-vulnerability"],
|
|
574
|
-
"A09:2021-Security Logging Failures": ["data-protection"],
|
|
575
|
-
"A10:2021-SSRF": ["injection"],
|
|
576
|
-
};
|
|
577
|
-
const findings = [];
|
|
578
|
-
let totalChecks = Object.keys(owaspChecks).length;
|
|
579
|
-
let passedChecks = 0;
|
|
580
|
-
for (const [owaspId, categories] of Object.entries(owaspChecks)) {
|
|
581
|
-
const hasVulns = categories.some((cat) => vulnsByCategory[cat] && vulnsByCategory[cat].length > 0);
|
|
582
|
-
if (!hasVulns) {
|
|
583
|
-
passedChecks++;
|
|
584
|
-
}
|
|
585
|
-
else {
|
|
586
|
-
findings.push(...categories.flatMap((cat) => vulnsByCategory[cat] || []));
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
const score = Math.round((passedChecks / totalChecks) * 100);
|
|
590
|
-
const passed = score >= 80;
|
|
591
|
-
return {
|
|
592
|
-
standard: "owasp-top-10",
|
|
593
|
-
passed,
|
|
594
|
-
score,
|
|
595
|
-
findings: [...new Set(findings)],
|
|
596
|
-
recommendations: passed
|
|
597
|
-
? []
|
|
598
|
-
: ["Address vulnerabilities to improve OWASP Top 10 compliance"],
|
|
599
|
-
};
|
|
600
|
-
}
|
|
601
|
-
evaluateCWE() {
|
|
602
|
-
const criticalCWEs = [
|
|
603
|
-
"CWE-78", // OS Command Injection
|
|
604
|
-
"CWE-89", // SQL Injection
|
|
605
|
-
"CWE-95", // Code Injection
|
|
606
|
-
"CWE-79", // XSS
|
|
607
|
-
"CWE-306", // Missing Authentication
|
|
608
|
-
"CWE-862", // Missing Authorization
|
|
609
|
-
"CWE-798", // Hardcoded Credentials
|
|
610
|
-
];
|
|
611
|
-
const criticalVulns = this.vulnerabilities.filter((v) => v.severity === "critical" && criticalCWEs.includes(v.cwe));
|
|
612
|
-
const score = Math.max(0, 100 - criticalVulns.length * 20);
|
|
613
|
-
const passed = criticalVulns.length === 0;
|
|
614
|
-
return {
|
|
615
|
-
standard: "cwe",
|
|
616
|
-
passed,
|
|
617
|
-
score,
|
|
618
|
-
findings: criticalVulns,
|
|
619
|
-
recommendations: criticalVulns.length > 0
|
|
620
|
-
? ["Address critical CWE vulnerabilities immediately"]
|
|
621
|
-
: [],
|
|
622
|
-
};
|
|
623
|
-
}
|
|
624
|
-
evaluateNIST() {
|
|
625
|
-
const findings = this.vulnerabilities.filter((v) => v.severity === "critical" || v.severity === "high");
|
|
626
|
-
const score = Math.max(0, 100 - findings.filter((v) => v.severity === "critical").length * 15 -
|
|
627
|
-
findings.filter((v) => v.severity === "high").length * 5);
|
|
628
|
-
return {
|
|
629
|
-
standard: "nist",
|
|
630
|
-
passed: score >= 70,
|
|
631
|
-
score,
|
|
632
|
-
findings,
|
|
633
|
-
recommendations: findings.length > 0
|
|
634
|
-
? ["Prioritize critical and high severity issues for NIST compliance"]
|
|
635
|
-
: [],
|
|
636
|
-
};
|
|
637
|
-
}
|
|
638
|
-
evaluateISO27001() {
|
|
639
|
-
const securityControls = {
|
|
640
|
-
accessControl: this.vulnerabilities.filter((v) => v.category === "authentication" || v.category === "authorization"),
|
|
641
|
-
cryptography: this.vulnerabilities.filter((v) => v.category === "cryptography"),
|
|
642
|
-
dataProtection: this.vulnerabilities.filter((v) => v.category === "sensitive-data-exposure"),
|
|
643
|
-
};
|
|
644
|
-
const controlScores = Object.values(securityControls).map((vulns) => Math.max(0, 100 - vulns.length * 10));
|
|
645
|
-
const score = Math.round(controlScores.reduce((a, b) => a + b, 0) / controlScores.length);
|
|
646
|
-
return {
|
|
647
|
-
standard: "iso-27001",
|
|
648
|
-
passed: score >= 80,
|
|
649
|
-
score,
|
|
650
|
-
findings: Object.values(securityControls).flat(),
|
|
651
|
-
recommendations: score < 80
|
|
652
|
-
? ["Strengthen security controls for ISO 27001 compliance"]
|
|
653
|
-
: [],
|
|
654
|
-
};
|
|
655
|
-
}
|
|
656
|
-
evaluatePCIDSS() {
|
|
657
|
-
const pciVulns = this.vulnerabilities.filter((v) => v.category === "cryptography" ||
|
|
658
|
-
v.category === "sensitive-data-exposure" ||
|
|
659
|
-
v.severity === "critical");
|
|
660
|
-
const score = Math.max(0, 100 - pciVulns.length * 10);
|
|
661
|
-
return {
|
|
662
|
-
standard: "pci-dss",
|
|
663
|
-
passed: score >= 90,
|
|
664
|
-
score,
|
|
665
|
-
findings: pciVulns,
|
|
666
|
-
recommendations: score < 90
|
|
667
|
-
? [
|
|
668
|
-
"Critical security issues must be resolved for PCI DSS compliance",
|
|
669
|
-
]
|
|
670
|
-
: [],
|
|
671
|
-
};
|
|
672
|
-
}
|
|
673
|
-
groupByCategory() {
|
|
674
|
-
return this.vulnerabilities.reduce((acc, vuln) => {
|
|
675
|
-
if (!acc[vuln.category]) {
|
|
676
|
-
acc[vuln.category] = [];
|
|
677
|
-
}
|
|
678
|
-
acc[vuln.category].push(vuln);
|
|
679
|
-
return acc;
|
|
680
|
-
}, {});
|
|
681
|
-
}
|
|
682
|
-
generateRemediationPlan() {
|
|
683
|
-
const automatable = [];
|
|
684
|
-
const manualRequired = [];
|
|
685
|
-
for (const vuln of this.vulnerabilities) {
|
|
686
|
-
if (vuln.autoRemediation?.[0]?.automated) {
|
|
687
|
-
automatable.push(vuln);
|
|
688
|
-
}
|
|
689
|
-
else {
|
|
690
|
-
manualRequired.push(vuln);
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
const prioritizedFixes = this.prioritizeFixes([
|
|
694
|
-
...automatable,
|
|
695
|
-
...manualRequired,
|
|
696
|
-
]);
|
|
697
|
-
const totalTime = this.estimateFixTime(prioritizedFixes);
|
|
698
|
-
return {
|
|
699
|
-
totalIssues: this.vulnerabilities.length,
|
|
700
|
-
automatable: automatable.length,
|
|
701
|
-
manualRequired: manualRequired.length,
|
|
702
|
-
estimatedFixTime: totalTime,
|
|
703
|
-
prioritizedFixes,
|
|
704
|
-
};
|
|
705
|
-
}
|
|
706
|
-
prioritizeFixes(vulnerabilities) {
|
|
707
|
-
const severityPriority = {
|
|
708
|
-
critical: 1,
|
|
709
|
-
high: 2,
|
|
710
|
-
medium: 3,
|
|
711
|
-
low: 4,
|
|
712
|
-
info: 5,
|
|
713
|
-
};
|
|
714
|
-
const plans = vulnerabilities.map((vuln) => ({
|
|
715
|
-
vulnerabilityId: vuln.id,
|
|
716
|
-
title: vuln.title,
|
|
717
|
-
severity: vuln.severity,
|
|
718
|
-
priority: severityPriority[vuln.severity],
|
|
719
|
-
steps: vuln.autoRemediation || [],
|
|
720
|
-
dependencies: [],
|
|
721
|
-
estimatedTime: this.estimateFixTimeForVuln(vuln),
|
|
722
|
-
}));
|
|
723
|
-
return plans.sort((a, b) => a.priority - b.priority);
|
|
724
|
-
}
|
|
725
|
-
estimateFixTime(vulnerabilities) {
|
|
726
|
-
let totalMinutes = 0;
|
|
727
|
-
for (const plan of vulnerabilities) {
|
|
728
|
-
switch (plan.estimatedTime) {
|
|
729
|
-
case "15 minutes":
|
|
730
|
-
totalMinutes += 15;
|
|
731
|
-
break;
|
|
732
|
-
case "1 hour":
|
|
733
|
-
totalMinutes += 60;
|
|
734
|
-
break;
|
|
735
|
-
case "4 hours":
|
|
736
|
-
totalMinutes += 240;
|
|
737
|
-
break;
|
|
738
|
-
default:
|
|
739
|
-
totalMinutes += 30;
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
if (totalMinutes < 60) {
|
|
743
|
-
return `${totalMinutes} minutes`;
|
|
744
|
-
}
|
|
745
|
-
else if (totalMinutes < 480) {
|
|
746
|
-
return `${Math.round(totalMinutes / 60)} hours`;
|
|
747
|
-
}
|
|
748
|
-
else {
|
|
749
|
-
return `${Math.round(totalMinutes / 480)} days`;
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
estimateFixTimeForVuln(vuln) {
|
|
753
|
-
const effort = vuln.autoRemediation?.[0]?.estimatedEffort;
|
|
754
|
-
switch (effort) {
|
|
755
|
-
case "low":
|
|
756
|
-
return "15 minutes";
|
|
757
|
-
case "medium":
|
|
758
|
-
return "1 hour";
|
|
759
|
-
case "high":
|
|
760
|
-
return "4 hours";
|
|
761
|
-
default:
|
|
762
|
-
return "30 minutes";
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
calculateSummary() {
|
|
766
|
-
const bySeverity = {
|
|
767
|
-
critical: 0,
|
|
768
|
-
high: 0,
|
|
769
|
-
medium: 0,
|
|
770
|
-
low: 0,
|
|
771
|
-
info: 0,
|
|
772
|
-
};
|
|
773
|
-
const byCategory = {
|
|
774
|
-
injection: 0,
|
|
775
|
-
authentication: 0,
|
|
776
|
-
authorization: 0,
|
|
777
|
-
cryptography: 0,
|
|
778
|
-
configuration: 0,
|
|
779
|
-
"data-protection": 0,
|
|
780
|
-
"input-validation": 0,
|
|
781
|
-
"sensitive-data-exposure": 0,
|
|
782
|
-
"security-misconfiguration": 0,
|
|
783
|
-
"dependency-vulnerability": 0,
|
|
784
|
-
};
|
|
785
|
-
for (const vuln of this.vulnerabilities) {
|
|
786
|
-
bySeverity[vuln.severity]++;
|
|
787
|
-
byCategory[vuln.category]++;
|
|
788
|
-
}
|
|
789
|
-
let securityScore = 100;
|
|
790
|
-
for (const [severity, count] of Object.entries(bySeverity)) {
|
|
791
|
-
securityScore -= this.severityWeights[severity] * count;
|
|
792
|
-
}
|
|
793
|
-
securityScore = Math.max(0, Math.min(100, securityScore));
|
|
794
|
-
const complianceScore = this.vulnerabilities.length === 0
|
|
795
|
-
? 100
|
|
796
|
-
: Math.max(0, 100 - this.vulnerabilities.filter((v) => v.severity === "critical").length * 15);
|
|
797
|
-
return {
|
|
798
|
-
totalVulnerabilities: this.vulnerabilities.length,
|
|
799
|
-
bySeverity,
|
|
800
|
-
byCategory,
|
|
801
|
-
securityScore,
|
|
802
|
-
complianceScore,
|
|
803
|
-
};
|
|
804
|
-
}
|
|
805
|
-
async collectAgentVotes() {
|
|
806
|
-
const agents = Object.keys(this.config.agentWeights || this.defaultAgentWeights);
|
|
807
|
-
for (const agent of agents) {
|
|
808
|
-
const vote = this.simulateAgentVote(agent);
|
|
809
|
-
this.agentVotes.set(agent, [vote]);
|
|
810
|
-
}
|
|
811
|
-
}
|
|
812
|
-
simulateAgentVote(agent) {
|
|
813
|
-
const highSevVulns = this.vulnerabilities.filter((v) => v.severity === "critical" || v.severity === "high");
|
|
814
|
-
const concerns = [];
|
|
815
|
-
for (const vuln of highSevVulns.slice(0, 3)) {
|
|
816
|
-
concerns.push(`Security concern: ${vuln.title}`);
|
|
817
|
-
}
|
|
818
|
-
const weight = this.config.agentWeights?.[agent] || this.defaultAgentWeights[agent] || 0.25;
|
|
819
|
-
let vote = "approve";
|
|
820
|
-
if (highSevVulns.length > 10) {
|
|
821
|
-
vote = "reject";
|
|
822
|
-
}
|
|
823
|
-
else if (highSevVulns.length > 5) {
|
|
824
|
-
vote = Math.random() > 0.5 ? "approve" : "abstain";
|
|
825
|
-
}
|
|
826
|
-
return {
|
|
827
|
-
agentId: `agent-${agent}`,
|
|
828
|
-
agentName: agent,
|
|
829
|
-
vote,
|
|
830
|
-
weight,
|
|
831
|
-
reasoning: `Security review by ${agent} with ${weight * 100}% weight`,
|
|
832
|
-
concerns: concerns.length > 0 ? concerns : undefined,
|
|
833
|
-
};
|
|
834
|
-
}
|
|
835
|
-
resolveArchitecturalDecisions() {
|
|
836
|
-
for (const [agent, votes] of this.agentVotes) {
|
|
837
|
-
const totalWeight = votes.reduce((sum, v) => sum + v.weight, 0);
|
|
838
|
-
const approvalWeight = votes
|
|
839
|
-
.filter((v) => v.vote === "approve")
|
|
840
|
-
.reduce((sum, v) => sum + v.weight, 0);
|
|
841
|
-
const decision = {
|
|
842
|
-
id: `decision-${agent}-${Date.now()}`,
|
|
843
|
-
title: `Security Architecture Decision for ${agent}`,
|
|
844
|
-
description: "Review of security measures and vulnerability handling",
|
|
845
|
-
proposedBy: agent,
|
|
846
|
-
votes,
|
|
847
|
-
finalDecision: approvalWeight / totalWeight >= 0.5 ? "approved" : "needs-revision",
|
|
848
|
-
approvedBy: votes.filter((v) => v.vote === "approve"),
|
|
849
|
-
rejectedBy: votes.filter((v) => v.vote === "reject"),
|
|
850
|
-
timestamp: new Date(),
|
|
851
|
-
};
|
|
852
|
-
this.architecturalDecisions.push(decision);
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
calculateAgentConsensus() {
|
|
856
|
-
const participatingAgents = Array.from(this.agentVotes.keys());
|
|
857
|
-
const allVotes = Array.from(this.agentVotes.values()).flat();
|
|
858
|
-
const approvalCount = allVotes.filter((v) => v.vote === "approve").length;
|
|
859
|
-
const totalVotes = allVotes.length;
|
|
860
|
-
const averageAgreement = totalVotes > 0 ? (approvalCount / totalVotes) * 100 : 0;
|
|
861
|
-
const contentiousVulns = this.vulnerabilities.filter((v) => v.severity === "critical" || v.severity === "high");
|
|
862
|
-
return {
|
|
863
|
-
participatingAgents,
|
|
864
|
-
averageAgreement: Math.round(averageAgreement),
|
|
865
|
-
contentiousIssues: contentiousVulns.slice(0, 10),
|
|
866
|
-
};
|
|
867
|
-
}
|
|
868
|
-
saveReport(report) {
|
|
869
|
-
const outputPath = this.config.outputPath || join(this.config.projectPath, "security-audit-report.json");
|
|
870
|
-
writeFileSync(outputPath, JSON.stringify(report, null, 2), "utf-8");
|
|
871
|
-
frameworkLogger.log("comprehensive-security-audit", "report-saved", "info", { outputPath });
|
|
872
|
-
}
|
|
873
|
-
generateMarkdownReport(report) {
|
|
874
|
-
let md = `# Security Audit Report
|
|
875
|
-
|
|
876
|
-
## Executive Summary
|
|
877
|
-
|
|
878
|
-
- **Audit ID**: ${report.metadata.auditId}
|
|
879
|
-
- **Timestamp**: ${report.metadata.timestamp.toISOString()}
|
|
880
|
-
- **Project Path**: ${report.metadata.projectPath}
|
|
881
|
-
- **Files Scanned**: ${report.metadata.totalFilesScanned}
|
|
882
|
-
- **Duration**: ${report.metadata.duration}ms
|
|
883
|
-
|
|
884
|
-
## Security Score
|
|
885
|
-
|
|
886
|
-
**${report.summary.securityScore}/100** ${this.getScoreEmoji(report.summary.securityScore)}
|
|
887
|
-
|
|
888
|
-
## Vulnerability Summary
|
|
889
|
-
|
|
890
|
-
| Severity | Count |
|
|
891
|
-
|----------|-------|
|
|
892
|
-
| Critical | ${report.summary.bySeverity.critical} |
|
|
893
|
-
| High | ${report.summary.bySeverity.high} |
|
|
894
|
-
| Medium | ${report.summary.bySeverity.medium} |
|
|
895
|
-
| Low | ${report.summary.bySeverity.low} |
|
|
896
|
-
| Info | ${report.summary.bySeverity.info} |
|
|
897
|
-
|
|
898
|
-
## Compliance Results
|
|
899
|
-
|
|
900
|
-
`;
|
|
901
|
-
for (const compliance of report.compliance) {
|
|
902
|
-
const status = compliance.passed ? "✅ PASS" : "❌ FAIL";
|
|
903
|
-
md += `### ${compliance.standard.toUpperCase()} - ${status}\n`;
|
|
904
|
-
md += `**Score**: ${compliance.score}/100\n\n`;
|
|
905
|
-
}
|
|
906
|
-
md += `## Detailed Findings\n\n`;
|
|
907
|
-
if (report.vulnerabilities.length === 0) {
|
|
908
|
-
md += "✅ No vulnerabilities found!\n\n";
|
|
909
|
-
}
|
|
910
|
-
else {
|
|
911
|
-
for (const vuln of report.vulnerabilities) {
|
|
912
|
-
md += `### ${this.getSeverityEmoji(vuln.severity)} ${vuln.title}\n\n`;
|
|
913
|
-
md += `- **Severity**: ${vuln.severity.toUpperCase()}\n`;
|
|
914
|
-
md += `- **File**: \`${vuln.file}:${vuln.line}\`\n`;
|
|
915
|
-
md += `- **CWE**: ${vuln.cwe}\n`;
|
|
916
|
-
if (vuln.owasp)
|
|
917
|
-
md += `- **OWASP**: ${vuln.owasp}\n`;
|
|
918
|
-
md += `- **Description**: ${vuln.description}\n`;
|
|
919
|
-
md += `- **Impact**: ${vuln.impact}\n`;
|
|
920
|
-
md += `- **Recommendation**: ${vuln.recommendation}\n`;
|
|
921
|
-
md += `- **Confidence**: ${vuln.confidence}%\n\n`;
|
|
922
|
-
md += `\`\`\`\n${vuln.codeSnippet}\n\`\`\`\n\n`;
|
|
923
|
-
md += "---\n\n";
|
|
924
|
-
}
|
|
925
|
-
}
|
|
926
|
-
md += `## Remediation Plan\n\n`;
|
|
927
|
-
md += `- **Total Issues**: ${report.remediation.totalIssues}\n`;
|
|
928
|
-
md += `- **Automatable Fixes**: ${report.remediation.automatable}\n`;
|
|
929
|
-
md += `- **Manual Fixes Required**: ${report.remediation.manualRequired}\n`;
|
|
930
|
-
md += `- **Estimated Fix Time**: ${report.remediation.estimatedFixTime}\n\n`;
|
|
931
|
-
if (report.remediation.prioritizedFixes.length > 0) {
|
|
932
|
-
md += "### Prioritized Fixes\n\n";
|
|
933
|
-
md += "| Priority | Title | Severity | Est. Time |\n";
|
|
934
|
-
md += "|----------|-------|----------|----------|\n";
|
|
935
|
-
for (const fix of report.remediation.prioritizedFixes.slice(0, 20)) {
|
|
936
|
-
md += `| ${fix.priority} | ${fix.title} | ${fix.severity} | ${fix.estimatedTime} |\n`;
|
|
937
|
-
}
|
|
938
|
-
md += "\n";
|
|
939
|
-
}
|
|
940
|
-
if (report.agentConsensus) {
|
|
941
|
-
md += `## Agent Consensus\n\n`;
|
|
942
|
-
md += `- **Participating Agents**: ${report.agentConsensus.participatingAgents.join(", ")}\n`;
|
|
943
|
-
md += `- **Average Agreement**: ${report.agentConsensus.averageAgreement}%\n\n`;
|
|
944
|
-
}
|
|
945
|
-
md += `---\n*Generated by 0xRay Comprehensive Security Audit System v1.22.28*\n`;
|
|
946
|
-
return md;
|
|
947
|
-
}
|
|
948
|
-
getScoreEmoji(score) {
|
|
949
|
-
if (score >= 90)
|
|
950
|
-
return "🟢 Excellent";
|
|
951
|
-
if (score >= 70)
|
|
952
|
-
return "🟡 Good";
|
|
953
|
-
if (score >= 50)
|
|
954
|
-
return "🟠 Fair";
|
|
955
|
-
return "🔴 Poor";
|
|
956
|
-
}
|
|
957
|
-
getSeverityEmoji(severity) {
|
|
958
|
-
const emojis = {
|
|
959
|
-
critical: "🚨",
|
|
960
|
-
high: "🔴",
|
|
961
|
-
medium: "🟡",
|
|
962
|
-
low: "🟢",
|
|
963
|
-
info: "ℹ️",
|
|
964
|
-
};
|
|
965
|
-
return emojis[severity];
|
|
966
|
-
}
|
|
967
|
-
addVote(vote) {
|
|
968
|
-
const existing = this.agentVotes.get(vote.agentName) || [];
|
|
969
|
-
existing.push(vote);
|
|
970
|
-
this.agentVotes.set(vote.agentName, existing);
|
|
971
|
-
}
|
|
972
|
-
getVulnerabilities() {
|
|
973
|
-
return this.vulnerabilities;
|
|
974
|
-
}
|
|
975
|
-
getArchitecturalDecisions() {
|
|
976
|
-
return this.architecturalDecisions;
|
|
977
|
-
}
|
|
978
|
-
}
|
|
979
|
-
export function createSecurityAuditSystem(config) {
|
|
980
|
-
return new ComprehensiveSecurityAuditSystem(config);
|
|
981
|
-
}
|
|
982
|
-
export async function runQuickSecurityAudit(projectPath) {
|
|
983
|
-
const system = new ComprehensiveSecurityAuditSystem({
|
|
984
|
-
projectPath,
|
|
985
|
-
scanDepth: "shallow",
|
|
986
|
-
includeDependencies: true,
|
|
987
|
-
complianceStandards: ["owasp-top-10", "cwe"],
|
|
988
|
-
enableAutoRemediation: true,
|
|
989
|
-
enableWeightedVoting: true,
|
|
990
|
-
});
|
|
991
|
-
return system.runAudit();
|
|
992
|
-
}
|
|
993
|
-
export async function runDeepSecurityAudit(projectPath, outputPath) {
|
|
994
|
-
const system = new ComprehensiveSecurityAuditSystem({
|
|
995
|
-
projectPath,
|
|
996
|
-
scanDepth: "deep",
|
|
997
|
-
includeDependencies: true,
|
|
998
|
-
complianceStandards: ["owasp-top-10", "cwe", "nist", "iso-27001", "pci-dss"],
|
|
999
|
-
enableAutoRemediation: true,
|
|
1000
|
-
enableWeightedVoting: true,
|
|
1001
|
-
outputPath,
|
|
1002
|
-
});
|
|
1003
|
-
return system.runAudit();
|
|
1004
|
-
}
|