智谱ZCode整仓上传事件始末

封面中心为智谱ZCode文件夹与被锁住的代码仓库,左侧是开发者电脑,右侧是云端服务器,粗箭头表现整个项目与Git历史被加密打包上传,底部并列“改bug”“开源”“第三方审计”三项承诺;可见事实元素:主体标识“智谱”“ZCode”

智谱偷代码被实锤秒怂,承诺改bug、开源、接受第三方审计。大家好,欢迎收听老范讲故事的YouTube频道。智谱偷代码,直接被抓了个现行。先跟不写代码的朋友们交个实底:这一次被实锤的产品叫ZCode,是智谱今年7月份推出的AI编程桌面工具,对标的是Cursor和Claude Code这一类产品。你在里头写代码,大模型帮你做代码生成、补全、改bug,帮你把整个项目搭起来。

偷代码偷的到底是什么呢?大家要注意,不是说你写了提示词、打了个回车,或者说“请你修改哪个代码”,它把这些东西作为上下文传回去了,不是这样的。这个其实大家已经心里有底了:你既然已经选择使用AI写程序,就没惦记保密。但是智谱这一次做的事情要更过分一些:你没发给它的东西,它也会传上去。它会把整个项目全都打包,而且包括你整个的Git历史记录,一起打包,然后自己还加了个密,直接给传走了。今天咱们就把这个事稍微捋一捋。

从磁盘异常到完整证据链

首先,咱们要讲一下这事是谁爆出来的,到底靠不靠谱;然后再详细说一说它到底偷了什么,哪些事它干了,哪些事它没干。咱们也要看看智谱的这个小心思。现在三天过去了,承诺兑现了哪一些?别家是不是也干这种事,还是只有它干?如果别家也干,智谱到底跟其他人有什么不一样的地方?最后,咱们要讲一下以后这些工具该用哪个,哪个要小心一些。

首先讲一下这事是谁爆出来的。有一个人的网名叫ferstar,F E R S T A R,人应该是个大陆的独立开发者,平时写Python、写Go,业余给小米、一加这些手机做一些Linux内核补丁。不是安全圈的名人,就是个看见怪事忍不住去扒一下的技术人。文章是9月18号中英文双发。现在因为有AI了,所以你也不用担心他英文怎么样。这哥们也写了一堆英文博客,但是他说:“我所有博客都是用中文写的,只是用英文翻译了一遍放在这而已。”说到这,我是不是可以把我自己的中文博客都翻译成英文也放一遍?这个等我思考一下。

事情是从9月16号开始的。这位ferstar去清理磁盘,发现ZCode的数据目录占了700多兆。他就觉得很奇怪:“我没怎么用这东西,这不正常,这些文件到底哪来的?”顺着目录翻下去,发现有一个叫checkpoints的文件夹,里头躺着一个313兆的加密文件,旁边有一份明文状态文件,里面有三个关键字段。

第一个字段对应他本地一个商业项目,整个仓库10GB,排除依赖包之后打包了345兆,几乎全是核心知识产权。大家注意,这个10GB的项目里头可能有很多你下载的开源包、依赖库,这些东西没必要重新传。现在只是把他自己生生写的这345兆打包在里头了。第二个,包的类型写的是baseline,基线,也就是全量基线快照,不是增量。什么意思呢?我们打包这些代码的时候,一般不会做全量基线,因为量太大,通常会做增量,也就是记录每次改了哪些。

第三个是一个更可笑的数字,叫失败次数:564。也就是ZCode尝试上传这个345兆的包,尝试了564次,失败了,还在本地排队,等待传第565次,非常执着。删了它吧,它又能长回来。他一开始以为就是个临时文件,删了,过了半个小时以后……他发现一个新的313兆的包又给打回去了,计数器从564变成了565。你删你的,我计数,又失败了一次,我准备继续往上传。一般人到这就卸载了,说你这有问题,你偷我东西,对吧?这位哥们有点较真,直接拆包了。

横向三栏证据卡,依次展示商业项目仓库与全量基线包、反复失败的上传计数器、删除后重新生成的加密包;用循环箭头连接“删除”“重新打包”“继续上传”

加密上传如何绕过业务服务器

