mstro-app 0.3.7 → 0.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -8
- package/bin/mstro.js +54 -15
- package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker.js +18 -9
- package/dist/server/cli/headless/claude-invoker.js.map +1 -1
- package/dist/server/cli/headless/headless-logger.d.ts +10 -0
- package/dist/server/cli/headless/headless-logger.d.ts.map +1 -0
- package/dist/server/cli/headless/headless-logger.js +66 -0
- package/dist/server/cli/headless/headless-logger.js.map +1 -0
- package/dist/server/cli/headless/mcp-config.d.ts.map +1 -1
- package/dist/server/cli/headless/mcp-config.js +6 -5
- package/dist/server/cli/headless/mcp-config.js.map +1 -1
- package/dist/server/cli/headless/runner.d.ts.map +1 -1
- package/dist/server/cli/headless/runner.js +4 -0
- package/dist/server/cli/headless/runner.js.map +1 -1
- package/dist/server/cli/headless/stall-assessor.d.ts +21 -0
- package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
- package/dist/server/cli/headless/stall-assessor.js +74 -20
- package/dist/server/cli/headless/stall-assessor.js.map +1 -1
- package/dist/server/cli/headless/tool-watchdog.d.ts +0 -12
- package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -1
- package/dist/server/cli/headless/tool-watchdog.js +30 -9
- package/dist/server/cli/headless/tool-watchdog.js.map +1 -1
- package/dist/server/cli/headless/types.d.ts +8 -1
- package/dist/server/cli/headless/types.d.ts.map +1 -1
- package/dist/server/cli/improvisation-session-manager.d.ts +16 -0
- package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
- package/dist/server/cli/improvisation-session-manager.js +94 -11
- package/dist/server/cli/improvisation-session-manager.js.map +1 -1
- package/dist/server/index.js +0 -4
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp/bouncer-cli.d.ts +3 -0
- package/dist/server/mcp/bouncer-cli.d.ts.map +1 -0
- package/dist/server/mcp/bouncer-cli.js +54 -0
- package/dist/server/mcp/bouncer-cli.js.map +1 -0
- package/dist/server/mcp/bouncer-integration.d.ts +2 -0
- package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
- package/dist/server/mcp/bouncer-integration.js +55 -39
- package/dist/server/mcp/bouncer-integration.js.map +1 -1
- package/dist/server/mcp/bouncer-sandbox.d.ts +60 -0
- package/dist/server/mcp/bouncer-sandbox.d.ts.map +1 -0
- package/dist/server/mcp/bouncer-sandbox.js +182 -0
- package/dist/server/mcp/bouncer-sandbox.js.map +1 -0
- package/dist/server/mcp/security-patterns.d.ts +6 -12
- package/dist/server/mcp/security-patterns.d.ts.map +1 -1
- package/dist/server/mcp/security-patterns.js +197 -10
- package/dist/server/mcp/security-patterns.js.map +1 -1
- package/dist/server/services/plan/composer.d.ts +4 -0
- package/dist/server/services/plan/composer.d.ts.map +1 -0
- package/dist/server/services/plan/composer.js +181 -0
- package/dist/server/services/plan/composer.js.map +1 -0
- package/dist/server/services/plan/dependency-resolver.d.ts +28 -0
- package/dist/server/services/plan/dependency-resolver.d.ts.map +1 -0
- package/dist/server/services/plan/dependency-resolver.js +152 -0
- package/dist/server/services/plan/dependency-resolver.js.map +1 -0
- package/dist/server/services/plan/executor.d.ts +91 -0
- package/dist/server/services/plan/executor.d.ts.map +1 -0
- package/dist/server/services/plan/executor.js +545 -0
- package/dist/server/services/plan/executor.js.map +1 -0
- package/dist/server/services/plan/parser.d.ts +11 -0
- package/dist/server/services/plan/parser.d.ts.map +1 -0
- package/dist/server/services/plan/parser.js +415 -0
- package/dist/server/services/plan/parser.js.map +1 -0
- package/dist/server/services/plan/state-reconciler.d.ts +2 -0
- package/dist/server/services/plan/state-reconciler.d.ts.map +1 -0
- package/dist/server/services/plan/state-reconciler.js +105 -0
- package/dist/server/services/plan/state-reconciler.js.map +1 -0
- package/dist/server/services/plan/types.d.ts +120 -0
- package/dist/server/services/plan/types.d.ts.map +1 -0
- package/dist/server/services/plan/types.js +4 -0
- package/dist/server/services/plan/types.js.map +1 -0
- package/dist/server/services/plan/watcher.d.ts +14 -0
- package/dist/server/services/plan/watcher.d.ts.map +1 -0
- package/dist/server/services/plan/watcher.js +69 -0
- package/dist/server/services/plan/watcher.js.map +1 -0
- package/dist/server/services/websocket/file-explorer-handlers.js +20 -0
- package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -1
- package/dist/server/services/websocket/handler.d.ts +0 -1
- package/dist/server/services/websocket/handler.d.ts.map +1 -1
- package/dist/server/services/websocket/handler.js +28 -2
- package/dist/server/services/websocket/handler.js.map +1 -1
- package/dist/server/services/websocket/plan-handlers.d.ts +6 -0
- package/dist/server/services/websocket/plan-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/plan-handlers.js +494 -0
- package/dist/server/services/websocket/plan-handlers.js.map +1 -0
- package/dist/server/services/websocket/quality-handlers.d.ts +4 -0
- package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-handlers.js +470 -0
- package/dist/server/services/websocket/quality-handlers.js.map +1 -0
- package/dist/server/services/websocket/quality-persistence.d.ts +45 -0
- package/dist/server/services/websocket/quality-persistence.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-persistence.js +187 -0
- package/dist/server/services/websocket/quality-persistence.js.map +1 -0
- package/dist/server/services/websocket/quality-service.d.ts +54 -0
- package/dist/server/services/websocket/quality-service.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-service.js +816 -0
- package/dist/server/services/websocket/quality-service.js.map +1 -0
- package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/session-handlers.js +23 -0
- package/dist/server/services/websocket/session-handlers.js.map +1 -1
- package/dist/server/services/websocket/types.d.ts +2 -2
- package/dist/server/services/websocket/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/server/cli/headless/claude-invoker.ts +21 -9
- package/server/cli/headless/headless-logger.ts +78 -0
- package/server/cli/headless/mcp-config.ts +6 -5
- package/server/cli/headless/runner.ts +4 -0
- package/server/cli/headless/stall-assessor.ts +101 -20
- package/server/cli/headless/tool-watchdog.ts +18 -9
- package/server/cli/headless/types.ts +10 -1
- package/server/cli/improvisation-session-manager.ts +118 -11
- package/server/index.ts +0 -4
- package/server/mcp/bouncer-cli.ts +73 -0
- package/server/mcp/bouncer-integration.ts +66 -44
- package/server/mcp/bouncer-sandbox.ts +214 -0
- package/server/mcp/security-patterns.ts +206 -10
- package/server/services/plan/composer.ts +199 -0
- package/server/services/plan/dependency-resolver.ts +179 -0
- package/server/services/plan/executor.ts +604 -0
- package/server/services/plan/parser.ts +459 -0
- package/server/services/plan/state-reconciler.ts +132 -0
- package/server/services/plan/types.ts +164 -0
- package/server/services/plan/watcher.ts +73 -0
- package/server/services/websocket/file-explorer-handlers.ts +20 -0
- package/server/services/websocket/handler.ts +28 -2
- package/server/services/websocket/plan-handlers.ts +592 -0
- package/server/services/websocket/quality-handlers.ts +570 -0
- package/server/services/websocket/quality-persistence.ts +250 -0
- package/server/services/websocket/quality-service.ts +975 -0
- package/server/services/websocket/session-handlers.ts +26 -0
- package/server/services/websocket/types.ts +62 -2
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
import { spawn } from 'node:child_process';
|
|
34
34
|
import { AnalyticsEvents, trackEvent } from '../services/analytics.js';
|
|
35
35
|
import { captureException } from '../services/sentry.js';
|
|
36
|
-
import { CRITICAL_THREATS, matchesPattern, requiresAIReview, SAFE_OPERATIONS } from './security-patterns.js';
|
|
36
|
+
import { CRITICAL_THREATS, matchesPattern, normalizeOperation, requiresAIReview, SAFE_OPERATIONS } from './security-patterns.js';
|
|
37
37
|
/** Timeout for Haiku bouncer subprocess calls (ms). Configurable via env var. */
|
|
38
38
|
const HAIKU_TIMEOUT_MS = parseInt(process.env.BOUNCER_HAIKU_TIMEOUT_MS || '10000', 10);
|
|
39
39
|
// ========== Decision Cache ==========
|
|
@@ -51,6 +51,10 @@ function getCachedDecision(operation) {
|
|
|
51
51
|
}
|
|
52
52
|
return entry.decision;
|
|
53
53
|
}
|
|
54
|
+
/** Clear the decision cache. Exposed for testing statistical reliability (multiple runs per operation). */
|
|
55
|
+
export function clearDecisionCache() {
|
|
56
|
+
decisionCache.clear();
|
|
57
|
+
}
|
|
54
58
|
function cacheDecision(operation, decision) {
|
|
55
59
|
// Don't cache low-confidence or error-fallback decisions
|
|
56
60
|
if (decision.confidence < 50)
|
|
@@ -226,13 +230,44 @@ function finalizeDecision(operation, decision, layer, startTime, context, logFn,
|
|
|
226
230
|
cacheDecision(operation, decision);
|
|
227
231
|
return decision;
|
|
228
232
|
}
|
|
233
|
+
/**
|
|
234
|
+
* Layer 2: Haiku AI analysis with timeout/error handling.
|
|
235
|
+
*/
|
|
236
|
+
async function runHaikuAnalysis(request, operation, startTime, fin) {
|
|
237
|
+
if (process.env.BOUNCER_USE_AI === 'false') {
|
|
238
|
+
console.error('[Bouncer] AI analysis disabled (BOUNCER_USE_AI=false)');
|
|
239
|
+
return fin({ decision: 'warn_allow', confidence: 60, reasoning: 'Operation requires review but AI analysis is disabled. Proceeding with caution.', threatLevel: 'medium' }, 'ai-disabled', { skipCache: true, skipAnalytics: true });
|
|
240
|
+
}
|
|
241
|
+
console.error('[Bouncer] 🤖 Invoking Haiku for AI analysis...');
|
|
242
|
+
trackEvent(AnalyticsEvents.BOUNCER_HAIKU_REVIEW, { operation_length: operation.length });
|
|
243
|
+
const claudeCommand = process.env.CLAUDE_COMMAND || 'claude';
|
|
244
|
+
const workingDir = request.context?.workingDirectory || process.cwd();
|
|
245
|
+
try {
|
|
246
|
+
const decision = await analyzeWithHaiku(request, claudeCommand, workingDir);
|
|
247
|
+
console.error(`[Bouncer] ✓ Haiku decision: ${decision.decision} (${decision.confidence}% confidence) [${Math.round(performance.now() - startTime)}ms]`);
|
|
248
|
+
console.error(`[Bouncer] Reasoning: ${decision.reasoning}`);
|
|
249
|
+
return fin(decision, 'haiku-ai');
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
253
|
+
if (errorMessage.includes('timed out')) {
|
|
254
|
+
console.error(`[Bouncer] ⚠️ Haiku analysis timed out after ${HAIKU_TIMEOUT_MS}ms — defaulting to ALLOW`);
|
|
255
|
+
captureException(error, { context: 'bouncer.haiku_timeout', operation });
|
|
256
|
+
return fin({ decision: 'allow', confidence: 50, reasoning: `Security analysis timed out after ${HAIKU_TIMEOUT_MS}ms. Defaulting to allow — user initiated the action.`, threatLevel: 'medium' }, 'haiku-timeout', { skipCache: true });
|
|
257
|
+
}
|
|
258
|
+
console.error(`[Bouncer] ⚠️ Haiku analysis failed: ${errorMessage}`);
|
|
259
|
+
captureException(error, { context: 'bouncer.haiku_analysis', operation });
|
|
260
|
+
return fin({ decision: 'deny', confidence: 0, reasoning: `Security analysis failed: ${errorMessage}. Denying for safety.`, threatLevel: 'critical' }, 'ai-error', { skipCache: true, skipAnalytics: true, error: errorMessage });
|
|
261
|
+
}
|
|
262
|
+
}
|
|
229
263
|
/**
|
|
230
264
|
* Main bouncer review function - 2-layer hybrid system
|
|
231
265
|
*/
|
|
232
266
|
export async function reviewOperation(request) {
|
|
233
267
|
const { logBouncerDecision } = await import('./security-audit.js');
|
|
234
268
|
const startTime = performance.now();
|
|
235
|
-
const { operation } = request;
|
|
269
|
+
const { operation: rawOperation } = request;
|
|
270
|
+
const operation = normalizeOperation(rawOperation);
|
|
236
271
|
const fin = (d, layer, opts) => finalizeDecision(operation, d, layer, startTime, request.context, logBouncerDecision, opts);
|
|
237
272
|
// Check cache first
|
|
238
273
|
const cached = getCachedDecision(operation);
|
|
@@ -252,14 +287,9 @@ export async function reviewOperation(request) {
|
|
|
252
287
|
return fin({ decision: 'allow', confidence: 95, reasoning: 'Empty tool parameters - operation is a no-op with no side effects.', threatLevel: 'low' }, 'pattern-noop', { skipAnalytics: true });
|
|
253
288
|
}
|
|
254
289
|
// LAYER 1: Pattern-Based Fast Path (< 5ms)
|
|
255
|
-
//
|
|
256
|
-
// to
|
|
257
|
-
|
|
258
|
-
if (safeOperation) {
|
|
259
|
-
console.error('[Bouncer] ⚡ Fast path: Safe operation approved');
|
|
260
|
-
return fin({ decision: 'allow', confidence: 95, reasoning: 'Operation matches known-safe patterns. No security concerns detected.', threatLevel: 'low' }, 'pattern-safe');
|
|
261
|
-
}
|
|
262
|
-
// Critical threats (rm -rf /, fork bombs) — ALWAYS denied
|
|
290
|
+
// Critical threats (rm -rf /, fork bombs) — ALWAYS denied, checked first
|
|
291
|
+
// to prevent chained commands (e.g., "echo hello; rm -rf /") from bypassing
|
|
292
|
+
// via a safe prefix match.
|
|
263
293
|
const criticalThreat = matchesPattern(operation, CRITICAL_THREATS);
|
|
264
294
|
if (criticalThreat) {
|
|
265
295
|
console.error('[Bouncer] ⚡ Fast path: CRITICAL THREAT detected');
|
|
@@ -269,37 +299,23 @@ export async function reviewOperation(request) {
|
|
|
269
299
|
enforceable: true,
|
|
270
300
|
}, 'pattern-critical');
|
|
271
301
|
}
|
|
272
|
-
//
|
|
273
|
-
//
|
|
302
|
+
// Use requiresAIReview() for nuanced routing — handles sensitive paths,
|
|
303
|
+
// safe operations with guards (chain operators, pipes, expansion), and
|
|
304
|
+
// exfiltration patterns in a single consistent check.
|
|
274
305
|
if (!requiresAIReview(operation)) {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
const workingDir = request.context?.workingDirectory || process.cwd();
|
|
286
|
-
try {
|
|
287
|
-
const decision = await analyzeWithHaiku(request, claudeCommand, workingDir);
|
|
288
|
-
console.error(`[Bouncer] ✓ Haiku decision: ${decision.decision} (${decision.confidence}% confidence) [${Math.round(performance.now() - startTime)}ms]`);
|
|
289
|
-
console.error(`[Bouncer] Reasoning: ${decision.reasoning}`);
|
|
290
|
-
return fin(decision, 'haiku-ai');
|
|
291
|
-
}
|
|
292
|
-
catch (error) {
|
|
293
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
294
|
-
if (errorMessage.includes('timed out')) {
|
|
295
|
-
console.error(`[Bouncer] ⚠️ Haiku analysis timed out after ${HAIKU_TIMEOUT_MS}ms — defaulting to ALLOW`);
|
|
296
|
-
captureException(error, { context: 'bouncer.haiku_timeout', operation });
|
|
297
|
-
return fin({ decision: 'allow', confidence: 50, reasoning: `Security analysis timed out after ${HAIKU_TIMEOUT_MS}ms. Defaulting to allow — user initiated the action.`, threatLevel: 'medium' }, 'haiku-timeout', { skipCache: true });
|
|
298
|
-
}
|
|
299
|
-
console.error(`[Bouncer] ⚠️ Haiku analysis failed: ${errorMessage}`);
|
|
300
|
-
captureException(error, { context: 'bouncer.haiku_analysis', operation });
|
|
301
|
-
return fin({ decision: 'deny', confidence: 0, reasoning: `Security analysis failed: ${errorMessage}. Denying for safety.`, threatLevel: 'critical' }, 'ai-error', { skipCache: true, skipAnalytics: true, error: errorMessage });
|
|
306
|
+
const isSafe = matchesPattern(operation, SAFE_OPERATIONS);
|
|
307
|
+
console.error(`[Bouncer] ⚡ Fast path: ${isSafe ? 'Safe operation approved' : 'No concerning patterns, allowing'}`);
|
|
308
|
+
return fin({
|
|
309
|
+
decision: 'allow',
|
|
310
|
+
confidence: isSafe ? 95 : 80,
|
|
311
|
+
reasoning: isSafe
|
|
312
|
+
? 'Operation matches known-safe patterns. No security concerns detected.'
|
|
313
|
+
: 'Operation appears safe based on pattern analysis. No obvious threats detected.',
|
|
314
|
+
threatLevel: 'low'
|
|
315
|
+
}, isSafe ? 'pattern-safe' : 'pattern-default');
|
|
302
316
|
}
|
|
317
|
+
// LAYER 2: Haiku AI Analysis (~200-500ms)
|
|
318
|
+
return runHaikuAnalysis(request, operation, startTime, fin);
|
|
303
319
|
}
|
|
304
320
|
/**
|
|
305
321
|
* Export risk classification utility
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bouncer-integration.js","sourceRoot":"","sources":["../../../server/mcp/bouncer-integration.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bouncer-integration.js","sourceRoot":"","sources":["../../../server/mcp/bouncer-integration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export interface SandboxExecResult {
|
|
2
|
+
/** The sandboxed command that was actually run */
|
|
3
|
+
wrappedCommand: string;
|
|
4
|
+
/** Whether sandbox-runtime is available on this platform */
|
|
5
|
+
sandboxAvailable: boolean;
|
|
6
|
+
/** Whether the sandbox contained the operation (no violations) */
|
|
7
|
+
contained: boolean;
|
|
8
|
+
/** List of violation descriptions if any escaped the sandbox */
|
|
9
|
+
violations: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface CanaryCheckResult {
|
|
12
|
+
/** Whether the canary file still exists (should be true if sandbox contained the write) */
|
|
13
|
+
canaryIntact: boolean;
|
|
14
|
+
/** Whether a file was written outside the sandbox (should be false) */
|
|
15
|
+
escapeDetected: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Test harness that wraps command execution in sandbox-runtime.
|
|
19
|
+
* Provides canary files and violation tracking to verify containment.
|
|
20
|
+
*/
|
|
21
|
+
export declare class BouncerSandboxHarness {
|
|
22
|
+
private sandboxManager;
|
|
23
|
+
private sandboxAvailable;
|
|
24
|
+
private tempDir;
|
|
25
|
+
private canaryDir;
|
|
26
|
+
constructor();
|
|
27
|
+
/**
|
|
28
|
+
* Initialize the sandbox. Falls back gracefully if bwrap/sandbox-exec not available.
|
|
29
|
+
*/
|
|
30
|
+
initialize(): Promise<{
|
|
31
|
+
available: boolean;
|
|
32
|
+
reason?: string;
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* Execute a command inside the sandbox. Returns containment results.
|
|
36
|
+
* If sandbox is not available, validates the bouncer decision only (no actual execution).
|
|
37
|
+
*/
|
|
38
|
+
executeInSandbox(command: string): Promise<SandboxExecResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Place a canary file and return a checker to verify containment.
|
|
41
|
+
* If a sandboxed command can delete or modify the canary, containment failed.
|
|
42
|
+
*/
|
|
43
|
+
placeCanary(name: string): {
|
|
44
|
+
path: string;
|
|
45
|
+
check: () => CanaryCheckResult;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Get the temp directory where sandboxed commands can write.
|
|
49
|
+
*/
|
|
50
|
+
getSandboxWriteDir(): string;
|
|
51
|
+
/**
|
|
52
|
+
* Whether the sandbox is actually available and initialized.
|
|
53
|
+
*/
|
|
54
|
+
isAvailable(): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Clean up temp dirs and reset sandbox state.
|
|
57
|
+
*/
|
|
58
|
+
cleanup(): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=bouncer-sandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bouncer-sandbox.d.ts","sourceRoot":"","sources":["../../../server/mcp/bouncer-sandbox.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,cAAc,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kEAAkE;IAClE,SAAS,EAAE,OAAO,CAAC;IACnB,gEAAgE;IAChE,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,2FAA2F;IAC3F,YAAY,EAAE,OAAO,CAAC;IACtB,uEAAuE;IACvE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,cAAc,CAA0F;IAChH,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;;IAQ1B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAiDpE;;;OAGG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmDnE;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,iBAAiB,CAAA;KAAE;IAc3E;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAc/B"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
// Licensed under the MIT License. See LICENSE file for details.
|
|
3
|
+
/**
|
|
4
|
+
* Sandbox Harness for Bouncer Testing
|
|
5
|
+
*
|
|
6
|
+
* Wraps command execution in Anthropic's sandbox-runtime (bubblewrap on Linux,
|
|
7
|
+
* sandbox-exec on macOS) to safely test what happens when the bouncer FAILS —
|
|
8
|
+
* i.e., when a malicious tool call gets through.
|
|
9
|
+
*
|
|
10
|
+
* Usage in tests:
|
|
11
|
+
* const harness = new BouncerSandboxHarness();
|
|
12
|
+
* await harness.initialize();
|
|
13
|
+
* const result = await harness.executeInSandbox('rm -rf /tmp/test-canary');
|
|
14
|
+
* expect(result.violations).toContain(...)
|
|
15
|
+
* await harness.cleanup();
|
|
16
|
+
*/
|
|
17
|
+
import { execSync } from 'node:child_process';
|
|
18
|
+
import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
19
|
+
import { tmpdir } from 'node:os';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
/**
|
|
22
|
+
* Test harness that wraps command execution in sandbox-runtime.
|
|
23
|
+
* Provides canary files and violation tracking to verify containment.
|
|
24
|
+
*/
|
|
25
|
+
export class BouncerSandboxHarness {
|
|
26
|
+
sandboxManager = null;
|
|
27
|
+
sandboxAvailable = false;
|
|
28
|
+
tempDir;
|
|
29
|
+
canaryDir;
|
|
30
|
+
constructor() {
|
|
31
|
+
this.tempDir = mkdtempSync(join(tmpdir(), 'bouncer-sandbox-'));
|
|
32
|
+
this.canaryDir = join(this.tempDir, 'canaries');
|
|
33
|
+
mkdirSync(this.canaryDir, { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Initialize the sandbox. Falls back gracefully if bwrap/sandbox-exec not available.
|
|
37
|
+
*/
|
|
38
|
+
async initialize() {
|
|
39
|
+
try {
|
|
40
|
+
const { SandboxManager } = await import('@anthropic-ai/sandbox-runtime');
|
|
41
|
+
if (!SandboxManager.isSupportedPlatform()) {
|
|
42
|
+
return { available: false, reason: 'Platform not supported by sandbox-runtime' };
|
|
43
|
+
}
|
|
44
|
+
const deps = SandboxManager.checkDependencies();
|
|
45
|
+
if (deps.errors.length > 0) {
|
|
46
|
+
return {
|
|
47
|
+
available: false,
|
|
48
|
+
reason: `Missing dependencies: ${deps.errors.join(', ')}`,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
await SandboxManager.initialize({
|
|
52
|
+
network: {
|
|
53
|
+
allowedDomains: [], // Block ALL network access
|
|
54
|
+
deniedDomains: ['*'],
|
|
55
|
+
},
|
|
56
|
+
filesystem: {
|
|
57
|
+
denyRead: [
|
|
58
|
+
'/home/*/.ssh',
|
|
59
|
+
'/home/*/.aws',
|
|
60
|
+
'/home/*/.gnupg',
|
|
61
|
+
'/etc/shadow',
|
|
62
|
+
'/etc/passwd',
|
|
63
|
+
],
|
|
64
|
+
allowWrite: [this.tempDir], // Only allow writes to our temp dir
|
|
65
|
+
denyWrite: [
|
|
66
|
+
'/',
|
|
67
|
+
'/home',
|
|
68
|
+
'/etc',
|
|
69
|
+
'/usr',
|
|
70
|
+
'/var',
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
this.sandboxManager = SandboxManager;
|
|
75
|
+
this.sandboxAvailable = true;
|
|
76
|
+
return { available: true };
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
80
|
+
return { available: false, reason: `Failed to initialize sandbox: ${msg}` };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Execute a command inside the sandbox. Returns containment results.
|
|
85
|
+
* If sandbox is not available, validates the bouncer decision only (no actual execution).
|
|
86
|
+
*/
|
|
87
|
+
async executeInSandbox(command) {
|
|
88
|
+
if (!this.sandboxAvailable || !this.sandboxManager) {
|
|
89
|
+
return {
|
|
90
|
+
wrappedCommand: command,
|
|
91
|
+
sandboxAvailable: false,
|
|
92
|
+
contained: true,
|
|
93
|
+
violations: ['Sandbox not available — decision-only testing mode'],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const violations = [];
|
|
97
|
+
try {
|
|
98
|
+
const wrappedCommand = await this.sandboxManager.wrapWithSandbox(command);
|
|
99
|
+
// Execute the wrapped command and capture violations
|
|
100
|
+
try {
|
|
101
|
+
execSync(wrappedCommand, {
|
|
102
|
+
timeout: 5000,
|
|
103
|
+
stdio: 'pipe',
|
|
104
|
+
cwd: this.tempDir,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Command failure inside sandbox is expected for malicious ops
|
|
109
|
+
}
|
|
110
|
+
// Check violation store
|
|
111
|
+
const stderr = this.sandboxManager.annotateStderrWithSandboxFailures(command, '');
|
|
112
|
+
if (stderr) {
|
|
113
|
+
violations.push(stderr);
|
|
114
|
+
}
|
|
115
|
+
this.sandboxManager.cleanupAfterCommand();
|
|
116
|
+
return {
|
|
117
|
+
wrappedCommand,
|
|
118
|
+
sandboxAvailable: true,
|
|
119
|
+
contained: violations.length === 0,
|
|
120
|
+
violations,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
125
|
+
violations.push(`Sandbox execution error: ${msg}`);
|
|
126
|
+
return {
|
|
127
|
+
wrappedCommand: command,
|
|
128
|
+
sandboxAvailable: true,
|
|
129
|
+
contained: true, // Error means the command didn't execute
|
|
130
|
+
violations,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Place a canary file and return a checker to verify containment.
|
|
136
|
+
* If a sandboxed command can delete or modify the canary, containment failed.
|
|
137
|
+
*/
|
|
138
|
+
placeCanary(name) {
|
|
139
|
+
const canaryPath = join(this.canaryDir, name);
|
|
140
|
+
const escapePath = join(this.canaryDir, `${name}.escaped`);
|
|
141
|
+
writeFileSync(canaryPath, `canary-${Date.now()}`, 'utf-8');
|
|
142
|
+
return {
|
|
143
|
+
path: canaryPath,
|
|
144
|
+
check: () => ({
|
|
145
|
+
canaryIntact: existsSync(canaryPath),
|
|
146
|
+
escapeDetected: existsSync(escapePath),
|
|
147
|
+
}),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get the temp directory where sandboxed commands can write.
|
|
152
|
+
*/
|
|
153
|
+
getSandboxWriteDir() {
|
|
154
|
+
return this.tempDir;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Whether the sandbox is actually available and initialized.
|
|
158
|
+
*/
|
|
159
|
+
isAvailable() {
|
|
160
|
+
return this.sandboxAvailable;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Clean up temp dirs and reset sandbox state.
|
|
164
|
+
*/
|
|
165
|
+
async cleanup() {
|
|
166
|
+
try {
|
|
167
|
+
if (this.sandboxManager) {
|
|
168
|
+
await this.sandboxManager.reset();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// Ignore cleanup errors
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
rmSync(this.tempDir, { recursive: true, force: true });
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// Ignore cleanup errors
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=bouncer-sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bouncer-sandbox.js","sourceRoot":"","sources":["../../../server/mcp/bouncer-sandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Security Patterns - Single Source of Truth
|
|
3
|
-
*
|
|
4
|
-
* Consolidated pattern definitions for fast-path security checks.
|
|
5
|
-
* All pattern-based security decisions use this module to avoid duplication.
|
|
6
|
-
*
|
|
7
|
-
* PHILOSOPHY:
|
|
8
|
-
* - Most operations should be evaluated by CONTEXT, not by path or extension
|
|
9
|
-
* - Only truly catastrophic operations (rm -rf /, fork bombs) are auto-denied
|
|
10
|
-
* - Sensitive operations (system paths, credentials) get AI review with context
|
|
11
|
-
* - The question is: "Does this operation make sense given user intent?"
|
|
12
|
-
*/
|
|
13
1
|
export interface SecurityPattern {
|
|
14
2
|
pattern: RegExp;
|
|
15
3
|
reason?: string;
|
|
@@ -50,6 +38,12 @@ export declare const NEEDS_AI_REVIEW: SecurityPattern[];
|
|
|
50
38
|
* Check if operation matches any pattern in array
|
|
51
39
|
*/
|
|
52
40
|
export declare function matchesPattern(operation: string, patterns: SecurityPattern[]): SecurityPattern | null;
|
|
41
|
+
/**
|
|
42
|
+
* Normalize file paths in Write/Edit/Read operations to resolve .. traversal.
|
|
43
|
+
* Prevents path traversal attacks like "Write: /home/user/../../etc/passwd"
|
|
44
|
+
* from matching safe home-directory patterns.
|
|
45
|
+
*/
|
|
46
|
+
export declare function normalizeOperation(operation: string): string;
|
|
53
47
|
export declare function requiresAIReview(operation: string): boolean;
|
|
54
48
|
/**
|
|
55
49
|
* Check if operation targets a sensitive path
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security-patterns.d.ts","sourceRoot":"","sources":["../../../server/mcp/security-patterns.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"security-patterns.d.ts","sourceRoot":"","sources":["../../../server/mcp/security-patterns.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,eAAe,EAiB5C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,EAAE,eAAe,EA0C7C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,eAAe,EAoC5C,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,eAAe,EAqH5C,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,eAAe,GAAG,IAAI,CAOrG;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAgED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CA8C3D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAEzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG;IAC/C,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAClD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CA8DA"}
|