那天晚上值班,团队从社区接入了一个看起来很实用的模型上下文协议(MCP)服务器。不到二十分钟,大家发现它除了查日志,还在尝试读取本地密钥配置,并向陌生地址发送数据。这个工具没有经过权限核对,也没有在隔离环境里跑过。平台组随后问了一个不太舒服的问题:第三方智能体组件,凭什么可以直接拿到生产凭证。
这个问题正好对应一条新消息。2026年9月3日,Tenable公布与OpenAI合作创建CyberAgents Exchange AI Inspector,用来帮助团队评估智能体、技能、MCP服务器和多智能体剧本。它不是一张拿到手就能放行的通行证,而是一种审阅机制。本文把这个消息拆成工程流程,给出清单、权限基线、动态测试和人工确认的落地做法。
为什么第三方 Agent 组件需要像软件供应链一样验收
后端团队早就知道,安装一个开源包不能只看下载量。维护者身份、版本来源、依赖树和发布记录,都决定这个包能不能进入生产。智能体组件只是把风险从普通代码延伸到了工具调用和自然语言指令。它看起来像配置,实际上可能带着一整套执行能力。采购流程也要记录验收人。没有责任人的软件供应链,出了问题只能互相推诿。
一个技能通常包含说明文件、提示词和脚本。智能体在特定场景加载它时,脚本可能访问文件系统、环境变量或子进程。若团队只读了技能说明,没有查看脚本,就等于只看了安装包的广告页。真正的验收必须同时检查它说了什么,以及它能够做什么。脚本执行权限越大,审查等级越高。能读秘密的能力不应和普通提示词混在一起。
MCP服务器的风险更加直接。它会启动一个进程,向智能体暴露工具、参数和返回值。工具如果能读文件、执行命令或访问数据库,权限边界就不能留在一句自然语言描述里。每个动作都应该有目录范围、参数范围、身份范围和审计记录。服务端口只是入口,不是权限本身。真正要审的是身份、工具和数据三者的组合。
传统软件包的能力通常在构建阶段就能列出来。智能体系统却会在运行时发现工具、理解描述,再根据上下文选择调用顺序。服务器本周只有读取工具,下周更新后可能多出写入工具。若审批记录没有跟着版本和工具清单变化,原来的结论很快就失效。更新策略也需要写清楚。自动更新适合低风险组件,高风险组件必须经过版本复核。
供应链验收的核心不是把所有第三方代码都挡在门外。团队需要知道组件从哪里来、谁在维护、依赖了什么、会连接哪里、能改变什么。每一个答案都应该落到可复查的文件或日志里。这样出现事故时,值班工程师才能说明当时批准的到底是哪一个版本。这些资料应能被新人读懂。安全流程如果只能靠少数老员工记忆,就很难长期执行。
对智能体组件来说,来源可信并不等于行为可信。公开仓库可以帮助人阅读代码,却不能替代沙箱测试和运行时监控。自动扫描能筛掉一部分明显问题,却看不出所有上下文诱导。安全边界要按实际能力设置,而不是按组件名称设置。团队还要为每个结论标记证据来源。
CyberAgents Exchange 与 AI Inspector 的发布信息
Tenable的官方新闻稿显示,CyberAgents Exchange在2026年8月上线。它被定义为面向网络安全的开源组件目录,内容包括智能体、技能、MCP服务器和多智能体剧本。官方页面强调它是供应商中立的目录。任何团队都应该把它当作发现组件的入口,而不是默认信任的来源。这些信息不能替代本地审批。
这类目录的价值在于减少重复造轮子。安全团队可以看到别人如何连接漏洞数据、威胁情报和运营流程。组件页面还能把使用场景、源代码和贡献者放在一起。对工程团队而言,透明度比一个漂亮的演示页面更有用。目录质量取决于使用者的复核。
CyberAgents Exchange的公开说明还提到,每个资产都链接到源代码仓库。目录不提供捆绑二进制文件,使用者可以先阅读代码,再决定是否部署。这个设计把信任判断交回使用方。它改善了来源核验,却没有替使用方完成权限审计。公开透明不等于自动安全。
9月3日的新闻稿介绍了AI Inspector。它把OpenAI的GPT网络安全模型、Tenable One AI Exposure的技能审查能力,以及Tenable研究人员的专业复核放在同一套审阅流程里。官方表述是帮助团队在部署前评估社区构建的组件。这里的关键词是评估,不是永久认证。审阅结论也需要写清有效范围。
Tenable还说,CyberAgents Exchange在Black Hat USA期间举办SWARM构建活动后,目录里的社区提交组件已经超过100个。AI Inspector预计在2026年9月提供。预计可用不等于已经在每个团队环境中完成验证。工程人员引用这条消息时,应把已公布信息和自己的测试结果分开记录。版本数量增加后,复核压力也会增加。
这条发布信息对平台组的真正启发,是把智能体组件审阅变成一个明确环节。模型可以辅助发现风险,产品平台可以整理暴露面,研究人员可以复核高风险结果。最终是否放行,仍然要看组件版本、企业数据和实际权限。谁批准了生产凭证,谁就必须保留自己的判断依据。
Agent、Skill、MCP Server 和 Playbook 的风险面
智能体是负责完成目标的执行角色。它会拆分任务、选择工具,并根据返回结果决定下一步。第三方智能体的风险在于规划逻辑不透明。即使每个单独工具都安全,组合顺序也可能带来新的副作用。审批时还要确认它代表谁执行。身份绑定不清,审计日志就无法追责。
技能是装进智能体的一组能力。它可以由指令、模板、代码和配置共同组成。技能加载时会改变智能体理解任务的方式。审查技能不能只看文字,还要找出它是否读取秘密、改写文件或启动外部程序。技能还可能带来隐性依赖。每个加载入口都应该有停用开关。
MCP服务器是连接模型与外部工具的服务端组件。它公开工具名称、描述、输入结构和返回结果。一个工具是否安全,取决于实现代码,也取决于它拿到的身份范围。读数据库和改数据库不应该被包装成同一个无限制动作。服务启动参数也要纳入审查。默认监听范围过大时,先收紧网络边界。
多智能体剧本负责安排多个角色协作。它可能让一个角色收集信息,让另一个角色做判断,再让第三个角色执行动作。风险会在传递过程中累积。一个不严谨的剧本,可能把未经验证的文本直接变成高权限工具参数。剧本中的失败分支同样值得测试。不能因为主路径通过,就放过异常路径。
这四类组件的审查重点并不相同。智能体要看任务边界和规划权限,技能要看加载内容和执行入口,MCP服务器要看工具与数据边界,剧本要看角色之间的信任关系。把它们统称为插件,会掩盖这些差异。目录分类越清楚,审批问题越容易回答。分类完成后,权限边界会更清楚。
数据流也是一个容易被忽略的面。工具返回的日志、代码和数据库记录,可能被模型重新组合,再交给另一个工具。中间任何一步都可能把敏感数据带出原来的区域。安全审查要画出数据从输入到输出的完整路径,而不是只检查网络端口。数据流图能帮助发现隐藏的转发链。
模型的自然语言指令同样属于供应链的一部分。工具描述里出现诱导性文本,可能影响智能体的选择。提示词注入不一定需要修改程序,也可能藏在返回数据或错误信息里。测试时要把工具描述、返回内容和上下文一起当作不可信输入。返回内容也要进入测试样本库。
| 组件 | 主要能力 | 验收重点 |
|---|---|---|
| Agent | 规划任务并选择动作 | 目标范围、身份和组合权限 |
| Skill | 注入指令与脚本能力 | 加载内容、执行入口和依赖 |
| MCP Server | 暴露工具与数据接口 | 工具清单、参数和出站流量 |
| Playbook | 编排多个角色协作 | 角色信任、状态传递和人工闸门 |
从静态代码扫描到工具调用权限审计
静态扫描仍然有用,但只能作为起点。它可以检查硬编码密钥、危险反序列化、命令拼接和依赖漏洞。它不能告诉你一个合法工具是否被授予了过大的业务权限。组件验收要把代码问题和能力问题分开登记。扫描结果要和组件版本绑定。换一次依赖版本,就重新生成一份报告。
工具清单是能力审计的底稿。每个工具至少应有名称、用途、输入结构、认证范围和副作用说明。名称与描述不能互相矛盾。若一个工具名写着读取,代码却支持删除,审批应立即停止。清单还应该记录副作用等级。没有副作用说明的工具,不能按低风险处理。
权限名单应该采用默认拒绝。平台只开放已经批准的工具,清单之外的调用直接返回阻断结果。对同一个工具,还要限制目录、表名、命令和数据量。只做工具级放行,仍然可能留下参数级越权。限制参数比提醒用户更可靠。提醒会被忽略,边界却能被系统强制执行。
参数审计要关注那些能改变范围的字段。路径、命令、查询条件、目标地址和批量大小,都可能把一个低风险动作变成高风险动作。输入结构最好使用可验证的模式,而不是只在描述里写一句注意安全。拒绝未知字段,也能减少维护者后续扩展时的意外放行。
出站流量必须单独检查。组件应该声明会连接的域名、端口、协议和数据类型。生产环境可以在网关或沙箱边界记录实际请求。声明范围和观察结果不一致时,不能用一句暂时没复现来带过。网络观察还要覆盖重试请求。很多异常数据并不出现在第一次连接里。