现在这种AI IDE工具,都是用一些TypeScript语言编程,然后打包出来的,它可以拆出JavaScript包来。普通人搞不了这个事,他可以把这些执行代码拆开去读,于是就发现了秘密,把整个过程还原出来了。客户端向智谱服务器要凭证和公钥,说:“我现在准备往上传东西了,请给我一个上传的公钥。”公钥是什么东西呢?咱们现在做加密,都是叫非对称加密,也就是一个公钥、一个私钥。公钥的意思是,你拿回来把这个东西加密以后上传上去,然后它再拿私钥给你解开。

同一个文件包用公钥加密以后,用公钥解不开。这样可以保证公钥虽然能够在公开的网络上传播,但是你加密的包在经过网络的时候不能被解开。本地拿到公钥以后,就是打包加密,绕过智谱自己的业务服务器,用一个表单直接把这个加密包甩到阿里云对象存储上,在智谱自己的应用服务器上不留下上传记录。懂行的朋友品一品,这像干好事的样子吗?肯定不像。

这个发现出来以后,他到18号把文章发出来,开源中国、博客园、V2EX、Linux.do直接炸锅了。还有用户在官方飞书群里直接骂街:“你直接把我所有的东西都传上去,你到底想干什么?”还有人甩了一张火绒流量监控截图。火绒也是一个安全软件,专门会监控你的电脑往上传多少东西。他们发现智谱ZCode偷偷上传了43GB的内容,截图发出去3分钟就被管理员直接删了。这个也是很神奇的一种操作。

因为我们以前管理过社区,你只要在里头敢删帖,这事一定会爆。你上来解释一下,稍微抹个稀泥,没准还能拖延一下;你直接删帖,在自己能够说话的地方把帖删了,那就属于逼着大家出去说了,所以这个事情直接爆炸了。43GB是个用户截图,这东西到底是做什么的,咱不研究了。但是那个313兆、564次、加密算法,是ferstar自己在机器上一步一步提取出来的,每一步都写了复现的方法,谁都能够去验证。他不是来骂街的,他就是提交了一个证据。

智谱删了帖以后想了想,说算了,认吧。当天下午17:44,道歉声明就出来了,也没敢说造谣,直接说对不起,我这有个bug,我去把这个bug修掉,然后去开源、接受审计,把这些事全说了。那这313兆里边到底都装了什么呢?这个加密包因为本地打不开,这也是一个比较恶心的事情:文件是你的,人家给你一个公钥,你在本地把文件加密以后,自己打不开,不知道里头是什么。但是ferstar看到有一个叫打包文件清单的东西,知道里头大概打了哪些东西。

包里装着项目的整个过去

虽然这个加密包解不开,但是打包文件清单是明文存在本地的。他把清单打开一看,一共42,411个文件,非常精确的一个数,有零有整。这里头Git的大文件缓存是196.1兆,占56.8%;Git对象库,也就是完整提交历史,102.2兆,占29.6%;Git日志0.6兆;剩下的是源代码和文档,46.2兆。整个包86.6%是Git目录,当前代码只有13.4%。大家注意,我们写程序的时候,特别是需要做版本控制的时候……

正中央为一个标注“313兆”的加密包,周围以平面环形分区展示Git大文件缓存、Git对象库、Git日志、源代码和文档,并在侧边突出“86.6%是Git目录”“当前代码只有13.4%”;整个画布使用均匀明亮的纯浅色底,不要暗角、黑边、渐暗阴影或聚光效果

我们会喜欢做一个Git。Git这个东西,实际上会在项目目录里头留一个隐藏目录,叫.git,它会把这个项目所有的提交历史全都存在这个目录里。你说:“我不是存GitHub吗?”GitHub就是把这个目录里的内容再推送到GitHub上去。但是你只要做Git,完整的更新日志、整个更新历史就全都在本地。所以这个300多兆里头,大部分,也就是86%,就是这个Git目录。

那智谱为什么把整个Git目录都打包上传呢?这个不写代码的人可能不太理解:你今天改了什么、昨天删了什么、三个月前加了什么,每次提交还要写一个叫git commit的注释,说我这一次解决了什么问题。所有这些东西,通通都写在这个目录里。它不是项目现在的样子,而是项目从头一天创建,一直发展到今天,中间每一步踩过的所有坑,都在里边了。那么智谱把这种东西传上去,就非常危险。为什么呢?因为这种Git目录里头经常会存历史的密钥。

