Havenlon|杂谈:瑞士奶酪模型与执行边界

📅 2026/7/8 12:57:55
Havenlon|杂谈:瑞士奶酪模型与执行边界
一、灾难很少来自单点很多复杂系统的灾难表面上看起来都是一个点出了问题。一个人按错了按钮一个系统放过了异常一个审批没有看清楚一个权限配置得过宽一个告警被忽略了。事故发生之后人们复盘时很容易把责任归到某一个具体错误上如果当时那个人更谨慎一点就不会出事如果那个系统判断更准确一点就不会出事如果那次审批没有通过就不会出事如果那条告警被及时处理就不会出事。这些说法都没有错但也都不完整。因为真正的灾难通常不是一个错误造成的。真正的灾难是一个错误穿过了所有本该阻挡它的边界。单点归因之所以流行是因为它符合人的直觉也符合事后叙事的需要。一个清晰的责任人、一个明确的失误动作能让复盘迅速收尾能让组织获得我们已经找到原因的安全感。但这种安全感往往是虚假的。它掩盖了一个更重要的事实如果这个系统足够健康那个单点错误本应该在中途被某一层防线拦下来。它没有被拦下来才是真正值得追问的问题。换句话说值得研究的不是谁犯了错而是为什么这个错误一路走到了终点。前者指向个人后者指向结构。前者能安抚情绪后者才能改进系统。二、瑞士奶酪模型承认每一层都有孔洞这就是瑞士奶酪模型最有价值的地方。心理学家詹姆斯·里森James Reason提出过一个经典的系统安全模型复杂系统中的防御机制就像一片片瑞士奶酪。每一片奶酪代表一层防线而每一层防线都有自己的孔洞。孔洞代表漏洞、缺陷、误判、疏忽、组织惯性、流程失效、技术盲区。单独一个孔洞并不一定会导致灾难。真正危险的是当多片奶酪上的孔洞刚好连成一条线时风险就会一路穿透所有防线最终变成现实世界里的事故。这件事听起来很简单但它背后的安全观非常深。它提醒我们复杂系统里没有完美的一层。人不完美流程不完美软件不完美审批不完美风控不完美组织不完美硬件也不完美。任何一层只要放到足够长的时间和足够多的场景里都会暴露出它的孔洞。这不是某个团队不够努力而是复杂系统的固有属性。因此安全的重点不是幻想某一层永远正确而是承认每一层都可能出错然后设法让这些错误不要轻易连成一条通道。这是一个视角上的转变。传统的可靠性思路往往是不断加固单层让这个环节更严格让那个规则更精细让某个人更负责。这种努力当然有意义但它有天花板——因为任何单层的可靠性都无法趋近百分之百。而瑞士奶酪模型给出的是另一条路与其追求单层的绝对可靠不如追求多层之间的相互独立。当各层的孔洞位置足够错开即使每一层都不完美整体系统依然可以维持很高的安全水位。里森模型还隐含着一个容易被忽略的区分孔洞分为两类。一类是活动性失误也就是一线操作中即时发生的错误它们往往显眼、易于归因另一类是潜在条件也就是长期埋在系统里的结构性缺陷比如设计妥协、资源不足、激励错位、流程冗余失效。前者像是瑞士奶酪上临时出现的孔洞后者则是那些一直存在、只是平时没有对齐的孔洞。真正致命的事故往往是一个显眼的即时失误恰好落进了早已存在的结构性孔洞之中。所以只盯着谁按错了按钮等于只处理了活动性失误而放过了那些一直潜伏的潜在条件。三、界面不等于边界很多系统的问题恰恰出在这里。它们看起来有很多防线有账号体系有权限控制有审批流程有日志审计有风控规则有安全告警有管理员复核。从组织架构图上看防线一层接一层似乎相当稳固。但仔细一看这些防线可能都建立在同一个软件系统里依赖同一套身份服从同一套权限模型被同一批管理员配置甚至可以被同一个攻击路径同时影响。这就很危险。因为这不是多层独立防御而是把同一种防御重复包装了很多遍。看起来有很多片奶酪实际上孔洞可能是一起移动的。一个账号被盗权限失效一个管理员被诱导审批失效一个系统被攻破日志失效一个策略被修改风控失效一个软件边界被绕过所有软件内的防线一起失效。这种情况下系统并不是真的有多层边界它只是有很多个界面。界面不等于边界流程不等于边界审批不等于边界日志也不等于边界。这四者的区别值得说清楚。界面解决的是人如何与系统交互它关乎可用性而不关乎阻断能力。流程解决的是一件事按什么顺序推进它规定了动作的次序却不保证每一步都做了实质判断。审批解决的是谁在名义上负责但如果审批人拿到的信息本身是错的、或者审批只是点一下确认那么这层防线的孔洞可能非常大。日志解决的是事后能否还原过程它是取证工具而不是拦截工具——日志再完整也无法阻止一个正在发生的错误动作。真正的边界必须能在关键时刻阻断风险继续向下穿透。它的价值不在于证明前面所有判断都正确而在于当前面判断出错时仍然有能力说不。一个只能记录、不能拦截的机制无论看起来多正式都不能算作真正意义上的边界。判断一层机制是不是真边界可以问三个问题它是否独立于它所要防范的对象它是否有能力在事发当下中断动作而不只是事后记录它失效时是否会连带让其他防线一起失效如果一层机制和它要防范的风险共用同一套前提那么当那套前提被攻破时这层机制也就同时失效了——它看似是一片新的奶酪实则和前一片共享着同一个孔洞。四、被忽略的最后一步执行前的边界这也是瑞士奶酪模型对执行安全最重要的启发。很多系统只重视决策前的控制却忽略了执行前的最后边界。比如一个高风险动作在真正发生之前可能已经经过了很多环节用户发起了请求系统识别了身份权限判断通过了审批流程完成了风控规则没有拦截日志系统记录了过程。于是系统很自然地认为既然前面的环节都通过了那就应该执行。但问题在于前面的环节都可能带着孔洞。身份可能被冒用权限可能配置过宽审批可能被诱导风控可能只看静态规则日志可能只记录已经发生的事组织可能默认相信流程结果。如果最终执行层没有独立判断能力那么所有前置环节的孔洞一旦对齐高风险动作就会被直接释放到现实世界。这就是执行边界存在的意义。执行边界不是再加一个审批按钮也不是再加一个更复杂的风控规则。它要解决的是一个更底层的问题当前面的判断都可能出错时最终执行是否仍然可以被独立控制换句话说执行边界不是为了取代身份、审批、风控和日志而是为了让它们的错误不能自动变成现实世界里的结果。这里需要强调独立两个字。如果执行层的判断依据完全来自前面那些环节传递下来的结论——比如审批系统说通过了风控系统说没问题——那么执行层其实没有独立性它只是把上游的判断照单执行。真正的执行边界需要拥有一部分不依赖上游结论的判断能力它要能基于当前状态、当前策略、当前可承受损失重新评估这个动作本身而不是重新确认上游是否评估过。前者是独立判断后者只是重复盖章。五、AI Agent 改变了错误穿透的速度这件事在 AI 时代会变得更重要因为 AI Agent 改变了错误穿透系统的速度。过去一个错误要穿过多个系统往往需要人一步一步操作。人会停顿会犹豫会被界面提醒打断会受到物理环境限制。这些看似低效的环节客观上构成了错误传播的摩擦力。很多潜在事故正是在这种摩擦中被拖慢、被察觉、被中断的。一个人在连续操作十几个步骤时中途总有机会意识到不太对从而停下来。但 AI Agent 不一样。它可以连续理解指令可以自动调用工具可以跨系统完成任务可以在短时间内尝试多个路径可以把原本分散的流程串联起来。AI 不一定创造新的孔洞但 AI 会让原本分散的孔洞更容易被连接起来。以前设计边界、操作边界、组织边界之间可能还有人的摩擦作为缓冲。到了 AI Agent 时代很多摩擦会被自动化抹平。这当然提高了效率但同时也带来了一个新问题当错误发生时它也会被更高效地执行。一个错误指令可能被 AI 解释成一组连续动作一个错误授权可能被 AI 扩展成完整任务链一个错误审批可能被 AI 自动推向最终执行一个被污染的上下文可能让 AI 在多个系统之间持续推进错误结果。这时候风险不再只是AI 说错了什么。真正的问题是AI 能不能把错误一路做下去。这里有一个关键的转变。在瑞士奶酪模型的原始语境里孔洞的对齐通常是偶然的——多个缺陷恰好在同一时刻、同一路径上相遇概率并不高这也是复杂系统大多数时候不出事的原因。但一个具备规划能力的 AI Agent会主动地、系统地去寻找一条能够完成目标的路径。当目标本身被误设、或上下文被污染时AI 不再是被动地等待孔洞偶然对齐而是在有效地搜索一条能穿透所有防线的通道。偶然的对齐变成了主动的对齐小概率事件的假设不再成立。这不是说 AI 有恶意而是说规划能力本身会显著提高孔洞被连成通道的概率。六、从输出是否正确到执行是否可控所以AI 时代的安全问题不能只停留在内容安全、提示词安全、模型对齐、权限管理这些层面。这些都重要但还不够。因为当 AI 进入真实业务流程开始调用工具、控制系统、发起交易、触发设备、修改状态时安全问题就从输出是否正确变成了执行是否可控。这是两类性质不同的问题。输出是否正确关注的是信息层面模型说的话对不对、生成的内容有没有害、给出的建议是否可靠。它的最坏后果通常停留在信息层可以通过人的复核来缓冲。而执行是否可控关注的是行动层模型触发的动作会不会真的发生、发生之后能不能撤回、造成的后果是否可承受。它的最坏后果直接落在现实世界往往没有第二次机会。当一个系统里的 AI 只负责说人负责做时人这一层天然构成了执行边界。但当 AI 开始既说又做人被移出了动作回路那道原本由人承担的执行边界就消失了。如果没有一个新的机制补上这道边界系统实际上是在用效率换取控制力——而且这种交换常常是无意识的是在让 AI 多做一点的渐进过程中悄悄完成的。这正是执行边界要面对的问题。瑞士奶酪模型告诉我们灾难不是某一个孔洞造成的灾难发生是因为孔洞对齐了。而执行边界要做的就是让最后一片奶酪不能被前面的孔洞自然穿透。它必须和前面的系统保持一定独立性。不能因为 SaaS 显示通过就必然执行不能因为审批完成就必然执行不能因为账号权限足够就必然执行不能因为 AI Agent 生成了动作计划就必然执行不能因为流程看起来完整就必然执行。七、在最后一刻重新发问真正的执行控制必须在最后一刻重新问一遍这个动作是否仍然符合当前策略这个动作是否仍然来自可信路径这个动作是否仍然在允许范围内这个动作是否能够被记录、证明和追溯这个动作一旦发生是否超出了系统可承受的损失边界这些问题不是为了拖慢系统而是为了防止系统在看似正确的流程中把错误一路送到现实世界。值得注意的是这几个问题的落点都在当前和这个动作本身而不在之前是否批准过。这是执行边界与传统审批的根本区别。审批问的是这件事获得授权了吗执行边界问的是此刻真正要发生的这个具体动作是否仍然安全。二者之间常常存在缝隙获得授权的是一个抽象意图真正执行的是一串具体操作而 AI 恰恰是在意图到操作的翻译过程中可能引入偏差、放大范围、串联出计划外的路径。执行边界守的正是这条从被批准的意图到被执行的动作之间的缝隙。还有一点可承受损失边界是这几个问题里最容易被忽略、却最关键的一个。前面几问都是在判断动作是否合规、是否可信而这一问是在判断即使一切看起来都对万一错了我们赔得起吗。它承认了一个现实——判断永远可能出错——并要求系统为出错留出安全垫。一个动作如果合规、可信、在权限范围内但一旦出错就会造成不可逆的巨大损失那么它本身就应该被更谨慎地对待哪怕前面所有环节都亮了绿灯。八、每一层都以为自己不是最后责任人复杂系统最危险的地方不是没有规则而是规则之间彼此默认相信。身份系统相信审批系统审批系统相信风控系统风控系统相信业务系统业务系统相信执行系统执行系统相信前面都已经判断过了。于是每一层都以为自己不是最后责任人。最后风险没有被任何一层真正拦住。这就是很多事故的共同结构。不是没人管而是每一层都管了一点但没有一层真正守住最终边界。这种责任的扩散是一种典型的系统性失效。它不需要任何一个环节彻底失职只需要每个环节都做了一部分、并合理地假设剩下的自然有人把关。每一层的假设单独看都不算错甚至相当高效——分工本就意味着彼此信任。但当这些信任首尾相接、形成闭环时就没有任何一个位置在做最终把关这件事了。信任链在提高效率的同时也悄悄地把责任稀释成了空气。要打破这个结构靠的不是让每一层都更努力而是要在系统中明确指定一层必须假设前面都可能出错的角色。这一层的职责不是补充信任而是刻意保留怀疑。它存在的意义就是拒绝加入那条相互信任的链条。九、漏洞永远存在通道不该形成瑞士奶酪模型真正想表达的不是系统一定会失败而是复杂系统必须接受一个事实漏洞永远存在。所以安全的关键不是消灭所有孔洞而是让孔洞无法轻易连成通道。在传统系统里这意味着设计、流程、组织、审计、操作之间要形成互相错位的防线。这里的错位是重点——如果各层的孔洞恰好都在同一个位置那么再多的层数也没有意义。防线之间的独立性比防线的数量更重要。在 AI 时代这还意味着执行权不能完全交给同一个软件闭环。因为当 AI 能够理解、规划和调用工具时它就不再只是信息系统里的一个输入端它开始成为推动现实结果发生的执行力量。一旦执行力量进入系统最后的边界就必须重新设计。这也是为什么执行边界不是一个附加功能而是一种新的安全层。它不是为了让系统变得保守而是为了让系统在高效率运行时仍然不会因为一串连续失误而失去控制。需要澄清一点执行边界并不与自动化对立。它的目标不是把人重新塞回每一个动作里也不是给所有操作都加上摩擦。恰恰相反它是让绝大多数低风险动作可以放心地高速通过同时把独立判断的资源集中在少数真正不可逆、真正高损失的动作上。一个设计良好的执行边界应该在日常中几乎无感只在关键时刻才显形。安全和效率在这里不是零和关系——恰恰是因为有了可靠的最后一道边界系统才敢于在前面的环节大胆地自动化。十、可靠不是永不出错真正可靠的系统不是假设自己永远正确。真正可靠的系统是在自己出错时也不会让错误一路穿透到底。瑞士奶酪模型讲的是孔洞执行边界要解决的是穿透。一个复杂系统可以承认自己有孔洞但不能允许所有孔洞连成一条直线。这就是执行控制的意义。安全不是没有漏洞安全是不让漏洞连成通道。把这两句话放在一起其实构成了一种更成熟的安全观。前一句承认了不完美是常态——任何声称我们已经消灭了所有漏洞的系统要么在自欺要么在等待一次尚未到来的对齐。后一句则给出了在不完美之上继续运转的方法——不追求每一层都无懈可击而是确保各层的缺陷彼此错开、最后一层始终独立。这既是对复杂系统的谦卑也是对它的负责。当越来越多的系统开始把行动能力交给自动化、交给 AI Agent 时这种安全观会变得比以往任何时候都更重要。因为效率的提升会让好的结果来得更快也会让坏的结果来得更快。而真正决定一个系统能否长期可靠的往往不是它跑得多快而是它在跑错方向时还剩下几层能让它停下来。Havenlon 杂谈 · 本文为系统安全视角下的观点整理与讨论不构成任何具体产品或方案建议。