SkillSpector 是 NVIDIA 的 Apache-2.0 安全扫描器,用于 AI 代理技能:可能包含 Markdown、脚本、依赖项、工具定义和激活规则的指令包。它接受本地目录、单个文件、zip 存档、Git 存储库或 URL,并生成风险评分为 0-100 的终端、JSON、Markdown 或 SARIF 结果。
它的价值就是威胁模型。技能不仅仅是文档。一旦代理遵循它,指令就可以导致文件访问、shell 执行、凭证使用、网络传输或持久配置更改。 SkillSpector 检查常规软件风险和特定于代理的问题,例如提示注入、过度代理、内存中毒、触发器滥用和 MCP 工具描述中毒。干净的报告是来自预安装分析层的证据,并不能保证运行时行为的安全。

SkillSpector 适合信任管道的位置
源身份 + 提交 pin
|
v
在隔离工作区中解压
|
.--------+--------。
伏
静态规则依赖/OSV
AST + 污点签名 + 元数据
'--------+--------'
v
可选的LLM语义审查
|
人性
接受/修复/抑制原因/拒绝
|
沙箱+最小权限+运行时监控
这个顺序很重要。今天扫描未固定的 URL 并不能证明明天的下载是相同的。在不隔离其凭证的情况下通过恶意指令运行法学硕士会造成另一次暴露。在没有阻止策略的情况下上传 SARIF 文件会创建可见性,但无法控制。将扫描仪视为可重复的准入过程中的一个阶段。
两级分析仪的作用
| 舞台 | 机制 | 实力 | 预期疲软 |
|---|---|---|---|
| 静态图案 | 跨技能文件的正则表达式和规则匹配 | 快速、确定性且可解释 | 良性例子可以匹配;新颖的措辞可以逃避 |
| 行为AST | 检测 Python 执行原语和危险调用链 | 查找关键字之外的代码行为 | 不执行代码;语言和间接覆盖范围是有限的 |
| 污点追踪 | 查找从输入/秘密/文件到执行或网络接收器的流 | 将源和汇连接成有意义的路径 | 动态调度和复杂的框架可以击败静态流 |
| OSV 查找 | 查询 OSV.dev 以查找已声明的依赖项漏洞 | 当前在线漏洞情报 | 离线模式使用较小的后备;未声明/供应的代码可能会丢失 |
| YARA 签名 | 匹配已知的恶意软件、Webshell、矿工和漏洞利用模式 | 对已知家庭有用 | 未知、打包或修改的有效负载可能会逃避 |
| 可选的法学硕士审查 | 评估意图和背景,解释发现 | 可以减少明显的静态误报 | 概率性、依赖于提供商并暴露于对抗性内容 |
该项目将静态分析描述为具有中等精度的高召回率,并表示可选的语义审查可以提高精度。不要将标题精确数据复制到政策中,而不将其复制到您自己的语料库中。安全团队关心的是每一类别的漏报,而不仅仅是一个总数。
操作方面的 16 种风险类别
| 危险人群 | 涵盖的示例 | 审稿人应该验证什么 |
|---|---|---|
| 指令控制 | 提示注入、隐藏指令、系统提示泄漏 | 指令是否可见、有范围且服从主机策略? |
| 数据存取 | 环境收集、文件系统枚举、上下文渗透 | 哪些具体数据类可以流向哪些域? |
| 权威 | 权限升级、过度代理、工具滥用 | 该技能是否仅请求最低可逆权限? |
| 坚持 | 内存中毒、自修改、启动或cron持久化 | 该技能可以修改未来的会话或其自身的执行吗? |
| 软件供应链 | 未固定的软件包、远程脚本、CVE、误植、混淆 | 哈希、提交和依赖来源是否可重现? |
| MCP 边界 | 通配符权限、未声明的功能、工具中毒 | 声明的元数据是否与代码和运行时流量匹配? |
| 代码行为 | exec/eval、子进程、动态导入、受污染的执行 | 危险行为是否必要、受到限制并安全地参数化? |
| 输出和触发器 | 未经净化的输出、广泛的激活、影子命令 | 普通文本是否会意外激活或跨越信任边界? |
SkillSpector 目前记录了这 16 个类别的 64 种模式。该数字对于版本控制覆盖范围很有用,但其本身不能作为安全分数。已知正则表达式的十个变体不一定能够防御一种新的攻击链,而单个高质量的污点规则可能会防止严重的泄漏。
了解风险评分
记录的模型为关键发现加 50 分,高 25 分,中 10 分,低 5 分,当存在可执行脚本时应用 1.3 倍乘数,并将结果上限为 100。已发布的评分等级为 0-20 低、21-50 中、51-80 高和 81-100 关键。
| 分数/频段 | 默认推荐 | 这不意味着什么 |
|---|---|---|
| 0–20 / 低 | 继续人工审核和沙箱测试 | 不“安全”;盲点可能包含未观察到的行为 |
| 21–50 / 中 | 需要业主处置和修复 | 不会自动产生恶意;合法的网络或 shell 使用可能会得分 |
| 51–80 / 高 | 除非安全允许例外,否则阻止安装 | 仅凭分数并不能确定意图 |
| 81–100 / 严重 | 拒绝并调查来源/出处 | 多项发现可能描述一个根本原因;分类期间重复数据删除 |
分数压缩异质证据。保留规则 ID、文件位置、片段、置信度、分析器版本和源代码提交。两项得分为 50 分的技能可能具有截然不同的风险:一条关键的代码执行路径与十条低严重性的卫生结果。
仅静态与 LLM 辅助扫描
| 模式 | 使用时 | 数据边界 | 政策含义 |
|---|---|---|---|
--no-llm | 快速 CI、不可信输入、隔离审查或确定性基线 | 没有语义负载发送到模型提供者 | 预计会有更多误报和错过意图 |
| 托管 OpenAI/Anthropic/NVIDIA 端点 | 上下文分类值得外部处理 | 技能内容可能会离开环境 | 审查提供商条款、保留、区域和凭证 |
| 本地 OpenAI 兼容端点 | 敏感技能或可重复的内部评估 | 如果网络受到控制,可以保留本地 | 模型质量和即时注入稳健性成为您的责任 |
切勿给予扫描仪的语义模型超出其所需的权限。该模型应该分析文本,不拥有生产秘密或安装权限。将任何技能内容视为对抗性输入并记录确切的提供者/模型,因为语义配置可能会在版本之间发生变化。
已知的盲点
NVIDIA 明确列出了重要限制:非英语攻击可能会被错过;不分析隐藏在图像中的文本;编译、加密或二进制代码在静态可见性之外;并且运行时行为不会被执行。当网络不可用时,OSV 覆盖范围会减少。静态分析还可能会遇到生成的代码、反射、第二阶段下载、环境条件行为以及仅在远程服务器更改其响应后才出现的滥用。
| 盲点 | 补偿控制 |
|---|---|
| 图片或文档说明 | 提取 OCR/元数据并在单独的沙箱中审查媒体 |
| 二进制或加密工件 | 拒绝不透明的有效负载或需要可重现的源和恶意软件沙箱 |
| 仅运行时行为 | 在具有默认拒绝的网络/文件系统的检测容器中执行 |
| 非英语或混淆的提示 | 使用语言感知审查、Unicode 规范化和对抗性测试用例 |
| 远程依赖关系更改 | 固定提交/哈希、镜像依赖项并验证签名/SBOM |
| 扫描仪规避或缺陷 | 使用深度防御、独立审查和扫描仪回归测试 |
团队可以执行的 CI 准入政策
- 解决不可变输入。 扫描前记录存储库、提交 SHA、存档哈希、作者和许可证。
- 解压后不执行。 清点每个文件时禁用挂钩、模板和包安装。
- 首先仅运行静态。 保存 JSON 和 SARIF 以及 SkillSpector 版本以及 OSV 是否可访问。
- 应用显式门。 阻止任何未抑制的关键/高结果、凭证到网络污染、隐藏指令或不透明的可执行文件。
- 单独进行语义审查。 仅将批准的内容发送给孤立的提供商,并且绝不允许模型安装该技能。
- 需要人性化。 每一次压制都需要一个所有者、理由、范围和到期日。
- 测试运行时边界。 从没有秘密、只读固定装置、域白名单和一次性帐户开始。
- 重新扫描更新。 触发源更改、依赖项锁定更改、规则包版本和新披露的 CVE。
| 寻找 | 建议登机口 | 异常证据 |
|---|---|---|
| 关键/高污染或执行链 | 硬块 | 安全审查加代码修复;避免永久压制 |
| 外部网络目的地 | 除非列入许可名单,否则阻止 | 商业目的、数据分类、域和有效负载证明 |
| 取消固定的依赖关系 | 区块释放 | 锁定文件/哈希和受控更新过程 |
| 广泛的触发器或通配符权限 | 需要缩小范围 | 展示的需求和运行时审批控制 |
| 低严重度的卫生问题 | 警告并注明截止日期 | 业主和补救票 |
如何评价检测质量
创建一个类似于您的组织安装的技能的标记语料库。包括合法使用子流程或网络 API 的干净技能、每个相关规则系列的故意易受攻击的固定装置、多语言指令、编码文本、重命名工具和连锁行为。分割语料库,这样调整示例就不会成为唯一的测试集。
| 公制 | 问题已回答 | 为什么这很重要 |
|---|---|---|
| 按严重性/类别召回 | 发现了多少已知危险案例? | 高总体速率可以隐藏凭证泄露的零覆盖率 |
| 精度 | 有多少警报可以采取行动? | 低精度训练开发者绕过大门 |
| 处置时间 | 人体分类需要多长时间? | 衡量实际运营成本 |
| 增量扫描时间 | 检查是否可以在每次更改时运行? | 慢门迁移到不频繁的审计 |
| 语义稳定性 | 重复/模型版本运行是否一致? | 暴露不确定性的政策结果 |
| 逃逸率 | 通过后运行时出现了哪些危险行为? | 测试整个入场系统,而不仅仅是扫描仪 |
SARIF 和报告
SARIF 输出可以上传到 GitHub 代码扫描,以便结果出现在源位置并参与存储库的正常安全工作流程。 JSON 对于策略引擎和纵向指标来说更好; Markdown 有助于人工审阅数据包;本地终端输出方便。确认固定版本中的退出代码行为并显式实施门,而不是假设创建报告会导致构建失败。
报告本身可以包含敏感片段、内部路径和可疑指令。限制工件保留和访问。不要在公共拉取请求中发布包含令牌或漏洞利用有效负载的完整发现。
替代方案和补充控制
| 选项 | 最佳使用 | 与 SkillSpector 的关系 |
|---|---|---|
| 思科人工智能防御技能扫描仪 | 另一种以特工技能为中心的多引擎扫描仪 | 比较覆盖率和误报;独立引擎可以实现检测多样化 |
| Semgrep/CodeQL | 深度特定于语言的静态分析和自定义组织规则 | 补充代理指令和 MCP 特定检查 |
| OSV-扫描仪/Dependabot | 依赖漏洞和更新工作流程 | 比一种嵌入式查找更广泛的依赖操作 |
| YARA/反恶意软件沙箱 | 已知的恶意软件和动态行为 | 对于面向 Markdown 的分析之外的有效负载很有用 |
| 手动许可名单 + 签名目录 | 高度控制的环境,批准的技能很少 | 减少供应链的可变性;仍然扫描每个签名的版本 |
| 运行时沙箱/策略引擎 | 强制执行文件、网络、机密和审批边界 | 必要的补偿,因为预安装扫描无法观察到一切 |
常见问题解答
低分是否意味着技能是安全的?
不。这意味着固定扫描仪版本没有积累许多公认的发现。盲点、运行时行为和供应链替代仍然是可能的。
SkillSpector 是否执行该技能?
不。它的记录限制是静态分析而不是动态执行。使用单独的沙箱进行运行时测试。
它可以扫描远程 Git 存储库吗?
是的,还有 URL、zip 存档、目录和单个文件。为了实现可重复性,请扫描不可变的提交或哈希,而不是可变的分支 URL。
需要LLM分析吗?
不。 --no-llm 仅静态运行。语义分析是可选的,可以使用托管提供程序或本地 OpenAI 兼容端点。
如果没有 OSV 网络访问会发生什么?
扫描仪会退回到一个小的内置列表,因此依赖性漏洞的覆盖范围不太最新且不全面。在报告中记录降级状态。
谁应该拥有最终决定权?
指定的安全或平台审核员,并听取技能职能所有者的意见。扫描仪提供结果;它不应该授予安装权限。
来源与验证
- 官方 SkillSpector 存储库和自述文件
- 官方安全政策
- 有关经过验证的技能和 SkillSpector 的 NVIDIA 技术文章
- NVIDIA 验证的代理技能目录
- OSV API 文档
- GitHub SARIF 上传文档
- OWASP 针对 LLM 申请风险的指南
- MITRE ATLAS 对抗性威胁知识库
- 思科 AI Defense 技能扫描仪比较
上次审核日期为 2026 年 7 月 26 日。模式计数、提供程序、默认模型和 CLI 行为可能会发生变化。在采用门之前固定扫描仪版本并验证当前存储库。

