从攻击视角分析LLM安全边界:访问控制需同时具备强制执行(哪些工具调用被允许)和可观测(完整记录操作日志),两者缺一不可;强调了工具可达性和scope配置错误的实际危害。
正在寻找 LLM 访问控制与监控最佳实践的团队,通常已经部署了模型并接入了各种工具。问题不在于要不要加控制,而在于控制放在哪里,以及记录什么日志才能让这些控制真正可信。
本文从攻击视角来回答这个问题。并非因为攻击多么高级,而是攻击的失败模式能精确告诉你边界应该设在哪里。
AI agent security 是约束自主或半自主系统在其拥有工具上的行为,并对实际执行过程进行观察的实践。
两个组成部分,各自都不是可选的:
Enforcement(执行)。哪些工具调用是允许的,允许哪些 agent 调用,针对哪些资源,在什么条件下调用。
Observation(观察)。对尝试了什么、成功了什么的持久记录,要足以重构一次事件。
一个有执行但没有观察的系统无法被审计。一个有观察但没有执行的系统是一份记录详尽的入侵报告。
值得关注的失败不是抽象的 prompt injection,而是那些可触及且作用域受限的工具所带来的普通后果。
以一个检索工具为例。它接收一个 tenant identifier 和一个 query。agent 被部署给 tenant A。tenant A 的用户构造了一段输入,导致 agent 调用工具时使用了 tenant B 作为 identifier。模型没有租户概念。工具信任它收到的参数。调用返回了 tenant B 的数据。
这条链路上没有任何高级漏洞利用。没有 jailbreak,没有模型权重窃取,没有新技术。只有一个参数、一个信任它的工具,以及它们之间缺失的检查。
同样的模式在不同类型的工具上反复出现:
一个接受资源路径的写工具,其中路径由模型提供。
一个 shell 或代码执行工具,其作用域是它运行的进程,而不是调用它的任务。
一个持有凭证的工具,因为按 agent 细化作用域被推迟了,所以部署中每个 agent 都能访问它。
每种情况的根本原因相同。授权决策在部署时做了一次,之后再也没有在调用时重新评估。
把限制放在 system prompt 里很诱人。"不要访问其他租户。" "只使用与任务相关的工具。"
这不是控制。这是对一个概率系统的建议。它可能在 1000 次调用中都成立,在第 1001 次失败,而你不会有任何信号告诉你边界移动了。
访问控制必须是确定性的。这意味着它不能存在于那个你试图约束其行为的组件中。
检查应该放在工具边界上,在 agent 与工具实现之间的请求路径中,每次调用时评估。
agent 发出一个带有参数的工具调用。
调用在工具执行前被拦截。
调用者身份、工具身份和参数一起按策略评估。
决策被记录。
只有在那之后工具才运行,或者调用被拒绝。
第三步是整个机制的核心。参数是授权输入的一部分,不只是调用者。read_document 的工具调用本身不存在固有的允许或拒绝。它取决于针对哪个文档、哪个 agent、代表谁。
第四步让第三步可被审计。如果决策没有和参数一起记录,你之后无法回答边界是否保持了。
这也是为什么按会话授权是不够的。一个 agent 会话可以跨越许多任务和许多资源。按会话授予的权限是对该会话将访问的一切的授权。
一个 agent 被赋予了摘要任务和一个检索工具。该工具在部署时被限定为生产文档存储,因为文档就在那里。
第二个 agent,属于不同的团队,也被赋予了同一个工具,因为工具注册表是共享的,按 agent 细化作用域还在路线图上。
第二个 agent 被用户提示——该用户对该 agent 有合法访问权——去检索该用户无权查看的文档。检索成功。摘要成功。输出被返回。
没有任何警报触发,因为没有每次调用的策略可违反,也没有每次调用的日志可检查。事件是在有人注意到内容时才被发现,而不是在系统注意到调用时。
每个 agent 最小权限,而非每个部署最小权限。每个 agent 获得其任务所需的最窄工具集和最窄参数范围。如果一个 agent 不需要写工具,它就没有写工具。
调用时授权,参数在作用域内。策略将调用者、工具和参数一起评估。工具调用是一个请求,不是常设权限。
每次调用日志,包含足以撤销的上下文。记录 agent 身份、工具、参数、决策和结果。如果你说不出一个 agent 触碰了什么,你就无法自信地撤销它。
reskSecure 在工具边界提供执行点。策略按调用评估,参数在作用域内,因此对 read_document 的检索调用是针对它命名的特定资源授权的,而非针对工具本身。拒绝和许可在决策时被记录。
ReskPoints 提供观察端。工具调用及其结果被捕获,这样"哪个 agent 触碰了哪个资源"这个问题有了一个答案,不需要手工重建日志。
两者共同覆盖了上面描述的两个部分:位于模型之外因此具有确定性的执行,和足够完整可以此采取行动的观察。
在 agents 上强制最小权限: https://resk.fr/projects/resksecure.html
关于工具权限应该如何按 agent 构建的相关问题,参见 AI agent tool permissions。
每个工具调用在工具执行前被拦截。
授权将调用者、工具和参数一起评估。
授权按调用评估,而非按会话,也非按部署。
每个 agent 持有其任务所需的最窄工具集。
参数范围受限,不只是工具可用性。
每个决策,许可和拒绝,都带着其参数被记录。
日志足以回答哪个 agent 触碰了哪个资源。
无需从原始日志重建状态即可撤销。
没有任何授权决策依赖于模型遵循一条指令。