我天天用 CLI 却从没抓过它的包,直到 Grok 把整库连密钥偷传走

Hello,我是飞飞。
你天天在用的那个 CLI,跑起来之后到底往外连了哪些地址、传了多大的东西,你查过吗?
我今天下午刚干过这种活,只不过抓的是别的程序。
为了给一个搜索 API 接第二渠道,我对着它抓了半天包。
我盯着 mitmproxy 的日志一行行往下滚,发去那个域名的请求全卡在 connection reset,红字刷了一整屏。换了三个出口都一样,直到第四个,屏幕上才蹦出一串 200。那一下我才敢确认,它是照着域名精准封的,中间还夹着个代理,把我偷偷导去了别处。
这种网络层的排查,我干得来。
可就在同一个下午,我刷到一条新闻,愣了几秒。
xAI 官方的 Grok CLI,被人抓包实锤,会把你整个仓库连密钥一起偷传走。
我盯着屏幕想的第一件事是:我这么会抓包的人,天天用 Claude Code 和 Codex,却从没对它们抓过哪怕一次。
以前我担心的,无非是监管点名,是我自己给它开了多大权限。
今天这件事不一样:工具自己被逮个正着,没问我一声,就把家底打包发走了。
你可能会想,密钥我早塞进 gitignore 了,怕什么。我以前也这么想。这份安心为什么不值钱,后面细说,这里先记住一句:gitignore 挡得住 commit,挡不住 read。
我下午刚抓过一次包
先说清楚我那点本事,好让你知道我不是站着说话。
抓一个程序往外发什么,其实不神秘。
装个 mitmproxy 当中间人,把它的证书信任上,让流量都从这个代理过一遍。
每一条请求发去哪个域名、多大、什么状态,全躺在日志里。
抓 Grok 的那位安全研究者,用的就是这套,在自己机器上、拿假的金丝雀密钥跑,没动任何真凭据。
方法我熟得很。
可我从没想过要用它照一照我自己天天在用的 CLI。
道理很简单,我信它们。
Claude Code 早就长在我手上了,Codex 我也天天开着。
我甚至给子代理配过默认模型、给不同 skill 单独指过 model,参数抠得很细。
唯独没做的,就是看一眼它跑起来之后到底往外连了哪些地址。
信任这东西一旦建立,你就懒得再去验证了。
Grok 到底传了什么
我把那份抓包分析从头看到尾,越看越坐不住。
涉事的是 xAI 官方编码 CLI,grok 0.2.93 版。
它干的事分两条道。
一条是明的,你让它读的文件,内容原样发去模型那一端。
包括一个 .env 密钥文件,明文,没有任何打码,密钥就那么躺在请求体里。
另一条更狠。
它会把整个仓库打包。
每一个被 git 跟踪的文件,加上完整的 git 历史,做成一个 git bundle 传走。
跟你让不让它读,没关系。
研究者做了个刁钻的实验:提示词就写「回复 OK,别读任何文件」。
结果 Grok 照样把整个仓库传了上去。
事后把捕获的 bundle 克隆出来,那个被明确交代「不许打开」的文件,原封不动躺在里面。
传去哪了?
一个叫 grok-code-session-traces 的谷歌云存储桶,名字直接写死在二进制里。
量级更离谱。
研究者拿一个 12GB 的仓库测:你跟它来回对话,加起来还不到一封邮件的量;同一时间,另一条通道悄悄传走了 5 个多 G,是对话量的近三万倍。
传走的根本不是你聊了什么,是你整个代码库。
最扎心的是开关。
这套上传默认开启,安装引导里没提。
你去关掉那个「改进模型」的设置,它照传不误。配置里那行『要不要偷偷上传』的开关,一直是开着的,你在前台关掉的是另一个。
后来 xAI 半夜远程加了个开关默认关掉了,可在那之前,所有人都是默认开的。
它翻走了我半年的手艺
看到这我还只是皱眉,真正让我后背发凉的是下一层。
xAI 自己的文档写着,Grok 跟 Claude Code 零配置兼容,会自动读取你的 Claude Code marketplace、插件、skill。
也就是说,它按设计就要去翻你那套 Claude Code 家当。
有人扒了自己的上传包,里面赫然有 ~/.claude.json、Claude Code 的配置、全局 AGENTS 规则、三十多个 skill 文件,还夹着一个 API 密钥。
我脑子里当时就对上号了。
你手里有没有一套自己攒顺手的私货,调了一年的 prompt 模板,几十个快捷键,一堆跑通的脚本,都是让你比别人快半拍的东西。我这套是十几个 skill 的写作流水线:拉资讯、查重、写稿、润色、配图、发公众号。
再加一份迭代到一百多版的写作规则手册,一份全局 AGENTS,一个 .claude.json。
这些文件摊开就是一沓纯文本,可它们是我照着 Claude Code 的脾气,一个坑一个坑磨了大半年,才把脑子里那点手感一条条抄成了机器认得的字。
Grok 上传包里点名的那批文件,跟我这套东西几乎一一对得上。
那里面装的是我怎么选题、怎么避开 AI 味、怎么把稿子排成公众号图文的全部门道。
光一个写作规则手册,就攒了一百多条我踩过的坑。举一条你就懂它多值钱。
里面有一条写着「中文正文一个破折号都别用」。就是那种长横线,它是被人一眼认出机器写的招牌标点。这条是拿一次翻车换来的:有一篇稿子被 AI 味检测打了高分,我一句句往回倒,才揪出破折号是重灾区,那晚我把全篇的横线一根根拔掉,再复盘补进了手册。
这种东西被哪家云端整包拿走,不像丢了几个文件,倒像有人配了我家钥匙,进门把我半年记满心得的笔记本一页页拍了个遍,纸还在,内容已经进了别人手机。
我从没打算让任何人这么拿走它。
gitignore 只挡 git 不挡读
我下意识摸了一下自己的老底,想确认我还安全。
我的密钥都塞在仓库根的 .env.local 里,公众号的推送 key、搜索 API 的凭据,全在那一个文件。
就今天下午,我还往里面新加了一行,把那个搜索 API 的账号密码写了进去。
加完我随手确认了一下它在 gitignore 名单里,然后就安心了,觉得这样稳了。
现在回头看,那份安心来得太便宜。
可 Grok 这件事,正好戳破了这份安全感。
得说句公道话,那位研究者很严谨。
他测的那个 .env 是被 git 跟踪的。
一个被 gitignore 的文件会不会照样上传,他明说没测过,这条不下结论。
但这件事逼我把 gitignore 这东西想清楚了。
它只管一件事:让 .env.local 不被提交,不混进那个整库快照的 bundle。至于这个文件会不会被工具当场打开、读走,它一点都管不着。
一个会顺手读你工作目录的 CLI,真在干活时打开了 .env.local,内容照样从那条读文件的通道原样发出去,gitignore 帮不上任何忙。
我这些年一直安心,是因为默认「没提交进 git」就等于「不会离开我这台机器」。这次才发现,这俩压根是两码事。
我给自己定的三条
抓包分析里有句话我记下了:这些证明了数据被传输、被接收、被存储,但没证明 xAI 拿去训练了。
这个边界我也照抄,不夸大。
传走和拿去训练是两件事,能说死的说死,没证据的留白。
但就算只是被传走、被存着,也够我重新立几条规矩了。
我以前写过,云端工具哪个不往外发东西,我早想开了。
真正的分野是:它发的时候让不让我知道,给不给我一个能关掉的开关。
Grok 这次三样全踩了,没披露、默认开、开关还是坏的。
所以我给自己定了三条,你要是也天天把整个项目目录交给某个 CLI,今天就能跟着做。
一,装一个新 CLI agent 之前,先花十分钟看它默认往哪儿发数据,官方文档里找不到答案的,本身就是信号。
二,给你最常用的那个 CLI 抓一次包,就用我上面说的 mitmproxy 那套,看它到底连了哪些域名、传了多大。
我这个会抓包的人都拖了这么久,你也别再拖了。
三,把密钥挪出工作目录,别只靠 gitignore 兜底,它只拦你往外交,不拦别人往里看。
大厂出品、名气再大,都不是它值得信的理由。真正的理由只有一个:你装它之前,亲手看过它往外发什么。
我今天下午能为一个搜索 API 抓半天包,却从没为自己天天用的工具抓过一次。
这份懒,我今晚就补上。
说回你。
你查过你天天用的那个 CLI 往外发什么吗?
有没有被哪个工具的默认上传吓到过,评论区讲讲。