【大模型安全实战】智能体安全的攻防二元性:同一种能力,为什么既是防线也是攻击面?(第4期)

专栏:智能体攻防卷·进阶
主题:攻防二元性
作者:Valhalla Matrix治理实验室
论文锚点LLM Agents Security Duality: A Comprehensive Survey of Self-Security and Empirical…,arXiv:2606.28450
文章类型:原创技术分析
适合读者:AI 工程师、安全工程师、架构师、技术负责人

本文讨论的是 AI Agent 的安全设计方法,不提供针对真实系统的攻击步骤。文中的攻击面分析用于风险识别、防护设计和安全测试。


摘要

AI Agent 正从“生成文本”逐渐发展为能够理解任务、制定计划、调用工具、访问文件、操作网络和管理长期记忆的复杂执行系统。

能力的增加带来了效率提升,也扩大了潜在风险。一个 Agent 越能理解上下文,越可能识别复杂攻击;但同样的理解能力,也可能被用于构造更精准的提示注入。一个 Agent 越能调用工具,越能自动化完成任务;但一旦权限控制失效,也可能执行超出用户意图的操作。

这种现象可以概括为:

Agent 的许多能力同时具有防御价值和攻击价值。

本文将这种现象称为“攻防二元性”,并从能力识别、威胁建模、权限控制、运行时验证和安全测试五个方面,说明如何把“能力越强、风险越大”的抽象判断,转化为可执行的工程方法。


一、什么是 Agent 的攻防二元性?

传统软件安全中,功能通常被理解为相对固定的能力。例如:

  • 身份认证用于阻止未授权访问;
  • 日志系统用于追踪异常行为;
  • 文件系统用于保存数据;
  • 网络接口用于提供服务。

但 AI Agent 的能力具有更强的上下文依赖性。相同的能力,可能因为调用者、输入内容、权限范围和执行环境不同,产生完全不同的结果。

可以用下面的公式描述:

[
\text{实际风险}

f(\text{能力},\ \text{输入},\ \text{权限},\ \text{环境},\ \text{意图})
]

其中,“能力”只是风险的一部分。真正决定结果的,还包括:

  • 谁在调用;
  • 输入是否可信;
  • Agent 能访问哪些资源;
  • 工具是否有副作用;
  • 是否需要人工审批;
  • 执行结果是否经过验证。

示例:工具调用

能力:调用工具

防御用途:

  • 自动检查代码;
  • 扫描配置;
  • 分析日志;
  • 修复低风险格式问题;
  • 执行安全巡检。

攻击用途:

  • 诱导 Agent 读取敏感文件;
  • 构造越权命令;
  • 修改安全配置;
  • 访问未授权网络资源;
  • 将数据发送到外部服务。

因此,不能简单地说“工具调用能力是安全能力”或“工具调用能力是危险能力”。

更准确的说法是:

工具调用是一种高价值、高风险的通用能力,其安全性取决于权限、边界和执行环境。


二、三类典型能力的双向影响

1. 自主规划

维度防御价值潜在攻击面
任务规划自动拆解复杂安全任务被错误目标诱导
步骤编排提高巡检和响应效率形成未经授权的操作链
失败恢复提升任务连续性在错误方向上重复执行
多工具协作自动完成复杂流程放大工具组合风险

自主规划的风险不只是“计划错了一步”,而是错误计划可能连续调用多个工具,形成副作用链路:

读取配置
  → 发现凭证
  → 生成脚本
  → 执行命令
  → 上传结果

每一步单独观察时可能都不明显,但组合起来就可能造成严重后果。

2. 工具调用

维度防御价值潜在攻击面
文件工具分析代码和文档越权读取或写入
Shell 工具自动运行测试和检查命令注入或危险操作
网络工具查询漏洞和官方文档数据外传或恶意内容进入上下文
数据库工具自动完成查询和分析未授权读取或数据修改

工具越接近操作系统,越不能只依赖系统提示词进行约束。

3. 长期记忆

