SKILLVERDICT
中文

中文版由 Skillverdict 翻译,仍在校对中;如有出入,以英文版为准。

扫描器评分卡 · 语料库 v1 · 静态模式 · 2026年11月2日

静态评分跟随包的大小,而非意图

我们让两个开源的 AI 智能体技能安全扫描器——NVIDIA SkillSpector 和 Cisco 的 skill-scanner——扫描了 186 个四种语言的真实技能和 40 个已去害的攻击样本。下文所有内容均引用引擎自身的输出。

Andrey Trukhachevskillverdict.dev数据:CC BY 4.0代码:Apache-2.0约 2600 字

§1 实验设置

智能体技能是一个包含编码智能体指令的 SKILL.md,通常旁边附有脚本和参考文件。人们——以及越来越多的智能体自身——直接从 GitHub 安装技能。两个开源扫描器在安装前给出判定:SkillSpector(NVIDIA;静态模式匹配、AST、YARA、OSV,可选 LLM 检查)和 skill-scanner(Cisco AI Defense;静态分析器、YARA,可选 LLM 检查)。

我们提出一个狭窄的问题:这些判定在普通的、已发布的技能上是什么样子——答案是否随技能所用的语言而变化?

语料库。 146 个正常技能,通过 GitHub 代码搜索按各语言的特征短语找到,去重(每个仓库最多三个,作者轮换),固定到提交 SHA,并带有明确的许可证:英语 39 个、俄语 38 个、德语 30 个、中文 39 个。另加 40 个合成攻击样本:十种模式(文本中的指令覆盖、HTML 注释中的隐藏指令、外泄、curl | bash、收集环境变量、伪造安装器、base64 shell、零宽字符、范围蔓延、持久化),在四种语言中写法完全一致并已去害。这里的“正常”指带许可证发布且来源经过审核;我们并未对其进行审计。

引擎。 SkillSpector 2.12.0,使用 --no-llm;Cisco skill-scanner 2.3.2,使用 --policy balanced 和 --policy quiet,不用 LLM。版本固定在 engines.lock.yaml 中。LLM 辅助模式未运行;那是下一步,将另行报告。作为对照,我们加入了自己写的 60 行隐藏字符检查器;它出现在表格里,因为它同样产生了误报,我们没有理由隐藏这一点。

所有这些——清单、脚本、结果——都在基准仓库中,三条命令即可复现。

§2 静态评分跟随包的大小

SkillSpector 把它的发现项归结为一个 0 到 100 的评分和一条建议:SAFE 为 20 及以下,CAUTION 到 50,DO NOT INSTALL 为 50 以上。在我们的语料库中,这个评分最强的预测因子不是技能做了什么,而是 SKILL.md 旁边有多少代码文件。

