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,484 @@
1
+ "use strict";
2
+ /**
3
+ * StatePersistenceGuard (L22)
4
+ *
5
+ * Detects and prevents unauthorized state persistence and corruption.
6
+ * Implements ASI08 from OWASP Agentic Applications 2026.
7
+ *
8
+ * Threat Model:
9
+ * - ASI08: State Corruption
10
+ * - Unauthorized state persistence
11
+ * - Cross-session state leakage
12
+ * - Malicious state injection
13
+ * - State tampering and replay attacks
14
+ *
15
+ * Protection Capabilities:
16
+ * - State integrity verification
17
+ * - Persistence authorization
18
+ * - Cross-session isolation
19
+ * - State encryption validation
20
+ * - Tampering detection
21
+ */
22
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ var desc = Object.getOwnPropertyDescriptor(m, k);
25
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
26
+ desc = { enumerable: true, get: function() { return m[k]; } };
27
+ }
28
+ Object.defineProperty(o, k2, desc);
29
+ }) : (function(o, m, k, k2) {
30
+ if (k2 === undefined) k2 = k;
31
+ o[k2] = m[k];
32
+ }));
33
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
34
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
35
+ }) : function(o, v) {
36
+ o["default"] = v;
37
+ });
38
+ var __importStar = (this && this.__importStar) || (function () {
39
+ var ownKeys = function(o) {
40
+ ownKeys = Object.getOwnPropertyNames || function (o) {
41
+ var ar = [];
42
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
43
+ return ar;
44
+ };
45
+ return ownKeys(o);
46
+ };
47
+ return function (mod) {
48
+ if (mod && mod.__esModule) return mod;
49
+ var result = {};
50
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
51
+ __setModuleDefault(result, mod);
52
+ return result;
53
+ };
54
+ })();
55
+ Object.defineProperty(exports, "__esModule", { value: true });
56
+ exports.StatePersistenceGuard = void 0;
57
+ const crypto = __importStar(require("crypto"));
58
+ class StatePersistenceGuard {
59
+ constructor(config = {}) {
60
+ this.stateStore = new Map();
61
+ this.sessionStates = new Map();
62
+ // State injection patterns
63
+ this.INJECTION_PATTERNS = [
64
+ // Code injection
65
+ { name: "code_injection", pattern: /(?:eval|exec|Function|setTimeout|setInterval)\s*\(/i, severity: 90 },
66
+ { name: "script_injection", pattern: /<script[\s>]|javascript:/i, severity: 85 },
67
+ { name: "prototype_pollution", pattern: /__proto__|constructor\s*\[|prototype\s*\[/i, severity: 90 },
68
+ // Serialization attacks
69
+ { name: "json_injection", pattern: /\{\s*["']?(__proto__|constructor|prototype)["']?\s*:/i, severity: 85 },
70
+ { name: "yaml_injection", pattern: /!!python\/|!!ruby\/|!!php\//i, severity: 80 },
71
+ { name: "pickle_attack", pattern: /cos\n|cposix\n|csubprocess/i, severity: 95 },
72
+ // Path traversal
73
+ { name: "path_traversal", pattern: /\.\.\/|\.\.\\|%2e%2e/i, severity: 75 },
74
+ { name: "null_byte", pattern: /\x00|%00/i, severity: 80 },
75
+ // State corruption
76
+ { name: "state_hijack", pattern: /session_id\s*[:=]|tenant_id\s*[:=]/i, severity: 70 },
77
+ { name: "privilege_inject", pattern: /(?:role|permission|admin|is_admin)\s*[:=]\s*(?:true|admin|1)/i, severity: 85 },
78
+ { name: "trust_inject", pattern: /trust_level\s*[:=]|autonomy_level\s*[:=]/i, severity: 80 },
79
+ // Replay attacks
80
+ { name: "timestamp_manipulation", pattern: /created_at\s*[:=]\s*\d+|modified_at\s*[:=]\s*\d+/i, severity: 60 },
81
+ { name: "version_manipulation", pattern: /version\s*[:=]\s*\d+/i, severity: 55 },
82
+ ];
83
+ // Sensitive state keys
84
+ this.DEFAULT_SENSITIVE_KEYS = [
85
+ "credentials",
86
+ "password",
87
+ "token",
88
+ "secret",
89
+ "api_key",
90
+ "session_token",
91
+ "auth_token",
92
+ "private_key",
93
+ "encryption_key",
94
+ "signing_key",
95
+ ];
96
+ this.config = {
97
+ enableIntegrityCheck: config.enableIntegrityCheck ?? true,
98
+ requireEncryption: config.requireEncryption ?? false,
99
+ maxStateSize: config.maxStateSize ?? 1024 * 1024, // 1MB
100
+ maxStateAge: config.maxStateAge ?? 24 * 60 * 60 * 1000, // 24 hours
101
+ enforceSessionIsolation: config.enforceSessionIsolation ?? true,
102
+ allowedTargets: config.allowedTargets ?? ["memory", "session", "cache"],
103
+ sensitiveKeys: config.sensitiveKeys ?? this.DEFAULT_SENSITIVE_KEYS,
104
+ detectTampering: config.detectTampering ?? true,
105
+ signingSecret: config.signingSecret ?? crypto.randomBytes(32).toString("hex"),
106
+ };
107
+ }
108
+ /**
109
+ * Validate a state operation
110
+ */
111
+ validateOperation(operation, requestId) {
112
+ const reqId = requestId || `state-${Date.now()}`;
113
+ const violations = [];
114
+ let integrityValid = true;
115
+ let encryptionValid = true;
116
+ let sessionAuthorized = true;
117
+ let sizeValid = true;
118
+ let ageValid = true;
119
+ let tamperingDetected = false;
120
+ // 1. Check session authorization for cross-session operations
121
+ if (this.config.enforceSessionIsolation && operation.target_session_id) {
122
+ if (operation.target_session_id !== operation.session_id) {
123
+ violations.push("cross_session_access_attempt");
124
+ sessionAuthorized = false;
125
+ }
126
+ }
127
+ // 2. Check persistence target authorization
128
+ if (operation.target && !this.config.allowedTargets.includes(operation.target)) {
129
+ violations.push(`unauthorized_target: ${operation.target}`);
130
+ }
131
+ // 3. For write operations, validate the value
132
+ if (operation.operation === "write" && operation.value !== undefined) {
133
+ // Check size
134
+ const valueSize = JSON.stringify(operation.value).length;
135
+ if (valueSize > this.config.maxStateSize) {
136
+ violations.push(`state_size_exceeded: ${valueSize} > ${this.config.maxStateSize}`);
137
+ sizeValid = false;
138
+ }
139
+ // Check for injection patterns
140
+ const valueStr = typeof operation.value === "string"
141
+ ? operation.value
142
+ : JSON.stringify(operation.value);
143
+ for (const { name, pattern, severity } of this.INJECTION_PATTERNS) {
144
+ if (pattern.test(valueStr)) {
145
+ violations.push(`injection_pattern: ${name}`);
146
+ if (severity >= 80) {
147
+ tamperingDetected = true;
148
+ }
149
+ }
150
+ }
151
+ // Check for sensitive key without encryption
152
+ if (this.isSensitiveKey(operation.key) && !operation.metadata?.encrypted) {
153
+ if (this.config.requireEncryption) {
154
+ violations.push("sensitive_key_not_encrypted");
155
+ encryptionValid = false;
156
+ }
157
+ }
158
+ }
159
+ // 4. For read/restore operations, validate existing state
160
+ if (operation.operation === "read" || operation.operation === "restore") {
161
+ const stateKey = this.getStateKey(operation.session_id, operation.key);
162
+ const existingState = this.stateStore.get(stateKey);
163
+ if (existingState) {
164
+ // Check ownership
165
+ if (this.config.enforceSessionIsolation &&
166
+ existingState.session_id !== operation.session_id) {
167
+ violations.push("state_ownership_violation");
168
+ sessionAuthorized = false;
169
+ }
170
+ // Check age
171
+ const age = Date.now() - existingState.created_at;
172
+ if (age > this.config.maxStateAge) {
173
+ violations.push(`state_expired: age ${Math.round(age / 1000)}s`);
174
+ ageValid = false;
175
+ }
176
+ // Verify integrity
177
+ if (this.config.enableIntegrityCheck && existingState.integrity_hash) {
178
+ const expectedHash = this.computeIntegrityHash(existingState);
179
+ if (existingState.integrity_hash !== expectedHash) {
180
+ violations.push("integrity_check_failed");
181
+ integrityValid = false;
182
+ tamperingDetected = true;
183
+ }
184
+ }
185
+ // Verify provided hash matches
186
+ if (operation.integrity_hash && existingState.integrity_hash !== operation.integrity_hash) {
187
+ violations.push("integrity_hash_mismatch");
188
+ integrityValid = false;
189
+ }
190
+ }
191
+ }
192
+ // 5. For restore operations, additional checks
193
+ if (operation.operation === "restore") {
194
+ // Check for version mismatch (optimistic locking)
195
+ if (operation.expected_version !== undefined) {
196
+ const stateKey = this.getStateKey(operation.session_id, operation.key);
197
+ const existingState = this.stateStore.get(stateKey);
198
+ if (existingState && existingState.version !== operation.expected_version) {
199
+ violations.push(`version_conflict: expected ${operation.expected_version}, got ${existingState.version}`);
200
+ }
201
+ }
202
+ }
203
+ // 6. For migrate operations, strict validation
204
+ if (operation.operation === "migrate") {
205
+ violations.push("migration_requires_admin_approval");
206
+ }
207
+ // Determine if operation should be blocked
208
+ const blocked = !sessionAuthorized ||
209
+ tamperingDetected ||
210
+ !integrityValid ||
211
+ !sizeValid ||
212
+ violations.length >= 3;
213
+ return {
214
+ allowed: !blocked,
215
+ reason: blocked
216
+ ? `State operation blocked: ${violations.slice(0, 3).join(", ")}`
217
+ : "State operation validated",
218
+ violations,
219
+ request_id: reqId,
220
+ analysis: {
221
+ operation: operation.operation,
222
+ state_key: operation.key,
223
+ integrity_valid: integrityValid,
224
+ encryption_valid: encryptionValid,
225
+ session_authorized: sessionAuthorized,
226
+ size_valid: sizeValid,
227
+ age_valid: ageValid,
228
+ tampering_detected: tamperingDetected,
229
+ },
230
+ recommendations: this.generateRecommendations(violations, operation.operation),
231
+ };
232
+ }
233
+ /**
234
+ * Store state with integrity protection
235
+ */
236
+ storeState(sessionId, key, value, options) {
237
+ const reqId = `store-${Date.now()}`;
238
+ // Validate the operation first
239
+ const validation = this.validateOperation({
240
+ operation: "write",
241
+ key,
242
+ value,
243
+ session_id: sessionId,
244
+ target: options?.target,
245
+ metadata: options,
246
+ }, reqId);
247
+ if (!validation.allowed) {
248
+ return validation;
249
+ }
250
+ // Create or update state
251
+ const stateKey = this.getStateKey(sessionId, key);
252
+ const existingState = this.stateStore.get(stateKey);
253
+ const now = Date.now();
254
+ const stateItem = {
255
+ state_id: existingState?.state_id || `state-${now}-${Math.random().toString(36).substr(2, 9)}`,
256
+ session_id: sessionId,
257
+ key,
258
+ value,
259
+ created_at: existingState?.created_at || now,
260
+ modified_at: now,
261
+ version: (existingState?.version || 0) + 1,
262
+ encrypted: options?.encrypted,
263
+ target: options?.target,
264
+ metadata: options?.metadata,
265
+ };
266
+ // Compute integrity hash
267
+ stateItem.integrity_hash = this.computeIntegrityHash(stateItem);
268
+ // Store
269
+ this.stateStore.set(stateKey, stateItem);
270
+ // Track session states
271
+ let sessionStates = this.sessionStates.get(sessionId);
272
+ if (!sessionStates) {
273
+ sessionStates = new Set();
274
+ this.sessionStates.set(sessionId, sessionStates);
275
+ }
276
+ sessionStates.add(key);
277
+ return {
278
+ ...validation,
279
+ state_item: stateItem,
280
+ };
281
+ }
282
+ /**
283
+ * Retrieve state with integrity verification
284
+ */
285
+ retrieveState(sessionId, key, options) {
286
+ const reqId = `retrieve-${Date.now()}`;
287
+ // Validate the operation
288
+ const validation = this.validateOperation({
289
+ operation: "read",
290
+ key,
291
+ session_id: sessionId,
292
+ integrity_hash: options?.integrity_hash,
293
+ }, reqId);
294
+ if (!validation.allowed) {
295
+ return validation;
296
+ }
297
+ const stateKey = this.getStateKey(sessionId, key);
298
+ const stateItem = this.stateStore.get(stateKey);
299
+ return {
300
+ ...validation,
301
+ state_item: stateItem,
302
+ };
303
+ }
304
+ /**
305
+ * Delete state
306
+ */
307
+ deleteState(sessionId, key) {
308
+ const reqId = `delete-${Date.now()}`;
309
+ const stateKey = this.getStateKey(sessionId, key);
310
+ const existingState = this.stateStore.get(stateKey);
311
+ if (!existingState) {
312
+ return {
313
+ allowed: true,
314
+ reason: "State not found",
315
+ violations: [],
316
+ request_id: reqId,
317
+ analysis: {
318
+ operation: "delete",
319
+ state_key: key,
320
+ integrity_valid: true,
321
+ encryption_valid: true,
322
+ session_authorized: true,
323
+ size_valid: true,
324
+ age_valid: true,
325
+ tampering_detected: false,
326
+ },
327
+ recommendations: [],
328
+ };
329
+ }
330
+ // Verify ownership
331
+ if (this.config.enforceSessionIsolation && existingState.session_id !== sessionId) {
332
+ return {
333
+ allowed: false,
334
+ reason: "Cannot delete state owned by another session",
335
+ violations: ["session_ownership_violation"],
336
+ request_id: reqId,
337
+ analysis: {
338
+ operation: "delete",
339
+ state_key: key,
340
+ integrity_valid: true,
341
+ encryption_valid: true,
342
+ session_authorized: false,
343
+ size_valid: true,
344
+ age_valid: true,
345
+ tampering_detected: false,
346
+ },
347
+ recommendations: ["Use the correct session ID to delete state"],
348
+ };
349
+ }
350
+ // Delete
351
+ this.stateStore.delete(stateKey);
352
+ const sessionStates = this.sessionStates.get(sessionId);
353
+ if (sessionStates) {
354
+ sessionStates.delete(key);
355
+ }
356
+ return {
357
+ allowed: true,
358
+ reason: "State deleted",
359
+ violations: [],
360
+ request_id: reqId,
361
+ analysis: {
362
+ operation: "delete",
363
+ state_key: key,
364
+ integrity_valid: true,
365
+ encryption_valid: true,
366
+ session_authorized: true,
367
+ size_valid: true,
368
+ age_valid: true,
369
+ tampering_detected: false,
370
+ },
371
+ state_item: existingState,
372
+ recommendations: [],
373
+ };
374
+ }
375
+ /**
376
+ * Verify state integrity
377
+ */
378
+ verifyIntegrity(sessionId, key) {
379
+ const stateKey = this.getStateKey(sessionId, key);
380
+ const stateItem = this.stateStore.get(stateKey);
381
+ if (!stateItem || !stateItem.integrity_hash) {
382
+ return false;
383
+ }
384
+ const expectedHash = this.computeIntegrityHash(stateItem);
385
+ return stateItem.integrity_hash === expectedHash;
386
+ }
387
+ /**
388
+ * Get all states for a session
389
+ */
390
+ getSessionStates(sessionId) {
391
+ const stateKeys = this.sessionStates.get(sessionId);
392
+ if (!stateKeys)
393
+ return [];
394
+ const states = [];
395
+ for (const key of stateKeys) {
396
+ const stateKey = this.getStateKey(sessionId, key);
397
+ const state = this.stateStore.get(stateKey);
398
+ if (state) {
399
+ states.push(state);
400
+ }
401
+ }
402
+ return states;
403
+ }
404
+ /**
405
+ * Clean up expired states
406
+ */
407
+ cleanupExpiredStates() {
408
+ const now = Date.now();
409
+ let cleaned = 0;
410
+ for (const [stateKey, state] of this.stateStore.entries()) {
411
+ if (now - state.created_at > this.config.maxStateAge) {
412
+ this.stateStore.delete(stateKey);
413
+ const sessionStates = this.sessionStates.get(state.session_id);
414
+ if (sessionStates) {
415
+ sessionStates.delete(state.key);
416
+ }
417
+ cleaned++;
418
+ }
419
+ }
420
+ return cleaned;
421
+ }
422
+ /**
423
+ * Reset all states for a session
424
+ */
425
+ resetSession(sessionId) {
426
+ const stateKeys = this.sessionStates.get(sessionId);
427
+ if (stateKeys) {
428
+ for (const key of stateKeys) {
429
+ this.stateStore.delete(this.getStateKey(sessionId, key));
430
+ }
431
+ }
432
+ this.sessionStates.delete(sessionId);
433
+ }
434
+ // Private methods
435
+ getStateKey(sessionId, key) {
436
+ return `${sessionId}:${key}`;
437
+ }
438
+ computeIntegrityHash(state) {
439
+ const data = JSON.stringify({
440
+ session_id: state.session_id,
441
+ key: state.key,
442
+ value: state.value,
443
+ version: state.version,
444
+ });
445
+ return crypto
446
+ .createHmac("sha256", this.config.signingSecret)
447
+ .update(data)
448
+ .digest("hex");
449
+ }
450
+ isSensitiveKey(key) {
451
+ const keyLower = key.toLowerCase();
452
+ return this.config.sensitiveKeys.some(sk => keyLower.includes(sk.toLowerCase()));
453
+ }
454
+ generateRecommendations(violations, operation) {
455
+ const recommendations = [];
456
+ if (violations.some(v => v.includes("cross_session"))) {
457
+ recommendations.push("Access only states owned by the current session");
458
+ }
459
+ if (violations.some(v => v.includes("injection"))) {
460
+ recommendations.push("Sanitize state values before persistence");
461
+ }
462
+ if (violations.some(v => v.includes("integrity"))) {
463
+ recommendations.push("Ensure state has not been tampered with");
464
+ }
465
+ if (violations.some(v => v.includes("encryption"))) {
466
+ recommendations.push("Encrypt sensitive state before storage");
467
+ }
468
+ if (violations.some(v => v.includes("size"))) {
469
+ recommendations.push("Reduce state size or split into smaller chunks");
470
+ }
471
+ if (violations.some(v => v.includes("expired"))) {
472
+ recommendations.push("Refresh or recreate expired state");
473
+ }
474
+ if (violations.some(v => v.includes("version"))) {
475
+ recommendations.push("Fetch latest state version before updating");
476
+ }
477
+ if (recommendations.length === 0) {
478
+ recommendations.push(`Continue with ${operation} operation`);
479
+ }
480
+ return recommendations;
481
+ }
482
+ }
483
+ exports.StatePersistenceGuard = StatePersistenceGuard;
484
+ //# sourceMappingURL=state-persistence-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-persistence-guard.js","sourceRoot":"","sources":["../../src/guards/state-persistence-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * L4 Tenant Boundary Guard
3
+ *
4
+ * Enforces strict multi-tenant isolation.
5
+ * Prevents cross-tenant data access.
6
+ */
7
+ import { SessionContext, TenantBoundaryResult } from "../types";
8
+ export interface ResourceOwnership {
9
+ resource_id: string;
10
+ tenant_id: string;
11
+ resource_type?: string;
12
+ }
13
+ export interface TenantBoundaryConfig {
14
+ validTenants?: Set<string>;
15
+ resourceOwnership?: Map<string, ResourceOwnership>;
16
+ resourceIdFields?: string[];
17
+ listOperations?: string[];
18
+ }
19
+ export declare class TenantBoundary {
20
+ private validTenants;
21
+ private resourceOwnership;
22
+ private resourceIdFields;
23
+ private listOperations;
24
+ constructor(config?: TenantBoundaryConfig);
25
+ /**
26
+ * Validate session has valid tenant
27
+ */
28
+ validateSession(session: SessionContext | undefined, requestId?: string): {
29
+ valid: boolean;
30
+ error?: string;
31
+ };
32
+ /**
33
+ * Check resource ownership
34
+ */
35
+ checkResourceOwnership(resourceId: string, session: SessionContext, requestId?: string): {
36
+ allowed: boolean;
37
+ resource_tenant?: string;
38
+ };
39
+ /**
40
+ * Check if tenant_id parameter matches session
41
+ */
42
+ checkTenantParameter(params: Record<string, any>, session: SessionContext, requestId?: string): {
43
+ allowed: boolean;
44
+ reason?: string;
45
+ };
46
+ /**
47
+ * Enforce tenant filtering for list operations
48
+ */
49
+ enforceTenantFilter(toolName: string, params: Record<string, any>, session: SessionContext, requestId?: string): {
50
+ allowed: boolean;
51
+ enforced_params: Record<string, any>;
52
+ reason?: string;
53
+ };
54
+ /**
55
+ * Complete tenant boundary check
56
+ */
57
+ check(toolName: string, params: Record<string, any>, session: SessionContext | undefined, requestId?: string): TenantBoundaryResult;
58
+ /**
59
+ * Register resource ownership
60
+ */
61
+ registerResource(resourceId: string, tenantId: string, resourceType?: string): void;
62
+ /**
63
+ * Add valid tenant
64
+ */
65
+ addValidTenant(tenantId: string): void;
66
+ }
67
+ //# sourceMappingURL=tenant-boundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-boundary.d.ts","sourceRoot":"","sources":["../../src/guards/tenant-boundary.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACnD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,OAAO,CAAC,gBAAgB,CAAW;IACnC,OAAO,CAAC,cAAc,CAAW;gBAErB,MAAM,GAAE,oBAAyB;IAoB7C;;OAEG;IACH,eAAe,CACb,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,SAAS,GAAE,MAAW,GACrB;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAwBrC;;OAEG;IACH,sBAAsB,CACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,SAAS,GAAE,MAAW,GACrB;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE;IAmBjD;;OAEG;IACH,oBAAoB,CAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,OAAO,EAAE,cAAc,EACvB,SAAS,GAAE,MAAW,GACrB;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAcxC;;OAEG;IACH,mBAAmB,CACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,OAAO,EAAE,cAAc,EACvB,SAAS,GAAE,MAAW,GACrB;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IA6B9E;;OAEG;IACH,KAAK,CACH,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,SAAS,GAAE,MAAW,GACrB,oBAAoB;IAoEvB;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAQnF;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;CAGvC"}