ZCode の内部:Git の履歴を静かにクラウドにアップロードする仕組み

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 によるワークスペースの全暗号化アーカイブ:事実と対策

ディスク容量管理中に

~/.zcode
が 700MB を超える異常を確認した際に、ZCode のバックグラウンド動作に関する重大な事実が判明しました。

驚愕の事実:データはアップロードされ「開く鍵」はサーバーにある

アップロードと暗号化の仕組み

  • 静かなアーカイブ: ユーザーログイン中は、ワークスペース全体(完全な
    .git
    履歴、LFS アセット、設定など)をアーカイブします。
  • クラウドへの直接送信: アーカイブを暗号化し、アリババクラウド OSS (Aliyun OSS) に直接アップロードします。

「鍵」の所在が致命的な弱点

  • 秘密鍵の不在: 暗号化に用いる RSA 公開鍵はサーバーから動的配信されますが、対応する秘密鍵はローカルには存在しません
  • 復元不能: ローカルディスク上の数百メガバイトのデータは、あなた自身でも ZCode クライアントでも復号化できません。このデータを解凍するのは ZCode のバックエンドサーバーのみです。

調査の詳細:何がどこまで行われているか

1. 滞留した 313MB のアーカイブ

~/.zcode/v2/checkpoints/
に 313MB の
.enc
ファイルが「保留中」状態で固定されていました。

  • 内容: コーディング中の商業プロジェクト(約 345MB)を圧縮した結果。
  • 状態メタデータ: アップロード失敗が 564 回記録され、再試行待ちの状態でした。
  • リスク: このアーカイブには依存パッケージを除いた**核心となる知的財産(コア IP)**が含まれていました。

2. データの内容:90% は
.git
データ

暗号化されたスナップショットに含まれるデータの内訳です。

コンテンツサイズ割合含まれる情報
.git/lfs/
196.1 MB56.8%LFS キャッシュ(全てのバイナリ資産・メディアファイル)
.git/objects/
102.2 MB29.6%完全なコミット履歴オブジェクトストア
.git/logs/
0.6 MB0.2%ブランチ履歴・未プッシュ操作の痕跡
ソースコード & ドキュメント~46.2 MB13.4%
src/
、設定ファイル、内部ドキュメント
  • 合計:
    .git
    ディレクトリだけでペイロードの 86.6% を占める。
  • 暴露される情報:
    • 運用開始からの全系譜(過去の実験的な 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 トグルは無効化できない

設定画面のオプションは意図通りに動作しません。

スイッチ期待される動作実際の動作
体験最適化 (
optimizeAgentExperienceEnabled
)
データ収集を無効化するデータ収集自体を制御するのみ。スナップショット取得・アップロードは継続
リポジトリスナップショットインデックス化 (
repoSnapshotIndexingEnabled
)
スナップショット機能を無効化するサーバー側でのインデックス化のみを制御。ローカルパッケージング・アップロードは継続
  • 根本原因: アップロードサイドカーは起動時に条件なしでインスタンス化されるため、UI トグルでは停止できません。
  • トリガー: プロンプト前 (
    captureBeforePrompt
    ) またはタスク完了時 (
    repo-wiki-update
    ) に発生します(1 セッション最大 62 回)。

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
    

結論:これは「バックアップ」ではなく「収集」です

この挙動は以下の点でユーザーの境界線を超えています

  1. データスコープ: 推論に必要なコンテキストではなく、リポジトリ全体および数年分の Git 履歴を暴露します。
  2. アーキテクチャ姿勢:
    • 復号鍵がサーバー側にあるため、ローカルに保持されたデータは開くことができません。
    • プライバシーポリシーで開示がないのに、止む術のないバックグラウンドアップロードが発生します。

ツールとしてではなく、「収集(コレクション)」システムとしての挙動です。UI 設定でオフにできない場合、OS カーネルレベルの制限をかけるのが唯一の効果的な防衛策です。

同じ日のほかのニュース

一覧に戻る →

2026/09/19 6:00

これまでに Claude.md が存在しない場合、Claude Code は現在 AGENTS.md を読み取るようになりました。

2026/09/19 3:51

さらに 100TB のメモリーを節約

## Japanese Translation: Cloudflare は、トラフィックの分散に常時ハッシュリング(consistent hashing)を処理する Pingora バックエンドルーターの一部である `pingora-ketama` コンポーネントの最適化により、メモリ使用量を成功裡に削減しました。変更前に、システムはサーバーごとに過剰なハッシュエントリを格納しており、コンプライアンスとキャッシュの必要性により数十個の別々のハッシュリングが生じる場合があり、一部のケースでは 6GB に達することもありました。統計解析により、サーバーあたりに単一のハッシュのみを使用すると深刻な不均衡(変動係数約 99%)が発生し、業界標準デフォルトはハッシュ数を約 160 としていることが示されました。数学的な導出により、32 ビット値に対して 10,000~100,000 ハッシュを超えると追加容量が限界に達し衝突リスクが増大することが確認されました。エンジニアは、サーバーごとの生成されるハッシュ数を 90% 削減しても分布誤差が大きくならないことが安全に確認できました。構造レベルでは、完全な構体(struct)全体を 8 バイトのインデックス(`u32`)と、4 バイトのハッシュを圧縮された生バイト配列形式に置き換えることで、エントリあたりのメモリ使用量を 25% 削減しました。新コードは、非公開の機能フラグを通じて段階的に導入され、旧バージョン(大リング)と新バージョン(小リング)が共存可能となっています。ロールアウトは小規模な検証ロケーションから始まり、グローバルなキャッシュ churn を回避し安全な移行を確保するよう層状に行われました。これらの変更により、サーバーあたりのハッシュ生成数を 90% 削減し、グローバルメモリ消費量を 100TB 以上削減することで、コスト効率、信頼性、ロールバックの安全性を向上させました。

2026/09/18 23:18

クラウドフレイク・クイックトンネル

## Japanese Translation: 本テキストは、アカウント、DNS 設定、または開放ポートを必要とせず、開発環境向けに安全なパブリック URL を瞬時に生成する強力なコマンドラインツールを紹介しています。Cloudflare のグローバルインフラストラクチャを活用することで、このソリューションは 335 都市以上に対応し、構築済みの TLS と DDoS 保護を備えた即時のアウトバウンド専用暗号化接続を提供します。このアプローチは、`npm run dev` などのツールのエンドポイントを一貫して共有しながら既存のコードベースを変更しないようにすることで、開発者のワークフローを簡素化します。 処理は約 3 秒で完了し、構造化された JSON(ホスト名、エッジロケーション、ヘルスステータスを含む)として URL をコンソールに直接印刷して簡単なパースを可能にします。重要なのは、これらのトンネルは一時的で、ホスティングプロセスが停止すると自動的に終了し、手動での片付けを必要としないことです。この設計により、シンプルな JSON ホスト名を用いて、Webhook(例:Stripe、GitHub)、コーディングエージェント、および人間によるブラウザからローカルサービスへとの統合を容易にします。最終的に、これは内部マシンを公開する際の課題を解決し、Anycast ルーティングを介して最近のエッジノードへと接続することで不要なオーバーヘッドなしに、プライベートの localhost アプリケーションとパブリックインターネットの間で効率的な橋渡しを提供します。