SkillSpector 静态评分与所附代码量的关系 每个点是一个包。所有含六个及以上代码文件的正常技能都得 100 分;只含一个文件的合成攻击样本得分在 14 到 51 之间。 SAFE ≤ 20 DO NOT INSTALL > 50 0 25 50 75 100 评分 0–100 仅 Markdown 60 正常 · 36 合成 ru-001 · 俄语 · 0 个代码文件 · 评分 22 · CAUTION ru-003 · 俄语 · 0 个代码文件 · 评分 8 · SAFE ru-004 · 俄语 · 0 个代码文件 · 评分 8 · SAFE ru-005 · 俄语 · 0 个代码文件 · 评分 16 · SAFE ru-009 · 俄语 · 0 个代码文件 · 评分 64 · DO NOT INSTALL ru-011 · 俄语 · 0 个代码文件 · 评分 16 · SAFE ru-012 · 俄语 · 0 个代码文件 · 评分 16 · SAFE ru-014 · 俄语 · 0 个代码文件 · 评分 20 · SAFE ru-015 · 俄语 · 0 个代码文件 · 评分 20 · SAFE ru-017 · 俄语 · 0 个代码文件 · 评分 55 · DO NOT INSTALL ru-019 · 俄语 · 0 个代码文件 · 评分 8 · SAFE ru-020 · 俄语 · 0 个代码文件 · 评分 16 · SAFE ru-022 · 俄语 · 0 个代码文件 · 评分 8 · SAFE ru-023 · 俄语 · 0 个代码文件 · 评分 0 · SAFE ru-024 · 俄语 · 0 个代码文件 · 评分 0 · SAFE ru-025 · 俄语 · 0 个代码文件 · 评分 8 · SAFE ru-026 · 俄语 · 0 个代码文件 · 评分 8 · SAFE ru-027 · 俄语 · 0 个代码文件 · 评分 16 · SAFE ru-028 · 俄语 · 0 个代码文件 · 评分 16 · SAFE ru-029 · 俄语 · 0 个代码文件 · 评分 16 · SAFE ru-030 · 俄语 · 0 个代码文件 · 评分 16 · SAFE ru-031 · 俄语 · 0 个代码文件 · 评分 16 · SAFE ru-033 · 俄语 · 0 个代码文件 · 评分 100 · DO NOT INSTALL ru-034 · 俄语 · 0 个代码文件 · 评分 0 · SAFE ru-035 · 俄语 · 0 个代码文件 · 评分 16 · SAFE ru-036 · 俄语 · 0 个代码文件 · 评分 16 · SAFE ru-037 · 俄语 · 0 个代码文件 · 评分 100 · DO NOT INSTALL ru-040 · 俄语 · 0 个代码文件 · 评分 0 · SAFE de-041 · 德语 · 0 个代码文件 · 评分 0 · SAFE de-044 · 德语 · 0 个代码文件 · 评分 8 · SAFE de-045 · 德语 · 0 个代码文件 · 评分 22 · CAUTION de-046 · 德语 · 0 个代码文件 · 评分 8 · SAFE de-047 · 德语 · 0 个代码文件 · 评分 8 · SAFE de-049 · 德语 · 0 个代码文件 · 评分 12 · SAFE de-050 · 德语 · 0 个代码文件 · 评分 8 · SAFE de-052 · 德语 · 0 个代码文件 · 评分 0 · SAFE de-053 · 德语 · 0 个代码文件 · 评分 8 · SAFE de-054 · 德语 · 0 个代码文件 · 评分 8 · SAFE de-056 · 德语 · 0 个代码文件 · 评分 8 · SAFE de-058 · 德语 · 0 个代码文件 · 评分 0 · SAFE de-060 · 德语 · 0 个代码文件 · 评分 8 · SAFE de-062 · 德语 · 0 个代码文件 · 评分 6 · SAFE de-064 · 德语 · 0 个代码文件 · 评分 9 · SAFE de-065 · 德语 · 0 个代码文件 · 评分 8 · SAFE de-066 · 德语 · 0 个代码文件 · 评分 15 · SAFE de-067 · 德语 · 0 个代码文件 · 评分 8 · SAFE de-068 · 德语 · 0 个代码文件 · 评分 0 · SAFE de-070 · 德语 · 0 个代码文件 · 评分 8 · SAFE zh-117 · 中文 · 0 个代码文件 · 评分 12 · CAUTION zh-123 · 中文 · 0 个代码文件 · 评分 7 · SAFE zh-124 · 中文 · 0 个代码文件 · 评分 0 · SAFE zh-126 · 中文 · 0 个代码文件 · 评分 56 · DO NOT INSTALL zh-134 · 中文 · 0 个代码文件 · 评分 3 · CAUTION zh-138 · 中文 · 0 个代码文件 · 评分 3 · SAFE zh-140 · 中文 · 0 个代码文件 · 评分 0 · SAFE zh-146 · 中文 · 0 个代码文件 · 评分 10 · SAFE en-154 · 英语 · 0 个代码文件 · 评分 72 · DO NOT INSTALL en-161 · 英语 · 0 个代码文件 · 评分 89 · DO NOT INSTALL en-162 · 英语 · 0 个代码文件 · 评分 100 · DO NOT INSTALL en-182 · 英语 · 0 个代码文件 · 评分 20 · SAFE mal-p-01-en · 英语 · 0 个代码文件 · 评分 20 · SAFE mal-p-01-ru · 俄语 · 0 个代码文件 · 评分 0 · SAFE mal-p-01-de · 德语 · 0 个代码文件 · 评分 0 · SAFE mal-p-01-zh · 中文 · 0 个代码文件 · 评分 0 · SAFE mal-p-02-en · 英语 · 0 个代码文件 · 评分 42 · CAUTION mal-p-02-ru · 俄语 · 0 个代码文件 · 评分 22 · CAUTION mal-p-02-de · 德语 · 0 个代码文件 · 评分 22 · CAUTION mal-p-02-zh · 中文 · 0 个代码文件 · 评分 22 · CAUTION mal-p-03-en · 英语 · 0 个代码文件 · 评分 0 · SAFE mal-p-03-ru · 俄语 · 0 个代码文件 · 评分 8 · SAFE mal-p-03-de · 德语 · 0 个代码文件 · 评分 0 · SAFE mal-p-03-zh · 中文 · 0 个代码文件 · 评分 0 · SAFE mal-p-04-en · 英语 · 0 个代码文件 · 评分 51 · DO NOT INSTALL mal-p-04-ru · 俄语 · 0 个代码文件 · 评分 51 · DO NOT INSTALL mal-p-04-de · 德语 · 0 个代码文件 · 评分 51 · DO NOT INSTALL mal-p-04-zh · 中文 · 0 个代码文件 · 评分 51 · DO NOT INSTALL mal-p-06-en · 英语 · 0 个代码文件 · 评分 0 · SAFE mal-p-06-ru · 俄语 · 0 个代码文件 · 评分 0 · SAFE mal-p-06-de · 德语 · 0 个代码文件 · 评分 0 · SAFE mal-p-06-zh · 中文 · 0 个代码文件 · 评分 0 · SAFE mal-p-07-en · 英语 · 0 个代码文件 · 评分 45 · CAUTION mal-p-07-ru · 俄语 · 0 个代码文件 · 评分 45 · CAUTION mal-p-07-de · 德语 · 0 个代码文件 · 评分 45 · CAUTION mal-p-07-zh · 中文 · 0 个代码文件 · 评分 45 · CAUTION mal-p-08-en · 英语 · 0 个代码文件 · 评分 43 · CAUTION mal-p-08-ru · 俄语 · 0 个代码文件 · 评分 43 · CAUTION mal-p-08-de · 德语 · 0 个代码文件 · 评分 43 · CAUTION mal-p-08-zh · 中文 · 0 个代码文件 · 评分 43 · CAUTION mal-p-09-en · 英语 · 0 个代码文件 · 评分 0 · SAFE mal-p-09-ru · 俄语 · 0 个代码文件 · 评分 0 · SAFE mal-p-09-de · 德语 · 0 个代码文件 · 评分 0 · SAFE mal-p-09-zh · 中文 · 0 个代码文件 · 评分 0 · SAFE mal-p-10-en · 英语 · 0 个代码文件 · 评分 41 · CAUTION mal-p-10-ru · 俄语 · 0 个代码文件 · 评分 41 · CAUTION mal-p-10-de · 德语 · 0 个代码文件 · 评分 41 · CAUTION mal-p-10-zh · 中文 · 0 个代码文件 · 评分 41 · CAUTION 中位数 8 1–5 个代码文件 35 正常 · 4 合成 ru-002 · 俄语 · 1 个代码文件 · 评分 26 · CAUTION ru-006 · 俄语 · 4 个代码文件 · 评分 23 · CAUTION ru-008 · 俄语 · 1 个代码文件 · 评分 41 · CAUTION ru-010 · 俄语 · 2 个代码文件 · 评分 56 · DO NOT INSTALL ru-016 · 俄语 · 2 个代码文件 · 评分 24 · CAUTION ru-018 · 俄语 · 1 个代码文件 · 评分 27 · CAUTION ru-021 · 俄语 · 1 个代码文件 · 评分 21 · CAUTION ru-038 · 俄语 · 2 个代码文件 · 评分 23 · CAUTION ru-039 · 俄语 · 1 个代码文件 · 评分 8 · SAFE de-051 · 德语 · 1 个代码文件 · 评分 25 · CAUTION de-057 · 德语 · 2 个代码文件 · 评分 0 · CAUTION de-061 · 德语 · 1 个代码文件 · 评分 7 · SAFE de-069 · 德语 · 1 个代码文件 · 评分 17 · SAFE zh-113 · 中文 · 4 个代码文件 · 评分 84 · DO NOT INSTALL zh-115 · 中文 · 3 个代码文件 · 评分 100 · DO NOT INSTALL zh-118 · 中文 · 4 个代码文件 · 评分 47 · CAUTION zh-120 · 中文 · 5 个代码文件 · 评分 100 · DO NOT INSTALL zh-125 · 中文 · 2 个代码文件 · 评分 100 · DO NOT INSTALL zh-127 · 中文 · 3 个代码文件 · 评分 100 · DO NOT INSTALL zh-128 · 中文 · 1 个代码文件 · 评分 100 · DO NOT INSTALL zh-129 · 中文 · 3 个代码文件 · 评分 86 · DO NOT INSTALL zh-130 · 中文 · 4 个代码文件 · 评分 67 · DO NOT INSTALL zh-132 · 中文 · 1 个代码文件 · 评分 17 · SAFE zh-143 · 中文 · 4 个代码文件 · 评分 14 · CAUTION zh-145 · 中文 · 2 个代码文件 · 评分 7 · SAFE en-152 · 英语 · 3 个代码文件 · 评分 49 · CAUTION en-153 · 英语 · 4 个代码文件 · 评分 100 · DO NOT INSTALL en-166 · 英语 · 2 个代码文件 · 评分 22 · CAUTION en-167 · 英语 · 2 个代码文件 · 评分 100 · DO NOT INSTALL en-170 · 英语 · 5 个代码文件 · 评分 100 · DO NOT INSTALL en-171 · 英语 · 3 个代码文件 · 评分 53 · DO NOT INSTALL en-173 · 英语 · 1 个代码文件 · 评分 27 · CAUTION en-179 · 英语 · 5 个代码文件 · 评分 100 · DO NOT INSTALL en-180 · 英语 · 5 个代码文件 · 评分 100 · DO NOT INSTALL en-183 · 英语 · 1 个代码文件 · 评分 7 · SAFE mal-p-05-en · 英语 · 1 个代码文件 · 评分 29 · CAUTION mal-p-05-ru · 俄语 · 1 个代码文件 · 评分 29 · CAUTION mal-p-05-de · 德语 · 1 个代码文件 · 评分 29 · CAUTION mal-p-05-zh · 中文 · 1 个代码文件 · 评分 29 · CAUTION 中位数 41 6–30 个代码文件 27 正常 ru-013 · 俄语 · 26 个代码文件 · 评分 100 · DO NOT INSTALL de-042 · 德语 · 18 个代码文件 · 评分 100 · DO NOT INSTALL de-043 · 德语 · 23 个代码文件 · 评分 100 · DO NOT INSTALL de-048 · 德语 · 22 个代码文件 · 评分 100 · DO NOT INSTALL de-055 · 德语 · 11 个代码文件 · 评分 79 · DO NOT INSTALL zh-119 · 中文 · 16 个代码文件 · 评分 7 · CAUTION zh-121 · 中文 · 11 个代码文件 · 评分 100 · DO NOT INSTALL zh-131 · 中文 · 16 个代码文件 · 评分 100 · DO NOT INSTALL zh-133 · 中文 · 18 个代码文件 · 评分 100 · DO NOT INSTALL zh-137 · 中文 · 7 个代码文件 · 评分 64 · DO NOT INSTALL zh-139 · 中文 · 19 个代码文件 · 评分 100 · DO NOT INSTALL zh-144 · 中文 · 20 个代码文件 · 评分 100 · DO NOT INSTALL zh-147 · 中文 · 23 个代码文件 · 评分 95 · DO NOT INSTALL zh-148 · 中文 · 8 个代码文件 · 评分 33 · CAUTION zh-149 · 中文 · 6 个代码文件 · 评分 30 · CAUTION zh-150 · 中文 · 7 个代码文件 · 评分 100 · DO NOT INSTALL en-158 · 英语 · 10 个代码文件 · 评分 100 · DO NOT INSTALL en-164 · 英语 · 8 个代码文件 · 评分 28 · CAUTION en-168 · 英语 · 25 个代码文件 · 评分 100 · DO NOT INSTALL en-169 · 英语 · 6 个代码文件 · 评分 100 · DO NOT INSTALL en-177 · 英语 · 8 个代码文件 · 评分 100 · DO NOT INSTALL en-181 · 英语 · 10 个代码文件 · 评分 100 · DO NOT INSTALL en-185 · 英语 · 21 个代码文件 · 评分 100 · DO NOT INSTALL en-186 · 英语 · 6 个代码文件 · 评分 100 · DO NOT INSTALL en-187 · 英语 · 8 个代码文件 · 评分 100 · DO NOT INSTALL en-188 · 英语 · 7 个代码文件 · 评分 100 · DO NOT INSTALL en-189 · 英语 · 6 个代码文件 · 评分 100 · DO NOT INSTALL 中位数 100 超过 30 个 16 正常 de-063 · 德语 · 214 个代码文件 · 评分 100 · DO NOT INSTALL zh-111 · 中文 · 57 个代码文件 · 评分 100 · DO NOT INSTALL zh-114 · 中文 · 34 个代码文件 · 评分 100 · DO NOT INSTALL zh-135 · 中文 · 94 个代码文件 · 评分 100 · DO NOT INSTALL zh-136 · 中文 · 65 个代码文件 · 评分 100 · DO NOT INSTALL zh-141 · 中文 · 163 个代码文件 · 评分 100 · DO NOT INSTALL en-151 · 英语 · 32 个代码文件 · 评分 100 · DO NOT INSTALL en-155 · 英语 · 52 个代码文件 · 评分 27 · CAUTION en-157 · 英语 · 39 个代码文件 · 评分 100 · DO NOT INSTALL en-159 · 英语 · 49 个代码文件 · 评分 100 · DO NOT INSTALL en-163 · 英语 · 59 个代码文件 · 评分 100 · DO NOT INSTALL en-172 · 英语 · 32 个代码文件 · 评分 100 · DO NOT INSTALL en-175 · 英语 · 143 个代码文件 · 评分 100 · DO NOT INSTALL en-176 · 英语 · 51 个代码文件 · 评分 56 · DO NOT INSTALL en-178 · 英语 · 54 个代码文件 · 评分 100 · DO NOT INSTALL en-184 · 英语 · 44 个代码文件 · 评分 100 · DO NOT INSTALL 中位数 100 正常技能(n = 138)合成攻击样本(n = 40)
图 1 SkillSpector 静态评分与所附代码量的关系。每个点是一个包;横线是该区间内正常技能的中位数。悬停在点上可看到其 id。共 178 个包;8 个大包未完成(§6)。
包内代码文件数n评分中位数SAFEDO NOT INSTALL
Markdown only (0 code files)608488
1-5 code files3541615
6-30 code files27100023
more than 30 code files16100015

