案例 1:Agent 只读范围
发现 2 项工具目标范围配置问题。
http_probe 被声明为 allowed,目标范围为 *;当前规则因此识别出该工具的目标范围没有被具体限定,同时该能力也被授予了 research-agent。
工具 http_probe 允许任意目标
建议将 http_probe 的目标范围限制为业务实际需要访问的最小范围,并明确其授权边界。
Agent research-agent 被授予任意目标工具 http_probe
建议将 Agent research-agent 可使用的 http_probe 能力限制在业务实际需要的最小目标范围,并确保 Agent 的工具授权与该范围一致。
工具 http_probe 允许任意目标
建议将 http_probe 的目标范围限制为业务实际需要访问的最小范围,并明确其授权边界。
本次先从这一项发现讲起(这只是讲解的先后顺序,不代表对风险做任何评价或排序)。
下面先解释工具本身的目标范围,再解释 Agent 获得的能力范围,帮助你理解这两项发现之间的关系。
本次评估实际读取了 1 份材料。
本次评估共涉及 8 个主题:已评估 1 个,未提供 3 个,当前规则未覆盖 4 个。
本次共有 2 项配置关注点,均来自 http_probe 的 target_scope = ["*"]:一项检查工具本身的目标范围,另一项检查该能力是否被授予 Agent。
这不是两个独立的配置事实,而是同一项 target_scope=["*"] 配置从工具边界和 Agent 能力边界两个层面得到的检查结果。
发现:http_probe 的目标范围配置为 ["*"],未限制为具体目标。
材料事实:http_probe 的 target_scope 被声明为 ["*"]。
为什么值得关注:该工具未在配置层限定允许访问的具体目标,声明的目标范围较宽。
建议:根据实际业务需求,将目标范围限制为必要的最小范围,并明确该工具允许访问的目标边界。
发现:research-agent 被授予了目标范围未限定的 http_probe。
材料事实:材料中 agent.tools 声明 research-agent 可以使用 http_probe,而 http_probe 的 target_scope 为 ["*"]。
为什么值得关注:该工具的目标边界较宽,同时被授予 research-agent,因此该 Agent 声明可用的能力范围也随之变宽。
建议:将 research-agent 可使用的 http_probe 能力限制在必要的最小目标范围,并确保 Agent 的工具授权与范围一致。
下面的案例用于帮助你理解当前发现所涉及的安全边界。它们是辅助理解材料,不属于本次评估结果。
真实性:可复现示例主题:tool来源:人工整理
HTTP 探测工具的目标范围写成 *,等于没有说清它到底只能访问哪里。
场景:一个 AI Agent 可以调用 HTTP 探测工具。工具配置里的目标范围写成了 *,没有明确规定允许访问哪些主机、域名或资源。
为什么值得关注:一个工具本身可能只是「发一个请求」,但如果目标范围是任意的,它实际能接触到的外部对象可能比设计时预想的多。这里真正值得关注的是:这个工具的能力边界到底有没有被限制住。
可以参考的判断:工具不仅要说明「能做什么」,还要明确限制「可以对谁做」。
真实性:模拟/教学案例主题:tool来源:人工整理
模拟/教学案例:这是为教学准备的示例,不是真实发生的安全事件。
模拟 / 教学案例:通知工具没有限制收件人,可能把内容发到设计范围之外。
场景:Agent 可以调用邮件或通知工具。工具没有限制允许发送的目标(收件人)。
为什么值得关注:即使 Agent 本身没有恶意行为,一个没有收件人边界的通知工具,也可能把数据发送给设计范围之外的对象。
可以参考的判断:外发能力需要同时限制三件事:能不能发、发什么、发给谁。
真实性:模拟/教学案例主题:tool来源:人工整理
模拟/教学案例:这是为教学准备的示例,不是真实发生的安全事件。
模拟 / 教学案例:工具说自己用于 HTTP 探测,但没有限制它探测哪些主机。
场景:一个工具声明:「允许进行 HTTP 探测」,但没有明确限制 host。
为什么值得关注:「工具用途声明」不等于「实际访问边界」。声明一个工具用于安全测试,并不能自动证明它只能访问安全测试目标。
可以参考的判断:用途声明不能代替访问边界;两者要分别声明、分别检查。
以下为本次评估实际收到的原始材料。安全评估引擎只读取文本内容,不执行材料中的任何代码,也不连接、不扫描其中提到的任何目标。
这份材料告诉安全评估引擎:
以上只是安全评估引擎在材料中识别到的对象;下面是这份材料的原文,可自行核对。
| DOC | 路径 | 类型 |
|---|---|---|
| DOC-001 | config/agent.json | json |
{
"agent": {
"name": "research-agent",
"model": "gpt-oss-120b",
"environment": "staging",
"tools": [
{
"name": "search_documents",
"permission": "allowed",
"target_scope": ["internal-kb"],
"side_effect": "READ_ONLY"
},
{
"name": "http_probe",
"permission": "allowed",
"target_scope": ["*"],
"side_effect": "READ_ONLY"
}
]
}
}工具配置:已提供相关材料,并完成当前规则支持的检查。
工具配置 evaluated
Prompt:本次材料未提供,因此没有 Prompt 相关评估结果。
Prompt not_provided
MCP:本次材料未提供,因此没有 MCP 相关评估结果。
MCP not_provided
RAG:本次材料未提供,因此没有 RAG 相关评估结果。
RAG not_provided
Agent 整体配置:当前规则未覆盖该主题,因此本次没有对应评估结果。
Agent 整体配置 unsupported
模型:当前规则未覆盖该主题,因此本次没有对应评估结果。
模型 unsupported
数据来源:当前规则未覆盖该主题,因此本次没有对应评估结果。
数据来源 unsupported
外部系统:当前规则未覆盖该主题,因此本次没有对应评估结果。
外部系统 unsupported
以上结论基于本次提交的材料与当前规则。本次发现属于配置评估结果,不代表已确认存在漏洞,也不代表发生了实际安全事件。未提供材料、当前规则未覆盖的主题,本次没有对应评估结果。
以下是材料中实际存在、可定位、可复核的事实片段。证据只承载事实,不承载任何安全结论。
对应关注点:PF-001、PF-002
"name": "http_probe",
"permission": "allowed",
"target_scope": ["*"],
"side_effect": "READ_ONLY"
}"name": "research-agent",
"model": "gpt-oss-120b",
"environment": "staging",
"tools": [
{
"name": "search_documents",
"permission": "allowed",
"target_scope": ["internal-kb"],"model": "gpt-oss-120b",
"environment": "staging",
"tools": [
{
"name": "search_documents",
"permission": "allowed",
"target_scope": ["internal-kb"],
"side_effect": "READ_ONLY""name": "search_documents",
"permission": "allowed",
"target_scope": ["internal-kb"],
"side_effect": "READ_ONLY"
},以下信息用于复核本次评估过程和原始产物,不属于面向用户的风险结论。
| 项目 | 值 |
|---|---|
| Assessment ID | ASMT-001 |
| 评估方法 | deterministic |
| 规则集版本 | 0.2.0 |
| created_at | n/a |
| pack_root | /home/ae1/ae1/app/demo/fixtures/tool_scope_boundary |
| pack_id | PACK-001 |
内部评估标记:POTENTIAL。该标记表示规则命中后的内部评估状态,不等同于已经确认存在漏洞。
| 关注点 | 规则 | 置信度 | 内部评估建议(非判定) | 证据 |
|---|---|---|---|---|
| PF-001 | R-TARGET-WILDCARD | declared | medium | EVID-004 |
| PF-002 | R-AGENT-WILDCARD-CAP | declared | medium | EVID-004 |