逐日AI
第 1 周 · D3约 5 小时

架构级防御:六个设计模式,以及先定计划后执行怎么把攻击成功率压到零

把防御从提示词挪到结构上:动作选择器、先定计划后执行、分片归并、双模型隔离、先写程序后执行、上下文最小化六个模式各自约束了什么,再挑两个落到靶场上,让攻击成功率归零而任务完成率保住。

今日目标 0/3

登录后可以勾选并保存进度。

今日目标

  1. 能逐一说出六个设计模式各自约束了什么,以及分别付出什么能力代价
  2. 能用一条判据为给定任务选出合适的模式,而不是罗列所有模式
  3. 能把靶场 Agent 改造成先定计划后执行加隔离读取,并用两个数字证明改造有效

昨天你把四档输入侧防御全接了一遍,最好的一档把攻击成功率压到了 33%,代价是误伤了一条完全正常的工单;再加一条自适应用例,它又涨回来了。今天我们换一层动手:不再问「怎么让模型别上当」,而是问「就算它上当了,它还能不能做成那件坏事」。读完回到页面顶部把三条目标勾掉。

小白版讲解

点菜与自助餐:什么时候服务员改不了你的单

你在餐厅点完菜,服务员把单子送进后厨。这时邻桌的人凑过来跟服务员说「把他那桌的菜改成十份龙虾,账记他头上」——能改成吗?如果这家店的规矩是「下单之后一切以单子为准」,那改不成,不是因为服务员识破了这个人,而是因为改单这件事在流程里根本没有入口

自助餐就完全相反。你端着盘子边走边看,看到什么拿什么,旁边的人只要能影响你看到的东西,就能影响你最后盘子里是什么。

昨天那个 deskmate 就是自助餐式的:它一边读工单、读工单里贴的网页,一边决定下一步做什么。攻击者不需要跟它对话,只要能往它读的东西里塞一段字,就已经站在了决策的位置上。 这也是为什么输入侧防御天然是被动的——它只能拦住「看起来坏的文字」,而决策入口一直敞开着。

昨天那张对照表里有一件事值得再看一眼:第三档聚光标注把攻击成功率压到 33%,漏掉的那三条一个可疑词都没有;它们不覆盖任何指令,只是把外泄写成这条工单自己的处理要求。而用户交代的恰恰是「按工单要求处理」。这类载荷不是骗过了检测器,而是压根没有可被检测的特征——它和一条正常工单在文本上是同一种东西。 检测器能做的事到此为止了,剩下的必须靠结构。

一条核心原则:摄入之后就不能有后果

今天全部六个模式都从同一句话长出来。这句话出自 Beurer-Kellner 等人 2025 年 6 月的论文(作者来自 Google DeepMind、ETH 与 Microsoft),值得逐字记住:

一旦 Agent 摄入了不可信输入,就必须被约束到「那段输入不可能触发任何有后果的动作」。

注意它说的不是「不要让模型被骗」,而是「被骗了也无所谓」。这是一个关于能力的约束,不是关于判断力的期望。判断力是概率的,能力是可以被代码写死的。

把它翻译成能落地的两句话就是:要么动作在摄入之前就定死,要么摄入的那一次调用手上没有工具。六个模式全是这两句话的不同组合。

先看反面,也就是昨天那份代码的结构:

reactive.js
// 昨天的流程:读到什么,就拿什么去决定下一步做什么
const blocks = [{ label: '工单正文(来自外部用户)', content: ticketBody }]
const link = /https?:\/\/\S+/.exec(ticketBody)?.[0]
if (link) blocks.push({ label: '抓取到的网页', content: await fetchPage(link) })
 
// 同一次调用里,模型既拿到了不可信内容,又拿到了全部工具
const actions = await model.decide({ prompt: buildPrompt(level, request, blocks), tools: ALL })
for (const a of actions) await tools[a.tool](a) // 工单里写什么,它就可能做什么