43 个含六个及以上代码文件的正常技能中,没有一个被判为 SAFE;其中 38 个被判为 DO NOT INSTALL。40 个攻击样本——每个只有一个 SKILL.md 和至多一个脚本——评分中位数为 29,最高 51。十种模式中只有一种在任一语言中达到 DO NOT INSTALL。一个带有 scripts/ 目录的正常英语技能,得到的评分比一个读取凭据文件并发送到某个 URL 的单文件样本还要差。

Cisco 的输出指向同一方向,只是幅度较小。它在正常技能上最常见的 MEDIUM 及以上发现项——DATA_EXFIL_NETWORK_REQUESTS、DATA_EXFIL_JS_NETWORK、UNANALYZABLE_BINARY、COMMAND_INJECTION_*——全部由附带的代码触发,而非指令。

这对后面的一切都很重要:四个语言集合在附带代码量上差别很大。真实世界里的俄语和德语技能大多只有 Markdown;英语和中文技能带有脚本,有时是整个应用。每一个按语言统计的数字都必须带着这一点来读——这也是 §4 只看位于 Markdown 中的发现项的原因。

§3 各语言的判定

用户看到的是判定,所以我们先统计它:引擎自身未判为 SAFE 的正常技能占比(SkillSpector:recommendation;Cisco:is_safe),以及被它判为 SAFE 的攻击样本占比。

