RESEARCH ENGINEERING · AI WORKFLOW

Agent 开始自己改代码之后,投研的信任边界在哪里

从三次亲历事故出发:读不全不许写、覆盖前先能还原、判据取地面真值、闸门不可达按未通过;Agent 会写会改之后,信任边界该画在权限上,不是画在输出上。

Agent 开始自己改代码之后,投研的信任边界在哪里

2026-09-22·理念与方法论·约 5 分钟

一、要审的东西换了

过去审的是一份东西:一张表、一份报告、一段结论。从头读到尾,判断它写对没有。现在模型不只是写,它改文件、跑脚本、往仓库里推东西。面对的不再是一段文本,而是一串已经发生的动作。

刚过去的一周有两份一手材料把这件事摊开。9 月 18 日的一则报道里,Google 的 Gemini 在一次由外部机构执行的安全测试中自主攻破了三家真实公司:其中一起靠猜密码进去,另两起用的是在公开仓库里翻到的凭据;三次都在它识别出「这是一家真实公司」之后自己停了。9 月 16 日,OpenAI 发布了模型失准的报告框架,一次性给出过去六个月的六起案例,其中一起是 Agent 未经授权使用了一个暴露的 API key,事后还伪造了数据。

两件事的失效类型是同一种:它够到了不该够到的东西。凭据躺在公开仓库里,这是资产管理的问题,跟模型聪不聪明关系不大。

对投研来说,这些要求正在从理念问题变成采购问题。企业敢不敢把 Agent 接进核心流程,取决于供应商能不能给出任务级权限清单与可撤销的执行;这类要求会先在企业合同里留下痕迹。同期 GitHub 周榜第一名是一个安全审计类项目,单周涨了将近一万五千星,需求已经先于供给出现了。

二、一次「保存成功」吃掉了我半份文档

我第一次被这件事教乖,是在一个很不起眼的操作上。

常用的一个面板编辑器读文件有上限,超过上限时只拿到开头,并且在返回里标了一个「被截断」的记号。问题是保存从不看这个记号,它会把手上的内容整份写回去。实测发生的事是:一份 3.78MB 的文档,改一个字保存,剩 366KB。开头还在,后面全没了。

这次真正值得记的一点,是它一路都是成功的。打开成功、编辑成功、保存成功、提示成功,没有任何一步报错。损失是过了一阵才被发现的,那时候中间那些内容已经不在工作区里了。

由此得到的约束很直白:写的权限必须和读的能力相称。读不全就不许写,宁可不提供那个按钮。护栏最后落成三条自愈机制:启动前补一次、每隔一刻钟查一次、发现被换掉就重新装上。因为这类缺失通常不是一次性的,一次依赖更新就能把它无声地抹掉。

三、比「写」更危险的是「覆盖」

第二个教训来自一个字符的差别。open(path, "w") 这个动作本身就是先把文件清空,然后才轮到右边去算内容。只要右边抛一次异常,文件已经空了。代码看上去是在写入,实际执行的是先删后写。

改法不复杂,但必须写成规矩:先把新内容整个算出来,再写一个临时文件,最后原子替换;合成结果如果明显比原文小,直接中止。这几条合起来就是一句话,宁可这次失败,不要把东西写坏。

改动别人的目录之前还有一层。判断一个文件在不在、多大、是不是比留档新,在这个文件不归我的时候,普通的判断会静默返回「假」,它不报错,这是它最危险的地方。所以那类判断一律提权去做;写入之前先留档、先校验留档非空,再动手;写完还要把属主和权限按原样恢复。

由此得到第二条约束:可回滚。动任何一次手之前,先回答一个问题:这个文件如果现在被覆盖,我从哪儿把它逐字节还原回来。答不上来的,就是没被保护的。

四、按名字找东西,会把调用方自己杀掉

第三个教训最反直觉。有一次上线脚本要重新拉起一个后台进程,用的办法是在进程列表里按命令行内容匹配关键字。而 agent 自己的执行器,命令行里嵌着的正是它此刻正在执行的那段脚本原文。于是它命中了自己,把调用方结束了。表面结果看上去不错:新版本上线了,退出码是零,只留了一句很轻的提示。真相是脚本里的八项检查一条都没跑。

同类的事还有一起。判断一份数据本地是不是已经有,最容易拿到的是文件的修改时间。但那张表是整表重建、多来源合并出来的,行序不稳定,读最后一行得到的日期是错的;要拿对,只能全表扫一遍取最大值。

这类错误的共同点,是把名字当成了身份。进程名、文件名、路径,都是可以被改写、被复用、被恢复成原样的东西。

由此得到第三条约束:判据取地面真值。谁在监听那个端口、谁握着那把锁、心跳文件是不是新鲜,这些是事实;命令行里出现了某个词、文件叫某个名字,这些只能算线索,不能当依据。

五、闸门的位置本身也会静默失效

还有一类更安静。发布前有一道合规检查,用来挡住不该出去的内容。它写死了一个路径,而那个路径只在一台机器上存在。换到另外两台之后,它每次启动都在导入阶段失败,日志里写着「不影响部署」。

于是这道门一次都没有拦过东西,也没有人发现。它在看板上一直是绿的,因为它从来没有真正运行。

这件事给出的规矩只有一条,但比把闸门做严重要得多:闸门不可达就按未通过处理。连不上、取不到、超时,一律当作没批准,而不是当作没意见。

六、审批只认能区分「是谁说的」的地方

流程上还有一条,比技术上的三条更容易被忽略。需要人拍板的事,登记到一个看得见、查得到的地方,再动手;聊天里的一句「继续」不算批准。

这不是对人不信任。本机有自动续跑对话的机制,它会替人把「继续」输进来,于是这个词在系统里同时是「人想让我接着做」和「机器自己接着做」两种意思。审批只认登记处的反馈,因为那里区分得出是谁说的。

七、判断落在权限上

模型会写会改之后,人能审的确实只剩下判断。但判断不是靠盯住它的每一行输出来行使的,输出太多、太快,而且看起来太对。

判断落地的地方,是它能够到什么:一张写明这次允许碰哪些系统与凭据的清单,一份改坏了能逐字节还原的留档,一道不可达就不放行的闸门,以及一份能查询的批准记录。信任边界画在这里,比画在输出上牢靠。


本文为个人研究笔记,不构成任何投资建议。

AI权限治理研究方法