zn-gate 1.4.1 e o que sai da sua máquina

John Silver4 min de leitura

Por defeito, nada sai da sua máquina. Se ativar a verificação cloud, só o prompt é enviado, depois de os segredos serem removidos; a saída das ferramentas nunca é enviada. Para os utilizadores do zn-gate 1.4.0 que tinham definido ZN_API_KEY, essa promessa não era verdadeira. Este artigo explica o que o pacote fazia, o que a nossa API guardava, o que mudámos na 1.4.1 e o que deve fazer. Em resumo: atualize e, se executou a 1.4.0 com uma chave de API, renove qualquer credencial que possa ter aparecido na saída de uma ferramenta.

O que a 1.4.0 fazia

O zn-gate analisa três tipos de texto: os prompts, os argumentos das chamadas de ferramentas e os resultados das ferramentas (o conteúdo dos ficheiros que o seu agente lê, a saída dos comandos que executa). Os três eram avaliados primeiro pelas regras locais. Na 1.4.0 e versões anteriores, se as regras locais não bloqueassem o texto e ZN_API_KEY estivesse definida, o pacote Node enviava esse texto para api.usezn.com para uma segunda opinião do classificador Galvanize-60M. Fazia-o sem redigir os segredos, e fazia-o para os resultados e os argumentos das ferramentas, não só para os prompts.

O README dizia que o pacote era local primeiro e que a redação de segredos era aplicada. A função de redação existia no código, mas nenhum caminho de execução a chamava. Encontrámos isto numa revisão interna do pacote publicado, a 11/10/2026.

Quem é afetado:

  • Utilizadores do pacote npm (o servidor MCP, zn-gate shield, zn-gate analyze, zn-gate test ou a biblioteca) com ZN_API_KEY definida e ZN_LOCAL_ONLY diferente de true.
  • Utilizadores do pacote Python com ZN_API_KEY definida: apenas analyze() e zn-gate analyze enviavam texto, sem redação. guard, check_tool_call, check_tool_result, sanitize_tool_result e as integrações com frameworks foram sempre locais.
  • Utilizadores que nunca definiram ZN_API_KEY, ou que definiram ZN_LOCAL_ONLY=true, não são afetados. Nada saía da máquina.

O que a nossa API guardava

O texto viajava por TLS e era avaliado pelo classificador. Duas rotas guardavam ainda os primeiros 1.000 caracteres de cada entrada na nossa tabela de evidências, sem prazo de validade: a rota antiga /prod/analyze e a rota MCP analyze. A rota atual /v30/analyze, que o zn-gate usa por defeito, não guardava a entrada nos planos pagos; mantinha uma cópia redigida e truncada apenas para o plano gratuito Contributor, que o aceita. Os registos de acesso guardam apenas a rota e o estado, nunca o conteúdo.

A 11/10/2026 alterámos a API para guardar apenas um hash SHA-256 e o comprimento da entrada, e apagámos o texto guardado na tabela de evidências em todos os registos que o tinham: 1.281 registos, com datas entre 22 de agosto e 12 de setembro de 2026.

O que muda na 1.4.1

  • Os resultados das ferramentas, os argumentos das chamadas e as descrições das ferramentas são avaliados apenas localmente, em qualquer configuração: servidor MCP, proxy shield e biblioteca.
  • A nuvem é opcional. A análise de prompts só consulta a nuvem se definir ZN_CLOUD=1 e ZN_API_KEY. ZN_API_KEY sozinha não ativa nada. ZN_LOCAL_ONLY=true continua a sobrepor tudo.
  • A redação corre no caminho de código real. check_tool_result devolve sempre o conteúdo passado pelo redator de segredos; check_tool_call devolve os argumentos sanitizados; shield encaminha a saída das ferramentas com os segredos redigidos. Quando a nuvem está ativa, o texto do prompt passa pelo redator antes de ser enviado.
  • zn-gate status mostra o que a sua configuração envia, e o autoteste nunca usa a rede.
  • Os novos testes simulam a rede e contam os pedidos: a saída de uma ferramenta com segredos falsos volta redigida e faz zero pedidos, mesmo com ZN_API_KEY e ZN_CLOUD=1 definidas. Face ao código da 1.4.0, sete desses oito testes falham.

O README tem agora uma tabela "What leaves your machine" (o que sai da sua máquina) nos três pacotes, e a mesma tabela está neste site.

O que deve fazer

  1. Atualize: npx -y zn-gate@latest (ou npm install -g zn-gate@1.4.1) e pip install -U zn-gate.
  2. Se executou a 1.4.0 ou anterior com ZN_API_KEY definida, considere que qualquer credencial que tenha aparecido na saída ou nos argumentos de uma ferramenta nesse período pode ter sido transmitida, e rode-a.
  3. Execute npx -y zn-gate status para ver o que a sua configuração envia agora.

O aviso está publicado no GitHub como GHSA-r4h2-qcf2-8227, com a lista completa dos caminhos de código afetados no changelog da 1.4.1.

Porque escrevemos isto

Ninguém nos reportou isto; encontrámo-lo nós. Podíamos ter publicado a 1.4.1 com uma linha no changelog. Publicamos os detalhes porque o objetivo do zn-gate é que possa confiar no que ele faz com os seus dados, e essa confiança tem de sobreviver aos dias em que nos enganamos. Se tiver perguntas, ou achar que algo aqui ainda não está suficientemente preciso, escreva para security@usezn.com.

— John Silver

Atualizado a 14 de outubro de 2026: a redação sobre o tratamento de dados foi revista para descrever o que o pacote e a API fazem hoje.

Share