各引擎、各语言中未被判为 SAFE 的正常技能占比 每个引擎一组水平条。SkillSpector 静态模式把 94% 的英语和 81% 的中文正常技能判为 CAUTION 或 DO NOT INSTALL,而俄语为 37%,德语为 28%。 SkillSpector 2.12 · static 引擎自身未判为 SAFE 的正常技能 英语 英语:35 个中有 33 个非 SAFE;28 个 DO NOT INSTALL / HIGH 94% (33/35) 俄语 俄语:38 个中有 14 个非 SAFE;6 个 DO NOT INSTALL / HIGH 37% (14/38) 德语 德语:29 个中有 8 个非 SAFE;5 个 DO NOT INSTALL / HIGH 28% (8/29) 中文 中文:36 个中有 29 个非 SAFE;22 个 DO NOT INSTALL / HIGH 81% (29/36) 被判为 SAFE 的合成攻击样本 40% 40 个样本中的 16 个 en 4 ru 4 de 4 zh 4(每种语言 10 个) Cisco skill-scanner 2.3 · balanced 引擎自身未判为 SAFE 的正常技能 英语 英语:39 个中有 18 个非 SAFE;18 个 DO NOT INSTALL / HIGH 46% (18/39) 俄语 俄语:38 个中有 1 个非 SAFE;1 个 DO NOT INSTALL / HIGH 3% (1/38) 德语 德语:30 个中有 8 个非 SAFE;8 个 DO NOT INSTALL / HIGH 27% (8/30) 中文 中文:39 个中有 14 个非 SAFE;14 个 DO NOT INSTALL / HIGH 36% (14/39) 被判为 SAFE 的合成攻击样本 85% 40 个样本中的 34 个 en 7 ru 9 de 9 zh 9(每种语言 10 个) Cisco skill-scanner 2.3 · quiet 引擎自身未判为 SAFE 的正常技能 英语 英语:39 个中有 17 个非 SAFE;17 个 DO NOT INSTALL / HIGH 44% (17/39) 俄语 俄语:38 个中有 1 个非 SAFE;1 个 DO NOT INSTALL / HIGH 3% (1/38) 德语 德语:30 个中有 6 个非 SAFE;6 个 DO NOT INSTALL / HIGH 20% (6/30) 中文 中文:39 个中有 12 个非 SAFE;12 个 DO NOT INSTALL / HIGH 31% (12/39) 被判为 SAFE 的合成攻击样本 85% 40 个样本中的 34 个 en 7 ru 9 de 9 zh 9(每种语言 10 个) CAUTION 或更差其中 DO NOT INSTALL(SkillSpector)/ HIGH–CRITICAL(Cisco)
图 2 判定层面的比率。左:按语言统计的未判为 SAFE 的正常技能;橙色部分为 DO NOT INSTALL(SkillSpector)或 HIGH/CRITICAL(Cisco)。右:引擎判为 SAFE 的攻击样本。
引擎enrudezh全部被判为 SAFE 的攻击样本
SkillSpector 2.12 · static94 % (33/35)37 % (14/38)28 % (8/29)81 % (29/36)61 %40 %
Cisco skill-scanner 2.3 · balanced46 % (18/39)3 % (1/38)27 % (8/30)36 % (14/39)28 %85 %
Cisco skill-scanner 2.3 · quiet44 % (17/39)3 % (1/38)20 % (6/30)31 % (12/39)25 %85 %