权限基线要保存成版本化记录。它至少包括工具名称、描述、参数结构、允许身份、出站地址和批准人。每次组件升级都要生成新基线。运行时发现工具数量或参数范围变化,就触发重新审批。基线文件应放在团队仓库中。口头约定无法支撑后续的偏差比对。
审计不是上线当天的一次仪式。远程接口会变化,依赖会更新,维护者也可能改变工具实现。平台应定期把真实调用日志与批准基线比较。只要出现未登记工具、异常参数或新出站地址,就先收紧权限,再查明原因。异常比对要通知组件负责人。
| 检查层 | 要回答的问题 | 不通过时的动作 |
|---|---|---|
| 来源 | 谁发布,版本是否可复核 | 退回补齐来源资料 |
| 代码 | 是否含明显危险实现 | 隔离并安排修复 |
| 能力 | 工具与参数能做什么 | 收缩名单和范围 |
| 运行 | 真实行为是否符合声明 | 阻断上线并复测 |
一份可落地的 Agent 组件准入清单
准入表不需要堆成几百个问题。第一栏先记录组件名称、来源仓库、版本、提交哈希和维护者。第二栏记录组件属于哪一类,以及它会调用哪些外部服务。没有这些基本信息,后续的扫描结果都缺少上下文。申请表要由使用方填写。只有真正承担业务结果的人,才知道哪些权限多余。
来源核验还要看维护过程。团队可以检查提交记录、发布标签、依赖锁文件和安全公告。若组件只有一个无法解释的压缩包,审查成本会明显上升。没有源代码和版本指纹的组件,不应直接进入生产候选。仓库活动异常时要暂停接入。
依赖清单要和运行环境对照。组件声明的依赖不能只停留在文档里,实际安装结果也要保存。固定版本有助于复现,宽泛版本会让同一个组件每天表现不同。依赖新增或删除,都应在变更记录中说明。锁定文件也要检查来源。版本固定但来源不可信,仍然可能把风险带进来。
网络行为要写得足够具体。不要只写需要联网,而要写连接对象、触发条件和数据类别。访问内部日志与向外部服务发送摘要,是两种完全不同的风险。无法解释的出站请求,应当在沙箱中单独观察。网络说明还应标记数据去向。地址明确并不代表数据内容可以随意发送。
高风险工具需要人机确认。删除数据、修改权限、导出大量记录和向外部发送内容,都不应由模型单独决定。确认页面要显示原始参数、目标对象和风险原因。只展示模型改写后的说明,可能把真正危险的字段藏掉。确认动作应留下不可抵赖的记录。
准入结果最好分为允许、限制和拒绝三档。允许表示范围清楚且测试通过,限制表示只能在指定身份和沙箱中使用,拒绝表示来源、能力或行为无法解释。分档结果要关联有效期。超过有效期就回到复审队列,而不是默认延长。
组件被批准后还要有负责人。负责人不一定是开发者,但必须能回答版本变更、日志异常和撤销权限的问题。平台要准备一键停用和凭证回收动作。没有撤销路径的自动化能力,不适合连接高价值数据。负责人离岗时要有接替人。
用 Python 做最小化 manifest 与权限检查器
清单文件只有被机器读取,才容易形成稳定流程。下面的检查器使用标准库读取一个 JSON 清单和一个规则文件。它会检查工具名称、危险描述、敏感参数和允许名单。代码短小,但已经能把人工审查集中到高风险项。
清单里的 tools 数组保存工具定义。每个工具包含 name、description 和 inputSchema 三个字段。规则文件只保存 allowed_tools 列表。真实团队可以继续加入数据分类、出站地址和需要确认的动作。
python
import json
import sys
from pathlib import Path
def load_json(path):
return json.loads(Path(path).read_text(encoding="utf-8"))
def main():
if len(sys.argv) != 3:
print("usage: python check_manifest.py manifest.json rules.json")
return 2
manifest = load_json(sys.argv[1])
rules = load_json(sys.argv[2])
allowed = set(rules.get("allowed_tools", []))
risky = {"delete", "drop", "exec", "sudo", "export"}
issues = []
for tool in manifest.get("tools", []):
name = tool.get("name", "")
text = tool.get("description", "").lower()
if name not in allowed:
issues.append((name, "not_allowed"))
if risky.intersection(text.split()):
issues.append((name, "risky_description"))
for field in tool.get("inputSchema", {}).get("properties", {}):
if any(word in field.lower() for word in ("path", "command", "target")):
issues.append((name, "sensitive_parameter:" + field))
for name, reason in issues:
print(name, reason)
print("high_risk_items=", len(issues))
return 1 if issues else 0
if __name__ == "__main__":
raise SystemExit(main())
运行前准备两个 JSON 文件,再执行命令行入口。若清单里有未批准工具,程序会返回非零状态。持续集成可以把这个状态接到合并门禁。平台也可以把输出保存为本次组件版本的审计附件。
这段程序有意保持简单。它不能证明工具实现没有漏洞,也不能替代动态沙箱。它只能根据公开清单发现几类明显的范围问题。把它当作自动化筛选器,不能当作安全结论生成器。
真正的规则应该来自团队的业务边界。财务系统可能禁止批量导出,代码平台可能禁止访问生产密钥,客服系统可能只允许读取脱敏字段。规则文件要由系统负责人和安全负责人共同维护。每次规则变更都要有评审人和生效时间。
检查器的输出还可以接入运行时日志。平台把工具名、参数摘要、调用身份和组件版本写到同一条记录里。发生偏差时,工程师可以快速定位是组件更新、规则变更还是模型选择造成的。这样一来,自动检查才真正连接到了运营流程。
上线前测试与运行时人机确认如何配合
上线前先在隔离环境部署组件。给它模拟凭证、假数据和最小网络范围。测试智能体要调用每一个声明工具,并记录返回值与副作用。真实生产凭证不应该出现在这一阶段。隔离环境的凭证应在测试后立即销毁。
第二步是比对声明和观察结果。工具数量、参数结构、文件访问和出站请求,都应该与准入清单对应。任何未登记工具都属于阻断信号。若差异是预期变更,也要先更新版本和审批记录。比对过程必须保留原始日志。
第三步要覆盖模糊输入和恶意返回。测试人员可以在日志、网页内容和工具返回中加入诱导文本。观察智能体是否把不可信内容当成新指令。这个过程不是为了证明模型永远不犯错,而是为了确认边界能够拦住错误动作。
预发布阶段应采用无副作用权限。组件可以读取仿真数据,但不能真的删库、改权限或发送批量信息。所有高风险调用都进入人工队列。值班工程师可以看到实际参数,再决定批准还是拒绝。队列积压时不能绕过人工闸门。
人机确认页面不要只显示一句风险提示。它应该展示组件版本、工具名称、原始参数、目标对象、数据量和触发规则。确认人需要知道自己批准的具体动作。若界面把细节藏在模型摘要后面,点击确认很容易变成习惯动作。
上线后的日志要支持按组件和版本查询。平台每天检查工具调用是否超出基线,按周期复查依赖和出站地址。发现异常时先停用高风险工具,再决定是否回滚。保留回滚、撤销和凭证回收动作,才能把审查结果变成实际防护。
团队可以从明天开始执行六步流程。先登记来源和版本哈希,再跑清单检查器,然后由安全负责人复核高风险项。接着在沙箱测试,预发布观察一周,生产环境保留高风险人机确认。AI Inspector可以帮助发现问题,但来源核验、权限设计、动态测试和运行时责任仍然要由使用团队自己承担。