.NET Skill库安全机制完全清单:外部引用扫描、域名白名单与依赖准入一次讲透
【免费下载链接】skillsRepository for skills to assist AI coding agents with .NET and C#项目地址: https://gitcode.com/GitHub_Trending/skills17/skills
🛡️ 本文带你完整看懂dotnet/skills仓库为 AI 编码智能体技能(Skills)建立的三道安全防线:外部引用扫描、域名白名单与依赖准入机制。这个仓库为 AI 编码智能体提供 .NET 和 C# 开发技能,所有技能文件在安装前都会经过静态安全分析,确保不会夹带未知域名、危险脚本或未经审查的外部依赖。
为什么 AI 技能库需要安全机制?
技能文件(SKILL.md)会直接指导 AI 智能体执行操作:读写文件、调用工具、引用外部链接。一旦技能内容中混入恶意链接或可疑脚本,风险会被智能体"照单全收"。因此,这个仓库内置了一套名为skill-validator的静态检查工具(位于 eng/skill-validator/),在不需要 LLM 的情况下,用check子命令对每个插件、技能、智能体做安全体检。
安全机制全清单:一张表看懂
| # | 检查项 | 防护目标 | 核心文件 |
|---|---|---|---|
| 1 | 外部引用扫描 | 逐行扫描技能内容中的 URL 与危险模式 | ReferenceScanner.cs |
| 2 | 域名白名单 | 只放行已知可信域名 | eng/known-domains.txt |
| 3 | 依赖准入 | 脚本、工具引用、MCP 服务器需白名单放行 | ExternalDependencyChecker.cs |
| 4 | 依赖白名单 | 记录已人工批准的例外项 | eng/allowed-external-deps.txt |
| 5 | 静态检查入口 | 无 LLM 的check命令统一执行 | CheckCommand.cs |
外部引用扫描:逐行拦截四类风险
外部引用扫描器会扫描所有SKILL.md、*.agent.md及references/目录下的 Markdown 文件,逐行识别以下问题:
- 未知域名(EXTERNAL-DOMAIN):内容中出现的任何 URL,其域名不在白名单中即被拦截,并提示"如果是有意引用,请将其加入 known-domains 文件";
- 明文 HTTP(HTTP-NOT-HTTPS):非本地的
http://链接一律标记,强制使用 HTTPS; - 管道即执行(PIPE-TO-SHELL):识别
curl … | sh这类"下载即执行"的危险模式,仅白名单中的 .NET 官方安装脚本可豁免; - 无完整性校验的外部脚本(SCRIPT-NO-SRI):
<script>标签引用外部资源时必须带 SRI 完整性属性,防止资源被篡改。
扫描器还会智能跳过占位符域名(如example.com、yourusername),并正确处理代码围栏内的内容——围栏内放宽 HTTPS 检查,但域名白名单检查依然生效,兼顾了文档示例与实际链接的区分。
域名白名单:最小权限的引用管控
eng/known-domains.txt 是引用扫描的信任根,采用"一行一个域名"的极简格式,按用途分组维护:
- 标准类:
dot.net、microsoft.com、modelcontextprotocol.io等; - 工具类:NuGet、Sysinternals 下载、符号服务器等特定工具域名;
- 平台类:Android、Apple 开发者文档;
- 仓库类:
github.com/dotnet/*系列官方仓库(精确到仓库路径前缀); - 社区类:Stack Overflow、xunit.net 等。
白名单支持两种匹配粒度:裸域名(如microsoft.com)会放行该域名及其全部子域名;带斜杠的路径前缀(如github.com/dotnet/runtime)则只放行该前缀下的 URL,实现更精细的管控。新增域名的流程也很清晰:在 PR 中一并提交域名条目,由评审人随技能内容一起批准。
依赖准入:四类外部依赖逐一过审
外部依赖检查器负责结构层面的"准入审查",它关注的不是 URL,而是技能对外部能力的结构性依赖:
- 捆绑脚本:技能
scripts/目录下的.ps1、.sh、.py等脚本文件会被标记——"技能一般不应捆绑可执行脚本"; - INVOKES 外部脚本:技能描述中声明调用外部脚本的模式会被拦截审查;
- 非内置工具引用:内容中
#tool:引用的工具若不在内置工具清单(read、search、bash、powershell 等)中,需人工确认其必要性; - MCP 服务器声明:
plugin.json中声明的 MCP 服务器会逐一检查,确保每个服务器依赖都是有意为之。
此外还有一个容易被忽略的跨宿主工具可移植性检查:同一个能力在 Copilot CLI、Claude Code、Gemini CLI 三个宿主中的工具名拼写不同,若智能体只为一个宿主声明了工具,在其他宿主上会"悄悄失能"——检查器会主动提示补齐所有宿主的拼写。
所有发现项均为建议级(advisory):作者可以有意保留依赖,只需在 eng/allowed-external-deps.txt 白名单中登记类型:名称:细节格式的条目(如script:技能名:脚本路径),即可放行。该文件的注释明确写着"当此文件清空且所有检查通过后,这些检查将升级为硬性错误"——这正是渐进式收紧安全策略的典型设计。
一条命令跑通安全检查
完成技能开发后,用下面的命令对整个插件目录做安全体检(无需 LLM、无需 token):
skill-validator check --plugin ./plugins/my-plugin \ --allowed-external-deps ./eng/allowed-external-deps.txt \ --known-domains ./eng/known-domains.txt完整的参数说明与使用示例见 eng/skill-validator/src/README.md,测试用例可参考 tests/ 目录下各插件的eval.yaml。
新手快速上手:三步理解这套机制
- 写技能→ 内容中只引用已知域名,避免捆绑脚本和管道执行命令;
- 跑检查→
check子命令会列出所有发现项,并给出对应的白名单登记键; - 做决策→ 保留依赖就登记到白名单,移除依赖则直接删掉,保持白名单随时间"收敛"。
这套"扫描—白名单—准入"的三层设计,让技能库既能保持开放生态,又确保每一个外部引用都经过人工审查,为 AI 编码智能体筑起了一道清晰的安全边界。🔐
【免费下载链接】skillsRepository for skills to assist AI coding agents with .NET and C#项目地址: https://gitcode.com/GitHub_Trending/skills17/skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考