Un informe de ingeniería inversa publicado el 18 de septiembre reveló que ZCode, la aplicación de escritorio para programar del laboratorio chino de modelos Z.ai, empaqueta el espacio de trabajo completo de un desarrollador —incluido todo el almacén de objetos de Git— y lo envía al almacenamiento de objetos de Alibaba Cloud envuelto en un cifrado que solo los servidores de Z.ai pueden deshacer.
Lo insólito del hallazgo no es la subida, sino la custodia de la clave. El archivo aterriza en el OSS de Alibaba como texto cifrado que el desarrollador no puede abrir, generado por un proceso que la pantalla de ajustes de la aplicación nunca muestra.
Claves del hallazgo
- Una de las instantáneas capturadas contenía 42.411 archivos y pesaba 313 MB, y solo el directorio .git representaba el 86,6 por ciento del envío.
- ZCode envolvía la clave AES-256-CTR de cada archivo con una clave pública RSA emitida en el momento por el servidor, de modo que la clave privada correspondiente quedaba únicamente dentro de la nube de Z.ai.
- Z.ai pidió disculpas, parcheó el cliente, concedió a los usuarios de ZCode un reinicio puntual de sus límites semanales de uso y anunció que abrirá el código e invitará a auditores externos.
Por qué entregar un directorio de Git es lo peor que puede pasar
El investigador, que firma como ferstar, desempaquetó el bundle de Electron del cliente y reconstruyó paso a paso la ruta de transferencia. En un proyecto comercial de 345 MB, el archivo resultante alcanzó los 313 MB repartidos en 42.411 archivos, y el propio almacén de objetos del repositorio constituía la mayor parte del total.
Esa proporción es la noticia. Un árbol de trabajo muestra cómo es un proyecto hoy; un almacén de objetos conserva todos los estados por los que ha pasado. Las credenciales que se subieron una vez y se eliminaron en el commit siguiente siguen en el historial. También los nombres de ramas abandonadas que delatan funciones sin lanzar, y los nombres de host internos y rutas remotas registrados en la configuración del repositorio.
Las condiciones de privacidad publicadas por Z.ai describen la recopilación de texto y código. No describen la recopilación del linaje completo de un repositorio.
Los interruptores que parecían apagar algo
Cualquiera que lea el informe corre al panel de preferencias, y ahí es donde el mecanismo se vuelve incómodo. Al cruzar la interfaz con el código, ferstar señaló que el interruptor «Optimize Experience» solo rige si los datos capturados pueden usarse para entrenar modelos, mientras que «Repo Snapshot Indexing» solo rige si el servidor indexa lo que llega. Ninguno toca el empaquetado ni la transmisión.
Según el informe, el componente de captura lo instancia el proceso anfitrión al arrancar, sin depender de las preferencias del usuario: la única condición previa es un token de sesión válido. Una sola sesión de trabajo registró 62 eventos de captura, disparados antes de cada consulta y de nuevo al terminar cada tarea.
Un segundo indicio refuerza el cuadro. Una copia de 131 KB del prompt de sistema de ZCode que circula en una recopilación pública de prompts enumera 31 herramientas disponibles para el agente. Ninguna sube, captura ni transmite nada, y en todo el documento no se menciona a Alibaba, ni el OSS, ni ninguna subida. La vía de exfiltración queda por completo fuera del bucle del agente, que es la razón por la que nunca aparece un aviso de permiso.
Pesos abiertos no es lo mismo que un entorno abierto
El episodio golpeó fuerte en parte por un error de categoría visible en los hilos de discusión: varios desarrolladores dieron por hecho que ZCode era de código abierto porque GLM lo es. Z.ai publica pesos descargables; el cliente de escritorio que los ejecuta es propietario, y es el cliente el que hace el empaquetado.
El alcance fue notable en ambos idiomas: el análisis de ferstar superó las 276.000 visitas y un hilo de advertencia en chino sumó otras 63.800. La reacción más citada vino del desarrollador Petri Kuittinen, que desaconsejó confiar en cualquier entorno de IA de código cerrado.
La respuesta de Z.ai llegó rápido. La compañía se disculpó, afirmó que los datos capturados se destruían inmediatamente tras procesarse en lugar de conservarse, lanzó un parche, compensó a los usuarios con un reinicio de los límites de uso y se comprometió a publicar el código de ZCode y someterlo a revisores externos.
Qué cambia esto para los desarrolladores
Para los equipos que sopesan desplegar modelos en local frente a usar clientes de escritorio de un proveedor, la separación se ve ahora más nítida que antes. Una publicación de pesos abiertos dice qué es un modelo; no dice nada sobre qué hace con el sistema de archivos la capa que lo envuelve. Cualquier asistente de programación con IA que ofrezca puntos de control o deshacer está, por construcción, capturando algo, y la pregunta que conviene hacerse es dónde acaban esas capturas. Un escrutinio parecido ha alcanzado este año a otros entornos de agentes, incluida la vulnerabilidad de cero clics revelada en cuatro agentes de línea de comandos.
Preguntas frecuentes
¿ZCode es de código abierto?
No. Z.ai publica abiertamente los pesos del modelo GLM, pero el cliente de escritorio ZCode es cerrado, y eso permitió que el comportamiento de captura pasara inadvertido hasta que alguien lo descompiló. La empresa ha dicho desde entonces que piensa abrir el código.
¿Podría un usuario descifrar su propio archivo subido?
No. La clave del contenido se envolvió con una clave pública RSA suministrada por el servidor de Z.ai, y el investigador no consiguió abrirla con ninguna clave privada presente en la máquina. La clave privada correspondiente reside solo en la infraestructura de Z.ai.
¿Desactivar los ajustes de privacidad detenía las subidas?
Según el informe, no. Los dos interruptores relevantes controlaban el uso posterior y la indexación en el servidor, mientras que el componente que empaquetaba y transmitía el espacio de trabajo se ejecutaba a nivel del proceso anfitrión al margen de esas preferencias.