维度防御价值潜在攻击面
历史经验减少重复分析污染后续任务
用户偏好提升交互效率泄露个人或业务信息
安全规则保留防护经验旧规则长期失效
会话上下文支持任务恢复跨用户或跨租户混淆

长期记忆尤其需要来源、可信度和有效期。未经验证的外部文本不应直接升级为永久 Agent 规则。


三、一个常见误区:能力越多,系统就越安全

很多团队在建设 Agent 时,会自然采用这样的思路:

增加更多工具
  → Agent 能做更多事情
  → 自动化程度提高
  → 系统更强
  → 系统更安全

问题在于,中间缺少了权限和验证环节。

更合理的关系是:

能力增加
  → 可执行范围扩大
  → 攻击面扩大
  → 需要更细的权限控制
  → 需要更强的运行时验证
  → 才可能获得可控的自动化收益

可以将 Agent 的有效安全能力表示为:

[
\text{有效安全能力}

\text{基础能力}
\times
\text{边界控制}
\times
\text{结果验证}
]

如果边界控制或结果验证接近于零,基础能力再强,也无法形成可靠的安全收益。


四、从“控制能力”转向“控制用途”

面对高风险能力,常见的两种做法是:

做法一:完全关闭能力

例如:

  • 禁止所有 Shell;
  • 禁止所有网络访问;
  • 禁止 Agent 读取文件;
  • 禁止子代理;
  • 禁止长期记忆。

这种方法简单,但会明显降低系统实用性。

做法二:保留能力,限制用途

例如:

  • 只允许读取当前工作区;
  • 只允许执行固定命令;
  • 网络默认关闭,仅开放指定域名;
  • 写文件前要求用户确认;
  • 凭证按任务临时发放;
  • 高风险操作需要二次审批;
  • 外部内容只能作为不可信数据进入上下文。

第二种方法更适合企业系统,但需要更完整的权限模型。


五、用途边界应该如何设计?

1. 工具级边界

每个工具都应有独立的权限描述,而不是由 Agent 统一继承全部能力。

一个简化的工具权限模型如下:

tool: file-reader
permissions:
  filesystem:
    mode: read
    roots:
      - workspace
  network: deny
  credentials: deny
  approval: not_required

对于修改文件的工具:

tool: file-editor
permissions:
  filesystem:
    mode: write
    roots:
      - workspace
  network: deny
  credentials: deny
  approval: required

对于 Shell 工具:

tool: shell
permissions:
  filesystem:
    read:
      - workspace
    write:
      - workspace/tmp
  network:
    mode: deny_by_default
  process:
    timeout: 60s
    max_children: 4
  approval:
    required_for:
      - package_install
      - git_push
      - deployment

这里的关键不是配置格式,而是治理原则:

工具应主动声明需要什么权限,策略系统负责决定是否授予。

2. 数据级边界

仅限制工具还不够,还要限制工具可以处理哪些数据。

建议为输入和输出增加数据标签:

data:
  classification: internal
  tenant: team-a
  source: workspace
  allowed_destinations:
    - local-session
    - approved-report

对于包含凭证、个人信息或生产数据的内容,应增加:

  • 脱敏;
  • 出口检测;
  • 目的地限制;
  • 审批;
  • 审计;
  • 自动过期。

3. 任务级边界

权限不应只绑定 Agent,还应绑定具体任务。

例如,同一个 Agent 在不同任务中可能拥有不同权限:

任务 A:代码阅读
  文件:只读
  Shell:禁止
  网络:禁止

任务 B:运行测试
  文件:工作区读写
  Shell:允许白名单命令
  网络:仅允许依赖镜像

任务 C:发布服务
  文件:受限
  Shell:受限
  网络:受限
  凭证:短期、审批后发放

任务完成后,权限应自动回收。


六、最小案例:文档总结能力的两面

假设一个 Agent 具备“读取并总结文档”的能力。

正常路径

