原博客: https://blog.ferstar.org/posts/zcode-silent-workspace-snapshot-upload/ 在 zcode 里面让 ai 自己看了一下,结论是全部属实,下面是 ai 的结论: 我先读一下这篇博客说了什么,再在本机核实它的说法。 博客的核心指控是:ZCode 会在登录状态下把整个工作区(含完整 .git 历史)打包加密后直传阿里云 OSS,且解密私钥只在服务端。我现在直接在本机(你正在运行 ZCode 的这台 Windows)核对它列出的每类证据。 v2/checkpoints 目录存在,结构和博客描述完全一致(pending/*.tar.gz.enc 258MB 、envelope.jsonmanifests/extra-manifests/state.json)。继续读这些文件核对具体字段。 state.jsonenvelope.json 与博客描述的字段一字不差(AES-256-CTR + RSA-OAEP-SHA256 包裹密钥、kind: baselinefailureCountuploadCredentialHandle)。这台机器上确实有一个针对 Desktop\motionanalysis 工作区的 258MB 加密包在上传队列里。接下来看清单文件里装了什么、以及上传去向的证据。 Manifest 确认包含 .git/ 内容和工作区数据文件; extra-manifest 确认把全局配置(settings.behavior.jsonskills.json)也一并打包 —— 与博客说法一致。现在查上传日志和设置开关。 关键实锤:清单里 .git/objects/pack/pack-*.pack 一项就是 257MB 的完整 git 历史包 —— 这正是那个 258MB 加密文件的主体。继续查日志里的上传记录和设置开关。 桌面端程序在 AppData\Local\Programs\ZCode。现在验证博客里最关键的指控:代码里是否存在 upload-credential 上传链路,以及设置开关的实际作用。 Node 可用。写个脚本在 app.asar(307MB)里搜博客提到的关键字符串。 小 bug(初始 tail 用了字符串),修正后重跑。 代码层面的关键字符串全部命中。再深挖两点:①上传是否直传 OSS(找 x-oss 表单字段);②抓取/上传有没有任何开关能关掉。同时查 9/9 那次上传失败的实际日志。 代码里找到了 OSS 直传表单的完整构造(policy/x-oss-signature/x-oss-security-token/callback),与博客描述一致。再确认:①快照 sidecar 的创建是否有条件(能否关掉);②有没有环境变量开关。 没有发现任何能关闭抓取/上传的环境变量或设置键。最后核对两点:①其他工作区的 state.json 是否显示“上传成功后清理”(比失败更有力);②快照恢复走什么接口(验证解密是否只能在服务端)。 证据链已经闭合。最后取一下应用版本号,然后汇总。 # 结论:博客说的机制在这台机器上全部属实 我在你正在运行 ZCode 的这台 Windows 本机上逐条核对了博客的证据链,每一条可检验的技术指控都得到了印证。本机安装的是 ZCode 桌面端 3.12.3.7463 。 ## 本机磁盘上的实物证据 C:\Users\xxx\.zcode\v2\checkpoints\ 存在,结构与博客描述完全一致: - pending\...tar.gz.enc(258MB)——针对 Desktop\motionanalysis 工作区的加密快照,2026-09-09 生成,state.json 显示 attemptCount: 1, failureCount: 1,即已尝试上传一次失败,正在队列里等重试。 - envelope.json 字段与博客一字不差:contentAlgorithm: "aes-256-ctr"keyWrapAlgorithm: "rsa-oaep-sha256"encryptedDataKey(被 RSA 包裹的 AES 密钥)。代码确认这个 RSA 公钥来自服务端 upload-credential 响应的 encryption.public_key 字段——解密私钥只在服务端,本地无法解开这个文件。 - 明文 manifest 证明打了什么:151 个文件里包含 .git/objects/pack/pack-*.pack 一个 257,535,221 字节(约 246MB)的完整 git 历史包——占整个加密体的 99.5%。也就是说这个快照的主体就是完整 Git 历史,不是“任务上下文”。 - extra-manifests\(schema repo_snapshot_extra_manifest/v1)确实把全局配置也打包了:settings.behavior.jsonskills.json,source 标注 app-memory:global-settings,跨工作区共享。 ## app.asar(307MB)里的代码证据 对桌面端主程序做了二进制字符串检索,全部命中: | 博客指控 | 代码实证 | |---|---| | 上传凭证接口 | Wn(process.env, "/api/v1/snapshot/upload-credential"),3 处;VITE_ZCODE_ENDPOINT_ORIGIN: "https://zcode.z.ai" | | 直传阿里 OSS | buildOss... 函数构造 multipart 表单:key/policy/x-oss-signature/x-oss-signature-version/x-oss-credential/x-oss-security-token/x-oss-date/callback/success_action_status:200 | | 每次提问前抓取 | captureBeforePrompt(...) 在发送 prompt 前调用,无任何设置检查,只判断 sidecar 是否存在 | | 任务结束时抓取 | captureStage: "terminal", content: "repo-wiki-update" | | 无法关闭 | 检索不到 snapshotUploadDisabled/disableRepoSnapshot/REPO_SNAPSHOT 环境变量或任何抓取开关;repoSnapshotIndexingEnabled(默认 false)只控制服务端索引,optimizeAgentExperienceEnabled(默认 false)只控制训练相关,均不影响


  • 情报分类:技术学习与提效
  • 分类依据:内容涉及技术、AI、软件工具或工程实践
  • 信息来源:服务器 / V2EX
  • 发布时间:2026/9/18 15:16:30