从ZCode到Trae:AI编程工具的偷传数据争议何时休"

admin 2026-10-16 10:14:21 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

从 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编程工具的偷传数据争议何时休" 网络安全文章

从ZCode到Trae:AI编程工具的偷传数据争议何时休"

ZCode与Trae因未经充分告知或开关失效导致本地项目文件上传云端引发争议。ZCode承认上传但否认用于训练,已开源并获审计称云端数据清零;Trae称仅做临时向量化且明文删除,但日志显示本地分支未启用。双方均存在隐私模式失效、密钥管理不透明及数据跨境等未解问题,建议用户加强审计、明确数据留存策略并关注合规风险。
四根铜焊盘听出root:TP-LinkTL-WR845NUART未认证调试口" 网络安全文章

四根铜焊盘听出root:TP-LinkTL-WR845NUART未认证调试口"

本文展示通过UART调试口物理获取TP-LinkTL-WR845N路由器未认证rootshell的过程。作者使用万用表识别四根铜焊盘引脚角色,连接CP2102转接器,在115200波特率下获取启动日志并直接进入rootshell。文章强调物理接触可绕过软件安全措施,并提供Jtagulator自动化找脚经验与踩坑教训。建议重视硬件调试接口暴露风险,加强物理访问控制。
AI安全之外,我想聊聊安全BP" 网络安全文章

AI安全之外,我想聊聊安全BP"

本文探讨安全BP(SecurityBusinessPartner)的角色与价值,强调安全部门与业务部门需建立协作关系。安全BP需理解业务、产品、技术及安全四个层次,从业务处境出发解决冲突,将安全能力转化为用户可理解的产品价值,并通过业务变化与风险结果检验工作成效。核心在于让业务在明确风险与责任的条件下运行发展。
评论:0   参与:  0