文章总结: ZCode与Trae因未经充分告知或开关失效导致本地项目文件上传云端引发争议。ZCode承认上传但否认用于训练,已开源并获审计称云端数据清零;Trae称仅做临时向量化且明文删除,但日志显示本地分支未启用。双方均存在隐私模式失效、密钥管理不透明及数据跨境等未解问题,建议用户加强审计、明确数据留存策略并关注合规风险。
综合评分: 82
文章分类: 数据安全,应用安全,安全大事件
从 ZCode 到 Trae:AI 编程工具的偷传数据争议何时休
原创
网络安全透视镜
网络安全透视镜
网络安全透视镜
2026年9月23日 10:50
江苏
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
导语 2026 年 9 月 18 日至 22 日,智谱旗下 AI 编程客户端 ZCode 与字节跳动旗下 Trae(含 TRAE IDE 与 TRAE Work)先后被开发者以取证方式公开指出:在用户未充分知情、或界面开关未能生效的情况下,本地项目文件被上传至厂商云端。两起事件相隔不到一周,指向同一类问题。截至发稿,ZCode 已完成整改、开源客户端并公布两家第三方机构审计结论;Trae 官方发布调查结果说明,确认存在临时上传但否认用于模型训练。双方对若干技术细节的陈述仍存在出入。本文依据开发者公开取证记录、厂商官方说明与公开媒体报道,还原事件脉络,并就此作出分析评论。
核心事实速览
| 事项 | ZCode(智谱) | Trae(字节跳动) |
| — | — | — |
| 曝光时间 | 2026-09-18 | 2025-07(遥测);2026-09(代码索引) |
| 核心指控 | 登录即打包整个工作区(含完整 .git 历史)加密上传阿里云 OSS | 项目文件被批量上传至云端做远程向量化(Embedding) |
| 厂商是否承认上传 | 承认,归因”代码库索引 / Repo Wiki 默认开启” | 承认,称系代码索引功能,明文计算后永久删除 |
| 用户可否关闭 | 取证称 UI 无有效开关;两个既有开关均不控制上传 | 隐私模式不覆盖索引链路;官方未提供”仅本地索引”选项 |
| 当前状态 | v3.14.0 移除上传链路;客户端开源;第三方审计称云端已清零 | 功能保留,官方发布澄清说明;本地分支未执行问题未获回应 |
| 是否称用于训练 | 否认 | 否认(无论隐私模式是否开启) |
一、ZCode 事件:一份 313MB 快照引发的整改
1.1 起因
9 月 18 日,开发者 ferstar 公开了其排查记录。据其描述,他在清理一台 256GB MacBook Air 的磁盘时,发现用户目录下 ~/.zcode 占用超过 700MB,其中 ~/.zcode/v2/checkpoints/ 下存在一个 313MB 的加密文件及一份状态文件。
状态文件显示:客户端扫描了本地打开的一个商业项目,在排除 node_modules 等目录后,将 345MB 内容打包加密为 313MB 的全量快照(baseline),并已尝试上传 564 次。因体积超出服务端限制,该包滞留本地待传队列,未传出局域网——这一点有其路由器流量日志佐证。
但同一台机器上的另一个仅含 538 个文件的小型公开仓库,压缩加密后约 15KB,状态显示已被服务端接收。随后有 Windows 用户在社区复现出相同目录结构与状态文件。
1.2 上传内容:86.6% 是 .git,而非当前代码
由于密文本地不可解,取证者转而分析留在本地的文件清单(Manifest)。该清单共列出 42,411 个文件,构成如下:
| 内容 | 体积 | 占比 |
| — | — | — |
| .git/lfs(历史大文件缓存) | 196.1 MB | 56.8% |
| .git/objects(完整对象库) | 102.2 MB | 29.6% |
| .git/logs(reflog 操作记录) | 0.6 MB | 0.2% |
| 源码与文档 | 约 46.2 MB | 13.4% |
即:当前在写的源代码仅占 13.4%,其余 86.6% 为 .git 目录内容。
这一构成是本事件与”AI 读取当前文件做推理”的本质区别。Git 对象库近乎只加不减:从代码中删除并再次提交的密钥,仍完整保留在历史对象中;未推送的本地分支名可反映未公开的研发动向;.git/config 中通常含有内网代码托管域名与仓库路径。
取证还指出,代码中存在 repo_snapshot_extra_manifest 机制,会将 ZCode 全局配置文件做哈希后跨工作区打包,随每次快照上传。
1.3 上传链路与密钥归属
据取证还原,链路分为两步:
客户端 → 向 zcode.z.ai 请求上传凭证 服务端 → 返回:快照 ID / RSA 公钥 / 体积上限 / 阿里云 OSS 直传签名 客户端 → 本地 tar.gz 打包 → 随机对称密钥 AES-256-CTR 流式加密 → 服务端公钥 RSA-OAEP 封装对称密钥(信封加密) → 密文绕过业务服务器,直传阿里云 OSS OSS → 回调通知后端登记
触发点有两个:每次向模型提问前的 captureBeforePrompt,以及任务结束时的 repo-wiki-update。日志显示单个活跃会话最多产生 62 次快照捕获。
争议焦点在于密钥归属:RSA 公钥由服务端随凭证临时下发,私钥始终只在云端。这意味着本地生成的密文,用户与客户端本体均无法解密。取证者据此认为该行为”更像采集而非备份”——此为个人判断,非机构认定。
1.4 开关失效
据取证,ZCode 设置界面中两个相关开关的实际作用域与用户预期不符:
| 设置项 | 实际作用域 |
| — | — |
| 优化体验 | 仅决定数据是否被授权用于模型训练;关闭后快照仍打包上传 |
| 仓库快照索引 | 仅决定服务端收到快照后是否建立索引;关闭后本地打包与上传不受影响 |
代码层面,负责快照捕获与上传的 sidecar 在客户端启动时无条件实例化,据称不读取任何用户配置,唯一条件是持有登录后的 JWT。取证者称其手动删除待传包后,半小时内被自动重建,失败计数由 564 增至 565,最终通过文件系统不可变锁(macOS chflags uchg / Linux chattr +i)才阻断该链路。
1.5 厂商回应与整改时间线
| 时间 | 事项 |
| — | — |
| 9/18 17:44 | 智谱在用户群致歉,归因”代码库索引 / Repo Wiki 功能上线初期默认开启”,称上传数据在 Wiki 页面生成后立即销毁、不会保存;承诺开源与第三方审查,并向全体用户补偿一次周额度重置 |
| 9/19 | 推送 v3.14.0,更新日志写明”修复仓库百科异常上传的问题”(取证所用问题版本为 3.12.3) |
| 9/19 | 企业用户太原承明科技发出特急函,提出 12 项答复要求,限期 10 月 10 日书面答复 |
| 9/20 晚 | 智谱 MaaS 平台宣布将上线”数据内容不留存”功能 |
| 9/21 | 宣布 ZCode 开源(GitHub,Apache-2.0),公布中国信通院与绿盟科技审计结论 |
两家机构的结论为:中国信通院技术评测确认 zcode-prod 阿里云 OSS 存储桶状态为”云端零数据”;绿盟科技审查确认相关存储桶及全部数据对象已删除,v3.14.0 未发现可触发本地仓库快照或文件外发的功能路径。截至发稿,两家机构均未公开本次审计的完整报告。
1.6 尚未解决的四点
其一,开源版本与出事版本无法比对。公开仓库创建于 9 月 20 日,仅有两个提交:一个空的初始 commit,以及一次性导入 6973 个文件、103 万行代码的 feat: open source。内部开发史被抹平,旧版上传管线的演进与移除过程无从查证。取证者核对源码后称,检查点功能实为本地 git 增量比对、元数据存储于本机,与云端无关——而”会话检查点回滚”正是官方解释整仓上传的理由之一。
其二,开源当日社区提出新发现。有开发者指出本地保存的模型 API Key,其加密默认密钥可由平台名、家目录与用户名推导(无盐、无 KDF),被形容为”等效明文存储”;另有指称服务端保留向客户端远程注入 prompt 的配置通道。两项均未获官方公开回应。
其三,审计的时间边界。事后审计可证明”9 月 20 日之后桶是空的”,无法倒推 9 月 18 日之前流入的数据是否曾被解密、同步或备份。承明科技函件的 12 项要求,核心即指向留存策略、访问日志、备份清单与合同化审计权。
其四,数据出境问题。函件指出 ZCode 客户端网络请求指向 zcode.z.ai 与 cdn-zcode.z.ai,而 Z.AI 平台缔约主体为注册于新加坡的实体;中文版隐私政策则写明境内收集的个人信息存储于境内、不会跨境传输。该问题涉及《个人信息保护法》第三十八条与第三十九条,截至发稿未见公开答复。
后续进展:承明科技此后发布澄清说明,称函件举证有误、措辞过度,撤回所列主张;据封面新闻 9 月 22 日报道,该公司技术人员称此前指出的问题在更新后的版本中已无法复现。
二、Trae 事件:争议从遥测转向代码索引
2.1 前情:2025 年 7 月的遥测争议
2025 年 7 月,有开发者抓包发现,Trae IDE 在手动关闭遥测与数据收集开关后,7 分钟内仍发出约 500 次网络请求、约 26MB 数据,目标为 byteoversea.com,内容涉及硬件配置、操作系统信息、唯一设备 ID、项目路径等。
字节跳动当时回应称:Trae 采集的是非敏感的统计与性能指标,不涉及个人身份信息;用户关闭的实为 VS Code 框架原生的遥测开关,Trae 自身遥测机制不依赖该开关,因此造成”误解”。数日后,Trae 在设置中补充说明:该开关仅控制通过 VS Code IDE 框架进行的遥测收集,通过其他 Trae 工具进行的数据收集不受此开关影响。
2.2 本轮:代码索引的远程向量化
ZCode 事件发酵后,开发者将同类排查方法应用于 Trae。一份标注成文时间为 2026-09-21 的取证记录显示,审计对象为 TraeCode CN 3.3.102(TRAE IDE)与 TraeWork CN 0.1.67(原 TRAE SOLO),方法为数据目录取证 + 二进制静态分析 + 运行日志行为追踪(全程只读),并明确区分”已证实”与”推断”。
被质证的官方表述为:
“为了实现代码库索引功能,当你将某个目录作为项目在 TRAE 中打开时,TRAE Work 和 TRAE IDE 确实会临时将代码库文件上传至服务器计算嵌入向量。计算完成后所有明文代码将被永久删除。”
取证者的核心反驳是:上传并非技术必需,而是服务端配置选择的结果。
2.3 关键证据:存在本地分支,但执行 0 次
在 CKG(代码知识图谱)内核 libckg.dll 中,内嵌一段可解析的流水线定义,包含一个 local_remote_embedding_selector 节点,显式配置两条互斥分支:
"local_remote_embedding_selector:0": { "configurations": { "local_branch": "collect_files:1", // 全本地 "remote_branch": "collect_files_and_remote_embedding:0" // 全远端 } } // 本地链:collect_files → local_chunk_and_embedding → idle(无网络节点) // 远端链:collect_files_and_remote_embedding → 上传至服务器 → idle
客户端生产代码 resources\app\out\main.js 中,构造给 CKG 的配置对象包含:
const b = { local_embedding: !0, // true,要求本地嵌入 embedding_storage_type: "sqlite_vec", // 本地向量库 source_product: "native_ide" }; // modules\ckg\start.bat 启动命令同样带 -local_embedding
但对全部 codekg.log.* 的逐条统计结果为:
| 日志签名 | 归属 | Trae CN | TraeWork |
| — | — | — | — |
| [CollectFilesStep] | 本地 | 0 | 0 |
| [LocalChunkAndEmbeddingStep] | 本地 | 0 | 0 |
| [CollectFilesAndRemoteEmbeddingStep] | 远端 | 73 | 215 |
| uploadKnowledgebaseFiles | 远端 | 408 | 33,285 |
远端嵌入分支合计 288 次,本地分支全部为 0 次。取证者将原因指向服务端下发的 GetCKGRAGConfig 回显:
RAGRepoWhiteList = [] // 允许走本地索引的仓库白名单 —— 空 RAGRepoNotOnlyWhiteList = true // "不只白名单内的仓库"也参与 RAGRemoteIndexThreshold = -1 // 远端索引不设下限 RemoteNonGitFileCountLimit = 3000 UploadKnowledgebaseFilesBatchSize = 5 // 本机真值:iLRWL / iAWL 100% 为 false
空名单叠加”不只白名单内的仓库”,使白名单判定彻底失效。取证者的结论是:正确表述应为”索引有两种实现,服务端策略选择了需要上传的那一种“,而非”因为要索引,所以必须上传”。
该份材料自设的边界:本机未抓取到明文请求体(自研网络库不记录 body),”上传的是文件内容而非哈希”系由批大小、耗时量级、服务端 embedding_failed 返回、协议含 user_file_content 字段四条判据共同支持的推断;本机亦不存在任何 CKG 嵌入模型文件(目录仅约 42.4MB,不足以容纳 bge-m3 量级模型),故只能表述为”代码路径存在、客户端默认请求、却从未触发”,不能断言本地方案端到端可用。
2.4 上传耗时与隐私模式
日志中 initialize finished 行同时给出总耗时与上传耗时,样本如下:
| 项目 | 文件数 | 上传耗时 | 占比 |
| — | — | — | — |
| 某数据集目录 | 55 | 3026.19 s | 97.1% |
| 某 Java 项目 | 161 | 82.99 s | 98.6% |
| 某 Java 项目 | 152 | 51.24 s | 97.6% |
| 某算法目录 | 3000 | 88.19 s | 97.1% |
即索引流程 92%–98.6% 的时间消耗在文件上传上。同一项目多次运行耗时波动可达 5–18 倍。
关于隐私模式,取证记录的观测结果为:
| 观测项 | 实测值 |
| — | — |
| UI 层 appPrivacyMode | on(服务端 2026-09-17 09:59 写入) |
| CKG local_env.json → is_privacy_mode | false(两个应用均如此) |
| 开启后是否仍在上传 | 是(09-17 至 09-20 均有记录) |
| CKG 日志中 privacy 关键词命中 | 0 次 |
取证者另指出一处对照:同一安装包内”采集进程内存快照并上传”的通道,界面提供了明确告知与取消按钮;而代码库索引的文件上传在界面上无任何提示,也无”本次不传”选项。
2.5 Trae 官方回应与未回答的问题
Trae 官方社区于 9 月 22 日发布调查结果说明,澄清三点:
1. “远程 embedding”即代码索引功能,用于让 AI 理解项目上下文;代码仅临时上传用于向量计算,计算完成后明文代码即被永久删除,云端不会保留完整源码。
2. 上传范围有严格过滤,并非全量:node_modules 等依赖目录、构建产物、二进制文件、图片音视频压缩包不上传;以 . 开头的隐藏目录(包括 .git)不上传;.gitignore 中列出的文件默认忽略,用户可在 .trae/.ignore 自定义;单文件大小与行数均设上限。
3. 隐私模式控制的是对话交互内容(含聊天中的代码片段与 AI 输出)是否用于数据分析与模型训练,与代码索引功能无关;无论隐私模式是否开启,代码库文件均不会用于数据分析、产品优化或模型训练。
经核对,上述三点与 Trae 公开产品文档一致。但仍有两处出入未获澄清:
一是 .git 是否被排除。官方称隐藏目录(含 .git)不上传;而另一份取证帖的记录为”排除规则里排了 node_modules、密钥文件等,但没有排除 .git”。两个来源陈述冲突,目前无第三方判定。
二是本地分支为何从未执行。官方回应未解释:为何代码中存在完整的本地嵌入分支、客户端默认请求 local_embedding:true,实际运行中该分支执行次数为 0。此为本轮质疑的核心。
三、横向对照:同类事件的四次重演
| 时间 | 产品 | 事实 | 用户可否关闭 |
| — | — | — | — |
| 2025-07 | Trae IDE | 关闭遥测后 7 分钟仍发出约 500 次请求、约 26MB | 否,开关仅覆盖 VS Code 原生模块 |
| 2026-07 | Grok Build(xAI) | 未获授权即自动将整个 Git 仓库(含历史)上传至 Google Cloud Storage | 曝光后由服务端静默翻转开关 |
| 2026-07 | Cursor | 被指仅凭登录态即上传,取消订阅后仍上传 736MB | 索引设置页据称可被服务端 flag 隐藏 |
| 2026-09 | ZCode | 登录即整仓快照,含完整 .git,私钥仅存云端 | 否,UI 无有效开关 |
| 2026-09 | Trae CN / Work | 代码索引默认走远程 embedding,本地分支未执行 | 隐私模式不覆盖索引链路 |
此外,2025 年 12 月安全研究员 Ari Marzouk 一次性披露 AI 编程工具中的 30 余个漏洞(代号 IDEsaster,其中 24 个获 CVE 编号),涉及 Cursor、Copilot、Windsurf、Zed、Claude Code、Cline、Gemini CLI 等,共同特征是无需用户交互即可借由提示词注入将私有仓库内容外发。
四、分析评论
以下为基于上述事实的分析与观点,与前三节的事实陈述分开呈现。
4.1 “不用于训练”不等于”没有上传”
两起事件中,厂商均以”不用于模型训练”作为主要回应。这一承诺在合规上是有意义的,但它只覆盖了数据生命周期的最后一环。把 AI 的数据处理拆开看:
采集 → 传输 → 处理 → 存储 → 训练
“不训练”回答不了前四个问题:传了什么、传到哪里、存了多久、谁能访问。”处理完删除”同样不等于”数据从未出域”——对企业而言,代码离开内网的那一刻,风险性质已经改变。
Trae 官方说明本身就体现了这一点:其隐私模式明确只管控”对话内容是否用于训练”,与代码索引上传是两条独立链路。这不是措辞游戏,而是产品设计上的真实分工,只是用户此前普遍不知情。
4.2 真正的分界线:默认开启与开关失效
将五起事件放在一起,共同结构只有三条:全量采集默认开启;用户开关只管”训不训练”;真正的控制面在服务端。
因此,将本轮争议定性为”偷代码”并不准确,也无助于解决问题。更准确的表述是:厂商在”数据最小化”与”体验优先”之间做了一次选择,而这次选择没有交给用户。
ZCode 与 Trae 的差异同样值得注意。ZCode 的问题在范围与姿态:打包整个工作区连同完整 Git 历史,且界面无可关闭的开关。Trae 的问题在路径选择:官方已如实披露存在临时上传,但本地索引分支明明存在、客户端默认请求本地、运行时却一次都没走。前者是”没得选”,后者是”有得选但没给”。
4.3 结构性成因:上下文饥渴与数据燃料
AI 编程工具读取代码具有技术正当性。一个 Bug 的成因可能跨多个模块,只给模型当前文件,它无法真正理解项目。这类工具必须建立”代码库上下文”,而上下文天然需要更多文件、更长历史和更完整依赖。
但矛盾在于:模型越聪明,需要的数据越多;安全要求恰恰相反。叠加两个现实因素——真实世界的编码轨迹(提示、改动、报错、修复的完整序列)是训练下一代 Agent 模型最稀缺的燃料;客户端热更新与服务端 feature flag 让”今天不传”随时可变——单次事后审计难以形成约束。
这也是为什么”开源”应当是起点而非终点。ZCode 开源当天即被社区在源码中提出新发现,恰恰说明透明有效,但同时也说明:源码透明无法覆盖服务端行为、云端配置与分发一致性。
4.4 合规与行业走向
ZCode 事件中最具法律分量的并非上传本身,而是数据出境问题。若境内企业数据确经新加坡主体处理,按《个人信息保护法》第三十八条,须满足安全评估、保护认证或标准合同三者之一;第三十九条还要求逐项告知并取得单独同意。该问题至今未见公开答复。
企业侧的反应已经先行。三星在 2023 年三次内部数据外泄后全面禁用 ChatGPT 等生成式 AI 工具三年,2026 年 6 月解禁,代价是约 5000 亿韩元(约 3.4 亿美元)自建安全 AI 环境,采取双轨制:通用办公用外部企业版工具,半导体研发留于自研模型与内部沙箱。阿里巴巴则于 2026 年 7 月将 Claude Code 列为高风险软件,要求员工移除。
可以预期,AI 编程工具的数据安全规范或行业标准将在近年内出现,企业采购的评估维度也会从”模型能力”扩展到”数据边界”:本地索引、私有部署、零留存、细粒度权限、全链路审计。
4.5 给开发者与企业的行动清单
1. 检索在用工具隐私政策的三个关键词:retention(存多久)、training use(是否用于训练)、third-party sharing(是否共享第三方)。
2. 不要把开关当作保险。本轮两起事件均已证明开关语义可能与预期不符;更稳妥的假设是”输入即留痕”。
3. 自行确认排除规则,尤其是 .git 是否被排除——该点目前存在来源冲突,不应依赖默认值。
4. 涉及密钥、用户数据、核心业务逻辑的项目使用隔离环境(虚拟机、容器或独立设备)。
5. 用过受影响版本的用户,应立即轮换数据库口令、API Key 与云服务凭证。Git 历史中被误提交过的凭据,应视为已泄露。
6. 企业采购应写入合同的四条:是否提供本地索引 / 私有化部署选项;代码数据留存期限与销毁条款;是否接受第三方安全审计;逐项确认并书面关闭默认开启的数据外发功能。
4.6 结语:争议何时休
短期内不会休。代码上传是这类产品的工作原理,整改能移除某一条链路,移除不了需求。
但可以让它从”事故”降级为”配置项”。需要三件事成为行业默认:Privacy by Default(默认不读 .git 与 .env、默认本地索引、默认敏感信息检测、默认最小上下文);可验证的删除(留存策略、访问日志、备份清单与合同化审计权);把数据边界做成竞争维度(企业最终会问的是”我敢不敢把核心代码交给你”)。
值得注意的是,社区中不乏另一种声音:开源时代本就是知识与代码的共享网络,AI 只是把这种流动放大,用户既是贡献者也是受益者。这一视角有其道理,但它成立的前提是知情与授权——开源有 License、有边界、有授权,而不知情的上传没有。这条界线,正是两起事件真正的分水岭。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:网络安全透视镜 网络安全透视镜
网络安全透视镜《从 ZCode 到 Trae:AI 编程工具的偷传数据争议何时休》