llm-trust-guard 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +318 -0
  3. package/dist/guards/agent-communication-guard.d.ts +169 -0
  4. package/dist/guards/agent-communication-guard.d.ts.map +1 -0
  5. package/dist/guards/agent-communication-guard.js +468 -0
  6. package/dist/guards/agent-communication-guard.js.map +1 -0
  7. package/dist/guards/autonomy-escalation-guard.d.ts +137 -0
  8. package/dist/guards/autonomy-escalation-guard.d.ts.map +1 -0
  9. package/dist/guards/autonomy-escalation-guard.js +470 -0
  10. package/dist/guards/autonomy-escalation-guard.js.map +1 -0
  11. package/dist/guards/circuit-breaker.d.ts +142 -0
  12. package/dist/guards/circuit-breaker.d.ts.map +1 -0
  13. package/dist/guards/circuit-breaker.js +347 -0
  14. package/dist/guards/circuit-breaker.js.map +1 -0
  15. package/dist/guards/code-execution-guard.d.ts +114 -0
  16. package/dist/guards/code-execution-guard.d.ts.map +1 -0
  17. package/dist/guards/code-execution-guard.js +467 -0
  18. package/dist/guards/code-execution-guard.js.map +1 -0
  19. package/dist/guards/conversation-guard.d.ts +73 -0
  20. package/dist/guards/conversation-guard.d.ts.map +1 -0
  21. package/dist/guards/conversation-guard.js +281 -0
  22. package/dist/guards/conversation-guard.js.map +1 -0
  23. package/dist/guards/drift-detector.d.ts +182 -0
  24. package/dist/guards/drift-detector.d.ts.map +1 -0
  25. package/dist/guards/drift-detector.js +480 -0
  26. package/dist/guards/drift-detector.js.map +1 -0
  27. package/dist/guards/encoding-detector.d.ts +76 -0
  28. package/dist/guards/encoding-detector.d.ts.map +1 -0
  29. package/dist/guards/encoding-detector.js +698 -0
  30. package/dist/guards/encoding-detector.js.map +1 -0
  31. package/dist/guards/execution-monitor.d.ts +73 -0
  32. package/dist/guards/execution-monitor.d.ts.map +1 -0
  33. package/dist/guards/execution-monitor.js +205 -0
  34. package/dist/guards/execution-monitor.js.map +1 -0
  35. package/dist/guards/input-sanitizer.d.ts +87 -0
  36. package/dist/guards/input-sanitizer.d.ts.map +1 -0
  37. package/dist/guards/input-sanitizer.js +301 -0
  38. package/dist/guards/input-sanitizer.js.map +1 -0
  39. package/dist/guards/mcp-security-guard.d.ts +204 -0
  40. package/dist/guards/mcp-security-guard.d.ts.map +1 -0
  41. package/dist/guards/mcp-security-guard.js +618 -0
  42. package/dist/guards/mcp-security-guard.js.map +1 -0
  43. package/dist/guards/memory-guard.d.ts +124 -0
  44. package/dist/guards/memory-guard.d.ts.map +1 -0
  45. package/dist/guards/memory-guard.js +476 -0
  46. package/dist/guards/memory-guard.js.map +1 -0
  47. package/dist/guards/multimodal-guard.d.ts +93 -0
  48. package/dist/guards/multimodal-guard.d.ts.map +1 -0
  49. package/dist/guards/multimodal-guard.js +507 -0
  50. package/dist/guards/multimodal-guard.js.map +1 -0
  51. package/dist/guards/output-filter.d.ts +76 -0
  52. package/dist/guards/output-filter.d.ts.map +1 -0
  53. package/dist/guards/output-filter.js +289 -0
  54. package/dist/guards/output-filter.js.map +1 -0
  55. package/dist/guards/policy-gate.d.ts +57 -0
  56. package/dist/guards/policy-gate.d.ts.map +1 -0
  57. package/dist/guards/policy-gate.js +182 -0
  58. package/dist/guards/policy-gate.js.map +1 -0
  59. package/dist/guards/prompt-leakage-guard.d.ts +110 -0
  60. package/dist/guards/prompt-leakage-guard.d.ts.map +1 -0
  61. package/dist/guards/prompt-leakage-guard.js +529 -0
  62. package/dist/guards/prompt-leakage-guard.js.map +1 -0
  63. package/dist/guards/rag-guard.d.ts +188 -0
  64. package/dist/guards/rag-guard.d.ts.map +1 -0
  65. package/dist/guards/rag-guard.js +769 -0
  66. package/dist/guards/rag-guard.js.map +1 -0
  67. package/dist/guards/schema-validator.d.ts +35 -0
  68. package/dist/guards/schema-validator.d.ts.map +1 -0
  69. package/dist/guards/schema-validator.js +316 -0
  70. package/dist/guards/schema-validator.js.map +1 -0
  71. package/dist/guards/state-persistence-guard.d.ts +153 -0
  72. package/dist/guards/state-persistence-guard.d.ts.map +1 -0
  73. package/dist/guards/state-persistence-guard.js +484 -0
  74. package/dist/guards/state-persistence-guard.js.map +1 -0
  75. package/dist/guards/tenant-boundary.d.ts +67 -0
  76. package/dist/guards/tenant-boundary.d.ts.map +1 -0
  77. package/dist/guards/tenant-boundary.js +187 -0
  78. package/dist/guards/tenant-boundary.js.map +1 -0
  79. package/dist/guards/tool-chain-validator.d.ts +102 -0
  80. package/dist/guards/tool-chain-validator.d.ts.map +1 -0
  81. package/dist/guards/tool-chain-validator.js +480 -0
  82. package/dist/guards/tool-chain-validator.js.map +1 -0
  83. package/dist/guards/tool-registry.d.ts +45 -0
  84. package/dist/guards/tool-registry.d.ts.map +1 -0
  85. package/dist/guards/tool-registry.js +155 -0
  86. package/dist/guards/tool-registry.js.map +1 -0
  87. package/dist/guards/trust-exploitation-guard.d.ts +134 -0
  88. package/dist/guards/trust-exploitation-guard.d.ts.map +1 -0
  89. package/dist/guards/trust-exploitation-guard.js +354 -0
  90. package/dist/guards/trust-exploitation-guard.js.map +1 -0
  91. package/dist/index.d.ts +133 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +430 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/integrations/express.d.ts +119 -0
  96. package/dist/integrations/express.d.ts.map +1 -0
  97. package/dist/integrations/express.js +244 -0
  98. package/dist/integrations/express.js.map +1 -0
  99. package/dist/integrations/index.d.ts +9 -0
  100. package/dist/integrations/index.d.ts.map +1 -0
  101. package/dist/integrations/index.js +26 -0
  102. package/dist/integrations/index.js.map +1 -0
  103. package/dist/integrations/langchain.d.ts +165 -0
  104. package/dist/integrations/langchain.d.ts.map +1 -0
  105. package/dist/integrations/langchain.js +308 -0
  106. package/dist/integrations/langchain.js.map +1 -0
  107. package/dist/integrations/openai.d.ts +205 -0
  108. package/dist/integrations/openai.d.ts.map +1 -0
  109. package/dist/integrations/openai.js +380 -0
  110. package/dist/integrations/openai.js.map +1 -0
  111. package/dist/types/index.d.ts +245 -0
  112. package/dist/types/index.d.ts.map +1 -0
  113. package/dist/types/index.js +6 -0
  114. package/dist/types/index.js.map +1 -0
  115. package/package.json +64 -0
