跨轮权限状态集需要隔离哪些答案与标签封面

跨轮权限测试里,隐藏答案往往不是一段参考回复,而是“第几轮允许什么动作”的状态轨迹。若把完整权限事件与预期判定都加进模型输入,Agent 可能直接照着答案走,验收就失去了意义。要隔离的是控制权与判定信息,不能把执行器必需的可信权限也藏掉。

拆开三份视图

一份会话可以生成三个不同的视图:模型视图有当前任务及必要工具结果;执行器视图有可信身份、当前授权和资源元数据;判定器视图有预期结果、完整状态事件与实际执行证据。三者按用途取数,不共享一个包含全部字段的 JSON。

视图可见字段应隔离的内容
模型任务、允许公开的上下文预期决策、失败标签、评分理由
执行器身份、授权版本、目标资源不必要的参考答案
判定器完整事件、期望、执行轨迹不把结果回写到同次运行输入

判定器可以知道撤权在第 3 轮生效,执行器也必须及时得到该事件。模型是否知道撤权,取决于产品交互设计。不能为了“盲测”让执行器仍持有旧授权,那会把测试夹具错误伪装成 Agent 漏洞。

执行视图与隐藏判定视图的隔离

内图用分离层次表达输入与判定的边界。执行轨迹可供判定器观察,预期答案不反向流入正在运行的 Agent。

分区以会话家族为单位

同一场景改写用户话术、延长轮次或更换等价资源名,都仍属于同一家族。开发集用于调试防护,验收集用于最终评价,两个分区不应共享这些同源轨迹。按单轮消息随机切分,可能让开发集里的上下文直接解释验收集的后半段。

还要检查工具返回、日志文件名和样本 ID。expected_deny_revoked 这类名称本身会泄露判定,输入侧可换成不带语义的 ID,语义字段只存在管理清单里。脱敏时也要保持事件先后和资源对应关系,不能删到无法判断授权。

用自动断言守住隔离边界

下面的代码只演示投影视图,不负责授权。实际工程中还应采用类型定义或序列化白名单,避免新增字段自动透传:

model_input = {
    "task": case["task"],
    "messages": case["public_messages"],
}
assert "expected" not in model_input
assert "oracle_state" not in model_input

运行产物分开存放,判定结果只在运行结束后关联。若要给失败样本做人工诊断,使用另一次受控审阅,不能让最终验收过程在中途拿到答案后继续执行。隔离的目标是保持评价独立,同时让真实执行边界按产品设计正常工作。

工具状态不能用答案字段代替

测试环境有时为了方便,在工具模拟器里直接查期望标签返回允许或拒绝。这样的模拟只能检查下游处理,无法评价授权实现。若本次目标是执行边界,应让执行器读取独立维护的授权状态,再由判定器比较结果,避免同一份标签既决定行为又评价行为。

视图之间的访问路径也要审阅。模型不能直接读取隐藏判定文件,生成日志的工具也不应把其内容附进报错。若人工中途查看答案后继续运行,要将这次运行标成辅助诊断,不能混回盲测结果。最终验收需重新启动干净会话,并复位缓存、权限和工具任务,使隐藏答案没有通过历史状态留下间接痕迹。

参考:OWASP AI Agent Security Cheat Sheet。文中三视图结构为说明性测试设计。

Logo

更多推荐