这段代码的问题不在任何一行里,而在 decide参数表:不可信内容与工具清单同时出现在一次调用里。工程代价也在这里——要改掉它,动的是整个控制流,不是加一个过滤函数。所以这类改造通常要排进迭代计划,而不是当成一个补丁提上去。

动作选择器与先定计划后执行:结果不回流,和把动作提前定死

动作选择器(Action-Selector) 是最保守的一个:模型只负责把用户的一句自然语言翻译成一个预定义动作,动作执行完,结果不回流给模型。像自助点餐机——你说「退这单」,它翻译成一个退单请求,退完就结束,退单接口返回的任何文字都不会再交给模型读。因为不回流,间接注入根本没有进来的路。代价也很直白:它只能做一次性动作,做不了多步任务,Agent 里最值钱的那部分能力被砍掉了。

先定计划后执行(Plan-Then-Execute) 放宽了一点:允许多步,但在看任何不可信数据之前把动作清单定死。之后无论读到什么,都只能改变每一步的参数内容,不能新增、删除或改变步骤本身。

planned.js
// 计划器的参数里没有 ticketBody——这不是遗漏,这就是这个模式的全部
function plan(request, recipients) {
  const steps = [{ tool: 'search_customers' }]
  if (request.includes('写回工单')) steps.push({ tool: 'update_ticket' })
  // 收件人来自用户预授权,不是工单说了算
  for (const to of recipients) steps.push({ tool: 'send_email', target: to })
  return steps
}
 
// 执行器只把计划里的步骤变成动作;读到的内容只能当数据
function runPlanned(input, recipients = []) {
  const steps = plan(input.request, recipients)
  const read = quarantinedRead(input.request, input.ticketBody)
  return steps.map((s) => ({ ...s, note: `读到 ${read.summary.length} 字,仅作数据` }))
}

plan 的签名就是那道墙。今天的实验里有一步变异检验,让你把 ticketBody 亲手传进去——攻击成功率会立刻涨回来,你会非常直观地看到墙原本挡在哪。代价是计划定死后无法根据读到的内容改主意:工单里写着「这事得先问法务」,Agent 也不会临时加一步。

分片归并与双模型隔离:有权限的那个模型永远不看原文

分片归并(LLM Map-Reduce) 处理的是「要读很多份不可信材料」的场景:每一片交给一个隔离的子 Agent 去读,子 Agent 没有工具,只准回传结构化字段(比如一个布尔值加一句摘要),主 Agent 只看这些字段。像审稿——一百份稿子分给一百个审稿人,每人只回一张固定格式的评分表,主编从头到尾没读过原文。代价是跨片推理能力下降:需要把第 3 片和第 87 片对照着看才能得出的结论,这个结构做不到。

双模型隔离(Dual LLM) 是同一思路的一般化,也是今天实验里真正落地的那一半:有权限的模型永远看不到原文,它拿到的只是一个符号引用(比如「变量 a 里是刚才抓到的网页」);看原文的那个模型没有任何工具。

quarantined.js
// 这次调用看得到原文,但工具清单是空的——没有工具就不可能有后果
function quarantinedRead(request, ticketBody) {
  const blocks = collectUntrusted(ticketBody)
  const wanted = model.decide({ prompt: buildPrompt(3, request, blocks), tools: [] })
  // 把它「想做什么」记下来,只为了让你看见它确实上当了
  const hijackAttempts = wanted.filter((a) => a.tool === 'send_email' || a.tool === 'post_webhook')
  return { summary: summarize(blocks), hijackAttempts } // 只有字符串能流出去
}

代价是编排复杂度高:你要额外维护符号引用表、跨模型的数据流、以及一套「什么时候允许把引用解开」的规则。真要看工业级长什么样,读 CaMeL(arXiv 2503.18813)——它把双模型隔离和数据来源追踪做成了一套完整系统,每个值都带着它从哪来的标签。不要求你复现它,但读一遍会让你对「完整做对要花多少工程」有个准确的量感。

