# Trust Labels (信任标签)

*来源与敏感度两个小标签，加上会话污点，强制执行 Rule of Two。*

> **Trust Labels（信任标签）** 是附在数据上的两个很小的标签集，**来源**（`owner`、`agent`、`external`）与**敏感度**（`public`、`private`、`secret`），再加上**会话污点**。NAS 把 Rule of Two 当作会话不变量来强制：一次会话不能同时拥有 [A] 读过外部内容、[B] 接触敏感数据、[C] 改变受保护状态或对外通信；要补全第三项，就走 [Human Gate](https://agentnas.com/zh-cn/concepts/human-gate/)。

**AN-06** · 符合性等级: L3 Guard · 概念簇: 权限

## 要解决的问题

提示词注入之所以奏效，是因为模型分不清“指令”和“数据”。模型层的防御（分类器、提示加固）会漏，攻击者还可以自适应。Meta 在 2025 年 10 月底提出 [Agents Rule of Two](https://ai.meta.com/blog/practical-ai-agent-security/)：在注入问题被可靠解决之前，一次会话最多只应同时具备三个性质中的两个。

更可靠的做法是在模型**之外**限定后果。存储恰好是“读”和“写”的必经之地，所以适合把这条规则变成可以测试的不变量。

## 工作方式

- **标签。** 来源 3 档、敏感度 3 档，外加 `reviewed` 标记（由闸门批准设置）。导入点（网页、邮件、上传）默认标为 `external`；密钥扫描器发现凭据时，自动标为 `secret`。
- **会话污点。** 一次运行读过的一切的汇总（来自读清单）；在一个会话内只增不减，新会话重置。
- **不变量。** A = 会话读过 `external`；B = 租约允许读 `private` 或以上（阈值可配置）；C = 租约允许向受保护树提议合并、共享、删除或出口。三者在同一会话里同时成立时，触发 C 的那次调用被拒绝或转交闸门。
- **实际效果：** 在同时具备 B 和 C 的租约下，会话一旦读过外部内容，之后的 C 类动作都要经过人。想避免这种摩擦，就把“读外部内容”放到另一个没有 B 的会话里，只通过结构化交接传递结果。
- **传播。** NAS 自己的派生（索引、摘要）确定性地继承输入标签的并集；运行写入的文件继承该运行的会话污点（保守做法）。
- **降级。** 只能经由 Human Gate，或**结构化交接：** 把受污染会话的输出限定为经 JSON Schema 校验的字段（枚举、ID、有界字符串），校验通过后才允许被特权会话读取。能被确定性校验的，才可能被信任。
- **强制点在网关与挂载层**（它们知道租约与会话），不在模型内部。

## 从小处开始

- 只做两件事：给导入目录里的文件打上 `external`；读过 `external` 的运行默认没有出口和受保护合并的权限，需要闸门。
- 策略用 Cedar 或 Rego 写成确定性的规则，拒绝时给出可读的原因。
- 先用“仅记录”模式跑一周，看看会误拦什么，再打开强制。

## 接口草图

仅作示意。字段名在规范 v0.3 之前可能调整。

*policy.yaml*

```yaml
# Deterministic policy (Cedar- or Rego-style rules can express the same thing)
session_invariant: rule_of_two
properties:
  A: session.read_origin includes "external"
  B: lease.sensitivity_max >= "private"
  C: lease allows propose_protected | share | delete | egress
on_would_complete_ABC: gate        # never "allow"
rules:
  - id: r-merge-1
    when: session.A and op == "merge" and target.protected
    then: gate
  - id: r-secret-1
    when: session.read_sensitivity == "secret" and op == "egress"
    then: deny
```

## 规范的要求

- 每个导入点**必须**赋予默认标签；外部内容**必须**标为 `external`。
- 会话污点**必须**在会话内只增不减。
- 策略求值**必须**是确定的，**不得**调用 LLM。
- 会让同一会话补全 A+B+C 的调用**必须**被拒绝或转交闸门。
- 降级**必须**经过闸门或经模式校验的结构化交接。
- 派生数据**必须**继承其输入标签的并集。

## 借鉴与区别

下面这些都是现成的思路。**真正新的部分：** 在**存储边界**用读清单实现会话污点，并把标签用到记忆写入和派生数据上。我们刻意把标签格缩小到 3×3，因为细粒度的格在实践中会导致标签膨胀。OpenClaw 已经在单个运行时里做了来源标签与隔离，我们的区别只是把它放到共享的存储中。

- [Agents Rule of Two (Meta)](https://ai.meta.com/blog/practical-ai-agent-security/)
- [The lethal trifecta](https://simonwillison.net/2025/Jun/16/the-lethal-trifecta/)
- [CaMeL](https://arxiv.org/abs/2503.18813)
- [Fides](https://arxiv.org/abs/2505.23643)
- [Design Patterns for Securing LLM Agents against Prompt Injections](https://arxiv.org/abs/2506.08837)
- [OpenClaw memory architecture](https://docs.openclaw.ai/concepts/memory-architecture)

## 坦诚的局限

- 这**不是**提示词注入的防御，它限制的是后果。
- NAS 看不到它之外的工具（浏览器、邮件），需要运行时配合。
- 污点是保守的，会带来摩擦与误报；结构化模式之外的自由文本仍然可以携带攻击者的话。
- 隐蔽信道无法消除。

## 开放问题

- 标签的粒度应当是文件还是段落？
- 多租户下标签词汇表如何治理？
- 如何降低误报？

## 常见问题

### Rule of Two 能防住提示词注入吗？

不能阻止注入发生。它让一次被注入的会话**无法同时**拥有“读过不可信内容、接触敏感数据、能改变受保护状态或对外发送”三项，从而限制后果。Meta 自己也强调它是减轻风险的启发式，不替代最小权限。

### 为什么只有三个来源和三个敏感度？

因为细粒度的标签格在实践中会膨胀、会被关掉。3×3 足够表达“谁写的、有多敏感”，也容易让人理解拒绝的原因。更细的分区可以靠路径与租约来做。

### 会话污点会不会让智能体什么都干不了？

只会限制三类动作：改动受保护树、共享或删除、对外发送。分支内的读写不受影响。需要避开摩擦时，可以把读外部内容的工作放进一个没有敏感数据的会话，只传回经模式校验的结果。

## 相关概念

- [Human Gate (人类闸门)](https://agentnas.com/zh-cn/concepts/human-gate/): 只在不可逆、对外或提权的动作之前出现，展示真实的差异。
- [Agent Memory (智能体记忆)](https://agentnas.com/zh-cn/concepts/agent-memory/): 笔记是你能读能改的真相，索引只是可以丢弃的缓存。
- [Capability Lease (能力租约)](https://agentnas.com/zh-cn/concepts/capability-lease/): 发给一次运行的、有期限与预算的窄域授权；子租约只能更窄。

---

规范网址: https://agentnas.com/zh-cn/concepts/trust-labels/
更新于: 2026-11-11 · 规范草案 v0.2 · CC BY 4.0
