
2026/09/18 15:11
ZCode の内部:Git の履歴を静かにクラウドにアップロードする仕組み
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
最も重要な発見は、ZCode が静かにユーザーの作業全体(完結した
.git 履歴、LFS アセット、reflogs、およびグローバル設定を含む)を Aliyun OSS にパッケージ化してアップロードしている点であり、これは対話内容のみを収集すると明記されているプライバシーポリシーに直接反するものです。アプリはコンテンツの暗号化には一時的な AES-256-CTR を使用していますが、対称鍵はサーバー (zcode.z.ai) から動的に配信される RSA 公開鍵でラップされており、秘密鍵はユーザーのマシン上に存在しないため、ローカルのシフタテキスト(例:~/.zcode/v2/checkpoints/313MB.enc)はローカルで復号できません。調査により、メタデータが 564 回のアップロード失敗を示しているにもかかわらず、Pending 状態にある 313MB のアーカイブが存在することがわかりましたが、クライアントは成功するか強制的に停止されるまで継続的に再試行します。アップロードされたスナップショットには 42,411 ファイルが含まれており、そのうち .git/lfs/ (56.8%) と .git/objects/ (29.6%) が合計で負荷の 86.6% を占め、履歴の API キー、リリース前のブランチ名、および内部ホスト名を露出しています。UI トグルスイッチである「Optimize Experience」や「Repo Snapshot Indexing」はこのキャプチャパイプラインを停止せず、トレーニングまたはサーバーインデックス化のためのデータ使用量のみを制御します。キャプチャ論理は有効な JWT が存在する場合、起動時に条件なく実行され、セッションごとに多数のイベントをトリガーします。アーカイブは削除直後に再作成されるため、手動での削除は無効です(「わらべ游戏」状態)。恒久的な緩和策として推奨されるのは、~/.zcode/v2/checkpoints ディレクトリをファイルシステムの不変フラグでロックすること(macOS では chflags uchg、Linux では sudo chattr +i)であり、これは再パッケージングを阻止しますが、チェックポイントのロールバックやタイムラインは失われます。元の動作に戻すには、chflags nouchg (macOS) または sudo chattr -i (Linux) を実行します。本文
ZCode によるワークスペースの全暗号化アーカイブ:事実と対策
ディスク容量管理中に
が 700MB を超える異常を確認した際に、ZCode のバックグラウンド動作に関する重大な事実が判明しました。~/.zcode
驚愕の事実:データはアップロードされ「開く鍵」はサーバーにある
アップロードと暗号化の仕組み
- 静かなアーカイブ: ユーザーログイン中は、ワークスペース全体(完全な
履歴、LFS アセット、設定など)をアーカイブします。.git - クラウドへの直接送信: アーカイブを暗号化し、アリババクラウド OSS (Aliyun OSS) に直接アップロードします。
「鍵」の所在が致命的な弱点
- 秘密鍵の不在: 暗号化に用いる RSA 公開鍵はサーバーから動的配信されますが、対応する秘密鍵はローカルには存在しません。
- 復元不能: ローカルディスク上の数百メガバイトのデータは、あなた自身でも ZCode クライアントでも復号化できません。このデータを解凍するのは ZCode のバックエンドサーバーのみです。
調査の詳細:何がどこまで行われているか
1. 滞留した 313MB のアーカイブ
~/.zcode/v2/checkpoints/ に 313MB の .enc ファイルが「保留中」状態で固定されていました。
- 内容: コーディング中の商業プロジェクト(約 345MB)を圧縮した結果。
- 状態メタデータ: アップロード失敗が 564 回記録され、再試行待ちの状態でした。
- リスク: このアーカイブには依存パッケージを除いた**核心となる知的財産(コア IP)**が含まれていました。
2. データの内容:90% は .git
データ
.git暗号化されたスナップショットに含まれるデータの内訳です。
| コンテンツ | サイズ | 割合 | 含まれる情報 |
|---|---|---|---|
| 196.1 MB | 56.8% | LFS キャッシュ(全てのバイナリ資産・メディアファイル) |
| 102.2 MB | 29.6% | 完全なコミット履歴オブジェクトストア |
| 0.6 MB | 0.2% | ブランチ履歴・未プッシュ操作の痕跡 |
| ソースコード & ドキュメント | ~46.2 MB | 13.4% | 、設定ファイル、内部ドキュメント |
- 合計:
ディレクトリだけでペイロードの 86.6% を占める。.git - 暴露される情報:
- 運用開始からの全系譜(過去の実験的な API キーや機密設定)
- プッシュされていないローカルブランチ名(未公開機能計画)
- 内部 GitLab ホスト名とリポジトリパス
3. アップロードパイプラインの構造
クライアントは
https://zcode.z.ai を経由し、最終的に OSS に直接データを転送しています。
sequenceDiagram participant C as ZCode クライアント participant S as zcode.z.ai サーバー participant O as Aliyun OSS C->>S: POST /api/v1/snapshot/upload-credential S-->>C: snapshot_id + RSA 公開鍵 + max_size + OSS フォーム認証情報 C->>C: tar.gz 圧縮 → AES-256-CTR 暗号化 → RSA-OAEP でキーをラップ C->>O: tar.gz.enc ファイルを直接 HTTP POST フォームで OSS にアップロード O->>S: カallback で受信確認を行う
- 永続接続: ZCode プロセスは、ZCode サーバーおよび Aliyun OSS に対して永続的な HTTPS 接続を維持しています。
4. UI トグルは無効化できない
設定画面のオプションは意図通りに動作しません。
| スイッチ | 期待される動作 | 実際の動作 |
|---|---|---|
体験最適化 () | データ収集を無効化する | データ収集自体を制御するのみ。スナップショット取得・アップロードは継続。 |
リポジトリスナップショットインデックス化 () | スナップショット機能を無効化する | サーバー側でのインデックス化のみを制御。ローカルパッケージング・アップロードは継続。 |
- 根本原因: アップロードサイドカーは起動時に条件なしでインスタンス化されるため、UI トグルでは停止できません。
- トリガー: プロンプト前 (
) またはタスク完了時 (captureBeforePrompt
) に発生します(1 セッション最大 62 回)。repo-wiki-update
5. プライバシーポリシーとの矛盾
- 明記されている: 「対話中に提出されたテキスト、ファイル、コード」の収集。
- 明記されていない: 「ワークスペース全体と完全な Git 履歴を静かにパッケージ化してアップロードする」行為。
- 結論: ポリシー上の一般的な文言と実装内容に乖離が存在します。
対策:ファイル削除だけでは不十分です
単純な削除は「モグラ叩き」になります(アップローダーが即座に再パッケージ化するため)。ファイルシステムレベルで書き込みをブロックする必要があります。
macOS でのロック方法
# キャッチチェックポイントディレクトリを消去しロックする rm -rf ~/.zcode/v2/checkpoints mkdir -p ~/.zcode/v2/checkpoints chflags uchg ~/.zcode/v2/checkpoints # 検証:"Operation not permitted" と表示されるべき touch ~/.zcode/v2/checkpoints/test
Linux でのロック方法
# キャッチチェックポイントディレクトリを消去しロックする rm -rf ~/.zcode/v2/checkpoints mkdir -p ~/.zcode/v2/checkpoints sudo chattr +i ~/.zcode/v2/checkpoints # 検証:"Operation not permitted" と表示されるべき touch ~/.zcode/v2/checkpoints/test
影響とロールバック
- 結果: アップロードパイプラインはディスク I/O を試みますが、カーネルレベルでブロックされアーティファクトを生成しなくなります。
- トレードオフ: 「チェックポイントのロールバック/タイムライン」UI 機能は利用できなくなります(本来コードアップロードを前提とした機能)。通常の利用(チャット、補完など)には影響ありません。
- 復旧方法:
# macOS chflags nouchg ~/.zcode/v2/checkpoints # Linux sudo chattr -i ~/.zcode/v2/checkpoints
結論:これは「バックアップ」ではなく「収集」です
この挙動は以下の点でユーザーの境界線を超えています。
- データスコープ: 推論に必要なコンテキストではなく、リポジトリ全体および数年分の Git 履歴を暴露します。
- アーキテクチャ姿勢:
- 復号鍵がサーバー側にあるため、ローカルに保持されたデータは開くことができません。
- プライバシーポリシーで開示がないのに、止む術のないバックグラウンドアップロードが発生します。
ツールとしてではなく、「収集(コレクション)」システムとしての挙動です。UI 設定でオフにできない場合、OS カーネルレベルの制限をかけるのが唯一の効果的な防衛策です。