周五晚上,我从抽屉底层翻出那个旧铁盒。里面是些早该扔掉的东西:大学时某次答辩的评分单、一张早就失效的借书卡、还有几把说不清是哪个抽屉的钥匙,有把上面贴着一条泛黄的胶带,写着“自行车锁”。我早就没有自行车了,却一直没舍得扔这把钥匙。好像留着它,那条停在某栋楼下风吹日晒的车就还在等我回去骑一样。
那天下午,我在有道的群里看到有人讲他把 opencode 装进了一台专用 KVM 的虚拟机里,理由相当干脆:宿主机上有工资单、税单、合同,他不愿意让一个前沿模型和它跑在同一片用户空间里。他说的是“不愿意”,不是“不应该”,也不是“有风险”。这三个字让我在屏幕前停了一下。我们这行人谈安全的时候很少用“愿意”这个词,习惯的是攻击面、威胁模型、最小权限——一套理性的、跟个人偏好无关的词汇。可是话说回来,谁的第一步真正是从威胁模型开始的呢?多半都是心里堵了一下,觉得“这样不对劲”,然后才去找词把它说出来。
另一位跑 Incus 的人说得更淡,他把宿主机的项目文件夹共享给代理,说大不了让代理把仓库搞坏,反正能从备份恢复。这句“大不了”让我想起自己很多年前的一个习惯:写文章写到不放心的时候,会顺手复制一份存进另一个文件夹,文件夹起名“备份1”,再过一阵变成“备份2”“备份3最终版”“备份3最终版不要再改了”。其实那些草稿里从没出过什么值得挽救的句子,多数的下场是某次大扫除里连文件夹一起进了废纸篓。备份这动作真正安抚的不是文件的安全性,是当时坐在屏幕前那个人的心。它像个护身符,佩在腰上就敢往前走了。
还有个细节让我想了想:有人在 Zed 里发现 Claude 代理能列出他的 SSH 私钥文件。不是被读取,只是“能列出来”。搁在两天前我可能觉得这没什么,文件本来就在那里,工具看一眼又不算动了它。可那一瞬间他决定给 Claude Code 上容器,按项目挂载凭证和内存,一次只挂一个仓库。我懂那种感觉,私钥这东西有点像旧铁盒里那把自行车锁的钥匙,留着的时候不觉得它重要,真要有人拿起来看了一眼,心里那个分量立刻就变了——不是它实际有多了不起,是原来一直以为只有自己知道它在那里。
倒是有一位评论者的态度让我挺意外的。他说他的工作电脑里没有任何个人价值的数据,所以直接跑代理毫无顾虑。我想了想自己这台机器,散落着这么多年攒下来的截图、旧文档、半途而废的项目,还有数不清的版本迭代里留下的废弃注释。值钱吗?大概都不值钱。可“值不值钱”这件事,恐怕不是用兜里能掏出来多少钱来衡量的。有些东西对你而言的意义不在于它有市场价,而在于它跟你一起待过的年份。
有人拿 25 年前的 FreeBSD jail 和 chroot 来比现在的沙箱方案,说这么多年的进步也就那样。这个说法刺了一下我——倒不是想替现代容器辩护,只是想起在 FileVault 刚出来那阵子,同事问我加密硬盘是不是就彻底安全了,我当时说什么来着?“你真正要防的,恐怕是想读你 U 盘的人。”我说这话的时候挺笃定,好像安全是道能一劳永逸画完的线。现在当然知道了,线上永远有洞,今天补齐一个,明天长一个新的,修补这件事没有终点站。
MCP-box 的开发者写他那篇文章的理由,跟安全模型没多大关系。他说他意识到机器上每个 MCP 服务器都拥有跟用户同等的 ~/.ssh 访问权限,而安装输出从头到尾没提过这一句。这句“没人提过”比任何技术缺陷都让我留心。不是大家故意瞒着,是这件事太小了,小到没有人会把它写进说明文档里;小到大家都默认“哦,这本来就是这样”;小到等哪天反应过来,已经有十几个 agent 在你的钥匙串上挂了各自的钩子。就像旧铁盒里的钥匙,你一直都知道它们在,只是从来没想过它们能开什么锁。
这一行的安全,说到底其实是边界感的问题:你对来客的信任停在哪一层,你愿意让它看到抽屉里的哪一格,钥匙放在哪里。深夜独坐时,我偶尔会想,是不是自己也正在变成那个第一次用 chroot 的老程序员——以为圈起来就安心了,下一秒便有新的漏洞从哪个角落里探出头来。但那天晚上我没在想这个,只是把那把早就不配任何锁的钥匙放回铁盒,合上盖子,推回抽屉深处。窗外夜航的灯火还在,远远近近地亮着,跟多年前一样,看着让人安心。