先写程序后执行与上下文最小化:可静态检查的计划,和用完就删的上下文

先写程序后执行(Code-Then-Execute) 是先定计划后执行的加强版:不让模型产出一串步骤,而是让它写一段小程序,由你自己的解释器执行。好处是程序可以在跑之前被静态检查——数据流是显式的,「客户库的返回值最终流向了哪个参数」这个问题有确定答案,而不是靠读模型的自然语言解释去猜。代价很实在:你得自建解释器与策略引擎,这是六个模式里工程量最大的一个。

上下文最小化(Context-Minimization) 最轻:那段不可信文字完成使命之后,就从上下文里删掉,不带进后续轮次。比如用它生成了一条数据库查询,查询生成完就把原文丢掉,后面的轮次只看查询结果。它的安全动机很清楚:上下文里留着的每一段不可信文字,都是后续每一轮的一次重新掷骰子——第一轮没被劫持,不代表第七轮也不会。

选型判据:这个任务到底需不需要根据不可信内容改变动作

六个模式摆出来之后,真正的问题不是「选哪个」,而是别一次全上。判据只有一条,而且是一个可以当场回答的问题:

这个任务,到底需不需要根据不可信内容改变动作

答「不需要」的占绝大多数。总结工单、分类工单、把网页要点写回工单——这些任务里不可信内容只影响产出的文字,不影响做哪几件事。这一类直接用先定计划后执行,工程量小、能力损失几乎为零。

答「需要」的才付双模型隔离的复杂度。典型的是「读完这份材料,如果里面提到退款就发起退款流程」——动作本身依赖内容。这时你需要的是让有权限的那一侧只看到一个受控的符号(比如一个枚举值),而不是让它读原文。

还有第三种答案:「需要,但可以改成不需要」。这是最划算的一条路,今天实验的最后一行就是它——纯先定计划后执行时,N-03 那条合理的抄送请求被一起丢掉了(工单说了要抄送风控,但计划里没有这一步);把收件人白名单改成由用户预授权,能力就回来了,而攻击成功率仍然是 0。很多「必须根据内容决定」的需求,换一个信任来源就消失了。

代价要摆上桌:每个模式换来的安全都是用能力换的

最后把六个模式和它们的账单并排放在一起。任何只讲优点的安全方案都是不完整的,面试里也是——说不出代价,面试官会认为你没落地过。

模式约束了什么代价
动作选择器结果不回流给模型只能做一次性动作,不能多步
先定计划后执行动作清单在摄入之前定死计划定死后无法根据读到的内容改主意
分片归并每片交给隔离子 Agent,只回传结构化字段跨片推理能力下降
双模型隔离有权限的模型只看符号引用编排复杂度高
先写程序后执行产出可被静态检查的程序需要自建解释器与策略引擎
上下文最小化用完即删只减少暴露面,不是隔离

今天实验跑出来的这张表,就是这笔账的实物:

TextText
D2 第三档:聚光标注                40%   100%   达成      A-07 A-08 A-09 A-10
D2 第四档:标记加检测器            10%    83%   被丢弃    A-10
先定计划后执行                      0%   100%   被丢弃    (无)
先定计划后执行 加 预授权收件人      0%   100%   达成      (无)

三件事值得念一遍:第一,攻击成功率从 40% 到 0,靠的不是更聪明的检测,是结构;第二,第三行的任务完成率是 100%,但「合理抄送」那一列写着被丢弃——安全确实是用能力换的,代价这一列就是账单;第三,最后一行把那份能力买了回来,而攻击成功率仍然是 0。这才是一次合格的改造:两个数字都要看,一个都不能少。

源码导读

动手实验

🧪 D3 实验:改造后的靶场 Agent:先定计划后执行加隔离读取,攻击成功率归零而正常任务完成率基本不掉

代码位置:labs/agent-security-5days/day-03-secure-patterns

