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.
Files changed (155) hide show
  1. package/.grok-plugin/plugin.json +1 -1
  2. package/.xray/codex.json +12 -4
  3. package/.xray/features.json +1 -1
  4. package/AGENTS-consumer.md +6 -6
  5. package/AGENTS.md +5 -5
  6. package/README.md +2 -2
  7. package/dist/AGENTS.md +5 -5
  8. package/dist/CHANGELOG.md +16 -0
  9. package/dist/README.md +2 -2
  10. package/dist/cli/index.js +2 -5
  11. package/dist/governance/governance-service.js +1 -1
  12. package/dist/integrations/base/README.md +1 -9
  13. package/dist/integrations/base/index.d.ts +0 -1
  14. package/dist/integrations/base/index.js +0 -2
  15. package/dist/integrations/governance/index.js +31 -8
  16. package/dist/integrations/grok/hooks/grok-hook-utils.js +1 -1
  17. package/dist/integrations/grok/hooks/session-start.js +12 -0
  18. package/dist/integrations/hooks/goggles-pipeline.mjs +62 -11
  19. package/dist/integrations/hooks/host-truth.mjs +74 -0
  20. package/dist/integrations/hooks/station-hook-runtime.cjs +3 -0
  21. package/dist/integrations/openclaw/plugin/xray-pre-tool/package.json +1 -1
  22. package/dist/mcps/knowledge-skills/storyteller.server.js +0 -1
  23. package/dist/nucleus/delegation-gate.d.ts +2 -2
  24. package/dist/nucleus/delegation-gate.js +13 -2
  25. package/dist/nucleus/work-freshness.mjs +189 -0
  26. package/dist/processors/implementations/agents-md-validation-processor.js +1 -1
  27. package/docs-site/docs/plates/boot.md +17 -2
  28. package/docs-site/docs/plates/governance.md +3 -2
  29. package/docs-site/docs/plates/index.md +3 -1
  30. package/docs-site/docs/plates/memory-recall.md +26 -35
  31. package/docs-site/docs/plates/orchestration.md +39 -35
  32. package/docs-site/docs/plates/processor.md +34 -36
  33. package/docs-site/docs/plates/reporting.md +3 -8
  34. package/docs-site/docs/plates/routing.md +22 -11
  35. package/package.json +2 -2
  36. package/scripts/foundry/release.mjs +48 -5
  37. package/scripts/mjs/test-consumer-readiness.mjs +1 -0
  38. package/scripts/mjs/test-mcp-functionality.mjs +14 -9
  39. package/scripts/node/basic-security-audit.cjs +0 -1
  40. package/scripts/node/bridge-mcp-wiring.cjs +66 -3
  41. package/scripts/node/postinstall.cjs +1 -1
  42. package/scripts/node/prepare-consumer.cjs +11 -7
  43. package/scripts/node/setup-dev.cjs +18 -26
  44. package/scripts/node/validate-mcp-connectivity.js +2 -1
  45. package/src/integrations/openclaw/plugin/xray-pre-tool/package.json +1 -1
  46. package/src/mcps/knowledge-skills/storyteller.server.ts +0 -1
  47. package/xray/agents_template.md +5 -5
  48. package/xray/codex.json +12 -4
  49. package/xray/features.json +1 -1
  50. package/dist/agents/known-names.d.ts +0 -26
  51. package/dist/agents/known-names.js +0 -72
  52. package/dist/analytics/consent-manager.d.ts +0 -92
  53. package/dist/analytics/consent-manager.js +0 -257
  54. package/dist/benchmark/performance-benchmark.d.ts +0 -103
  55. package/dist/benchmark/performance-benchmark.js +0 -373
  56. package/dist/cli/commands/analytics-disable.d.ts +0 -9
  57. package/dist/cli/commands/analytics-disable.js +0 -72
  58. package/dist/cli/commands/analytics-enable-action.d.ts +0 -8
  59. package/dist/cli/commands/analytics-enable-action.js +0 -82
  60. package/dist/cli/commands/analytics-preview.d.ts +0 -9
  61. package/dist/cli/commands/analytics-preview.js +0 -106
  62. package/dist/cli/commands/analytics-status.d.ts +0 -9
  63. package/dist/cli/commands/analytics-status.js +0 -68
  64. package/dist/cli/commands/enforce.d.ts +0 -12
  65. package/dist/cli/commands/enforce.js +0 -78
  66. package/dist/cli/commands/govern.d.ts +0 -29
  67. package/dist/cli/commands/govern.js +0 -149
  68. package/dist/cli/commands/security-audit.d.ts +0 -23
  69. package/dist/cli/commands/security-audit.js +0 -219
  70. package/dist/cli/server.d.ts +0 -1
  71. package/dist/cli/server.js +0 -147
  72. package/dist/config/routing-mappings.d.ts +0 -26
  73. package/dist/config/routing-mappings.js +0 -151
  74. package/dist/core/bridge.mjs +0 -922
  75. package/dist/core/trace-context.d.ts +0 -12
  76. package/dist/core/trace-context.js +0 -33
  77. package/dist/enforcement/index.d.ts +0 -22
  78. package/dist/enforcement/index.js +0 -40
  79. package/dist/enforcement/loaders/index.d.ts +0 -36
  80. package/dist/enforcement/loaders/index.js +0 -39
  81. package/dist/enforcement/test-auto-healing.d.ts +0 -83
  82. package/dist/enforcement/test-auto-healing.js +0 -325
  83. package/dist/inference/index.d.ts +0 -10
  84. package/dist/inference/index.js +0 -5
  85. package/dist/infrastructure/iac-validator.d.ts +0 -150
  86. package/dist/infrastructure/iac-validator.js +0 -465
  87. package/dist/infrastructure/schemas/cloud-schemas.d.ts +0 -482
  88. package/dist/infrastructure/schemas/cloud-schemas.js +0 -488
  89. package/dist/integrations/base/ExampleIntegration.d.ts +0 -46
  90. package/dist/integrations/base/ExampleIntegration.js +0 -180
  91. package/dist/integrations/enforcement-gate.d.ts +0 -44
  92. package/dist/integrations/enforcement-gate.js +0 -348
  93. package/dist/mcps/connection/connection-manager.d.ts +0 -39
  94. package/dist/mcps/connection/connection-manager.js +0 -79
  95. package/dist/mcps/index.d.ts +0 -17
  96. package/dist/mcps/index.js +0 -65
  97. package/dist/mcps/orchestrator/index.d.ts +0 -6
  98. package/dist/mcps/orchestrator/index.js +0 -5
  99. package/dist/metrics/index.d.ts +0 -6
  100. package/dist/metrics/index.js +0 -6
  101. package/dist/orchestrator/self-direction-activation.d.ts +0 -108
  102. package/dist/orchestrator/self-direction-activation.js +0 -244
  103. package/dist/orchestrator/universal-registry-bridge.d.ts +0 -84
  104. package/dist/orchestrator/universal-registry-bridge.js +0 -246
  105. package/dist/performance/performance-budget-enforcer.d.ts +0 -157
  106. package/dist/performance/performance-budget-enforcer.js +0 -433
  107. package/dist/performance/performance-regression-tester.d.ts +0 -107
  108. package/dist/performance/performance-regression-tester.js +0 -341
  109. package/dist/postprocessor/analysis/CodeChangeAnalyzer.d.ts +0 -11
  110. package/dist/postprocessor/analysis/CodeChangeAnalyzer.js +0 -50
  111. package/dist/postprocessor/config/ProcessorConfigLoader.d.ts +0 -44
  112. package/dist/postprocessor/config/ProcessorConfigLoader.js +0 -16
  113. package/dist/postprocessor/integration.d.ts +0 -156
  114. package/dist/postprocessor/integration.js +0 -194
  115. package/dist/postprocessor/metamorphosis/index.d.ts +0 -2
  116. package/dist/postprocessor/metamorphosis/index.js +0 -1
  117. package/dist/postprocessor/redeploy/RetryHandler.d.ts +0 -49
  118. package/dist/postprocessor/redeploy/RetryHandler.js +0 -118
  119. package/dist/processors/implementations/session-capture-processor.d.ts +0 -14
  120. package/dist/processors/implementations/session-capture-processor.js +0 -37
  121. package/dist/public/XrayService.d.ts +0 -17
  122. package/dist/public/XrayService.js +0 -40
  123. package/dist/public/index.d.ts +0 -4
  124. package/dist/public/index.js +0 -2
  125. package/dist/security/comprehensive-security-audit.d.ts +0 -157
  126. package/dist/security/comprehensive-security-audit.js +0 -1004
  127. package/dist/security/index.d.ts +0 -13
  128. package/dist/security/index.js +0 -13
  129. package/dist/security/security-agent-coordinator.d.ts +0 -71
  130. package/dist/security/security-agent-coordinator.js +0 -203
  131. package/dist/security/security-hardening-system.d.ts +0 -238
  132. package/dist/security/security-hardening-system.js +0 -726
  133. package/dist/security/security-orchestration-layer.d.ts +0 -118
  134. package/dist/security/security-orchestration-layer.js +0 -495
  135. package/dist/testing/memory-regression-suite.d.ts +0 -105
  136. package/dist/testing/memory-regression-suite.js +0 -258
  137. package/dist/tools/assess-complexity-tool.d.ts +0 -28
  138. package/dist/tools/assess-complexity-tool.js +0 -44
  139. package/dist/tools/query-routing-tool.d.ts +0 -17
  140. package/dist/tools/query-routing-tool.js +0 -59
  141. package/dist/utils/batch-operations.d.ts +0 -25
  142. package/dist/utils/batch-operations.js +0 -292
  143. package/dist/utils/task-graph.d.ts +0 -29
  144. package/dist/utils/task-graph.js +0 -106
  145. package/dist/utils/test-template-generator.d.ts +0 -25
  146. package/dist/utils/test-template-generator.js +0 -178
  147. package/dist/utils/token-manager.d.ts +0 -48
  148. package/dist/utils/token-manager.js +0 -163
  149. package/dist/validation/agent-config-validator.d.ts +0 -110
  150. package/dist/validation/agent-config-validator.js +0 -280
  151. package/dist/validation/orchestration-flow-validator.d.ts +0 -87
  152. package/dist/validation/orchestration-flow-validator.js +0 -606
  153. package/src/mcps/connection/connection-manager.ts +0 -91
  154. package/src/mcps/index.ts +0 -80
  155. 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
- }