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