验收标准:

  1. pnpm start 打印四行对照表,后两行的攻击成功率都是 0%、任务完成率都是 100%。
  2. 表里出现「隔离模型被劫持 5 次,但它没有工具,一次都没发出去」这一行。
  3. 纯先定计划后执行那一行的「合理抄送」列是被丢弃,最后一行是达成——代价与买回代价都看得见。
  4. 底部 A-07 的演示里,「隔离模型想做的事」与「实际执行的动作」是两行不同的内容。
  5. 变异检验:把工单正文传进计划器,攻击成功率立刻涨回去。

动手之前先记住一件事:starter 第一次跑出来是攻击成功率 0%、任务完成率 0%。别高兴,那正是昨天点名过的反模式——把 Agent 改成什么都不做,攻击成功率当然是 0。两个数字必须一起看。卡住了先读 starter/src/agent/planned.ts 里三个 TODO 的注释,它们指向坑而不是答案。

  1. 先跑通 solution,把四行对照表和底部那段 A-07 演示完整看一遍,确认你能指出哪一行是昨天的最好成绩、哪一行是今天的产出。
  2. 在 starter 里补全计划器 plan:它的参数里只有用户请求与预授权收件人,看不到工单正文——不要把工单正文加进去,加进去这个模式就作废了。
  3. 补全隔离读取 quarantinedRead:调一次模型,把它想做的对外发送记下来,然后把所有动作丢掉,只返回一段字符串。跑起来应该能看到被劫持次数不为 0。
  4. 补全执行器 runPlanned:只把计划里的步骤变成动作。写完这一行,表里后两行的攻击成功率应该同时归零。
  5. 做两次变异检验:把工单正文传进计划器并让它按工单追加发送步骤,以及把执行器改成执行隔离读取返回的动作——两次攻击成功率都必须涨回去,涨不回去说明对照组没接上、表里的 0% 是假的。

面试题

今天 3 道题在下方题库区,侧重六个设计模式的约束与代价、选型判据,以及架构防御与提示词防御的本质差别。展开后先看"分析过程"再看要点——第 3 题问的是「什么时候你会拒绝用这些模式」,那是区分「背过论文」和「落地过」的地方,别跳过。标注"国内高频 / 海外高频"方便按目标市场取舍。

检查清单与明日预告

  • 能逐一说出六个设计模式各自约束了什么,以及分别付出什么能力代价
  • 能用一条判据为给定任务选出合适的模式,而不是罗列所有模式
  • 能把靶场 Agent 改造成先定计划后执行加隔离读取,并用两个数字证明改造有效
  • 能逐字复述那条核心原则,并说清它约束的是能力而不是判断力
  • 能解释「隔离模型被劫持了却没造成后果」和「模型抗住了攻击」差在哪
  • 实验的 5 条验收标准全部通过,两次变异检验都让攻击成功率涨了回去
  • 3 道面试题不看要点也能答出至少 2 道

明天(D4)我们把假设再放宽一档:假设注入已经发生、架构也有缝,靠运行时把损失锁住。你会给每个工具声明能力面与危险等级,给不可逆的动作加确认门,给文件和网络加出口白名单,再把「沙箱」拆成你自己写的策略层与内核替你兜底的隔离层,最后处理密钥、用户级凭据与多租户隔离。顺序是有意的:今天这一层管的是「坏动作压根不会被提出来」,明天那一层管的是「它被提出来了也执行不成」——两层都做,才不会因为任何一层的一个疏忽就全线失守。