用户指定文档
  → Agent 验证路径
  → 读取授权范围内的文件
  → 提取关键信息
  → 输出摘要

防御价值包括:

  • 快速分析安全文档;
  • 从日志中提取异常;
  • 比较配置变化;
  • 汇总代码审查结果;
  • 生成项目知识摘要。

风险路径

外部文档包含恶意指令
  → Agent 将文档内容误认为系统指令
  → 继续读取其他文件
  → 将敏感信息放入输出

问题并不在“读取文档”这个功能,而在于:

  • 文档内容和系统指令没有区分;
  • 文件路径没有限制;
  • 输出没有敏感信息检测;
  • Agent 没有执行前的权限确认;
  • 读取和外传被错误地串联起来。

改进后的安全路径

用户请求
  → 校验用户身份和工作区
  → 校验目标路径
  → 将文档标记为不可信数据
  → 禁止文档内容修改系统策略
  → 执行摘要任务
  → 对输出进行敏感信息检测
  → 记录工具调用和数据范围

此时,系统保留了总结能力,同时降低了越权读取和数据外泄风险。


七、对 Agent 进行双向威胁建模

建议每增加一种 Agent 能力,都填写一张“能力双向评估表”。

项目需要回答的问题
能力名称该能力具体做什么?
正常用途它为用户解决什么问题?
输入来源输入来自用户、模型、文件还是网络?
防御价值它可以帮助发现或阻止什么问题?
攻击面被滥用后可能造成什么后果?
所需权限需要文件、网络、Shell、凭证还是数据库权限?
组合风险与哪些其他能力组合后会放大风险?
约束方式通过白名单、沙箱、审批还是数据标签限制?
结果验证如何确认输出没有越权或错误副作用?
回滚方式操作失败后能否恢复?
审计信息是否记录调用者、参数、结果和权限决策?

这张表的价值在于:它迫使团队同时考虑“这个能力能做什么”和“这个能力可能被如何利用”。


八、四个工程控制点

1. 输入不等于指令

Agent 可能从以下位置读取文本:

  • 用户消息;
  • 代码注释;
  • README;
  • Issue;
  • 网页;
  • 日志;
  • 文档;
  • 工具返回值;
  • 数据库记录。

这些内容都不应自动获得系统指令级别的信任。

推荐区分三类信息:

系统策略:可信
用户请求:受身份和权限约束
外部内容:默认不可信,仅作为数据

即使外部内容包含“请执行某命令”之类的句子,也应被视为待分析文本,而不是授权指令。

2. 工具调用必须重新授权

模型提出工具调用,并不等于工具调用已经获得授权。

应经过:

模型提议
  → 参数校验
  → 权限计算
  → 风险分级
  → 用户或策略批准
  → 沙箱执行
  → 输出检查

尤其需要防止:

  • 模型自行批准高风险操作;
  • 工具 A 间接绕过工具 B 的权限;
  • 子代理继承过多权限;
  • 重试机制重复执行写操作;
  • 工具输出未经处理直接回到高信任上下文。

3. 结果也需要验证

防护不能只发生在执行前,工具输出同样需要检查:

  • 是否包含凭证;
  • 是否包含系统提示词;
  • 是否包含恶意指令;
  • 是否超出任务范围;
  • 是否来自预期资源;
  • 是否应该写入长期记忆;
  • 是否可以直接展示给用户。

对于高风险操作,建议使用结构化结果:

{
  "status": "completed",
  "changed_files": [],
  "side_effects": [],
  "warnings": [],
  "requires_review": false
}

结构化结果比让 Agent 自由解释执行状态更容易审计。

4. 失败和中断必须安全

一个成熟的 Agent 系统不仅要处理成功路径,还要处理:

  • 模型超时;
  • 工具超时;
  • 网络中断;
  • 用户取消;
  • 子进程异常;
  • 插件崩溃;
  • 会话恢复;
  • 重试;
  • 部分写入;
  • 凭证回收失败。

必须明确:

