Um arquivo de 313 MB que ninguém pediu para enviar

A Z.ai publicou na segunda-feira o código-fonte do ZCode, o seu agente de programação, três dias depois de um assinante pagante ter mostrado que a ferramenta empacotava espaços de trabalho inteiros e os enviava para a nuvem da Alibaba sem perguntar.

O programador, que publica como ferstar, documentou o comportamento a 18 de setembro. Descobriu-o ao libertar espaço em disco num MacBook Air, ao reparar que a diretoria ~/.zcode tinha passado os 700 MB. Lá dentro estava uma imagem de um projeto comercial: 345 MB de ficheiros comprimidos num arquivo cifrado de 313 MB, abrangendo 42.411 ficheiros dos seus espaços de trabalho.

A maior parte era histórico de Git

Cerca de 87% da carga era a diretoria .git. Segundo a decomposição de ferstar, o maior componente eram 196,1 MB de cache LFS, seguidos de 102,2 MB de objetos de commit e 0,6 MB de reflogs. Isso não é uma imagem do código em que um programador trabalha. É a história do projeto, com cada ramo e cada estado apagado de que o repositório ainda se lembra.

Cabos de rede ligados às portas de um comutador
Os arquivos eram depositados no armazenamento de objetos da Alibaba. Imagem ilustrativa. Vladimir Srajber · pexels · Pexels License

O arquivo foi cifrado antes do envio com cifragem em envelope — uma chave de conteúdo AES-256-CTR embrulhada com RSA-OAEP-SHA256 — e depositado no Aliyun OSS depois de negociadas credenciais com os servidores da Z.ai. A chave privada nunca chegou à máquina do utilizador. A consequência prática é que o programador não conseguia abrir o seu próprio repositório enviado, nem o cliente que o tinha criado.

As opções não funcionavam

O ZCode expunha duas definições que pareciam governar isto: “Optimize Experience” e “Repo Snapshot Indexing”. Desligá-las não travava a captura, porque a cadeia corria incondicionalmente assim que a aplicação estivesse autenticada. Apagar o pacote pendente também não ajudava: em meia hora, um novo arquivo de 313 MB era construído. Uma imagem tinha acumulado 564 tentativas falhadas de envio antes de ser notada.

A correção, e o que ela não pode mostrar

Discos rígidos dispostos numa superfície de trabalho clara
Uma imagem abrangia 42.411 ficheiros dos espaços do programador. Imagem ilustrativa. Marta Branco · pexels · Pexels License

A Z.ai diz ter resolvido o problema. O presidente executivo, Zhang Peng, afirmou que a empresa tinha concluído a correção necessária, segundo a RuntimeWire, e a seguir a empresa publicou o código.

O repositório em github.com/zai-org/ZCode tem licença Apache-2.0 e cobre a aplicação de secretária, a interface de navegador, o agente de terminal, os serviços de backend, a interface partilhada e o ambiente de execução de agentes. Foi criado a 20 de setembro e abriu com dois commits — um despejo de código consolidado e não o histórico de desenvolvimento que permitiria auditar como o caminho de envio foi escrito ou quando mudou.

O próprio aviso da Z.ai admite o limite: o processamento interno feito depois de os pedidos chegarem à sua gateway fica fora do que o repositório do cliente permite verificar. Publicar o cliente diz o que o software faz agora. Não diz o que aconteceu aos repositórios já enviados, se foram apagados, nem quem dentro da empresa os podia ler.

O que vigiar

O repositório não traz SECURITY.md nem avisos de segurança publicados. Quem usou o ZCode não tem mecanismo para confirmar o que foi retido, nem forma de verificar que os binários distribuídos correspondem ao código publicado sem os compilar e comparar. Se a Z.ai responder a alguma das perguntas, será o teste de saber se abrir o código foi correção ou publicidade.