@@ -0,0 +1,467 @@
1
+ "use strict";
2
+ /**
3
+ * CodeExecutionGuard (L11)
4
+ *
5
+ * Validates and sandboxes agent-generated code before execution.
6
+ * Prevents RCE (Remote Code Execution) attacks via malicious code generation.
7
+ *
8
+ * Threat Model:
9
+ * - ASI05: Unexpected Code Execution (RCE)
10
+ * - Code injection via LLM outputs
11
+ * - Sandbox escape attempts
12
+ *
13
+ * Protection Capabilities:
14
+ * - Static code analysis for dangerous patterns
15
+ * - Import/require blocklist enforcement
16
+ * - System call detection
17
+ * - Resource limit enforcement
18
+ * - Language-specific security rules
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.CodeExecutionGuard = void 0;
22
+ class CodeExecutionGuard {
23
+ constructor(config = {}) {
24
+ // Language-specific dangerous patterns
25
+ this.DANGEROUS_PATTERNS = {
26
+ javascript: [
27
+ { name: "eval", pattern: /\beval\s*\(/g, severity: 50 },
28
+ { name: "function_constructor", pattern: /new\s+Function\s*\(/g, severity: 50 },
29
+ { name: "child_process", pattern: /require\s*\(\s*['"]child_process['"]\s*\)/g, severity: 60 },
30
+ { name: "exec", pattern: /\b(exec|execSync|spawn|spawnSync)\s*\(/g, severity: 60 },
31
+ { name: "fs_write", pattern: /\b(writeFile|writeFileSync|appendFile|unlink|rmdir)\s*\(/g, severity: 45 },
32
+ { name: "process_env", pattern: /process\.env/g, severity: 30 },
33
+ { name: "require_dynamic", pattern: /require\s*\(\s*[^'"]/g, severity: 40 },
34
+ { name: "vm_module", pattern: /require\s*\(\s*['"]vm['"]\s*\)/g, severity: 55 },
35
+ { name: "fetch_external", pattern: /fetch\s*\(\s*['"]https?:\/\/(?!localhost)/g, severity: 35 },
36
+ { name: "websocket", pattern: /new\s+WebSocket\s*\(/g, severity: 35 },
37
+ { name: "prototype_pollution", pattern: /__proto__|constructor\s*\[|Object\.setPrototypeOf/g, severity: 50 },
38
+ { name: "global_access", pattern: /\bglobal\b|\bglobalThis\b/g, severity: 35 },
39
+ ],
40
+ python: [
41
+ { name: "eval", pattern: /\beval\s*\(/g, severity: 50 },
42
+ { name: "exec", pattern: /\bexec\s*\(/g, severity: 50 },
43
+ { name: "compile", pattern: /\bcompile\s*\(/g, severity: 45 },
44
+ { name: "subprocess", pattern: /import\s+subprocess|from\s+subprocess/g, severity: 60 },
45
+ { name: "os_system", pattern: /os\.(system|popen|exec)/g, severity: 60 },
46
+ { name: "os_module", pattern: /import\s+os|from\s+os\s+import/g, severity: 40 },
47
+ { name: "socket", pattern: /import\s+socket|from\s+socket/g, severity: 40 },
48
+ { name: "pickle", pattern: /import\s+pickle|pickle\.loads?/g, severity: 55 },
49
+ { name: "ctypes", pattern: /import\s+ctypes|from\s+ctypes/g, severity: 55 },
50
+ { name: "builtins", pattern: /__builtins__|__import__/g, severity: 50 },
51
+ { name: "file_write", pattern: /open\s*\([^)]*['"]w['"]/g, severity: 40 },
52
+ { name: "requests", pattern: /requests\.(get|post|put|delete)\s*\(/g, severity: 35 },
53
+ { name: "getattr_dynamic", pattern: /getattr\s*\(\s*\w+\s*,\s*[^'"]/g, severity: 40 },
54
+ ],
55
+ bash: [
56
+ { name: "rm_rf", pattern: /rm\s+(-rf?|--recursive)/gi, severity: 70 },
57
+ { name: "sudo", pattern: /\bsudo\b/gi, severity: 60 },
58
+ { name: "curl_pipe", pattern: /curl\s+.*\|\s*(ba)?sh/gi, severity: 70 },
59
+ { name: "wget_execute", pattern: /wget\s+.*&&\s*(ba)?sh/gi, severity: 70 },
60
+ { name: "eval", pattern: /\beval\b/gi, severity: 50 },
61
+ { name: "env_dump", pattern: /\benv\b|\bprintenv\b/gi, severity: 35 },
62
+ { name: "chmod", pattern: /chmod\s+(\+x|777|755)/gi, severity: 40 },
63
+ { name: "chown", pattern: /\bchown\b/gi, severity: 45 },
64
+ { name: "dd", pattern: /\bdd\s+if=/gi, severity: 55 },
65
+ { name: "nc_reverse", pattern: /\bnc\b.*-e/gi, severity: 70 },
66
+ { name: "base64_decode", pattern: /base64\s+(-d|--decode)/gi, severity: 40 },
67
+ { name: "cron", pattern: /crontab|\/etc\/cron/gi, severity: 50 },
68
+ ],
69
+ sql: [
70
+ { name: "drop_table", pattern: /DROP\s+(TABLE|DATABASE)/gi, severity: 70 },
71
+ { name: "delete_all", pattern: /DELETE\s+FROM\s+\w+\s*(;|$)/gi, severity: 60 },
72
+ { name: "truncate", pattern: /TRUNCATE\s+TABLE/gi, severity: 65 },
73
+ { name: "union_injection", pattern: /UNION\s+(ALL\s+)?SELECT/gi, severity: 55 },
74
+ { name: "comment_injection", pattern: /--\s*$/gm, severity: 30 },
75
+ { name: "xp_cmdshell", pattern: /xp_cmdshell/gi, severity: 70 },
76
+ { name: "into_outfile", pattern: /INTO\s+(OUT|DUMP)FILE/gi, severity: 60 },
77
+ { name: "load_file", pattern: /LOAD_FILE\s*\(/gi, severity: 55 },
78
+ ],
79
+ };
80
+ // Default blocked imports per language
81
+ this.DEFAULT_BLOCKED_IMPORTS = {
82
+ javascript: [
83
+ "child_process",
84
+ "cluster",
85
+ "dgram",
86
+ "dns",
87
+ "net",
88
+ "tls",
89
+ "vm",
90
+ "worker_threads",
91
+ "v8",
92
+ "perf_hooks",
93
+ ],
94
+ python: [
95
+ "subprocess",
96
+ "os",
97
+ "sys",
98
+ "socket",
99
+ "ctypes",
100
+ "pickle",
101
+ "marshal",
102
+ "multiprocessing",
103
+ "threading",
104
+ "_thread",
105
+ ],
106
+ };
107
+ // Default blocked functions
108
+ this.DEFAULT_BLOCKED_FUNCTIONS = [
109
+ "eval",
110
+ "exec",
111
+ "system",
112
+ "popen",
113
+ "spawn",
114
+ "fork",
115
+ "execv",
116
+ "execve",
117
+ "dlopen",
118
+ "compile",
119
+ ];
120
+ this.config = {
121
+ allowedLanguages: config.allowedLanguages ?? ["javascript", "python", "sql"],
122
+ blockedImports: config.blockedImports ?? [],
123
+ blockedFunctions: config.blockedFunctions ?? this.DEFAULT_BLOCKED_FUNCTIONS,
124
+ maxCodeLength: config.maxCodeLength ?? 10000,
125
+ maxExecutionTime: config.maxExecutionTime ?? 5000,
126
+ allowNetwork: config.allowNetwork ?? false,
127
+ allowFileSystem: config.allowFileSystem ?? false,
128
+ allowShell: config.allowShell ?? false,
129
+ allowEnvAccess: config.allowEnvAccess ?? false,
130
+ customPatterns: config.customPatterns ?? [],
131
+ riskThreshold: config.riskThreshold ?? 50,
132
+ };
133
+ }
134
+ /**
135
+ * Analyze code for dangerous patterns before execution
136
+ */
137
+ analyze(code, language, requestId) {
138
+ const reqId = requestId || `code-${Date.now()}`;
139
+ const normalizedLang = language.toLowerCase();
140
+ const violations = [];
141
+ let riskScore = 0;
142
+ // Check language allowlist
143
+ if (!this.config.allowedLanguages.includes(normalizedLang)) {
144
+ return {
145
+ allowed: false,
146
+ reason: `Language '${language}' is not allowed`,
147
+ violations: ["disallowed_language"],
148
+ request_id: reqId,
149
+ code_analysis: {
150
+ language: normalizedLang,
151
+ length: code.length,
152
+ dangerous_imports: [],
153
+ dangerous_functions: [],
154
+ system_calls: [],
155
+ network_access: false,
156
+ file_access: false,
157
+ shell_access: false,
158
+ env_access: false,
159
+ risk_score: 100,
160
+ complexity_score: 0,
161
+ },
162
+ recommendations: [`Use one of: ${this.config.allowedLanguages.join(", ")}`],
163
+ };
164
+ }
165
+ // Check code length
166
+ if (code.length > this.config.maxCodeLength) {
167
+ violations.push("code_too_long");
168
+ riskScore += 20;
169
+ }
170
+ // Get language-specific patterns
171
+ const patterns = [
172
+ ...(this.DANGEROUS_PATTERNS[normalizedLang] || []),
173
+ ...this.config.customPatterns,
174
+ ];
175
+ // Analyze for dangerous patterns
176
+ const dangerousImports = [];
177
+ const dangerousFunctions = [];
178
+ const systemCalls = [];
179
+ let networkAccess = false;
180
+ let fileAccess = false;
181
+ let shellAccess = false;
182
+ let envAccess = false;
183
+ for (const { name, pattern, severity } of patterns) {
184
+ const matches = code.match(pattern);
185
+ if (matches) {
186
+ violations.push(`dangerous_pattern_${name}`);
187
+ riskScore += severity;
188
+ // Categorize the pattern
189
+ if (name.includes("exec") || name.includes("spawn") || name.includes("system") || name.includes("subprocess")) {
190
+ shellAccess = true;
191
+ systemCalls.push(name);
192
+ }
193
+ if (name.includes("fs") || name.includes("file") || name.includes("write")) {
194
+ fileAccess = true;
195
+ }
196
+ if (name.includes("fetch") || name.includes("socket") || name.includes("request") || name.includes("websocket")) {
197
+ networkAccess = true;
198
+ }
199
+ if (name.includes("env")) {
200
+ envAccess = true;
201
+ }
202
+ if (name.includes("import") || name.includes("require")) {
203
+ dangerousImports.push(name);
204
+ }
205
+ if (name.includes("eval") || name.includes("exec") || name.includes("compile")) {
206
+ dangerousFunctions.push(name);
207
+ }
208
+ }
209
+ }
210
+ // Check blocked imports
211
+ const blockedImports = [
212
+ ...this.config.blockedImports,
213
+ ...(this.DEFAULT_BLOCKED_IMPORTS[normalizedLang] || []),
214
+ ];
215
+ for (const blockedImport of blockedImports) {
216
+ const importPatterns = [
217
+ new RegExp(`require\\s*\\(\\s*['"]${blockedImport}['"]\\s*\\)`, "g"),
218
+ new RegExp(`import\\s+.*from\\s+['"]${blockedImport}['"]`, "g"),
219
+ new RegExp(`import\\s+${blockedImport}`, "g"),
220
+ new RegExp(`from\\s+${blockedImport}\\s+import`, "g"),
221
+ ];
222
+ for (const pattern of importPatterns) {
223
+ if (pattern.test(code)) {
224
+ violations.push(`blocked_import_${blockedImport}`);
225
+ dangerousImports.push(blockedImport);
226
+ riskScore += 40;
227
+ }
228
+ }
229
+ }
230
+ // Check blocked functions
231
+ for (const blockedFunc of this.config.blockedFunctions) {
232
+ const funcPattern = new RegExp(`\\b${blockedFunc}\\s*\\(`, "g");
233
+ if (funcPattern.test(code)) {
234
+ violations.push(`blocked_function_${blockedFunc}`);
235
+ dangerousFunctions.push(blockedFunc);
236
+ riskScore += 35;
237
+ }
238
+ }
239
+ // Policy checks
240
+ if (networkAccess && !this.config.allowNetwork) {
241
+ violations.push("network_access_denied");
242
+ riskScore += 30;
243
+ }
244
+ if (fileAccess && !this.config.allowFileSystem) {
245
+ violations.push("filesystem_access_denied");
246
+ riskScore += 30;
247
+ }
248
+ if (shellAccess && !this.config.allowShell) {
249
+ violations.push("shell_access_denied");
250
+ riskScore += 40;
251
+ }
252
+ if (envAccess && !this.config.allowEnvAccess) {
253
+ violations.push("env_access_denied");
254
+ riskScore += 25;
255
+ }
256
+ // Calculate complexity (simplified)
257
+ const complexityScore = this.calculateComplexity(code, normalizedLang);
258
+ // Cap risk score
259
+ riskScore = Math.min(100, riskScore);
260
+ // Decision
261
+ const blocked = riskScore >= this.config.riskThreshold;
262
+ const result = {
263
+ allowed: !blocked,
264
+ reason: blocked
265
+ ? `Code blocked: ${violations.slice(0, 3).join(", ")}`
266
+ : "Code analysis passed",
267
+ violations,
268
+ request_id: reqId,
269
+ code_analysis: {
270
+ language: normalizedLang,
271
+ length: code.length,
272
+ dangerous_imports: [...new Set(dangerousImports)],
273
+ dangerous_functions: [...new Set(dangerousFunctions)],
274
+ system_calls: [...new Set(systemCalls)],
275
+ network_access: networkAccess,
276
+ file_access: fileAccess,
277
+ shell_access: shellAccess,
278
+ env_access: envAccess,
279
+ risk_score: riskScore,
280
+ complexity_score: complexityScore,
281
+ },
282
+ recommendations: this.generateRecommendations(violations, riskScore),
283
+ };
284
+ // If allowed, provide sandbox configuration
285
+ if (!blocked) {
286
+ result.sandbox_config = this.generateSandboxConfig(networkAccess, fileAccess, shellAccess, envAccess);
287
+ // Optionally provide sanitized code
288
+ if (violations.length > 0) {
289
+ result.sanitized_code = this.sanitizeCode(code, normalizedLang);
290
+ }
291
+ }
292
+ return result;
293
+ }
294
+ /**
295
+ * Validate code structure (syntax check simulation)
296
+ */
297
+ validateSyntax(code, language) {
298
+ const errors = [];
299
+ const normalizedLang = language.toLowerCase();
300
+ // Basic syntax checks (simplified - real implementation would use parsers)
301
+ switch (normalizedLang) {
302
+ case "javascript":
303
+ // Check for unclosed brackets
304
+ const jsOpenBraces = (code.match(/{/g) || []).length;
305
+ const jsCloseBraces = (code.match(/}/g) || []).length;
306
+ if (jsOpenBraces !== jsCloseBraces) {
307
+ errors.push("Unbalanced curly braces");
308
+ }
309
+ const jsOpenParens = (code.match(/\(/g) || []).length;
310
+ const jsCloseParens = (code.match(/\)/g) || []).length;
311
+ if (jsOpenParens !== jsCloseParens) {
312
+ errors.push("Unbalanced parentheses");
313
+ }
314
+ break;
315
+ case "python":
316
+ // Check for unclosed quotes
317
+ const singleQuotes = (code.match(/'/g) || []).length;
318
+ const doubleQuotes = (code.match(/"/g) || []).length;
319
+ const tripleQuotes = (code.match(/'''|"""/g) || []).length;
320
+ if ((singleQuotes - tripleQuotes * 3) % 2 !== 0) {
321
+ errors.push("Unclosed single quotes");
322
+ }
323
+ if ((doubleQuotes - tripleQuotes * 3) % 2 !== 0) {
324
+ errors.push("Unclosed double quotes");
325
+ }
326
+ break;
327
+ case "sql":
328
+ // Check for unclosed quotes
329
+ const sqlSingleQuotes = (code.match(/'/g) || []).length;
330
+ if (sqlSingleQuotes % 2 !== 0) {
331
+ errors.push("Unclosed single quotes in SQL");
332
+ }
333
+ break;
334
+ }
335
+ return { valid: errors.length === 0, errors };
336
+ }
337
+ /**
338
+ * Generate secure sandbox configuration
339
+ */
340
+ generateSandboxConfig(needsNetwork, needsFileSystem, needsShell, needsEnv) {
341
+ return {
342
+ timeout: this.config.maxExecutionTime,
343
+ memoryLimit: 128 * 1024 * 1024, // 128MB
344
+ allowedSyscalls: this.getAllowedSyscalls(needsNetwork, needsFileSystem, needsShell),
345
+ networkPolicy: needsNetwork && this.config.allowNetwork ? "localhost" : "none",
346
+ filesystemPolicy: needsFileSystem && this.config.allowFileSystem ? "temponly" : "none",
347
+ envVars: needsEnv && this.config.allowEnvAccess
348
+ ? { NODE_ENV: "sandbox", SANDBOX: "true" }
349
+ : {},
350
+ };
351
+ }
352
+ /**
353
+ * Sanitize code by removing dangerous patterns
354
+ */
355
+ sanitizeCode(code, language) {
356
+ let sanitized = code;
357
+ // Get language patterns
358
+ const patterns = this.DANGEROUS_PATTERNS[language] || [];
359
+ // Remove high-severity patterns
360
+ for (const { pattern, severity } of patterns) {
361
+ if (severity >= 50) {
362
+ sanitized = sanitized.replace(pattern, "/* BLOCKED */");
363
+ }
364
+ }
365
+ // Remove blocked imports
366
+ const blockedImports = [
367
+ ...this.config.blockedImports,
368
+ ...(this.DEFAULT_BLOCKED_IMPORTS[language] || []),
369
+ ];
370
+ for (const blockedImport of blockedImports) {
371
+ const importPatterns = [
372
+ new RegExp(`require\\s*\\(\\s*['"]${blockedImport}['"]\\s*\\)`, "g"),
373
+ new RegExp(`import\\s+.*from\\s+['"]${blockedImport}['"].*`, "gm"),
374
+ new RegExp(`import\\s+${blockedImport}.*`, "gm"),
375
+ new RegExp(`from\\s+${blockedImport}\\s+import.*`, "gm"),
376
+ ];
377
+ for (const pattern of importPatterns) {
378
+ sanitized = sanitized.replace(pattern, "/* BLOCKED_IMPORT */");
379
+ }
380
+ }
381
+ return sanitized;
382
+ }
383
+ /**
384
+ * Get allowed languages
385
+ */
386
+ getAllowedLanguages() {
387
+ return [...this.config.allowedLanguages];
388
+ }
389
+ /**
390
+ * Add custom dangerous pattern
391
+ */
392
+ addDangerousPattern(language, name, pattern, severity) {
393
+ if (!this.DANGEROUS_PATTERNS[language]) {
394
+ this.DANGEROUS_PATTERNS[language] = [];
395
+ }
396
+ this.DANGEROUS_PATTERNS[language].push({ name, pattern, severity });
397
+ }
398
+ calculateComplexity(code, language) {
399
+ let complexity = 0;
400
+ // Count control structures
401
+ const controlPatterns = {
402
+ javascript: /\b(if|else|for|while|switch|try|catch)\b/g,
403
+ python: /\b(if|elif|else|for|while|try|except|with)\b/g,
404
+ sql: /\b(CASE|WHEN|IF|WHILE|LOOP)\b/gi,
405
+ };
406
+ const pattern = controlPatterns[language];
407
+ if (pattern) {
408
+ const matches = code.match(pattern) || [];
409
+ complexity += matches.length * 5;
410
+ }
411
+ // Count function definitions
412
+ const funcPatterns = {
413
+ javascript: /\b(function|=>|\basync\b)/g,
414
+ python: /\bdef\b|\blambda\b/g,
415
+ sql: /\bCREATE\s+(FUNCTION|PROCEDURE)\b/gi,
416
+ };
417
+ const funcPattern = funcPatterns[language];
418
+ if (funcPattern) {
419
+ const funcMatches = code.match(funcPattern) || [];
420
+ complexity += funcMatches.length * 10;
421
+ }
422
+ // Line count factor
423
+ const lines = code.split("\n").length;
424
+ complexity += Math.min(lines, 100);
425
+ return Math.min(100, complexity);
426
+ }
427
+ getAllowedSyscalls(needsNetwork, needsFileSystem, needsShell) {
428
+ const base = ["read", "write", "exit", "brk", "mmap", "munmap", "close"];
429
+ if (needsNetwork && this.config.allowNetwork) {
430
+ base.push("socket", "connect", "bind", "listen", "accept");
431
+ }
432
+ if (needsFileSystem && this.config.allowFileSystem) {
433
+ base.push("open", "stat", "fstat", "lstat", "access");
434
+ }
435
+ // Never allow shell-related syscalls even if configured
436
+ // This is a security-critical restriction
437
+ // Shell access should be handled differently (e.g., via approved commands only)
438
+ return base;
439
+ }
440
+ generateRecommendations(violations, riskScore) {
441
+ const recommendations = [];
442
+ if (violations.some((v) => v.includes("import"))) {
443
+ recommendations.push("Remove or replace blocked imports with safe alternatives");
444
+ }
445
+ if (violations.some((v) => v.includes("eval") || v.includes("exec"))) {
446
+ recommendations.push("Avoid dynamic code execution - use static alternatives");
447
+ }
448
+ if (violations.some((v) => v.includes("network"))) {
449
+ recommendations.push("Remove network access or use approved endpoints only");
450
+ }
451
+ if (violations.some((v) => v.includes("filesystem"))) {
452
+ recommendations.push("Use temporary directories or remove file operations");
453
+ }
454
+ if (violations.some((v) => v.includes("shell"))) {
455
+ recommendations.push("Shell access is not permitted - use language-native alternatives");
456
+ }
457
+ if (riskScore >= 70) {
458
+ recommendations.push("Code requires significant review before execution");
459
+ }
460
+ if (recommendations.length === 0) {
461
+ recommendations.push("Code passed security analysis");
462
+ }
463
+ return recommendations;
464
+ }
465
+ }
466
+ exports.CodeExecutionGuard = CodeExecutionGuard;
467
+ //# sourceMappingURL=code-execution-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-execution-guard.js","sourceRoot":"","sources":["../../src/guards/code-execution-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * ConversationGuard
3
+ *
4
+ * Detects and prevents multi-turn manipulation attacks by:
5
+ * - Tracking conversation history patterns
6
+ * - Detecting gradual privilege escalation attempts
7
+ * - Identifying context manipulation across turns
8
+ * - Blocking suspicious conversation trajectories
9
+ */
10
+ export interface ConversationGuardConfig {
11
+ maxConversationLength?: number;
12
+ conversationTTLMinutes?: number;
13
+ escalationThreshold?: number;
14
+ manipulationPatterns?: ManipulationPattern[];
15
+ detectToneShifts?: boolean;
16
+ detectRoleConfusion?: boolean;
17
+ detectInstructionOverride?: boolean;
18
+ }
19
+ export interface ManipulationPattern {
20
+ name: string;
21
+ pattern: RegExp;
22
+ weight: number;
23
+ category: "escalation" | "confusion" | "override" | "extraction";
24
+ }
25
+ export interface ConversationGuardResult {
26
+ allowed: boolean;
27
+ reason?: string;
28
+ violations: string[];
29
+ risk_score: number;
30
+ risk_factors: RiskFactor[];
31
+ conversation_analysis: {
32
+ turn_count: number;
33
+ escalation_attempts: number;
34
+ manipulation_indicators: number;
35
+ suspicious_patterns: string[];
36
+ };
37
+ }
38
+ export interface RiskFactor {
39
+ factor: string;
40
+ weight: number;
41
+ details: string;
42
+ }
43
+ export declare class ConversationGuard {
44
+ private config;
45
+ private sessions;
46
+ private defaultManipulationPatterns;
47
+ constructor(config?: ConversationGuardConfig);
48
+ /**
49
+ * Analyze a new user message in context of the conversation
50
+ */
51
+ check(sessionId: string, userMessage: string, toolCalls?: string[], claimedRole?: string, requestId?: string): ConversationGuardResult;
52
+ /**
53
+ * Record assistant response (for complete conversation tracking)
54
+ */
55
+ recordResponse(sessionId: string, response: string, toolCalls?: string[]): void;
56
+ /**
57
+ * Get session analysis
58
+ */
59
+ getSessionAnalysis(sessionId: string): {
60
+ turn_count: number;
61
+ escalation_attempts: number;
62
+ manipulation_indicators: number;
63
+ claimed_roles: string[];
64
+ session_age_minutes: number;
65
+ } | null;
66
+ /**
67
+ * Reset a session
68
+ */
69
+ resetSession(sessionId: string): void;
70
+ private getOrCreateSession;
71
+ private cleanupSessions;
72
+ }
73
+ //# sourceMappingURL=conversation-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-guard.d.ts","sourceRoot":"","sources":["../../src/guards/conversation-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,uBAAuB;IAEtC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAE7C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,CAAC;CAClE;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,qBAAqB,EAAE;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,uBAAuB,EAAE,MAAM,CAAC;QAChC,mBAAmB,EAAE,MAAM,EAAE,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAoBD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAA+C;IAE/D,OAAO,CAAC,2BAA2B,CAuEjC;gBAEU,MAAM,GAAE,uBAA4B;IAehD;;OAEG;IACH,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,EAAE,EACpB,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,GAAE,MAAW,GACrB,uBAAuB;IA0I1B;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI;IAa/E;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG;QACrC,UAAU,EAAE,MAAM,CAAC;QACnB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,uBAAuB,EAAE,MAAM,CAAC;QAChC,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,GAAG,IAAI;IAaR;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,eAAe;CAUxB"}