大模型安全通常试图解决一个问题:如何让模型不生成错误、有害或违规的内容。
但当大模型从聊天助手变成能够调用数据库、发送邮件、执行命令和操作业务系统的 Agent 后,仅仅约束模型“说什么”已经不够。一次错误回答可能只是信息不准确,一次错误工具调用却可能直接删除文件、泄漏数据,甚至触发不可逆的业务操作。
论文《Deterministic Architectural Safety for Enterprise AI Agents: A Runtime Enforcement Framework》提出了一套面向企业 Agent 的运行时安全架构。

https://www.researchgate.net/profile/Rizwan-Jahangir/publication/410601495_Deterministic_Architectural_Safety_for_Enterprise_AI_Agents_A_Runtime_Enforcement_Framework/links/6a5e048dd4da0457569f82b4/Deterministic-Architectural-Safety-for-Enterprise-AI-Agents-A-Runtime-Enforcement-Framework.pdf
它没有继续寻找一种能够彻底阻止提示注入的模型,而是选择接受一个更现实的前提:
大模型的决策可能被操纵,但它产生的动作不能因此直接获得执行权。
基于这一前提,论文将 Agent 安全拆分为身份、凭据、权限、数据、审计、外部 AI 和治理七个安全域,并尝试通过策略执行点、确定性策略引擎和不可变审计,将安全控制从模型内部迁移到模型之外的执行路径上。
论文由 Rizwan Jahangir 和 Daisuke Ishii 撰写,目前仍处于审稿阶段。作者同时公开了 OPA/Rego 策略、25个测试场景、形式化模型和验证结果。

从“模型不能犯错”转向“错误不能落地”
现有大模型安全方案,大多属于概率性行为控制。
例如系统提示词、安全微调、输入输出检测模型、LLM Judge,以及让 Agent 在调用工具前进行自我反思。这些方法可以降低风险,却很难给出稳定的安全保证。
面对同一个输入,模型可能因为采样参数、上下文变化或模型升级而作出不同判断。即使一个安全模型能够拦截99%的攻击,对于删除数据库、转移资金、发送敏感文件等操作,剩下的1%仍然可能造成严重后果。
论文将这类机制称为“概率性行为控制”。它们试图让模型形成正确的安全行为,但最终仍然依赖模型本身作出判断。
确定性架构采用了另一条路线。
模型不再直接控制工具,而是只能产生一个结构化的动作请求。例如:
{"action": "execute","tool": "send_email","resource": "internal_email","destination": "employee@corp.com","data": [{"id": "report-001","class": "Internal"}]}
这个请求不会立即执行,而是先进入策略执行点,也就是 Policy Enforcement Point,简称 PEP。
PEP 会根据当前用户身份、Agent 权限、目标资源、数据类型和目标地址,将请求交给独立的策略决策系统。只有当所有策略都通过时,工具调用才会真正发生。
整个过程可以简化为:
用户任务↓大模型生成计划↓Agent 提出工具调用↓运行时策略执行点 PEP↓允许 / 拒绝 / 请求人工确认↓真实工具和业务系统
这里最关键的变化是,模型只能“建议做什么”,不能决定“是否真的执行”。
即使攻击者已经通过间接提示注入控制了模型,让 Agent 试图删除数据库,只要 Agent 没有对应权限,执行请求仍然会被拒绝。
因此,这套架构并不承诺阻止提示注入。作者在验证过程中也否定了“架构能够阻止所有提示注入攻击”这一说法,将其修正为“限制提示注入造成的影响”。