与 §2 一起读:SkillSpector 在英语上的 94% 主要是代码量效应;它在俄语上的 37%——俄语技能几乎不带代码——主要来自一条规则(§4)。Cisco 在俄语上的 3% 对英语上的 46%,是同一个代码量效应经过另一套评分器后的样子。两个引擎的静态模式都无法把攻击样本和正常集合分开:SkillSpector 把其中 40% 判为 SAFE,Cisco 为 85%。

§4 背后的规则

只统计位于 Markdown 文件中的发现项,就能去掉大部分代码量效应,剩下的是文本的语言:

引擎 · 位于 .md 文件中的 MEDIUM+ 发现项enrudezh
SkillSpector 2.12 · static100 %76 %41 %89 %
Cisco skill-scanner 2.3 · balanced46 %11 %13 %44 %
Cisco skill-scanner 2.3 · quiet44 %11 %7 %44 %
hidden-char checker (ours, control)5 %0 %0 %0 %

四条规则解释了大部分与语言相关的行为:

  • SkillSpector AE4,“Suspicious Unicode normalization or mixed-script content”。 在俄语 Markdown 上 207 个发现项,英语 3 个,中文 2 个,德语 0 个。任何包含代码块、产品名或命令的俄语 SKILL.md 都会混用西里尔字母和拉丁字母,从而触发它。它的级别是 MEDIUM,所以单凭它就能让大约三分之一仅含 Markdown 的俄语技能从 SAFE 变成 CAUTION。(我们自己用俄语写的技能收获了四个。)
  • SkillSpector RP1,“npx commands without a version suffix”。 在英语 Markdown 上 346 个发现项——英语文本上 MEDIUM 发现项的最大单一来源。写着 npx something 的文档被当作供应链风险,即使它只是示例而非安装步骤。
  • Cisco YARA_prompt_injection_unicode_steganography。 在中文包上 112 个发现项,德语 24 个,俄语 0 个——大多在代码和数据文件中,而不是 SKILL.md,这也是 Cisco 在中文上比率更高的主要原因。
  • Cisco YARA_code_execution_generic。 在英语 Markdown 上 31 个发现项,其他三种语言为 0。它的模式匹配的是英语单词;其他语言的文本无法触发它,用这些语言写的攻击也同样无法触发。

