セキュリティ
GLMコーディングエージェントZCodeは、Git履歴を静かにアップロードする
ZCode, the GLM coding agent, silently uploads your Git history (tokenstead.ai)
要約
AIコーディングアプリZCodeが、ログイン中にユーザーのワークスペース全体(Git履歴、LFSキャッシュ、reflogsなど)を暗号化し、Aliyun OSSにアップロードしていることが判明しました。このアップロードは、設定のトグルやプライバシーポリシーに記載がなく、ユーザーの同意なしに行われており、ベンダーのみが復号できる鍵で暗号化されているため、深刻なプライバシー懸念を引き起こしています。
全文翻訳
2026年9月18日、ferstarという開発者が、GLMファミリーのオープンウェイトモデル(ローカルAIコミュニティで広く利用されているGLM-5.3-Flashなど)を開発した北京に本社を置くZ.ai社のAIコーディングデスクトップアプリ、ZCodeのリバースエンジニアリングの解説を公開しました。その発見は、ほとんどのプライバシー問題よりも悪い内容でした。アプリがログインしている間、ユーザーのワークスペース全体(完全な.git履歴、LFSアセットキャッシュ、reflogs、グローバルアプリ設定)を静かにパッケージ化し、暗号化して、Alibaba CloudのオブジェクトストレージであるAliyun OSSにアーカイブをアップロードします。研究者自身のキャプチャでは、研究者が調査中に564回のアップロード失敗が記録された、345MBの商用ワークスペースから構築された313MBの暗号化アーカイブが見つかりました。
ローカルでGLMを実行している場合、ウェイトを公開している会社と、開発者がそれらの上に使用するランタイムは同じものではありません。スレッドの反応は、GLMがオープンソースであるためZCodeもオープンソースだと誤解したコメントが多く、混乱が生じていることを示しました。ZCodeはオープンソースではありません。ウェイトはオープンですが、ハーネスはクローズドであり、Z.ai自身のモデルのためのハーネスで、サードパーティのエディタでは実現できないファーストパーティ統合として宣伝されています。この話は数時間のうちに両言語で広まりました。ferstarの投稿は276,000ビューを超え、FeiZの中国語のアラートスレッド(「ZCodeは現時点で使用を停止してください…オープンソースエージェントを可能な限り使用するのが最善です」)はさらに63,800ビューを集めました。最も引用された応答は、自身のAIエージェントをセキュリティドキュメント付きでオープンソース化しているPetri Kuittinen氏からのもので、「私の助言は以前から変わらず、これからも変わりません。『クローズドソースのAIハーネスを絶対に信用しないこと』です。」
疑わしいディレクトリを記事にした詳細:暗号化キー。ZCodeはエンベロープ暗号化を使用します。ペイロードは対称キーで暗号化され、そのキーはRSA-OAEP公開キーでラップされます。公開キーは、アップロード資格情報ネゴシエーション中にサーバーから提供されます。対応する秘密キーはZ.aiのクラウドにのみ存在します。ferstarはローカルシステム上のすべての秘密キーでアーカイブをアンラップしようとしましたが、失敗しました。ユーザー自身のディスク上にある313MBの暗号文は、ユーザーまたはZCodeクライアント自体では復号できません。ferstarの投稿からの結論は、「サーバーのみが使用できるキーは、サーバーが望むときにコードを読み取れるようにすること、というただ一つの目的を果たします。」
パッケージ化されるもの
パッケージングマニフェストはローカルにプレーンテキストで保存されており、具体的です。42,411ファイルのスナップショットの場合:
Content Size Share
.git/lfs/ 196.1 MB 56.8%
.git/objects/ 102.2 MB 29.6%
.git/logs/ 0.6 MB 0.2%
ソースコードとドキュメント 46.2 MB 13.4%
.gitディレクトリだけでペイロードの86.6パーセントを占めます。ペイロードの内訳(42,411ファイルのスナップショット):.gitディレクトリが暗号化アーカイブの86.6パーセントを占めます。
これは重要です。なぜなら、gitオブジェクトストアはワーキングツリーのスナップショットではなく、リポジトリの最初からの完全な系統だからです。後続のコミットで削除されたAPIキーがそこにあります。未プッシュのブランチ名(未リリース製品計画を示す)がそこにあります。.git/configからの内部ホスト名とリポジトリパスがそこにあります。キャプチャされたアーカイブは、開いていたファイルではなく、何年にもわたるエンジニアリング履歴です。
アップロードパイプライン(クライアントのapp.asarから再構築):クライアントはzcode.z.aiに資格情報を要求し、それによりOSSフォーム署名、オブジェクトキー、サイズキャップ、およびラウンドごとのRSA公開キーが返されます。クライアントはワークスペースをtar.gzにパッケージ化し、AES-256-CTRで暗号化し、対称キーをラップして、アーカイブを直接Aliyun OSSにPOSTします。Aliyun OSSはZ.aiのバックエンドにコールバックしてスナップショットを登録します。実行中のクライアントは、テスト中にzcode.z.aiと2つのAliyun OSSノードへの永続的な接続を維持していました。
:::figure /images/articles/zcode-git-upload/upload-flow.svg
再構築されたZCodeスナップショットアップロードフロー:コーディネーターからの資格情報、ローカルパッケージングと暗号化、Aliyun OSSへの直接フォームPOST、コールバック登録。クライアントapp.asarからferstarによって再構築されました。
トグルはそれを止めない
自然な行動は設定を開くことです。ferstarはUIスイッチとコードをクロスリファレンスしました。「最適化エクスペリエンス」(optimizeAgentExperienceEnabled)は、データがモデルトレーニングに許可されるかどうかのみを制御します。スナップショットのキャプチャとアップロードは続行されます。「リポジトリスナップショットインデックス作成」(repoSnapshotIndexingEnabled)は、サーバーがアップロードされたスナップショットをインデックス化するかどうかのみを制御します。ローカルパッケージングとアップロードは続行されます。ホストアセンブリは、ユーザー設定に関係なく、起動時に無条件でキャプチャサイドカーをインスタンス化します。唯一の要件は、トークンプロバイダーが有効なJWTを生成できることです。セッションログは、単一のアクティブセッションから62回のキャプチャイベントを示しており、各プロンプトの前およびタスク完了時にトリガーされました。
第二の情報源がメカニズムを裏付けています。OrcaPromptVault、キャプチャされたAIハーネスプロンプトの公開コレクションには、ZCodeからの131KBのシステムプロンプトと31のツールサーフェスが含まれています。チェックポイント/巻き戻し機能はシステムプロンプトに配線されています。「Workspace rewind applied. rewindId, checkpointId, strategy, restoredFiles」というテンプレートが5回出現します。これはスナップショットパイプラインのユーザーインターフェース側の先端であり、ファイルシステムロックが無効にする機能です。エージェントの完全なツールサーフェスには、スナップショット、アップロード、またはテレメトリツールは含まれていません。流出パイプラインはエージェントツールではなく、ツールループの外でインスタンス化されるホストレベルのサイドカーです。だからこそ、どの権限設定もそれを止められず、エージェント自体もそれを決して見ないのです。キャプチャされた131KBの命令には、Aliyun、OSS、アップロード、またはプライバシーに関する言及は一切ありません。
キャプチャはferstarが言及しなかった詳細を追加します:ZCodeはReadSessionContextツールを搭載しており、セッションIDによってオンデマンドで他の永続化されたZCodeセッションを読み取ります。ホストレベルのスナップショットサイドカーと組み合わせると、セッションコンテンツはローカルに永続化され、クラウドでキャプチャされます。漏洩したシステムプロンプトのチェックポイントテンプレート(5回出現)と、スナップショット、アップロード、またはテレメトリツールを含まないエージェントの31ツールサーフェス。
プライバシーポリシーには記載なし
ZCodeのプライバシーポリシーでは、ツールが「会話中に送信されたテキスト、ファイル、コード」を収集すると記載されています。これは、すべてのAIコーディングツールが提供する標準的な推論コンテキストの開示です。ポリシー、FAQ、変更履歴全体を通じて、ferstarは、ワークスペース全体とGit履歴のパッケージングとアップロードについて言及している箇所を見つけられませんでした。最も近い記述は、最適化プログラムがデフォルトでオフになっていることに関するテンプレート文です。
状況を悪化させる文脈
ZCodeは2026年7月にローンチされ、そのローンチピッチは直接信頼に基づいたものでした。Z.aiは、AnthropicのClaude Codeの隠しテレメトリ論争の数週間後に、オープンウェイトをキルスイッチ問題からの脱却として位置づけ、ZCodeを競合としていました。Z.aiの幹部は、XでZCodeに「いかなる種類のスパイウェア」が含まれるかとの質問に対し、同社はZCodeウェブサイトに「記載されている以上のもの」を実装することはないと回答しました。ワークスペースのスナップショット機能はZCodeウェブサイトには記載されていません。
Z.aiは2026年1月に香港証券取引所に上場しました。同社の公式Xアカウントは、公開時点ではferstarの投稿に返信していませんでした。最も目立った返信は、ZCodeチーム関連のアカウントからのもので、「すみません、あなたに見つけさせてしまいました」というもので、メカニズムの確認であり、反論ではありませんでした。ferstarのツイートは13時間で276,000ビューを超え、V2EXやHN関連チャンネルでの議論スレッドは、主に次のような意見に分かれました。エージェントは常に、同意を得てコードフラグメントをツール呼び出し中にアップロードする。これは、同意なしに、ベンダーのみが読み取れるように暗号化された、リポジトリ全体とその履歴全体です。
効果のある防御策
保留中のアーカイブを削除しても効果はありません。クライアントは30分以内に新しい313MBのアーカイブを再パッケージ化し、リトライカウンターを増やしました。効果のある修正はファイルシステムレベルです。チェックポイントディレクトリをカーネルレベルで書き込み不可にします。Linux: cp -rf ~/.zcode/v2/checkpoints && mkdir -p ~/.zcode/v2/checkpoints && sudo chattr +i ~/.zcode/v2/checkpoints