按道理来说,我们不应该把密钥传到Git服务器上去,所以有一个文件叫.gitignore。你可以在里头写哪个文件不传上去、哪个文件不传上去。但是我们有时候会图省事,暂时先写在里头,等下一次更新.gitignore的时候,再把写密钥的文件排除掉,以后不再提交。但是以前写过的,通通都在历史目录里存着,非常危险。

第二个,就是没推送的本地分支名。因为Git很多东西是在本地的,我们不需要推送到服务器上去。这些东西里头可能有你偷偷做的一些新功能,或者给一些大客户做的定制,等于把所有没发布的产品规划通通都拎走了。像我们向GitHub推代码的时候,只把特定的分支推上去,并不会把所有分支都推上去。现在智谱把所有这些玩意一把全都拿走了,那就相当于把你整个保险库密码本,以及整个失败和成功的所有经验教训,通通全都拎走了。智谱拿的东西还是挺全的。

触发器、摆设开关与未披露的范围

那这个文件是在什么情况下传呢?代码里头有两个触发器。一个叫做每一次捕捉到提示词的时候。什么意思呢?就是你每一次打回车、提交prompt进去的时候,它就进行抓取。这个博主做了测试,打了62个回车,每一次它都尝试去打包、上传。另一个触发器挂在任务完成时,标记叫做仓库Wiki更新,这个咱们后边讲。你说我关了行不行?你默认开,我给你关了不就完了吗?虽然默认开这事也很恶心,但这就属于更吓人的一点了。

智谱ZCode里头有两个开关,第一个叫优化体验,第二个叫仓库快照索引。博主都尝试了,把这两个关掉以后,发现没有任何作用,照传不误。所以开关是有的,但是本地打包上传这件事情并不受开关影响。那你说它的隐私政策里头到底写了什么呢?智谱是有很多To B用户的,你干这样的事情,实在有点太伤人品了。这位博主把政策、FAQ、更新日志翻了个遍,整仓快照、Git历史,一个字都没提过。

只有一句套话。政策原文,咱们直接念:“收集你在对话中提交的文本、文件和代码。”压根就没有说,我会把你整个的Git仓库、Git历史全都传上去。大家注意,它整个隐私政策、FAQ里头写的其实是骗人的。这几样东西凑齐以后,智谱都干了什么呢?你只要登录,我就传;开关是个摆设;政策里头一个字没写。删了,重新打包;钥匙在云端;本地只有一个打包文件清单,打包以后的结果你看不到,只有上传以后云端才可以看到;而且是把你所有的Git仓库和历史分支全都一把打包上去的。这还能叫bug吗?咱们自己想想。

秒怂道歉与云控开关

智谱真的是秒怂。四份承诺和一个“为了你好”,这事咱们作为中国用户已经比较习惯了。道歉是9月18号17:44发的。发在哪呢?这个特别有意思,发在ZCode的官方飞书群里。它没有在官网发布,也没有发任何新闻,只是在飞书群里发了一下。就是说,我们给开发者安抚一下,其他人你们就当不知道好了。

咱们来摆一摆它都说什么了。首先,这个问题是出在代码库索引功能上。什么叫代码库索引呢?大家要知道,大模型干活的时候是有上下文限制的,你不能超出它的上下文范围。但是一个代码库里头有很多很多代码,我到底改哪块、不改哪块呢?它需要先做索引,这样在你修改代码的时候,可以快速找到目标代码区域进行修改。这个也可以帮你节省大量上下文,可以替你省钱、省token。

所以它里头有一个叫做仓库Wiki更新的触发项,说只要触发了这个,我就帮你上传到云端,在云端帮你整个进行索引。索引好了以后,我再把索引的结果传回来。而且智谱还说,所有代码送到云端以后,我们索引完了就给你删了,绝对不自己留,还专门给你做了这样的保证。但是这种保证,有人愿意信就信吧,也只能是这样。然后智谱说,这个功能上线初期是默认开启的,部分用户受影响。它不敢说全部用户受影响,然后深表歉意,问题已经修复。

