1

Agentes de IA estão instalando servidores MCP arquivados, e o do Puppeteer tem RCE que não vai ser corrigido

Você pede pro Claude Code ou pro Cursor "configura um MCP do GitHub" e ele configura. Só que, em vez do servidor que o próprio GitHub mantém, ele pode instalar o @modelcontextprotocol/server-github, o servidor de referência que a Anthropic publicou quando lançou o MCP. Esse repositório foi arquivado, e o aviso diz que não vai ter mais correção de segurança.

Quem levantou isso foi a Glow Labs, que chamou o padrão de MCPhantom. Eles analisaram transcrições de sessões reais em que um servidor obsoleto foi instalado ou sugerido. Em 98% delas, o agente parece ter tirado o nome do pacote dos dados de treino. Nos outros 2%, o próprio usuário pediu o pacote antigo pelo nome. Apareceu no Claude Code, no Cursor, no Codex CLI, no Claude Cowork e no Claude chat, com modelos da Anthropic, da OpenAI e da xAI. Ou seja, não é coisa de um fornecedor só.

O caso do Puppeteer

A Anthropic publicou 20 servidores de referência em 2024. Conforme os serviços lançaram os próprios, 13 foram arquivados. Nesses arquivados a Glow achou quatro falhas de severidade alta, e a pior está no server-puppeteer: com um prompt injection numa página, o agente abre qualquer processo na máquina no lugar do navegador e roda o comando que o atacante quiser. Você autorizou "navegar na web", e essa autorização acaba cobrindo o resto.

A Glow reportou. Os mantenedores responderam que o servidor foi arquivado em maio de 2025, não tem manutenção e não vai sair correção daquele repositório. A Glow diz que ainda não viu ninguém explorando, mas patch também não vem.

E os pacotes continuam sendo baixados. Pela contagem da Glow, foram mais de 17,3 milhões de downloads desde julho de 2025. Conferi na API do npm em 03/11: na semana de 27/10 a 02/11, o server-github teve cerca de 200 mil downloads, e o server-puppeteer, uns 30 mil.

Dois detalhes me chamaram a atenção. O npm já marca esses pacotes como deprecated, mas o npx instala mesmo assim, só com um aviso. Numa das sessões, o agente consultou o npm, recebeu "This package is deprecated", instalou e não falou nada para o usuário. E as ferramentas de segurança de sempre não pegam: não tem manifesto (roda via npx), as falhas não têm CVE e o EDR só vê um processo Node baixando pacote público.

O que eu faria

Primeiro, procurar nas configs de MCP. Os caminhos relativos são config de projeto, então rode na raiz de cada repositório:

grep -noE '@modelcontextprotocol/server-[a-z-]+' ~/.claude.json .mcp.json ~/.cursor/mcp.json .cursor/mcp.json ~/.codex/config.toml .codex/config.toml ~/.config/Claude/claude_desktop_config.json "$HOME/Library/Application Support/Claude/claude_desktop_config.json" 2>/dev/null

Depois, checar cada um que aparecer:

npm view @modelcontextprotocol/server-github deprecated

Se imprimir alguma mensagem (hoje é "Package no longer supported..."), está obsoleto. Não saia apagando tudo do escopo @modelcontextprotocol: o server-filesystem, o server-memory, o server-everything e o server-sequential-thinking seguem mantidos, com versões de outubro. Os servidores marcados como deprecated hoje são github, gitlab, slack, postgres, puppeteer, brave-search, google-maps, gdrive, redis, aws-kb-retrieval e everart.

A troca é pelo servidor do dono do serviço, quando existe. No caso do GitHub, é o github/github-mcp-server.

Pro agente não voltar a instalar, dá pra usar hook. No Claude Code, um PreToolUse com matcher Bash|Edit|Write apontando para este script bloqueia tanto o npx quanto a escrita da config:

#!/bin/sh
# bloqueia os servidores MCP de referência arquivados
input=$(cat)
printf '%s' "$input" | grep -qE '@modelcontextprotocol/server-(github|gitlab|slack|postgres|puppeteer|brave-search|google-maps|gdrive|redis|aws-kb-retrieval|everart)' || exit 0
echo "Servidor MCP arquivado, sem correção de segurança. Use o servidor oficial do serviço." >&2
exit 2

Salve como ~/.claude/hooks/mcp-arquivado.sh, dê chmod +x e registre no ~/.claude/settings.json:

{ "hooks": { "PreToolUse": [ { "matcher": "Bash|Edit|Write",
  "hooks": [ { "type": "command", "command": "$HOME/.claude/hooks/mcp-arquivado.sh" } ] } ] } }

O hook recebe o JSON da chamada no stdin. Com exit 2, o Claude Code cancela a chamada e entrega o stderr ao Claude como erro da ferramenta. Efeito colateral: ele também barra o agente quando for apagar a entrada antiga da config, então essa limpeza é melhor fazer na mão.

Ophir Arie, da Glow, resumiu bem: a memória do modelo virou um gerenciador de pacotes sem feed de depreciação.

Fontes: relatório da Glow Labs e Help Net Security.

Carregando publicação patrocinada...