ZCode empaquetaba 42.411 archivos por instantánea y solo Z.ai podía descifrarlos

Un informe de ingeniería inversa halló que la app de programación del creador de GLM enviaba historiales de Git completos a Alibaba Cloud, con la clave en el servidor

|5 min de lectura0
Source code on a developer's screen — ZCode's snapshot routine packaged entire repositories, including the .git object store, before every prompt.
Source code on a developer's screen — ZCode's snapshot routine packaged entire repositories, including the .git object store, before every prompt.

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.

¿Qué te parece este artículo?

SJ
Cargando...

Artículos relacionados

Vercel desactivó AVIF en toda su plataforma por un error corregido hace un año
Developer Tools

Vercel desactivó AVIF en toda su plataforma por un error corregido hace un año

Vercel rastreó un RCE reportado en Next.js hasta libheif, desactivó AVIF en toda su plataforma el 13 de agosto y coordinó los arreglos en sharp, libvips y libheif para el 25 de agosto.

Seung Junghace 9 horas
Shopify compra Tailwind Labs mientras la IA erosiona el negocio del framework
Developer Tools

Shopify compra Tailwind Labs mientras la IA erosiona el negocio del framework

Shopify adquirió Tailwind Labs, creadora de Tailwind CSS. El framework mantiene su licencia MIT mientras Tailwind Plus y ui.sh dejan de aceptar nuevas suscripciones.

Seung Junghace 7 días
Meta libera Astryx, un sistema de diseño en React que los agentes pueden consultar
Developer Tools

Meta libera Astryx, un sistema de diseño en React que los agentes pueden consultar

Meta publicó Astryx en junio como beta pública bajo licencia MIT, un sistema de diseño en React que maduró durante ocho años dentro del monorepo interno de la compañía.

Seung Junghace 5 días
Agentes de IA inundaron RubyGems con 2.000 paquetes y el registro cerró las altas cuatro días
Developer Tools

Agentes de IA inundaron RubyGems con 2.000 paquetes y el registro cerró las altas cuatro días

Un informe forense reconstruye la campaña GemStuffer de mayo, en la que agentes de IA subieron más de 2.000 gems y forzaron a RubyGems a congelar las nuevas altas cuatro días.

Seung Junghace 7 días
Los reparadores con LLM rompieron código que funcionaba diez veces más a menudo de lo que arreglaron el defectuoso
Developer Tools

Los reparadores con LLM rompieron código que funcionaba diez veces más a menudo de lo que arreglaron el defectuoso

Un estudio en arXiv midió un bucle de reparación con LLM dañando programas correctos a 0,261 y arreglando los defectuosos a 0,023, y halló la dirección interna que lo impulsa.

Seung Junghace 6 días
HydraFusion de GitHub deja de elegir un modelo: monta un flujo de trabajo
Developer Tools

HydraFusion de GitHub deja de elegir un modelo: monta un flujo de trabajo

Project HydraFusion, de GitHub, arma un plan multimodelo para cada petición de Copilot y cambia la sencillez de un único modelo por un coste mucho más bajo.

Seung Junghace 6 días