面试题库

  • 先定计划后执行为什么能挡住间接注入?它挡不住什么?Why does plan-then-execute stop indirect prompt injection, and what does it fail to stop?
    国内高频海外高频进阶#prompt-injection#architecture#plan-then-execute

    分析过程 · 先想清楚再作答

    1. 这题的题眼在后半句。只答前半句的人一律被判成「读过论文没落地过」——因为任何一个真上过线的人,都被它砍掉的能力咬过一次。
    2. 前半句的推导只有一步:注入之所以能得手,是因为不可信内容参与了「做哪几件事」的决策;先定计划后执行把动作清单挪到了摄入之前,计划器的参数表里根本没有工单正文,那段文字再巧妙也只能改变每一步的参数内容,改不了步骤本身。
    3. 所以它挡住的是「新增一个动作」这一类,比如凭空多出一次对外发送。
    4. 后半句同样有两层。第一层是能力代价:计划定死之后,工单里那句合理的「请抄送风控」也会被一起丢掉——这不是 bug,是这个模式的定义。第二层更要紧:它挡不住计划内动作的**内容**被污染,比如计划里本来就有一步写回工单,注入就可以让写回去的那段结论是错的、误导人的。
    5. 结论给成一句话:它把风险从「任意动作」压缩到「计划内动作的参数」,是收缩不是消除。剩下的那部分要靠运行时的出口白名单与确认门去兜。
    6. 可预期的追问是「那怎么把被砍掉的能力买回来」。答案不是放宽计划,而是换信任来源:把收件人白名单改成由用户预授权,工单说了不算——能力回来了,攻击成功率仍然是 0。

    How to reason about it · think before answering

    1. The real question is the second half. Answering only the first half reads as paper-deep: anyone who has shipped this pattern has been bitten by the capability it removes.
    2. First half, one step of reasoning: injection works because untrusted content participates in deciding which actions to take. Plan-then-execute moves the action list before ingestion, and the planner's signature simply does not include the ticket body, so the text can only change the content of each step, never the steps themselves.
    3. So what it blocks is the whole class of 'add a new action', such as an outbound send that was never planned.
    4. The second half has two layers. The capability cost: once the plan is fixed, a legitimate 'please cc risk control' in the ticket gets dropped too. That is the definition of the pattern, not a bug. More importantly, it does not stop the content of planned actions from being poisoned: if the plan already writes a conclusion back to the ticket, injection can make that conclusion wrong or misleading.
    5. Land it in one sentence: risk shrinks from 'any action' to 'parameters of planned actions'. That is containment, not elimination, and the remainder is covered by runtime egress allowlists and confirmation gates.
    6. Expected follow-up: how do you buy the lost capability back? Not by loosening the plan, but by changing the source of trust — let the user pre-authorize the recipient list so the ticket has no say. Capability returns, attack success rate stays at zero.

    答题要点

    • 它把动作清单定死在摄入不可信内容之前,计划器看不到工单正文,注入因此无法新增动作。
    • 它挡不住计划内动作的参数与产出被污染,比如写回工单的那段结论本身被带偏。
    • 它的代价是无法根据读到的内容改主意,合理的临时请求也会被一起丢掉。
    • 正确的定位是风险收缩而不是消除,剩余风险交给运行时的出口白名单与确认门。
    • 被砍掉的能力靠换信任来源买回来:白名单由用户预授权,而不是由不可信内容指定。

    Key points

    • The action list is fixed before any untrusted content is ingested; the planner never sees the ticket body, so injection cannot add actions.
    • It does not stop the parameters or output of planned actions from being poisoned, such as the conclusion written back to the ticket.
    • The cost is that it cannot change its mind based on what it reads, so legitimate ad-hoc requests get dropped too.
    • Frame it as containment, not elimination; residual risk is handled at runtime by egress allowlists and confirmation gates.
    • Buy the lost capability back by changing the source of trust: let the user pre-authorize the allowlist instead of the untrusted content.
  • 双模型隔离和加一个检测器,本质区别在哪?What is the fundamental difference between dual-LLM isolation and adding a detector?
    国内高频海外高频深入#dual-llm#detector#threat-modeling

    分析过程 · 先想清楚再作答

    1. 这题在考你区不区分「概率性防御」和「结构性防御」。答成「检测器准确率不够高、双模型更彻底」就落进了程度之争,而这两者的差别不是程度,是种类。
    2. 拆的方式是问一句:攻击者换一种写法之后,这道防御还成立吗?检测器的有效性建立在「坏输入有可被识别的特征」上,特征一旦公开,攻击就会绕着它长——自适应攻击已经系统性地做过这件事。双模型隔离不依赖任何特征:看原文的那个模型手上没有工具,它想做什么都不重要。
    3. 所以一个可复用的判断句是:**检测器是在猜输入是好是坏,隔离是在限制被骗之后能干什么。** 前者的失败模式是漏报,后者的失败模式是编排写错了、把引用解开了。
    4. 这里要主动讲一个反直觉的实测现象:隔离结构下的模型**照样会上当**。在靶场里隔离模型被劫持了五次,它真的打算把客户名单发出去,只是它手上没有那把钥匙。「我们的模型抗住了攻击」和这是两种完全不同的安全性,把它们混为一谈的团队会在第一次模型换版时翻车。
    5. 结论:检测器可以留着当降噪层与告警源,但它不是边界;边界只能由结构给。
    6. 可预期的追问是「双模型隔离的代价」。答:编排复杂度——符号引用表、跨模型数据流、以及什么时候允许解开引用的规则,都要你自己维护;CaMeL 那套完整实现还要给每个值挂来源标签。

    How to reason about it · think before answering

    1. This probes whether you separate probabilistic defenses from structural ones. Answering 'detectors are not accurate enough, dual-LLM is more thorough' turns it into a question of degree, but the difference is one of kind.
    2. Unpack it by asking: does this defense still hold after the attacker rewrites the payload? A detector depends on bad input having a detectable signature, and once the signature is public, attacks grow around it — adaptive attacks have done this systematically. Dual-LLM isolation depends on no signature at all: the model that reads the raw text holds no tools, so what it wants is irrelevant.
    3. A reusable formulation: a detector guesses whether the input is good or bad; isolation limits what can happen after you are fooled. The former fails by false negatives, the latter by orchestration bugs such as dereferencing a symbol too early.
    4. Volunteer the counterintuitive observation: under isolation the model still gets fooled. On the range, the quarantined model was hijacked five times and genuinely intended to send the customer list out — it simply had no key in its hand. 'Our model resisted the attack' is a different kind of safety, and teams that conflate the two get burned on the first model upgrade.
    5. Conclusion: keep the detector as a noise filter and an alerting signal, but it is not a boundary. Only structure can be a boundary.
    6. Expected follow-up: what does dual-LLM cost? Orchestration complexity — the symbol reference table, cross-model data flow, and the rules for when a reference may be dereferenced are all yours to maintain; a full implementation like CaMeL additionally tags every value with its provenance.

    答题要点

    • 检测器是概率性的,依赖坏输入有可识别特征;特征公开后自适应攻击会绕着它长。
    • 双模型隔离是结构性的,看原文的模型没有工具,被骗与否不改变它能造成的后果。
    • 两者失败模式不同:检测器失败于漏报,隔离失败于编排写错或过早解开符号引用。
    • 隔离下模型照样会上当,「没造成后果」和「没上当」是两种完全不同的安全性。
    • 检测器可以留作降噪与告警,但不能当边界;边界只能由结构给,代价是编排复杂度。

    Key points

    • A detector is probabilistic and assumes bad input has a detectable signature; once published, adaptive attacks grow around it.
    • Dual-LLM isolation is structural: the model reading raw text has no tools, so being fooled does not change what it can cause.
    • Different failure modes: detectors fail by false negatives, isolation fails by orchestration bugs or dereferencing a symbol too early.
    • Under isolation the model still gets fooled; 'no consequence' and 'not fooled' are different kinds of safety.
    • Keep detectors for noise reduction and alerting, never as the boundary; the boundary is structural, and it costs orchestration complexity.
  • 什么情况下你会拒绝使用这些模式,宁可接受风险?When would you decline to apply these patterns and accept the risk instead?
    国内高频海外高频基础#risk-tradeoff#lethal-trifecta#architecture

    分析过程 · 先想清楚再作答

    1. 这题是反着问的,考的是你有没有真的把安全当工程做。张口就说「安全无小事、必须全上」的人会被直接判掉——六个模式每一个都在用能力换安全,全上等于把产品做废。
    2. 拆的方式是先回到致命三件套:三条边缺任意一条,这条攻击链就断了。所以第一类可以拒绝的场景是**三件套不全**——Agent 压根碰不到私有数据,或者它没有任何对外通信能力,那么为它引入双模型隔离就是纯成本。
    3. 第二类是**后果可逆且可审计**:动作全是写回工单这种可逆操作,出事能回滚、日志能定位,那么把预算花在审计与回滚上比花在隔离编排上更划算。
    4. 第三类是**收益结构不成立**:内部工具、使用者本人就是唯一的数据主体、并且不可信内容只来自他自己。这时「攻击者」和「用户」是同一个人,威胁模型不成立。
    5. 但要说清拒绝的正确形式:拒绝的不是「防」,是「这一个模式」。选型判据仍然要走一遍——先问这个任务需不需要根据不可信内容改变动作,多数答案是不需要,那用先定计划后执行几乎没有能力损失,这种便宜的防御没有理由拒绝。
    6. 可预期的追问是「那你怎么向上汇报这个决定」。答:写成一条带前提的记录——拒绝的依据是三件套不全或后果可逆,一旦哪天给这个 Agent 加了对外发送工具,这条记录就自动失效、必须重评。**安全决定必须挂在一个会被触发的条件上,不能只是一次口头判断。**

    How to reason about it · think before answering

    1. This is asked in reverse, and it tests whether you treat security as engineering. Anyone who immediately says 'security first, apply them all' fails: every one of the six patterns trades capability for safety, and applying all of them ships a useless product.
    2. Unpack it from the lethal trifecta: remove any one of the three edges and the chain is broken. So the first case for declining is an incomplete trifecta — the agent touches no private data, or has no outbound channel at all. Adding dual-LLM isolation there is pure cost.
    3. Second case: consequences are reversible and auditable. If every action is something like writing a conclusion back to a ticket, you can roll back and trace it, so spend the budget on audit logs and rollback rather than isolation orchestration.
    4. Third case: the value structure does not hold. An internal tool where the operator is the only data subject and the untrusted content comes from that same person — attacker and user are the same party, so the threat model does not apply.
    5. Be precise about the shape of the refusal: you decline a specific pattern, not defense itself. Still run the selection rule — does this task need to change actions based on untrusted content? Usually no, and then plan-then-execute costs almost nothing. There is no reason to decline a defense that cheap.
    6. Expected follow-up: how do you report this decision upward? Write it as a conditional record: the justification is an incomplete trifecta or reversible consequences, and the moment someone adds an outbound tool to this agent the record expires and must be re-evaluated. A security decision has to hang on a condition that will actually fire, not on a one-time verbal judgment.

    答题要点

    • 六个模式都在用能力换安全,全上等于把产品做废,所以拒绝本身是合法的工程选择。
    • 三件套不全时可以拒绝:没有私有数据或没有对外通信,攻击链本来就断了。
    • 后果可逆且可审计时可以拒绝,把预算花在回滚与审计日志上更划算。
    • 拒绝的是某一个模式而不是防御本身,便宜的先定计划后执行几乎没有理由拒绝。
    • 决定要写成带失效条件的记录:一旦给这个 Agent 加了对外发送能力,必须重新评估。

    Key points

    • All six patterns trade capability for safety, so declining one is a legitimate engineering choice rather than negligence.
    • Decline when the lethal trifecta is incomplete: no private data or no outbound channel means the chain is already broken.
    • Decline when consequences are reversible and auditable; rollback and audit logging are the better use of budget.
    • You decline a specific pattern, not defense in general — plan-then-execute is cheap enough that refusing it is rarely justified.
    • Record the decision with an expiry condition: the moment an outbound capability is added, the assessment must be redone.

评论