§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 评分中位数 SAFE DO NOT INSTALL Markdown only (0 code files) 60 8 48 8 1-5 code files 35 41 6 15 6-30 code files 27 100 0 23 more than 30 code files 16 100 0 15
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 的攻击样本。
引擎 en ru de zh 全部 被判为 SAFE 的攻击样本 SkillSpector 2.12 · static 94 % (33/35) 37 % (14/38) 28 % (8/29) 81 % (29/36) 61 % 40 % Cisco skill-scanner 2.3 · balanced 46 % (18/39) 3 % (1/38) 27 % (8/30) 36 % (14/39) 28 % 85 % Cisco skill-scanner 2.3 · quiet 44 % (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+ 发现项 en ru de zh SkillSpector 2.12 · static 100 % 76 % 41 % 89 % Cisco skill-scanner 2.3 · balanced 46 % 11 % 13 % 44 % Cisco skill-scanner 2.3 · quiet 44 % 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 规则 en ru de zh 合计 RP1346 12 14 40 412 AE43 207 0 2 212 AE123 4 25 118 170 PE339 2 24 24 89 E134 0 14 39 87 AS332 1 44 3 80 RA261 2 1 12 76 EA258 1 5 7 71
Cisco skill-scanner, balanced 规则 en ru de zh 合计 TOOL_ABUSE_UNDECLARED_NETWORK14 1 2 14 31 YARA_code_execution_generic31 0 0 0 31 CORRELATED_SENSITIVE_NETWORK_FLOW0 0 24 0 24 PIPELINE_TAINT_FLOW1 0 0 8 9 COMPOUND_FETCH_EXECUTE7 0 0 1 8 ALLOWED_TOOLS_WRITE_VIOLATION0 3 0 1 4 SOCIAL_ENG_MISLEADING_DESC2 0 0 1 3 COMPOUND_FIND_EXEC2 0 0 0 2
§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 / CRITICAL MEDIUM MEDIUM 及以上无检出
图 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 我们对扫描器的期望
这一切都不是反对扫描的论据,而是主张校准判定的论据,而且修复方法是具体的:
把体量和风险分开。 限制重复的低信息量发现项的贡献(一条 npx 规则不应累加到 100),当诚实的答案是“我们没看”时,说“大包,部分分析”而不是 DO NOT INSTALL。
让 Unicode 规则感知文字系统。 俄语文档里西里尔字母加拉丁字母是基线,不是异常;异常是拉丁单词里夹着一个西里尔字母 。这同样适用于中日韩文字和德语的软连字符。
用不止一种语言测试文本规则。 匹配“ignore previous instructions”的规则要么附带它的译文发布,要么应该是一项 LLM 检查——测试套件应当说明是哪一种。
发布一个误报语料库。 每个扫描器都附带恶意测试样例;几乎没有一个附带一组必须通过的普通技能。这里的语料库采用 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)引用的是引擎自身的输出,不是我们对任何技能的评判。