ZCode, la app de código de Zhipu, sube en silencio tu historial de Git a la nube
Un desarrollador documenta que el cliente de escritorio empaqueta el workspace completo, lo cifra con una clave que solo tiene el servidor y lo sube a Aliyun OSS.
ZCode, la aplicación de escritorio de programación asistida de Zhipu, empaqueta el workspace completo del usuario —historial de Git incluido—, lo cifra y lo sube a Aliyun OSS. El cliente no puede descifrar lo que deja en el disco local, porque la clave privada vive solo en los servidores de la compañía. Lo ha documentado un desarrollador que empezó mirando por qué su directorio ~/.zcode ocupaba más de 700 MB y acabó encontrando un archivo .enc de 313 MB esperando en la carpeta de pendientes.
El flujo de subida
El análisis del app.asar del cliente reconstruye dos etapas. Primero se piden credenciales a zcode.z.ai: el servidor devuelve las firmas de formulario de OSS, un object key dinámico, los límites de tamaño y una clave pública RSA. Después el cliente empaqueta el workspace en un tar.gz, lo cifra en streaming con AES-256-CTR y hace un POST directo a Aliyun OSS, que a su vez llama al backend de Zhipu para registrar la instantánea. La inspección de sockets activos confirmó conexiones HTTPS persistentes al endpoint de zcode.z.ai y a dos nodos de almacenamiento de Aliyun.
El detalle jugoso es el cifrado de sobre. La clave simétrica se envuelve con RSA-OAEP-SHA256 usando la clave pública que entrega el servidor en cada ronda; la privada nunca toca la máquina del usuario. El autor lo comprobó intentando abrir el sobre con todas las claves locales: no hay manera. Ese archivo de 313 MB que ocupa disco no lo puede leer ni el usuario ni el propio cliente. Si el objetivo fuera el rollback o la sincronización entre dispositivos, la clave estaría en local, como en Git o Time Machine.
Qué viaja dentro
Aunque el cifrado se resista, el manifest con el inventario de archivos se guarda en claro junto al archivo. Sobre una instantánea de 42.411 archivos: .git/lfs suma 196,1 MB (56,8% del total), .git/objects 102,2 MB (29,6%), .git/logs 0,6 MB y el código fuente junto con la documentación unos 46,2 MB. El directorio .git por sí solo representa el 86,6% del contenido. No sube el árbol de trabajo actual, sube la historia completa: claves de API y configuraciones sensibles borradas en commits posteriores, nombres de ramas locales sin publicar, hosts internos de GitLab y rutas de repositorio del .git/config. Además, un manifest extra, repo_snapshot_extra_manifest, hashea la configuración global de ZCode y la arrastra en cada instantánea, cruzando workspaces.
El estado local mostraba 564 intentos de subida fallidos y 345 MB de workspace comprimidos en un archivo etiquetado como baseline, es decir, la instantánea completa.
Los interruptores
Al cruzar las opciones de la interfaz con el código, el autor comprueba que el ajuste "Optimize Experience" no desactiva la recogida de datos: solo gobierna si esos datos se autorizan para entrenamiento de modelos. La captura y subida de instantáneas siguen ejecutándose igual.
Para quien administra equipos de desarrollo esto no es un detalle de telemetría. Una herramienta que empaqueta el historial completo de Git y lo cifra con una clave que solo controla el proveedor cambia el modelo de confianza: el código y la trazabilidad de un proyecto quedan legibles para el backend en cuanto haga falta. El hallazgo es de un usuario, no de una auditoría externa. Queda por ver si Zhipu modifica el comportamiento del cliente o lo documenta como es debido.