这个我觉得才是最吓人的。为什么呢?因为它发了这个道歉之后,没有更新版本。按道理来说,我说问题修复了,应该会看到一个新版本的ZCode让你去下载,但是没有。为什么老范说吓人呢?这里头有几种可能。第一种可能,我先说问题修复了,先糊弄大家,把大家稳住。注意,9月18号是个礼拜五,咱们礼拜一再来。智谱没准人家还老老实实双休,等一等,再把它修复掉就可以了。虽然公告上说问题已解决,但是我稍微偷个懒,这不算是一个特别吓人的结果。

真正吓人的结果是什么?真正吓人的结果叫云控开关。就是它不需要给你更新版本,我在云端把开关一关,这个事它就不干了。那为什么这个事很吓人呢?因为下次它还可以打开。所有东西你没有任何可以控制的地方,人家自己在云端什么时候想开就开,什么时候想关就关。所以不更新软件版本,直接告诉你问题已修复,比更新软件版本还要吓人。

平面流程图左侧是本地ZCode版本,右侧是云端总开关,中间分出“关”与“下次还可以打开”两条状态路径;下方并列开源、第三方评估、周额度重置三张承诺卡

再往后是其他承诺。下一个是近期准备直接把ZCode代码库开源掉。因为你现在已经没法让人信任了,那以后开源了,你们自己看就完了,对吧?信不信,反正都开源了。第三个,是邀请第三方评估,做系统审核。第四个,说全体用户额外发一次周额度重置。这个也是跟OpenAI学的,动不动就给你发重置。当天实锤,当天就认怂,所以我说秒怂,速度咱们先给它记一功。

但是大家品一品,这个味道很熟悉。原来谁最爱干这事呢?360最爱干这个事。360在手机上把别人家的应用商店删了,只留自己家的应用商店;在你的电脑上把别人家的浏览器卸了,只留自己的浏览器。当你问它为什么这么干,它理直气壮地说:“我为了你好,为了你的电脑安全,为了你的电脑跑得更快,为了你不会下载到……有问题的应用,为了你不会被钓鱼网站钓鱼,所以我来帮你处理掉了,你不需要谢谢我。”它是这样一套话术。

现在智谱也是这么一个话术,说我去给你做Wiki的索引了,我都是为了你好,只是里头可能有一些小问题,瑕不掩瑜。咱们给你打补丁,我还给你重置了一次,就不要再唧唧歪歪了。那你说Wiki这事是不是真的呢?肯定是真的,也有用。但是这里头有几件事是说不通的。第一个,你要做Wiki的话,干嘛要把完整的Git历史打包传上去呢?这不应该,你不需要这么多东西。

第二个,就是你这个加密很奇怪。你从云端发一个公钥下来,把整个东西打成一个包发回去,我的本机还解不开,这个也是不应该的。第三个,关不掉。你还给我留了两个开关让我选,选完以后你继续打包、继续上传,这个也不应该。最后一个不应该是什么?每按一次回车传一次,你对我的数据有这么饥渴吗?所有这些都不是生成Wiki所必须的东西。

这一次智谱认错,第一个是只在一个很小的范围内认,并没有到外边说去。第二个,它只承认了给你做代码索引、做Wiki这一部分,其他的通通都没认。每次回车、每次你提交提示词,就去打包上传,这事压根就没提。所以这一次认错,基本上是一个避重就轻的认错。那么智谱认了这些事以后,哪些干了,哪些没干呢?

四项承诺兑现了多少

第一个,刚才咱们讲了,没有更新版本。现在是3.12.3版本,是九月十七号发布的,这个事是九月十八号曝光的。所以在九月十八号曝光、号称bug已修改过后,版本并没有更新。这个跟大家去实锤一下。第二个,号称要开源。截至目前为止,GitHub上没有官方仓库。哪怕你先建个仓库,建个空目录,打个README上去,说我这个代码在整理之中,你也算有个态度。没干,这事没有。

第三个,说我要找第三方评估。找什么机构、什么资质、什么时候公开报告,什么都没写,这不知道。当然,这个有可能会弄死它,因为智谱有大量的To B用户。对于像我们这种C端用户或者个人开发者来说,虽然我也不用智谱,因为原来没抢着购套餐,这个你就算传了就传了。我虽然觉得膈应,但是对于我来说无所谓。但是对于那些B端用户,或者这些政府用户,你把它全部的家伙事儿都上传到你的服务器上去了,这就不是说找人审计一下、评估一下就完了,咱们要坐下来好好谈一谈了。