七个安全域如何构成运行时控制平面
论文没有把 Agent 安全简化为一个提示注入检测器,而是将其拆解为七个相互配合的安全域。
这七个安全域并不都直接部署在大模型网关,也不完全属于 Agent 框架。它们共同构成一套横跨身份系统、Agent Runtime、工具网关和业务资源的控制平面。
1. 身份域:Agent必须证明自己代表谁
传统应用中的操作主体通常是用户或服务账户。进入 Agent 系统后,操作链路会变得更复杂:
用户↓ 委托主 Agent↓ 委托子 Agent↓工具调用
当一个子 Agent 请求访问数据库时,仅记录“agent-123调用了数据库”是不够的。系统还需要知道:
Agent 代表哪个用户行动;
权限最初由谁授予;
中间经过了几次委托;
当前委托是否仍然有效;
子 Agent 是否超出了父 Agent 的授权范围。
论文将这种关系称为主体链或委托链。每一个安全相关动作都应当关联一个可验证的主体链。
例如:
员工 Alice└── 报表 Agent└── 数据分析 Agent└── read_db(customer_db)
权限在委托过程中只能保持不变或逐步收缩,不能扩大:
子 Agent 权限 ⊆ 父 Agent 权限 ⊆ 原始用户权限如果用户只能读取客户数据库,主 Agent 就不能把财务数据库权限授予子 Agent。
这一设计适合多 Agent 协同场景。它解决的不是“Agent叫什么名字”,而是让每一个动作都能追溯到真实授权来源。
不过,论文公开的 Rego 策略并没有真正验证身份签名、令牌有效期和委托链完整性。策略输入虽然包含 principal_chain,但实际执行逻辑没有引用这一字段。因此,身份域目前主要停留在参考架构和形式化模型层面。
2. 凭据域:Agent不应直接接触长期密钥
很多 Agent 应用会把数据库密码、云服务密钥或第三方 API Key 放进环境变量,再由 Agent 运行时直接读取。
这种方式存在明显风险。
一旦 Agent 被提示注入控制,攻击者可能诱导它读取环境变量、访问配置文件,或者通过工具返回结果泄漏密钥。
论文建议引入独立的 Secrets Broker,也就是凭据代理:
Agent 请求调用工具↓PEP 判断动作是否允许↓Secrets Broker 生成短期凭据↓凭据直接注入工具执行器↓工具代表 Agent 完成操作
在这个过程中,Agent 只知道自己可以调用某个工具,不需要看到真实密码。
短期凭据还可以绑定:
指定工具;
指定资源;
指定动作;
指定时间窗口;
指定 Agent 实例;
指定调用次数。
例如,一个报表 Agent 获得的不是完整数据库密码,而是一枚只能在5分钟内读取 customer_db 的临时令牌。
这样,即使令牌意外泄漏,其可利用范围也相对有限。
3. 权限域:工具和资源必须成对授权
权限域是论文当前实现最完整的部分。
作者要求所有具有真实副作用的操作都经过 PEP,不能允许 Agent 绕过网关直接调用数据库、Shell、文件系统或外部网络。
这里不仅要判断 Agent 是否有权使用某个工具,还要同时判断它是否有权通过这个工具访问当前资源。
权限应表示为工具与资源的二元组:
(read_db, customer_db)(write_db, financial_db)(send_email, internal_email)
不能分别维护:允许的工具:read_db、write_db允许的资源:customer_db、financial_db
因为分别判断可能产生权限组合漏洞。例如某个 Agent 拥有两项合法权限:
read_db(customer_db)write_db(financial_db)
如果策略只检查“Agent拥有read_db工具”和“Agent能够访问financial_db资源”,就可能错误地允许:
read_db(financial_db)Agent 原本只能读取客户数据库、写入财务数据库,却通过组合两个独立授权,获得了读取财务数据库的能力。
论文在构造测试场景时发现了这一 confused deputy,也就是“混淆代理”问题,随后将策略修改为工具和资源必须在同一条 capability 中同时匹配。
实际 Rego 策略如下:
capability_pair_allowed {some iinput.agent.capabilities[i].tool == input.toolinput.agent.capabilities[i].resource == input.resource}
只有当请求中的工具和资源共同出现在同一条权限记录中,动作才可能被允许。
这类机制很像传统操作系统和云平台中的强制访问控制,只是授权对象从“进程访问文件”扩展到了“Agent通过工具访问业务资源”。
4. 数据域:有权限调用工具,不等于可以发送任何数据
仅仅控制工具权限仍然不够。
假设一个 Agent 被允许使用 HTTP 工具访问网络。攻击者可以通过间接提示注入,诱导它读取内部文档,再将文档发送到外部服务器。
从工具权限看,Agent 的确拥有 http_post 权限;从安全结果看,这仍然构成数据泄漏。
因此,论文要求在权限判断之外增加数据流控制。
数据首先被划分为不同级别:
PublicInternalConfidentialRestricted
当工具调用携带 Confidential 或 Restricted 数据时,系统需要检查目标地址是否处于允许列表。
公开代码中的逻辑是:
permit {input.action == "execute"capability_pair_alloweddata_flow_safe}
也就是说,动作只有同时满足以下条件才会执行:请求是一个受支持的执行动作;
工具和资源权限匹配;
数据流向符合策略。
当请求中不存在敏感数据时,data_flow_safe 返回允许;当存在 Confidential 或 Restricted 数据时,目标必须属于预先批准的地址。
这解决的是“有权限使用合法工具,但利用合法工具外泄数据”的问题。
但这里存在一个重要前提:数据标签必须可信。
论文测试中的数据标签由请求直接声明:
{"id": "doc1","class": "Restricted"}
真实系统不能依赖 Agent 自己报告数据等级。被劫持的 Agent 完全可以不填写 data 字段,或者把 Restricted 数据标成 Public。
因此,企业落地时还需要补充:
数据来源标记;
敏感字段识别;
污点传播;
内容与标签绑定;
编码和摘要后的标签继承;
工具输入输出之间的数据流追踪。
否则,数据域的策略虽然是确定性的,策略判断依据却可能是错误的。
5. 审计域:不只是记录日志,而是保证动作无法脱离日志
Agent 轨迹通常包含模型调用、工具选择、参数、结果和中间状态。
但普通应用日志并不等于安全审计。
如果系统采用“先执行动作,再异步写日志”的方式,就可能出现:
动作已经执行↓日志服务故障↓没有留下审计记录
论文要求对安全相关动作使用“日志先于提交”或者原子提交机制:
策略判断允许↓写入不可变审计记录↓提交真实动作
只有当审计记录成功写入后,动作才真正生效。审计记录至少需要包括:
用户身份;
Agent 身份;
委托链;
工具和资源;
完整参数摘要;
策略版本;
策略判断结果;
数据等级;
人工审批记录;
执行结果和错误信息。
论文的形式化模型给出了一条审计完整性定理:如果所有动作都采用原子的“记录后提交”机制,那么每一个已经提交的安全动作都存在对应审计记录。
不过,公开代码只测试了 OPA 策略判断,并没有实现不可变日志、日志签名或事务性动作提交。因此,审计域目前仍是一项架构要求,而不是已经验证的工程能力。
6. 外部AI域:调用第三方模型也是一种数据外发
企业 Agent 经常需要调用多个外部模型。
一个 Agent 可能使用企业内部模型完成任务规划,再将部分文本发送给外部模型进行翻译、摘要或代码生成。
从传统大模型网关的角度看,这只是一次模型请求;从数据安全角度看,它实际上是一条外部数据传输通道。
外部 AI 域需要判断:
允许调用哪些模型供应商;
哪类数据可以发送给哪些供应商;
是否需要对上下文进行脱敏;
供应商是否允许保留输入数据;
数据是否跨境;
请求是否携带用户身份或业务秘密;
模型输出能否进入后续高权限工具。
论文把外部模型调用放在专门的 AI Gateway 之后,并要求敏感数据只能发送至批准的模型服务。
公开策略中的白名单包含内部接口和批准的外部 AI 服务:
approved := {"api.internal.example.com","secure-ai.example.com"}
当 Restricted 或 Confidential 数据被发送至其他地址时,策略拒绝执行。
但目标地址白名单只能解决“数据去了哪里”,不能完全判断“数据为什么被发送”。
如果攻击者的目标恰好是一个已批准的模型供应商,或者白名单服务本身遭到入侵,现有策略仍然无法阻止泄漏。作者也明确将“批准供应商未被攻破”列为信息流保证成立的前置假设。
7. 治理域:把企业制度转化为可执行策略
前六个安全域解决具体的运行时控制问题,治理域则负责管理这些控制本身。
企业安全制度通常写在文档中,例如:
客户数据不得发送至外部服务;
财务操作必须由两人审批;
高风险 Agent 不得直接访问生产环境;
权限变更需要经过安全审核;
敏感操作日志至少保留三年。
问题在于,文档中的制度不会自动约束 Agent。
治理域的任务,是将这些制度转化为机器可执行、可追踪的策略,并建立完整的策略生命周期:
制度要求↓机器可读策略↓评审与审批↓发布和生效↓运行时执行↓效果监测↓版本回滚
每一次策略判断都应关联具体的策略版本。否则当安全事故发生时,很难回答“当时系统执行的究竟是哪一版规则”。
作者还将部分控制要求映射到 NIST SP 800-207、ISO/IEC 27001和ISO/IEC 42001,例如身份验证、执行前授权、敏感数据传输、审计日志和策略版本管理。
不过,标准条款映射只能说明设计方向与标准要求存在对应关系,并不代表系统已经通过合规认证。

