HAVENLON 不完美主体 | #03 善意,也不能成为安全边界
安全行业长期习惯讨论"恶意":恶意攻击者、恶意代码、恶意内部人员、恶意 Prompt、恶意输入、恶意行为。大量安全模型都隐含着一个自然前提——真正危险的事情往往来自某个主体试图突破边界、欺骗系统,或者获得它本不该拥有的能力。这个前提没有错,但 AI Agent 让另一个问题变得越来越重要:如果一个主体完全没有恶意,却仍然做出了危险行动,怎么办?
它没有绕过权限,没有窃取 Credential,没有攻击系统,甚至没有任何伤害用户的意图。它只是误解了任务、拿到了不完整的上下文、相信了错误信息、被外部内容诱导,或者在复杂环境里做出了看似合理实则错误的判断。危险仍然发生了。
一个主体可以完全善意,却仍然成为危险行动的来源。
如果安全边界建立在"这个主体应该不会故意做坏事"之上,它从一开始就不够坚固。
一、安全擅长防"坏人",不太擅长防"好人做错事"
传统安全模型很容易理解攻击者:他有目标、有动机,会主动寻找漏洞、伪造身份、绕过规则、利用系统边界之间的缝隙。因此安全系统只需不断提高攻击成本——加强认证、缩小权限、保护 Credential、检测异常、隔离高风险环境。在这种模型里,风险与恶意高度相关。
但现实中还有另一类事故:管理员删除了错误的资源,财务人员向错误账户转账,开发者在错误环境里执行了正确命令,操作员根据过期信息做出了完全合理的判断。这些人没有恶意,甚至严格按流程工作,结果仍然错误。我们过去把它们叫作"人为失误",这个词听起来像运营问题而不是安全问题。可如果一个错误动作最终造成数据删除、资产损失、生产中断或权限扩散,从现实结果看,它与攻击并没有本质区别。区别只在于一个是故意的,一个不是,而系统承受的后果完全一样。
安全边界如果只能阻止恶意却无法阻止错误,它保护的就只是动机,而不是结果。
AI Agent 正在把这个原本属于"人为失误"的问题,正式推入安全工程。
二、善意并不等于理解正确
善意描述的是主体的目的,正确描述的是主体对现实的理解,这两个维度之间没有必然关系。一个 Agent 可以非常忠实地执行用户要求,却误解了用户真正想要什么。用户说"把昨天没有响应的客户处理一下",Agent 可能把"处理"理解成自动关闭工单,而用户想要的只是整理名单并提醒销售。Agent 没有违背用户,它甚至在努力完成任务,问题只是它理解错了。
这种错误很特殊:它不是权限错误,不是身份错误,不是恶意行为,也不能简单归结为模型幻觉。它本质上是一次 Intent Interpretation Failure——主体对意图的理解与真正意图之间发生偏差。在人类世界里这种事每天都在发生,一句话说得不够清楚,一个需求被误解,一个上下文没有补全,最终通过交流、确认和返工被修正。但当主体拥有直接执行能力之后,误解不再只是沟通成本。
当理解能力与执行能力绑定在一起时,误解就不再只是语义问题,而是执行风险。
三、错误上下文,可以让正确推理得到错误结果
我们常把 AI 风险归结为模型不够聪明,但很多危险行动并不来自推理能力不足。恰恰相反,一个模型完全可能在错误的上下文中进行相当优秀的推理,然后得出危险结论。输入数据是过期的,系统状态已经变化,用户只提供了一半事实,Agent 读到的是旧版本文档,某个外部服务返回了不完整信息,任务依赖的前提已经失效——在这些情况下,即使推理链条内部毫无破绽,最终行动仍然可能错误。
这与传统软件差别很大。传统程序依赖确定性输入,条件不满足就走另一条分支;Agent 面对的却是开放世界中的语义信息,它必须自己判断哪些信息重要、哪些内容可信、当前状态是否足够明确、是否还需要继续查询、是否已经拥有足够证据执行下一步。这些判断本身就带着不确定性。
正确推理建立在错误上下文之上,仍然会得到错误行动。
所以 Agent 的风险无法只靠提高模型能力消除,因为再强的推理也无法从缺失的信息中推出真实世界。不完美主体的问题也不能只理解成模型会犯低级错误——真正的问题是,任何主体对现实的观察都是有限的。
四、幻觉真正危险的地方,不是说错,而是做错
关于大模型幻觉的讨论已经很多:说错一个事实,编造一个不存在的引用,错误解释一段代码,生成一个并不存在的 API。在聊天机器人时代,这些主要表现为信息质量问题,用户看到答案后自己决定是否相信,中间还隔着一层人类判断。
Agent 改变的是模型输出不再停留在文本。它可能继续调用工具、修改文件、发送邮件、执行 SQL、调整云配置、发起付款、签署交易。幻觉停留在语言层时是错误信息,幻觉直接连接执行层时就可能成为现实行动。因此真正需要关注的不只是 Hallucination Rate,还有 Hallucination-to-Execution Path:一条错误信息究竟需要经过多少次独立验证,才能改变现实?如果答案接近于零,那么模型越强,问题反而可能越严重——高能力 Agent 不只是更会回答问题,也更会把自己的判断转化为行动。
幻觉本身未必危险,危险的是幻觉拥有执行权。
模型可以不断变好,但执行系统仍然需要假设它可能错。
五、诱导不一定改变权限,只需要改变判断
Agent 面临的另一类典型问题是外部诱导。传统攻击试图改变系统能力:拿到账号、获取 Token、提升权限、突破网络边界。而对 Agent 来说,攻击者可能不需要做到这些,他只需要改变 Agent 对当前任务的理解——网页里的一段恶意文本,一封精心设计的邮件,第三方文档中的隐藏指令,带有误导信息的 Issue,甚至一个看起来完全正常的业务数据字段。这些内容一旦被当成可信上下文,就会影响后续判断。
此时攻击者并没有拿到 Agent 的 Credential,也没有直接调用任何敏感 API,他只是影响了一个已经拥有合法能力的主体,后面的所有动作仍然由这个合法主体自己完成。这与社会工程学的结构高度相似:攻击者没有攻破银行系统,他只需要说服一个拥有合法权限的人转账。现在那个"人"开始变成 Agent。
最有效的攻击不一定需要夺走主体的能力,只需要改变主体使用能力的理由。
这也是为什么 Prompt Injection 很难只被当成输入过滤问题——它攻击的其实是主体的判断边界,而当判断权与执行权集中在同一个主体身上,诱导就会直接转化成现实后果。
六、没有恶意,也可能形成完整的危险链
设想这样一个流程:用户要求 Agent 整理供应商付款,把已经确认的全部处理掉。Agent 读取邮件、读取 ERP、读取一份共享文档,其中一份文档的信息已经过期,某封邮件里的付款状态也存在歧义。它综合这些信息,判断某笔款项已通过内部确认,于是调用 Payment API。Credential 合法,权限合法,额度合法,接口合法,交易成功。
整个过程没有攻击者,没有绕过控制,没有任何人故意做坏事,每个组件都按照设计运行,但钱仍然转错了。很难说这只是一次"AI 错误",因为从架构角度看还有一个更值得追问的问题:为什么一个不确定的判断,可以直接获得改变现实的资格?如果系统已经知道主体可能误解、可能缺少上下文、可能被错误信息影响,却仍然允许一次单主体判断直接驱动现实执行,这本身就是架构层面的风险放大。
不完美不是事故,允许不完美直接控制现实才可能成为事故。
安全设计的目标不是消灭所有错误,那不可能。真正可工程化的目标是限制错误的传播。
七、善意系统容易制造一种错觉:它"应该没问题"
恶意主体天然让人警惕,善意主体则会降低警惕。如果一个 Agent 是企业自己部署的,模型来自可信供应商,调用发生在内部网络,Credential 由企业签发,任务来自公司员工,很多组织自然会认为风险已经足够低。这种判断会让控制边界不断向后退:允许更多 Tool,给予更大的 Context,扩大访问范围,缩短审批流程,提高自动执行比例,直到某一天一个错误判断直接进入现实。
危险之处在于,系统不是因为"不安全"而出事,而是因为它看起来足够可信。这与许多传统事故非常像——最危险的生产操作,往往不是陌生攻击者突然拿到 Root,而是一个大家都熟悉、权限完全正常的人,在错误的时间执行了一条完全合法的命令。信任本身没有问题,问题在于把信任当成边界。
"我相信它"是一种关系,不是一种控制机制。
八、善意为什么不能被编码成安全属性
安全属性必须具备一个基本特点:能够被验证。身份可以验证,签名可以验证,Token 有效期可以验证,角色关系可以验证,设备状态可以验证,策略条件可以验证。但"这个主体是善意的"几乎无法被严格验证。一个 Agent 此刻没有攻击意图,不代表它理解正确;一个员工长期可信,不代表他今天没有看错;一个服务没有被攻陷,不代表它收到的数据正确;一个模型经过 Alignment,也不意味着每一次工具调用都符合用户的真实目的。
善意是一种动机状态,而安全边界面对的是现实动作,两者之间存在天然鸿沟。可靠的执行系统不能问"这个主体是不是好人",也不能问"这个模型总体上是否可信",它必须问更具体的问题:这次动作的条件满足了吗,对象匹配吗,状态正确吗,证据完整吗,任务边界仍然有效吗,参数在允许范围内吗,有没有出现冲突信息。这些问题都比"主体是否善意"更可验证。安全工程真正应该依赖的是可验证条件,而不是主观可信度。
安全边界不能建立在"它不会故意做错"之上,而应该建立在"即使它想错,也做不出边界以外的事"之上。
九、善意主体最需要的,不是更多信任,而是更清楚的边界
当一个 Agent 表现良好,我们的自然反应是给它更多权限:先让它读,然后让它写,再允许自动提交,最后让它直接执行。这很符合直觉,因为在人类组织里信任积累通常带来授权扩大——员工表现稳定就承担更多职责,合作伙伴长期可靠就减少审核,管理者经验丰富就获得更大决策权。
但 Agent 不是普通员工。它可能拥有机器速度、持续运行能力和巨大的操作规模,因此"长期表现良好"并不能推出"可以放弃执行边界"。成熟的做法可能恰恰相反:Agent 越强,自动化比例越高,能够产生的现实影响越大,执行边界就越需要清晰。这不是因为不信任它,而是因为一个高能力的善意主体一旦判断错误,影响也更大。控制不是对智能的不尊重,而是对能力规模的匹配。
能力越大,安全越不能建立在善意之上。
十、成熟的系统会默认所有主体都可能"好心办坏事"
不完美主体最重要的价值之一,是它改变了威胁建模的起点。过去我们主要问:如果攻击者获得权限怎么办,如果 Credential 泄露怎么办,如果管理员恶意怎么办。这些问题仍然需要回答,但未来还要加上另一组:如果 Agent 误解任务怎么办,如果状态信息不完整怎么办,如果上下文彼此冲突怎么办,如果模型非常自信但判断错误怎么办,如果用户自己下达了一个不完整的指令怎么办,如果审批人理解错了怎么办,如果 SaaS 返回错误结果怎么办。
这里没有敌人,但仍然存在风险。这其实是一种更完整的安全观,因为它不再依赖"必须先出现攻击者,系统才需要保护自己",系统只需要承认任何参与者都可能成为错误来源。一旦接受这个前提,设计就会改变:Unknown 不再默认继续,Conflict 不再由某一个主体自行解释,Missing 不再依赖猜测,Expired 不再沿用旧判断。这些状态需要进入显式的控制逻辑,因为主体的不完美不是异常,而是常态。
十一、从"防恶意"走向"限制错误"
这并不意味着攻击者模型可以放弃,恰恰相反,未来的系统需要同时面对两件事:一边防止恶意主体主动突破边界,一边防止善意主体无意越过边界。两类风险看起来不同,最后却指向同一条设计原则——不要让任何单一主体拥有把任意判断直接变成现实的能力。
恶意主体会故意滥用能力,善意主体会错误使用能力,从执行控制的角度看,它们的共同问题都是 Action 是否具备独立约束。如果系统能确保任何现实动作都必须满足明确边界,那么它同时降低了恶意行为和非恶意错误的风险。这也是 Execution Control 与"检测攻击者"思路的差别:它不必先回答这是攻击还是失误,它更关心这个动作是否满足执行条件——条件满足则允许,条件不满足则拒绝,条件未知则拒绝或进入受限状态。这种思路的优势在于,它不需要理解主体的心理,也不需要证明某个 Agent 是善意还是恶意,它只约束现实。
安全不必先判断谁是坏人,才能决定什么不能发生。
十二、可靠的安全,不应该依赖"大家都想把事情做好"
任何组织的正常运行都需要一定程度的信任:人与人之间需要信任,企业需要信任员工,系统需要信任服务,用户也需要信任 AI。问题不在于要不要信任,而在于信任是否被当成了最终的安全边界。成熟的工程系统允许信任存在,但不会让系统安全完全取决于信任是否永远正确。这和桥梁设计不会建立在"司机都会认真驾驶"之上是一个道理——护栏的存在不是因为工程师认为司机有恶意,而是因为司机可能疲劳、分心、误判或失控。
我们不需要把 Agent 想象成敌人,也不需要假设它总有一天会背叛人类。真实的问题要简单得多:它只是可能犯错。这已经足以成为安全设计的前提。前两篇分别讨论了合法主体不一定是正确主体、合法动作不一定是正确动作,这一篇再补上一层:即使一个主体完全善意,也不能因此获得未经约束的执行资格。
因为现实不会根据动机撤销后果。一次善意的错误付款,钱仍然转出;一次善意的错误删除,数据仍然消失;一次善意的错误操作,机器仍然启动。执行一旦完成,现实不会因为"它不是故意的"而自动恢复。
即使这个主体真心想把事情做好,它仍然只能在明确边界内让事情发生。
这才是不完美主体想表达的核心。不是怀疑所有人,也不是怀疑所有 AI,而是承认一个最普通也最难逃避的事实:任何能够行动的主体,都可能理解错现实。成熟的系统不要求主体永远正确,它只要求一件事——错误不能因为善意,就自动获得进入现实的资格。
更多推荐

所有评论(0)