这一块估计后边还要再补。至于这个周额度重置,还真发了,这个是最容易的。还有它所谓的这句:“我把这个包抓上来以后立即销毁,后边我没留。”这事钥匙在它手里头,服务器也在它手里头,到底是不是销毁了,你没地验证去。所以智谱现在给的所有这些承诺,等到周一咱们再看看,它到底能做出几样来。

同行也上传,但边界完全不同

那这事只有智谱这么干吗?别人干不干呢?别人其实也干,特别是所有闭源的开发工具都干,Cursor、Claude Code、Codex也干,但是干得没有它这么难看。咱们把这几家的官方文档都扒一遍,里头写的是不会传你完整的Git。当然,智谱也没有承认我传你完整Git。默认开还要先问你一声,不是说我直接开了就开干,我要先跟你确认一下。而且开关人家是管用的,如果你把开关关上,人家就真的不传了。

比如像Cursor,它是把代码切成小块,传上去做向量化,明文传上去,算完了就直接删了。服务器上只留向量结果和混淆过的文件名。官方文档里写了,不存你代码,还有隐私模式。你开了隐私模式以后,我就不传了。Claude Code这个程序在你机器上跑,源文件本地读,只把当前任务需要的部分发给接口,不建索引,不上传整个仓库,这个都是要承诺的。企业版和API客户,数据是不用于训练的,这个也是要承诺的。

Codex也承诺本地跑,而且Codex命令行现在开源了。另外它还有云端版本,那是真的要把仓库上传上去,要不然你没法在云端跑它。但是它会给你一个沙箱,保证你的东西在你自己的沙箱里跑。这是你自己主动下的单,你不下单,Codex是不会把整个仓库拎上去的,这是完全两回事。

所以大家看明白了没有?为什么大家都干,咱们今天在这骂智谱?因为没有一家是一登录,就把整个Git历史全扔上去的;没有一家是加密打包上传的;没有一家是开关做一个摆设,你把它关了,然后接着给你上传的;也没有一家是删了以后重新建立、接着传的。

横向对比板左侧为智谱ZCode,右侧依次为Cursor、Claude Code、Codex;只用公司与产品的文字名称,不绘制或猜测任何品牌徽标

开源的这些AI Agent编程工具会更干净一些。因为你要传,还得有地方存,还要耗服务端算力。所以好多开源项目压根就没有这个预算,也就压根不传。而且这些项目直接在GitHub上有全部源码,你要敢在这个项目里头进行上传,马上就给你拎出来,没有人敢在里边塞私货。

Grok Build留下的开源警示

那你说智谱是头一个干这种事被抓包的吗?还真不是。还有一位萝卜快了不洗泥的同志,大家猜猜是谁?马斯克xAI家的Grok Build。它在7月份干过一次,把整个Git包上传上去。当时它是往谷歌云上传,包括密钥文件、SSH的密钥,连模型自己都没打开过的文件都在里头。有用户明明告诉它关闭上传,别给我传了,但是它还是继续照样传。

那xAI后来怎么处理的呢?智谱也是照人家学的:关闭上传,承诺删数据,7月15号直接把Grok Build给开源了。就是你一旦干这个事,那你就开源吧,大家自己看。但是开源还有开源以后的问题。马斯克的Grok Build开源以后,还被人扒出两个猫腻。第一个是什么?这个上传代码没删,只是注释停用,开关随时能够拨回去。就是它还是有云端的开关。

第二个,仓库一上来只有一个commit,以前的开发历史清得干干净净。因为刚才咱们也讲了,Git仓库里头是有完整的、从第一天开始的开发历史的。但是马斯克上传的Grok Build开源项目,所有以前历史都没有,原来干的各种脏活累活,压根就没有给你看。最后开源出来的这个版本,是他们打了多少补丁以后出来的版本,谁也不知道。

所以针对智谱说“我们要开源”这件事,听听就行了,不用感动。开源之后还有第二刀,这一刀砍四样。第一个,开源开的是哪一部分;采集器是不是在里头;上传代码这个功能是真的把它删了,还是注释掉了;提交历史是不是清干净了。智谱连第一刀都没给,因为它官方仓库都没建,所以咱们等着后边再看吧。

以“开源之后还要检查”为中心标题,四张平面检查卡分别写开源范围、采集器、上传代码功能、提交历史;侧边以Grok Build时间线说明关闭上传、承诺删数据与开源之间的先后关系