四条不变量:确定性安全究竟证明了什么
为了描述这套架构,论文建立了一个状态转移模型。
系统中包含用户、Agent、工具、资源、数据对象、策略、动作和审计日志。每次 Agent 提出的动作都会推动系统从一个状态迁移到另一个状态。
安全系统需要持续保持四条不变量:
身份有效动作已授权数据流向安全审计记录完整
第一条是不允许不存在有效主体链的动作。
第二条是所有工具调用必须经过授权,并且工具与资源同时处于 Agent 的能力范围内。
第三条是 Restricted 等敏感数据不能发送到未经批准的目标。
第四条是所有已经执行的安全相关动作都必须存在不可变审计记录。
在这些基础上,论文给出了四个定理:
定理 | 核心结论 |
|---|---|
不变量保持 | 如果初始状态安全,且所有动作均经过正确的PEP,后续状态仍然安全 |
有界委托 | 子Agent获得的权限不会超过父Agent |
审计完整性 | 每个已经提交的安全动作都有不可变审计记录 |
信息流安全 | Restricted数据不会流向非批准目标 |
这些证明在逻辑上成立,但都是条件化结论。
以“不变量保持”为例,它依赖三个重要前提:
PEP 不可绕过;
PEP 正确实现了策略;
策略完整表达了安全要求。
如果 Agent 可以直接访问网络,绕过 Tool Gateway,证明就不再成立。
如果策略漏掉了某种工具副作用,证明也无法覆盖该风险。
如果数据标签错误,信息流策略即使执行完全正确,也可能放行真实的敏感数据。
因此,论文证明的不是“Agent整体行为已经被确定性控制”,而是:
在可信输入、正确策略和不可绕过的执行边界成立时,明确写入策略的安全属性可以被确定性执行。
这个区别非常重要。
“100%拦截”背后,其实是一组OPA策略测试
论文最引人关注的数据是:
14个恶意场景全部拦截;
11个正常场景全部允许;
恶意行为遏制率100%;
正常行为误拒率0%。
公开仓库中的25个场景主要覆盖三类风险:
场景类型 | 恶意样本 | 正常样本 |
|---|---|---|
数据外泄 | 7 | 4 |
未授权工具使用 | 4 | 3 |
权限提升 | 3 | 4 |
合计 | 14 | 11 |
作者使用真实的 OPA 二进制执行 Rego 策略,而不是自己模拟一个策略引擎。运行结果显示25个场景全部符合预设标签。
不过,这个“100%”不能被理解为系统能够拦截所有 Agent 攻击。
测试中没有真实大模型,也没有完整 Agent。
每个场景都是提前写好的 JSON 请求。例如,一个恶意场景直接构造:
{"tool": "delete_db","resource": "customer_db","capabilities": [{"tool": "read_db","resource": "customer_db"}]}
策略发现 Agent 只有读取权限,没有删除权限,于是返回拒绝。
这实际上验证的是:
对于作者预先编写的25个结构化输入,OPA策略输出与作者预先设置的期望标签一致。
它没有测试:
真实提示注入过程;
模型如何生成工具参数;
多步骤任务轨迹;
多工具组合攻击;
动态权限和资源状态;
工具内部隐藏副作用;
编码和混淆后的数据泄漏;
自适应攻击者;
生产环境中的延迟和吞吐。
仓库也明确说明,测试 Harness 不包含实时 LLM,只是模拟一个已经被攻破的模型所生成的违规工具调用。延迟和吞吐则被列为未来工作。
此外,作者在构造测试场景的过程中,先后发现了工具—资源组合漏洞和 Confidential 数据遗漏问题,随后修改策略,再获得25/25的结果。
这种做法适合作为策略回归测试,但不足以证明策略能够泛化到未知攻击。
因此,论文的实验结果更准确的表达应当是:
当前Rego策略正确处理了25个已知测试用例。
而不是:
七域架构已经实现了对企业Agent攻击的100%拦截。
真正的工程难点,不是写出一条拒绝规则
论文公开的核心策略并不复杂:
default permit = falsepermit {input.action == "execute"capability_pair_alloweddata_flow_safe}
这套策略采用默认拒绝原则。只有工具—资源组合正确,并且数据流向安全,动作才被允许。
真正困难的不是让 OPA 对一段 JSON 返回 true 或 false,而是如何构造可信、完整且不会被 Agent 操纵的策略输入。
以一次邮件发送为例,PEP 至少需要得到:
{"principal": "alice@corp.com","agent_id": "report-agent-01","delegation_chain": ["alice", "report-agent"],"tool": "send_email","recipient": "partner@example.com","attachments": ["financial-report.xlsx"],"data_class": "Restricted","task_id": "task-20260728-001","policy_version": "v3.2"}
其中每一个字段都有可能成为薄弱点。身份不能由 Agent 自己填写,必须来自身份系统或签名令牌。
权限不能放在 Agent 可修改的请求正文里,必须来自权威权限中心。
数据等级不能完全依赖模型判断,需要与文件、字段和数据来源绑定。
目标地址不能只检查字符串,还要考虑重定向、DNS变化、代理和二次转发。
策略允许结果还要绑定具体参数,防止授权和执行之间发生状态变化。
因此,企业真正需要建设的不是一个单独的 Rego 文件,而是一条可信决策链:
身份系统+ 权限中心+ 工具注册中心+ 数据分类与污点追踪+ Agent轨迹+ 资源实时状态↓统一策略输入↓确定性策略判断↓绑定参数的执行令牌↓工具执行
Harness、工具网关和模型网关应该如何分工
这篇论文也为一个常见问题提供了参考:Agent 行为安全究竟应该部署在 Agent 框架、大模型网关,还是独立安全模块中?
答案不是三选一。
Agent Harness负责理解轨迹
Agent Harness 最接近 Agent 的规划和执行过程,能够看到:
当前用户任务;
模型生成的计划;
已执行步骤;
Tool、MCP和Skill调用;
工具返回结果;
多 Agent 消息;
当前记忆和上下文。
因此,任务对齐、轨迹分析、多步骤风险识别和用户确认适合部署在 Harness 层。
例如,Agent先读取客户名单,随后压缩文件,再调用邮件工具。单看每一步可能都合法,但结合轨迹后可能形成数据泄漏链路。
Tool Gateway负责不可绕过的硬控制
Tool Gateway位于真实副作用发生之前,适合承担:
工具和资源授权;
参数约束;
短期凭据注入;
数据流向控制;
高风险操作审批;
速率和影响范围限制;
不可变审计。
即使 Agent Harness 被攻击或修改,真实业务系统仍然不应该接受未经 Tool Gateway 授权的调用。
大模型网关负责模型调用和上下文安全
大模型网关更适合处理:
模型供应商白名单;
请求内容脱敏;
输入输出内容检测;
模型调用审计;
Token和成本控制;
模型路由;
外部模型数据合规。
它能够看到模型请求,却通常看不到工具执行的完整语义和系统状态,因此很难独立完成 Agent 行为授权。
比较合理的生产架构是:
Agent Harness负责理解任务、计划和轨迹↓Tool Gateway / PEP负责不可绕过的确定性授权↓资源侧访问控制负责在数据库、文件系统和业务系统再次校验
模型网关则位于每次模型调用的入口,负责上下文和外部 AI 供应链控制。

