From 66dc4ce1c86a36acfbbd9d2c4b781a4344db1211 Mon Sep 17 00:00:00 2001 From: doudouOUC Date: Thu, 28 May 2026 23:57:12 +0800 Subject: [PATCH] fix(serve): strip env field, add status cleanup and name validation (T2.8 #4514) Security: - Strip `env` from runtime-added MCP server configs (prevents NODE_OPTIONS/LD_PRELOAD injection via HTTP body) Correctness: - Add `removeMCPServerStatus(name)` in spawn-failure catch block (prevents stale CONNECTING entry in status registry) Hardening: - Add name validation (charset + length) to ACP ext-method handlers for both add and remove (matches HTTP route validation) --- packages/cli/src/acp-integration/acpAgent.ts | 13 +++++++++++++ packages/core/src/tools/mcp-client-manager.ts | 1 + 2 files changed, 14 insertions(+) diff --git a/packages/cli/src/acp-integration/acpAgent.ts b/packages/cli/src/acp-integration/acpAgent.ts index f2dcec2cef..c09c7abec3 100644 --- a/packages/cli/src/acp-integration/acpAgent.ts +++ b/packages/cli/src/acp-integration/acpAgent.ts @@ -2504,6 +2504,12 @@ class QwenAgent implements Agent { 'Invalid or missing name', ); } + if (name.length > 256 || !/^[A-Za-z0-9_-]+$/.test(name)) { + throw RequestError.invalidParams( + undefined, + 'Server name must be ≤256 chars, alphanumeric + underscore/hyphen', + ); + } if (!config || typeof config !== 'object' || Array.isArray(config)) { throw RequestError.invalidParams( undefined, @@ -2537,6 +2543,7 @@ class QwenAgent implements Agent { includeTools: _inc, excludeTools: _exc, cwd: _cwd, + env: _env, ...safeConfig } = config as Record; const result = await manager.addRuntimeMcpServer( @@ -2578,6 +2585,12 @@ class QwenAgent implements Agent { 'Invalid or missing name', ); } + if (name.length > 256 || !/^[A-Za-z0-9_-]+$/.test(name)) { + throw RequestError.invalidParams( + undefined, + 'Server name must be ≤256 chars, alphanumeric + underscore/hyphen', + ); + } if ( typeof originatorClientId !== 'string' || originatorClientId.length === 0 diff --git a/packages/core/src/tools/mcp-client-manager.ts b/packages/core/src/tools/mcp-client-manager.ts index 4dd31a50aa..3c95045347 100644 --- a/packages/core/src/tools/mcp-client-manager.ts +++ b/packages/core/src/tools/mcp-client-manager.ts @@ -2825,6 +2825,7 @@ export class McpClientManager { // Clean up any partial state (including tools from partial discover) this.toolRegistry.removeMcpToolsByServer(name); this.pooledConnections.delete(name); + removeMCPServerStatus(name); const failedClient = this.clients.get(name); if (failedClient) { try {