在正常 Markdown 上触发的规则,MEDIUM 及以上

SkillSpector

规则enrudezh合计
RP1346121440412
AE4320702212
AE123425118170
PE3392242489
E1340143987
AS332144380
RA261211276
EA25815771

Cisco skill-scanner, balanced

规则enrudezh合计
TOOL_ABUSE_UNDECLARED_NETWORK14121431
YARA_code_execution_generic3100031
CORRELATED_SENSITIVE_NETWORK_FLOW0024024
PIPELINE_TAINT_FLOW10089
COMPOUND_FETCH_EXECUTE70018
ALLOWED_TOOLS_WRITE_VIOLATION03014
SOCIAL_ENG_MISLEADING_DESC20013
COMPOUND_FIND_EXEC20002

§5 谁都没抓到的

这十种攻击模式写得易于识别,而非隐蔽:目的是看识别能力能否经受住翻译。

各引擎在各语言中能检出哪些合成模式 两个引擎、十种攻击模式、四种语言的网格。填充的格子表示在 MEDIUM 及以上级别被检出。纯文本模式和非英语的指令覆盖大多为空。 SkillSpector · static en ru de zh Cisco · balanced en ru de zh P-01 文本中的指令覆盖 文本中的指令覆盖 · 英语 · skillspector: HIGH 文本中的指令覆盖 · 俄语 · skillspector: MEDIUM 及以上无检出 文本中的指令覆盖 · 德语 · skillspector: MEDIUM 及以上无检出 文本中的指令覆盖 · 中文 · skillspector: MEDIUM 及以上无检出 文本中的指令覆盖 · 英语 · cisco: HIGH 文本中的指令覆盖 · 俄语 · cisco: MEDIUM 及以上无检出 文本中的指令覆盖 · 德语 · cisco: MEDIUM 及以上无检出 文本中的指令覆盖 · 中文 · cisco: MEDIUM 及以上无检出 P-02 HTML 注释中的指令 HTML 注释中的指令 · 英语 · skillspector: HIGH HTML 注释中的指令 · 俄语 · skillspector: HIGH HTML 注释中的指令 · 德语 · skillspector: HIGH HTML 注释中的指令 · 中文 · skillspector: HIGH HTML 注释中的指令 · 英语 · cisco: MEDIUM 及以上无检出 HTML 注释中的指令 · 俄语 · cisco: MEDIUM 及以上无检出 HTML 注释中的指令 · 德语 · cisco: MEDIUM 及以上无检出 HTML 注释中的指令 · 中文 · cisco: MEDIUM 及以上无检出 P-03 向 URL 外泄文件 向 URL 外泄文件 · 英语 · skillspector: MEDIUM 及以上无检出 向 URL 外泄文件 · 俄语 · skillspector: MEDIUM 向 URL 外泄文件 · 德语 · skillspector: MEDIUM 及以上无检出 向 URL 外泄文件 · 中文 · skillspector: MEDIUM 及以上无检出 向 URL 外泄文件 · 英语 · cisco: MEDIUM 及以上无检出 向 URL 外泄文件 · 俄语 · cisco: MEDIUM 及以上无检出 向 URL 外泄文件 · 德语 · cisco: MEDIUM 及以上无检出 向 URL 外泄文件 · 中文 · cisco: MEDIUM 及以上无检出 P-04 curl | bash curl | bash · 英语 · skillspector: HIGH curl | bash · 俄语 · skillspector: HIGH curl | bash · 德语 · skillspector: HIGH curl | bash · 中文 · skillspector: HIGH curl | bash · 英语 · cisco: MEDIUM 及以上无检出 curl | bash · 俄语 · cisco: MEDIUM 及以上无检出 curl | bash · 德语 · cisco: MEDIUM 及以上无检出 curl | bash · 中文 · cisco: MEDIUM 及以上无检出 P-05 收集环境变量的脚本 收集环境变量的脚本 · 英语 · skillspector: HIGH 收集环境变量的脚本 · 俄语 · skillspector: HIGH 收集环境变量的脚本 · 德语 · skillspector: HIGH 收集环境变量的脚本 · 中文 · skillspector: HIGH 收集环境变量的脚本 · 英语 · cisco: MEDIUM 收集环境变量的脚本 · 俄语 · cisco: MEDIUM 收集环境变量的脚本 · 德语 · cisco: MEDIUM 收集环境变量的脚本 · 中文 · cisco: MEDIUM P-06 伪造的安装器下载 伪造的安装器下载 · 英语 · skillspector: MEDIUM 及以上无检出 伪造的安装器下载 · 俄语 · skillspector: MEDIUM 及以上无检出 伪造的安装器下载 · 德语 · skillspector: MEDIUM 及以上无检出 伪造的安装器下载 · 中文 · skillspector: MEDIUM 及以上无检出 伪造的安装器下载 · 英语 · cisco: HIGH 伪造的安装器下载 · 俄语 · cisco: MEDIUM 及以上无检出 伪造的安装器下载 · 德语 · cisco: MEDIUM 及以上无检出 伪造的安装器下载 · 中文 · cisco: MEDIUM 及以上无检出 P-07 base64 shell 命令 base64 shell 命令 · 英语 · skillspector: HIGH base64 shell 命令 · 俄语 · skillspector: HIGH base64 shell 命令 · 德语 · skillspector: HIGH base64 shell 命令 · 中文 · skillspector: HIGH base64 shell 命令 · 英语 · cisco: HIGH base64 shell 命令 · 俄语 · cisco: HIGH base64 shell 命令 · 德语 · cisco: HIGH base64 shell 命令 · 中文 · cisco: HIGH P-08 零宽字符隐藏文本 零宽字符隐藏文本 · 英语 · skillspector: HIGH 零宽字符隐藏文本 · 俄语 · skillspector: HIGH 零宽字符隐藏文本 · 德语 · skillspector: HIGH 零宽字符隐藏文本 · 中文 · skillspector: HIGH 零宽字符隐藏文本 · 英语 · cisco: MEDIUM 及以上无检出 零宽字符隐藏文本 · 俄语 · cisco: MEDIUM 及以上无检出 零宽字符隐藏文本 · 德语 · cisco: MEDIUM 及以上无检出 零宽字符隐藏文本 · 中文 · cisco: MEDIUM 及以上无检出 P-09 过宽触发 / 范围蔓延 过宽触发 / 范围蔓延 · 英语 · skillspector: MEDIUM 及以上无检出 过宽触发 / 范围蔓延 · 俄语 · skillspector: MEDIUM 及以上无检出 过宽触发 / 范围蔓延 · 德语 · skillspector: MEDIUM 及以上无检出 过宽触发 / 范围蔓延 · 中文 · skillspector: MEDIUM 及以上无检出 过宽触发 / 范围蔓延 · 英语 · cisco: MEDIUM 及以上无检出 过宽触发 / 范围蔓延 · 俄语 · cisco: MEDIUM 及以上无检出 过宽触发 / 范围蔓延 · 德语 · cisco: MEDIUM 及以上无检出 过宽触发 / 范围蔓延 · 中文 · cisco: MEDIUM 及以上无检出 P-10 通过 crontab / rc 持久化 通过 crontab / rc 持久化 · 英语 · skillspector: HIGH 通过 crontab / rc 持久化 · 俄语 · skillspector: HIGH 通过 crontab / rc 持久化 · 德语 · skillspector: HIGH 通过 crontab / rc 持久化 · 中文 · skillspector: HIGH 通过 crontab / rc 持久化 · 英语 · cisco: MEDIUM 及以上无检出 通过 crontab / rc 持久化 · 俄语 · cisco: MEDIUM 及以上无检出 通过 crontab / rc 持久化 · 德语 · cisco: MEDIUM 及以上无检出 通过 crontab / rc 持久化 · 中文 · cisco: MEDIUM 及以上无检出 HIGH / CRITICALMEDIUMMEDIUM 及以上无检出
图 3 每种模式、每种语言报告的最高严重级别。我们的隐藏字符对照检查器未显示;它在四种语言中都能检出 P-08,别的一概不检——正如设计。
  • P-01,纯文本中的指令覆盖(“忽略之前的指令,然后……”)。两个引擎都检出了英语样本;没有一个检出同一句话的俄语、德语或中文译文。
  • P-09,过宽的触发条件和范围蔓延(“任何请求都使用此技能”)。任何语言中都没有任何引擎检出。 这是一种纯文本模式,而且可以说是现实中最常见的问题。
  • P-06,伪造的“前置依赖安装器”下载。 Cisco 只在英语中检出;SkillSpector 完全没有。
  • SkillSpector 在四种语言中都能抓到结构性模式——HTML 注释中的指令、curl | bash、收集环境变量、base64 shell、零宽字符、持久化。Cisco 的静态模式在四种语言中都能抓到收集环境变量和 base64,英语之外再无其他。