任务失败后是否重试?
写操作是否幂等?
进程是否被回收?
临时文件是否删除?
凭证是否失效?
会话是否记录真实状态?

九、三个容易被忽视的结论

结论一:减少能力不一定等于提高安全

关闭所有工具当然可以降低部分风险,但也会让 Agent 失去实际价值。

更合理的工程目标是:

保留必要能力
+
缩小权限范围
+
限制数据出口
+
增加运行时验证
+
保留人工接管能力

结论二:能力边界比能力数量更重要

一个拥有十个权限清晰工具的 Agent,可能比一个拥有一百个无边界工具的 Agent 更安全、更稳定。

评价能力时,应关注:

  • 权限是否最小;
  • 操作是否可逆;
  • 输出是否可审计;
  • 风险是否可分级;
  • 失败是否可恢复。

结论三:攻防双方会使用相似的自动化能力

防守方可能使用 Agent:

  • 分析日志;
  • 识别异常;
  • 归并告警;
  • 检查配置;
  • 生成修复建议。

攻击方也可能使用类似的自动化能力:

  • 识别暴露面;
  • 生成变体;
  • 归并目标信息;
  • 自动尝试错误配置;
  • 扩展攻击范围。

因此,防守体系不能只依赖“对手不会使用自动化工具”这一假设。更重要的是:

  • 限制系统被滥用的权限;
  • 提高异常行为的可见性;
  • 缩短检测和响应时间;
  • 对高风险动作保留人工控制。

十、落地检查清单

能力上线前

  • 明确能力的正常用途;
  • 列出输入来源;
  • 列出所有外部副作用;
  • 标注文件、网络、Shell 和凭证权限;
  • 明确是否允许被其他 Skill 调用;
  • 设计拒绝路径;
  • 增加调用和结果审计;
  • 为不可逆操作配置人工审批。

工具调用时

  • 模型输出不直接执行;
  • 参数经过结构化校验;
  • 路径经过规范化和边界检查;
  • 命令参数避免字符串拼接;
  • 环境变量使用白名单;
  • 网络访问默认限制;
  • 工具超时后回收子进程;
  • 结果经过敏感信息检测。

Skill 管理时

  • 记录来源和版本;
  • 保留变更记录;
  • 明确依赖;
  • 标注权限;
  • 设置有效期;
  • 支持撤销和回滚;
  • 禁止未经审核的自动升级;
  • 对外部内容进行不可信标记。

十一、总结

AI Agent 的安全问题,不能简单归结为“模型是否安全”或“工具是否危险”。

更准确的理解是:

同一种能力,既可能帮助系统发现问题,也可能在边界失效时放大问题。

自主规划可以提升响应效率,也可能形成错误的执行链;工具调用可以自动完成任务,也可能造成越权操作;长期记忆可以积累经验,也可能保存污染内容和敏感信息。

因此,Agent 安全建设的重点不是一味减少能力,而是建立完整的用途边界:

能力定义
  → 权限声明
  → 输入分级
  → 工具授权
  → 沙箱执行
  → 输出检查
  → 失败恢复
  → 审计追踪

最终可以用一句话概括:

能力决定 Agent 能做什么,边界决定 Agent 最终会做什么。

当团队评估一个新的 Agent 能力时,至少要同时回答两个问题:

  1. 这个能力能够帮助我们解决什么问题?
  2. 如果输入、权限或运行环境被滥用,它最坏会造成什么后果?

只有把这两个问题放在同一张设计表中,才能真正理解 Agent 的攻防二元性,并将其转化为可执行的工程控制。


延伸阅读

  • LLM Agents Security Duality: A Comprehensive Survey of Self-Security and Empirical…,arXiv:2606.28450
  • OWASP Top 10 for LLM Applications
  • OWASP Agentic Applications Security
  • NIST AI Risk Management Framework
  • MITRE ATLAS

本文仅用于安全设计、风险识别和防护研究。实际系统应结合自身数据、权限、网络和部署环境进行独立评估。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