确定性策略只能守住“明确边界”
七域架构最擅长处理的是规则清晰的风险:
没有delete权限,不允许删除没有financial_db权限,不允许访问Restricted数据不能发送至外部地址超过1万元的转账必须人工确认生产环境不允许执行任意Shell
这些规则可以结构化,可以通过代码确定执行。但大量 Agent 风险并不是简单的权限越界,而是“授权范围内的错误行为”。
例如,一个客服 Agent 有权退款,但它可能因为理解错误,对不符合条件的订单进行退款。
一个邮件 Agent 有权向客户发送邮件,但它可能发送不准确、带有误导性的承诺。
一个代码 Agent 有权修改仓库,却可能在合法文件中植入后门。
一个运维 Agent 有权重启服务,却可能在错误时间重启核心生产系统。
这些动作从工具和资源权限上看都是合法的,真正的问题在于:
是否符合当前任务;
是否符合用户真实意图;
参数是否合理;
时机是否正确;
是否偏离历史行为;
多个合法步骤组合后是否形成风险。
这类问题很难仅用静态规则解决,仍然需要模型检测、任务对齐、异常行为识别和人工确认。
因此,企业 Agent 安全更合理的组合是:
确定性策略负责明确、不可突破的硬边界语义安全模型负责识别难以枚举的行为风险人工确认负责处理高影响和高不确定性动作
三者不是替代关系。从输入输出护栏走向执行控制平面
这篇论文没有提出一种新的提示注入检测算法,也没有真正实现完整的七域安全系统。
身份验证、凭据代理、不可变审计和治理平台主要停留在架构设计阶段。公开实验只验证了权限和简单数据流策略,25个场景也不足以证明其具备真实 Agent 环境中的泛化能力。
但论文仍然提出了一个值得重视的判断:
企业 Agent 的核心安全边界不应建立在大模型是否听话之上,而应建立在真实动作是否经过不可绕过的运行时控制之上。
对于聊天机器人,输入输出护栏可能已经能够覆盖主要风险。
对于能够调用工具的 Agent,安全控制必须继续向下延伸到:
Agent代表谁行动;
权限从哪里获得;
凭据如何使用;
哪些工具可以访问哪些资源;
数据可以流向哪里;
每次动作如何审计;
策略如何发布和治理。
这正是七域架构的价值。
它没有让模型变得确定,也没有消除提示注入,而是尝试在不确定的模型和确定的业务系统之间,建立一个可验证、可审计、默认拒绝的执行控制平面。
未来企业部署 Agent 时,真正需要回答的可能不再只是“模型有没有安全护栏”,而是另一个更具体的问题:
当模型判断错误,甚至已经被攻击者控制时,系统中还有哪一道边界能够阻止错误动作真正发生?
声明:本文来自模安局,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。