zai-org / zai-org/feedback

[Q] 数据安全 / 隐私 — 未经用户同意上传工作区快照

Open
#715 1 comment 3 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

priority: P2 status: 待评估 type: 使用问题
Dominant language
No language data
Stars
22
Forks
1
PR merge metrics
No merged PRs in 30d

Description

涉及的框架 · Framework

ZCode Agent(自研)

你的问题 · Your question

问题类型

数据安全 / 隐私 — 未经用户同意上传工作区快照

环境

  • ZCode 版本:3.12.3(Windows)
  • 订阅类型:Coding Plan(付费用户)
  • 卸载前版本,取证已完成

问题描述

ZCode 在用户从未开启相关功能的情况下,自动将工作区全量文件打包、加密并上传至服务端。

1. 未经同意的技术证明

我的设置文件中:

  • repoSnapshotIndexingEnabledfalse
  • repoSnapshotIndexingUserConfigured 从未被设置

而应用内该功能的启用判定为双条件与:

function sKt(e) {
  return e?.repoSnapshotIndexingEnabled === true
      && e?.repoSnapshotIndexingUserConfigured === true;
}

两项均不成立,快照机制仍被触发,并生成了一个约 256 MB 的加密包。

2. 上传范围

经快照清单核实,纳入内容包括:

  • 工作区全部源码与文档(共 12,188 个文件,341,492,472 字节)
  • .git 版本库对象(含 131 个 .git/objects,即提交历史)
  • 全局设置文件(app-memory:global-settings

明确排除了 node_modulesdist/.env(这部分过滤已生效)。

3. 服务端曾确认接收

依据代码逻辑,仅在服务端确认接收后才写入 lastAcceptedManifestHash

if (!(await this.uploadClient.uploadObject({...})).ok) {
    await this.pendingManager.failPendingUpload(t, i);
    return ...;
}
await this.pendingManager.markAcceptedManifest(t, i, {...});

我在本机 state.json 中比对确认:某一工作区的待上传包哈希与服务端回执字段
逐字节相同,生成时间 2026-09-18 04:44:08,服务端确认接收时间 04:44:11。
另有三个工作区存在更早的接收记录。

诉求

  1. 完整披露该上传机制:触发条件、数据范围、存储位置、存储期限、是否提供给第三方
  2. 提供我账号名下的完整上传记录清单
  3. 删除已上传的全部数据并出具删除证明
  4. 就未经同意的上传行为说明修复时间点,并说明 2026-09-19 致歉所称"已修复"的
    具体技术含义与验证方式
  5. 明确退款方案(现"周额度重置"补偿不予接受)

补充说明

我已附上脱敏后的取证记录。如需账号信息以核查,请通过工单/私密渠道联系,
我不会在公开 issue 中披露账号标识。

你已经尝试过什么 · What you've tried

证据 1:上传队列存在(来自 %USERPROFILE%\.zcode\v2\checkpoints\<工作区哈希>\state.json

{
  "activeUpload": {
    "kind": "baseline",
    "uploadCredentialHandle": "4eda657b-…(已脱敏)",
    "attemptCount": 1,
    "createdAt": 1789682057273,
    "attribution": { "captureStage": "terminal" }
  },
  "failureCount": 11
}

说明:attemptCount: 1 为真实上传尝试次数(源码 recordUploadAttempt()
attemptCount: (n.attemptCount ?? 0) + 1)。

证据 2:功能开关为 false(来自 setting.json

{ "repoSnapshotIndexingEnabled": false }

repoSnapshotIndexingUserConfigured 字段不存在)

证据 3:加密方式(来自 pending\*.envelope.json

{
  "schema": "repo_snapshot_encrypted_artifact/v2",
  "contentAlgorithm": "aes-256-ctr",
  "keyWrapAlgorithm": "rsa-oaep-sha256",
  "aad": { "kind": "baseline", "compression": "tar.gz" }
}
ZCode 版本 / 环境 · Version / Environment

3.12.3

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reviewing the attached state.json, setting.json, pending/*.envelope.json evidence and the named recordUploadAttempt(), uploadClient.uploadObject(), and markAcceptedManifest() paths. This issue is done only when the upload trigger and scope are explained, affected records are addressed, and the requested deletion, disclosure, remediation, and compensation responses are provided.

Written by the indexing model from the issue text.

Assessment

Domain
backend-api-design, security
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.