Ce qui se passe
ZCode est l'application de bureau de Zhipu (Z.ai) pour coder avec un agent
IA. En cherchant pourquoi son dossier ~/.zcode dépassait 700 Mo, l'auteur du
blog ferstar y a trouvé, dans v2/checkpoints/, une archive chiffrée de
313 Mo correspondant à 345 Mo d'un projet commercial, marquée
baseline, avec 564 tentatives d'envoi échouées au compteur.
En démontant app.asar, il reconstitue le circuit : tant que l'utilisateur est
connecté, l'application empaquette l'espace de travail, le chiffre et l'envoie
vers Aliyun OSS, le stockage objet d'Alibaba Cloud.
Précision de méthode : c'est l'enquête d'une seule personne, par rétro-ingénierie, et l'article ne fait état d'aucune réponse de Zhipu.
Le mécanisme
- Le client appelle
POST /api/v1/snapshot/upload-credentialsurzcode.z.ai, qui renvoie un identifiant d'instantané, des signatures de formulaire OSS, une taille maximale et une clé publique RSA. - Il compresse l'espace de travail en
tar.gz, le chiffre en AES-256-CTR avec une clé éphémère, et enveloppe celle-ci en RSA-OAEP-SHA256 avec la clé publique reçue. - Il dépose l'archive directement sur OSS, qui prévient ensuite le serveur de Zhipu.
La clé privée n'est jamais sur la machine : ni l'utilisateur ni l'application ne peuvent rouvrir l'archive. Seul le serveur le peut.
Les déclencheurs relevés : avant chaque prompt (captureBeforePrompt) et en fin
de tâche. Une seule session a produit jusqu'à 62 captures.
Ce qui part
Le manifeste, lui, reste en clair sur le disque. Sur 42 411 fichiers :
| Contenu | Taille | Part |
|---|---|---|
.git/lfs/ |
196,1 Mo | 56,8 % |
.git/objects/ |
102,2 Mo | 29,6 % |
.git/logs/ |
0,6 Mo | 0,2 % |
| sources et documentation | ~46,2 Mo | 13,4 % |
Le dossier .git fait donc 86,6 % de l'envoi. Avec lui partent les secrets
supprimés dans des commits ultérieurs, les branches jamais poussées et les
adresses des dépôts internes inscrites dans .git/config.
Pourquoi les réglages n'y changent rien
- Optimize Experience (
optimizeAgentExperienceEnabled) ne décide que de l'usage des données pour l'entraînement. - Repo Snapshot Indexing (
repoSnapshotIndexingEnabled) ne décide que de l'indexation côté serveur.
Le composant de capture est instancié sans condition au démarrage ; il lui suffit d'un jeton de session valide. Supprimer l'archive ne sert pas non plus : l'auteur l'a vue se reconstituer en une demi-heure.
Comment s'y prendre
La parade de l'auteur verrouille le dossier au niveau du système de fichiers. Sur macOS :
rm -rf ~/.zcode/v2/checkpoints
mkdir -p ~/.zcode/v2/checkpoints
chflags uchg ~/.zcode/v2/checkpoints
touch ~/.zcode/v2/checkpoints/test # doit répondre "Operation not permitted"Sur Linux, sudo chattr +i ~/.zcode/v2/checkpoints remplace chflags. Pour
revenir en arrière : chflags nouchg ou sudo chattr -i. La fonction de retour
en arrière de l'application cesse alors de fonctionner.
Source : Inside ZCode: Silently Uploading Your Entire Git History to the Cloud, blog de ferstar (version anglaise traduite par l'auteur avec une IA), septembre 2026.