与语言无关的检测恰好存在于模式位于代码中的地方。当攻击位于指令中时,检测要么只有英语,要么不存在——而这与如今风险所在之处正好相反,因为智能体遵循的是指令,只是偶尔才运行代码。

§6 运行备注

  • SkillSpector 在 186 个包中的 8 个(16–73 MB,根目录带 SKILL.md 的整个仓库,其中一个有 6 342 个 JavaScript 文件)上 15 分钟内未完成。Cisco 处理每一个都不到一分钟。这 8 个被排除在上面所有比率之外,列在这里:de-059, en-160, en-165, en-174, en-190, zh-112, zh-122, zh-142。
  • 我们为这个基准写的隐藏字符检查器一度误报正常技能,直到它学会 emoji 序列使用 U+200D、软连字符在德语中很正常。它仍然标记 146 个正常包中的 7 个,其中 2 个在 Markdown 中。我们报告它的理由与报告其他引擎相同。
  • Cisco 拒绝文件名为 Skill.md 或 _template-skill.md 的技能;两个这样的条目被从语料库中剔除,而非重命名。

§7 我们对扫描器的期望

这一切都不是反对扫描的论据,而是主张校准判定的论据,而且修复方法是具体的:

  1. 把体量和风险分开。 限制重复的低信息量发现项的贡献(一条 npx 规则不应累加到 100),当诚实的答案是“我们没看”时,说“大包,部分分析”而不是 DO NOT INSTALL。
  2. 让 Unicode 规则感知文字系统。 俄语文档里西里尔字母加拉丁字母是基线,不是异常;异常是拉丁单词里夹着一个西里尔字母。这同样适用于中日韩文字和德语的软连字符。
  3. 用不止一种语言测试文本规则。 匹配“ignore previous instructions”的规则要么附带它的译文发布,要么应该是一项 LLM 检查——测试套件应当说明是哪一种。
  4. 发布一个误报语料库。 每个扫描器都附带恶意测试样例;几乎没有一个附带一组必须通过的普通技能。这里的语料库采用 CC BY 4.0,可以充当这组样例。

