.NET Skill库安全机制完全清单:外部引用扫描、域名白名单与依赖准入一次讲透
2026/9/18 18:37:03 网站建设 项目流程

.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.mdreferences/目录下的 Markdown 文件,逐行识别以下问题:

  • 未知域名(EXTERNAL-DOMAIN):内容中出现的任何 URL,其域名不在白名单中即被拦截,并提示"如果是有意引用,请将其加入 known-domains 文件";
  • 明文 HTTP(HTTP-NOT-HTTPS):非本地的http://链接一律标记,强制使用 HTTPS;
  • 管道即执行(PIPE-TO-SHELL):识别curl … | sh这类"下载即执行"的危险模式,仅白名单中的 .NET 官方安装脚本可豁免;
  • 无完整性校验的外部脚本(SCRIPT-NO-SRI)<script>标签引用外部资源时必须带 SRI 完整性属性,防止资源被篡改。

扫描器还会智能跳过占位符域名(如example.comyourusername),并正确处理代码围栏内的内容——围栏内放宽 HTTPS 检查,但域名白名单检查依然生效,兼顾了文档示例与实际链接的区分。

域名白名单:最小权限的引用管控

eng/known-domains.txt 是引用扫描的信任根,采用"一行一个域名"的极简格式,按用途分组维护:

  • 标准类dot.netmicrosoft.commodelcontextprotocol.io等;
  • 工具类:NuGet、Sysinternals 下载、符号服务器等特定工具域名;
  • 平台类:Android、Apple 开发者文档;
  • 仓库类github.com/dotnet/*系列官方仓库(精确到仓库路径前缀);
  • 社区类:Stack Overflow、xunit.net 等。

白名单支持两种匹配粒度:裸域名(如microsoft.com)会放行该域名及其全部子域名;带斜杠的路径前缀(如github.com/dotnet/runtime)则只放行该前缀下的 URL,实现更精细的管控。新增域名的流程也很清晰:在 PR 中一并提交域名条目,由评审人随技能内容一起批准。

依赖准入:四类外部依赖逐一过审

外部依赖检查器负责结构层面的"准入审查",它关注的不是 URL,而是技能对外部能力的结构性依赖:

  1. 捆绑脚本:技能scripts/目录下的.ps1.sh.py等脚本文件会被标记——"技能一般不应捆绑可执行脚本";
  2. INVOKES 外部脚本:技能描述中声明调用外部脚本的模式会被拦截审查;
  3. 非内置工具引用:内容中#tool:引用的工具若不在内置工具清单(read、search、bash、powershell 等)中,需人工确认其必要性;
  4. 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

新手快速上手:三步理解这套机制

  1. 写技能→ 内容中只引用已知域名,避免捆绑脚本和管道执行命令;
  2. 跑检查check子命令会列出所有发现项,并给出对应的白名单登记键;
  3. 做决策→ 保留依赖就登记到白名单,移除依赖则直接删掉,保持白名单随时间"收敛"。

这套"扫描—白名单—准入"的三层设计,让技能库既能保持开放生态,又确保每一个外部引用都经过人工审查,为 AI 编码智能体筑起了一道清晰的安全边界。🔐

【免费下载链接】skillsRepository for skills to assist AI coding agents with .NET and C#项目地址: https://gitcode.com/GitHub_Trending/skills17/skills

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询