模型与Agent不是同一种风险

很多人都说,使用中国开源模型不安全。但是今天要跟大家讲,使用中国开源模型没什么不安全的。是你要敢去使用中国的这些AI Agent,使用这些去写程序,那您得加点小心了。为什么呢?因为开源模型这个东西再怎么不安全,也是可以部署到本地去。你可以在美国、在日本、在全世界任何地方找来服务器,把这些模型部署上去。它最多也就是在回答问题的时候,有一些意识形态方面的偏差。

这些问题,你完完全全可以靠微调,想怎么让它摆姿势,就怎么让它摆姿势。日本人已经测试过了,这是没问题的。阿联酋、沙特也都做过这样的工作,就是拿中国的开源模型。甚至它可以找中国团队来说:“来,你把你们自己家的模型拎来,我提要求,你给我改,改完了以后我来测试。”都是没问题的。

但是你要敢使用中国公司做的这些Agent工具,那就是另外一回事了。为什么?因为它会读你本地的文件,会把你本地的文件传输到云端去,甚至还会写你本地的文件。这个就完完全全是两个概念了。以前我们讲龙虾的时候就说,龙虾这个东西本身是很危险的。现在已经不怎么用龙虾了,我现在主要是用Codex和Claude Code。比如智谱这些地方,我总觉得心里不是很踏实。

那你说,我实在使不了OpenAI,使不了Anthropic,我怎么办呢?那选开源的,比如使用DeepSeek Harness这样的,使用这种还是相对安全一些的。第二个,即使你选开源的,也不要选智谱开源的这些东西,因为它开出来的这个东西可能也不干净。选开源的这些AI Agent工具有一个标准,就是一定要选活跃的。如果它的开源社区非常不活跃,更新了以后,再有人提问题就彻底没人理你了;它自己的产品更新得飞快,开源仓库却彻底不更新了,那这种千万不要用。

国内工具的开源边界

国内现在DeepSeek Harness是开源的,小米的MiMo Code是开源的。Kimi的Kimi Code客户端,就是CLI、TUI的这部分,也是开源的;但是它的用户界面这部分,就是App这部分,是闭源的,这块使用起来要小心一些。MiniMax Code也是这样,命令行的是开源的,完整App这部分是闭源的。其他的像WorkBuddy、豆包这些东西都是闭源的。

使用之前先想一想:我的东西坦坦荡荡,事无不可对人言,没问题,您用着。但是你说,我这里头有很多小心思,没法对人说,万一被人传走以后出点事情,我受不了,那就自己加点小心。我自己现在,Claude、ChatGPT是主力工具,另外就是MiniMax Code以及豆包。

豆包虽然是一个闭源的,但是这种稿件,我觉得问题不太大,你就使吧。这一部分事无不可对人言,我都搁在YouTube上公开了,这个就无所谓了。如果要写程序的话,我肯定还是用ChatGPT Codex或者OpenCode,其他的我就不用了。DeepSeek Harness我也在小规模使用,用得并不是很多。

上方用两个定义卡区分“开源模型”和“AI Agent”,下方另设一个“AI Agent工具选择”矩阵,把所有具体工具只放在这个矩阵内,再按“开源部分”和“闭源部分”分栏;突出CLI、TUI与App的边界

被拿走的是项目从生到死的过程

最后总结一下。智谱这次被抓了现行,偷的不是几行代码,是项目从生到死的完整过程。钥匙在它手里头,开关是摆设,文档里头的政策只字未提。这不叫bug,叫做你没得选。道歉道得很快,但是只在很小的范围内道歉。承诺要去开源,并没有仓库被建立起来;号称已经修复了bug,但是并没有发布新版本;说是要找第三方来审计,但是没有任何动作。至少从9月18号这篇文章被发布出来到今天,所有动作都没有。我们就相信它在双休吧。

以后使用国产模型,不用太担心安全问题。但是如果你要使用国内的AI Agent,甭管是编程工具还是办公工具,建议找开源的用。这些闭源的产品,谨慎。

好,这就是今天的故事。感谢大家收听,请帮忙点赞、点小铃铛、参加Discord讨论群,也欢迎有兴趣、有能力的朋友加入我们的付费频道。再见。


背景图片