§8 局限

  • 仅静态模式。两个引擎都有 LLM 辅助模式,可能改变整体图景,尤其是对文本模式。运行它们是下一步。
  • 攻击样本简短且单一用途。它们测试的是某种模式在某种语言中能否被识别,而不是真实攻击者会如何打包它。
  • “正常”是对来源的判断,不是审计。正常集合上的某些发现项可能是对的。
  • 一个语料库,一个日期。评分卡会在每次引擎发版时重新运行;真正重要的第一个数字是下一个。

§9 厂商回应

数据开放前的通知

SkillSpector 和 skill-scanner 的维护者将于 2026年11月5日 收到发现项文件和完整表格,比仓库在 2026年11月12日 开放早七天——仓库包含语料库清单、攻击样本、脚本、运行日志和汇总结果。逐个技能的引擎原始输出不再分发;它可由清单复现。他们的回应以及其间发布的任何修复,都将原样在此刊出。

作者:Andrey Trukhachev。更正与异议:andrey@skillverdict.dev。本页上的严重级别词汇(SAFE、CAUTION、DO NOT INSTALL、HIGH、MEDIUM)引用的是引擎自身的输出,不是我们对任何技能的评判。

第二阶段

技能页面上线时收到通知

第二阶段上线时发一封邮件,仅此而已。选择你的邮件服务;邮件已写好,直接发送即可。

技能页面上线时通知我

或写信至 andrey@skillverdict.dev。如果你维护一个扫描器并希望在发布前拿到原始结果,也用这个地址。