Cisco Skill Scanner 拆解:9 个分析引擎,以及一份敢写「召回率 7.75%」的评测

一、速览:值不值得你花时间

推荐指数:★★★★☆(4 / 5)

先讲我为什么给它 4 分 —— 不是因为指标好看,恰恰是因为它敢把不好看的指标写出来。

AI 安全工具这个赛道有个通病:大家都在卷「我发现了多少漏洞」,没人愿意说「我漏了多少」。Cisco 这个 README 里有一节叫 Current modernization evidence,直接给了两组对比数据:

开发基准(MaliciousSkillBench,5,256 恶意 + 1,338 良性):相比 origin/main,F1 从 32.92% 提到 47.73%,召回率从 19.88% 提到 31.43%,良性误报率从 3.59% 降到 1.05%,精确率 99.16%。

锁定的 source-disjoint 切分:TP=65、FP=42、TN=503、FN=774 —— 精确率 60.75%、召回率 7.75%、F1 13.74%、FPR 7.71%。然后它自己写明:

This improves F1 over origin/main (7.40%) but regresses FPR (3.67%), so it does not pass the promotion gate. Every bundled CEL rule therefore remains in shadow…

「没通过晋升门槛」这句话是官方自己写的。 现在我见过的所有 AI 安全工具里,敢这么干的只有它和 Dark-Moon(那个会告诉你 57 个漏洞是云端模型跑的)。这种诚实本身就是可靠性信号 —— 一个愿意公布召回率的团队,其「没检出」比别人的「没检出」更可信。

技术上它也有独到之处:9 个分析引擎里有两个是同类少见的 —— Bytecode(.pyc 完整性校验,抓「源码干净但字节码被换」这类绕过)和 Pipeline(shell 管道的污点分析)。另外它用官方 cel-go v0.32.0 运行时做类型化的决策层,在确定性检测之后、LLM 分析之前做事实关联。

扣分项:召回率就是那个 7.75%(在 held-out 集上漏掉 92% 的恶意 skill);所有 CEL 规则目前都在 shadow 模式,实际不抑制任何 finding;Meta-analyzer 的准确性验证官方标注「remains pending」;以及许可证状态不一致(README 写 Apache-2.0,GitHub API 识别为 NOASSERTION)。

关键数据(截至 2026-10-06)

出品方 Cisco AI Defense
语言 Python(PyPI 包 cisco-ai-skill-scanner)
Star / Fork 2,561 / 323
提交 / Open Issues 108 / 8
许可证 README 声明 Apache-2.0,GitHub API 识别为 NOASSERTION
首次提交 2026-01-29(约 8 个月)
最近提交 2026-09-26(2 天前)
Python 要求 3.11–3.14(源码装 CEL 还需 Go 1.27.1+)
分析引擎 9 个
决策层 官方 cel-go v0.32.0,模式 off / shadow / enforce
官方站点 https://cisco-ai-defense.github.io/docs/skill-scanner

适合谁

人群 分 理由
平台 / 工具链团队 4 / 5 GitHub Actions + pre-commit + SARIF 三件套齐,policy 可精细调
企业安全运营 4 / 5 Cisco 背书 + 可审计的评测数据,采购材料好写
安全研究员 5 / 5 那份带混淆矩阵的评测报告,本身就是极好的研究素材
日常用 Claude Code / Codex 的开发者 3 / 5 能用,但 8 个月历史 + 召回率偏低,建议和 SkillSpector 双跑
个人 / 学习者 3 / 5 有交互式向导,但概念(CEL / policy / meta)偏多

二次开发

难度 说明
改配置 中 —— 有 5 个 policy 预设(strict / balanced / permissive / low-noise / quiet)+ generate-policy / configure-policy 两个生成器,但要理解 knobs 不少
改集成 低 —— SARIF + 可复用 GitHub Actions + pre-commit + REST API
改内核 中 —— 插件架构,可加自定义 YARA / 签名 / Python 规则,有 --trusted-rule-pack 加载管理员信任的规则包

二、它是什么,不是什么

README 的 Scope and Limitations 一节写得极其克制,我建议原文照读,这里摘四条:

  • No findings ≠ no risk. 扫描返回「无发现」只说明没命中已知威胁模式,不代表这个 skill 安全、良性或无漏洞。
  • Coverage is inherently incomplete. 签名 + LLM 语义 + 行为数据流 + 可选云服务 + 可配规则包已经提升了覆盖,但没有任何自动化工具能检测出所有手法,尤其是新颖或 0day 攻击。
  • False positives and false negatives can occur. 共识模式和 meta 分析能帮忙,但没有哪种配置能消除全部错误分类。
  • Human review remains essential. 自动扫描只是纵深防御的一环;高风险或生产部署必须配合人工代码审查和/或威胁建模。

提炼三个关键词:multi-engine(9 引擎纵深)、typed CEL decisions(类型化决策层)、measured, not claimed(给数字而非断言)。

三、9 个分析引擎

Analyzer 检测方法 范围 需要
Static YAML + YARA 模式 所有文件 无
Bytecode .pyc 完整性校验 Python 字节码 无
Pipeline 命令污点分析 shell 管道 无
Correlation 有界的结构化 source/sink 关联 Python / JS / TS / 包事实 无
Behavioral AST 数据流分析 Python 文件 无
LLM 语义分析 SKILL.md + 脚本 API key
Meta 误报过滤 所有 finding API key
VirusTotal 基于哈希的恶意软件检测 二进制文件 API key
AI Defense 云端 AI 文本内容 API key

前五个不需要任何 API key,这点很友好 —— 你可以零成本先把确定性检测跑一遍。

三个我认为最有特色的引擎:

1)Bytecode —— .pyc 完整性校验。 这条抓的是一个很阴的绕过:把 .py 源码写得干干净净,但随包带上被篡改的 .pyc。Python 在源码存在时会优先用源码吗?实际取决于时间戳和 -B 等设置,而很多审查流程只看 .py。SkillSpector 那边对应的模式是 SC8「携带 Python 字节码」,但 Cisco 这个是做完整性校验(比对源码和字节码是否一致),比「检测到有 .pyc 就报」更进一步。

2)Pipeline —— shell 管道污点分析。 curl ... | bash 这类是老套路,但管道里的数据流组合千变万化,专门开一个引擎做命令级污点追踪,比正则匹配 curl 靠谱。

3)Meta —— 误报过滤。 让 LLM 回头看一遍所有 finding,做关联、优先级排序、并可过滤。但官方明说「paired accuracy validation remains pending」 —— 也就是说这个模块还没有配对准确性验证数据。用它过滤 finding 时,请假设它可能把真阳性也滤掉。

CEL 决策层

用官方 cel-go v0.32.0 运行时,在确定性检测之后、LLM 分析之前关联有界事实(bounded facts)。三种模式:

模式 行为
off 不用 CEL
shadow 跑了但不影响结果(默认)
enforce 启用抑制

关键事实:balanced(默认)和 strict 策略用 shadow,permissive 用 off。而且所有内置 CEL 规则目前都是 rollout: shadow,所以即使你全局设 --cel-mode enforce,finding 也都会被保留,直到单条规则通过资格认证被晋升。

换句话说:CEL 这一层现在是「观察模式」,还不实际抑制任何东西。 别指望它帮你降噪。

四、评测数据:这才是它的价值所在

开发基准(MaliciousSkillBench)

指标 origin/main 当前 变化
F1 32.92% 47.73% ↑
召回率 19.88% 31.43% ↑
良性误报率 3.59% 1.05% ↓
精确率 — 99.16% —

五次 CEL-shadow 运行完全一致且确定性;CEL 评估了 154 个候选,没有提出任何抑制、也没有回退。

锁定的 source-disjoint 切分(难看但真实)

1
2
TP = 65     FP = 42
TN = 503 FN = 774
指标 值
精确率 60.75%
召回率 7.75%
F1 13.74%
FPR 7.71%

官方结论:F1 相对 origin/main(7.40%)有提升,但 FPR 反而退化了(3.67% → 7.71%),因此未通过晋升门槛。

这组数字要怎么读? 我的理解:

  • FN=774 意味着 839 个恶意样本里漏掉了 774 个。 在这个切分上,它抓不到绝大多数恶意 skill。
  • 但精确率 60.75% 仍在可用区间 —— 报出来的里面大约六成是真的。
  • 两个切分的差距(召回 31.43% vs 7.75%)本身说明了泛化问题:在和训练集同源的数据上表现好得多,换成 source-disjoint 就大幅下滑。这是典型的分布偏移。

实践含义:把它当「能抓到一部分坏东西、报出来的可信度还行」的工具,不要当「能拦住恶意 skill」的门禁。 想当门禁,得自己先在你的 skill 分布上复现一遍评测。

其他诊断

数据集 结果
NotInject 硬负样本集 0/339 可操作命中(零误报,很好)
HarmfulSkillBench 7/200 可操作,6/200 HIGH+,1 个样本被隔离
OpenSkillRisk 76/263 可操作包,2 个主机隔离
111 个官方 Codex / Claude Code / Cursor skills CEL-OFF 与 CEL-SHADOW 结果一致,其中 30 个 MEDIUM+、8 个 HIGH/CRITICAL,五次运行稳定

后两个是仅正样本的召回诊断,无法衡量精确率或 FPR —— 官方自己标注了这一点。

「111 个官方 skill 里有 8 个 HIGH/CRITICAL」这条也很有冲击力 —— 连大厂官方发布的 skill 都有这个比例命中。

五、上手

1
2
3
4
5
6
7
8
9
10
# 安装(uv 推荐)
uv pip install cisco-ai-skill-scanner
# 或 pip install cisco-ai-skill-scanner

# 云厂商 extra(按需)
pip install cisco-ai-skill-scanner[bedrock] # AWS Bedrock
pip install cisco-ai-skill-scanner[google] # Google AI Studio / Gemini
pip install cisco-ai-skill-scanner[vertex] # Google Vertex AI
pip install cisco-ai-skill-scanner[azure] # Azure OpenAI
pip install cisco-ai-skill-scanner[all]

Python 3.11–3.14;源码装且带 CEL 改动的话还需要 Go 1.27.1+ 构建 helper。

交互式向导(新手友好)

1
2
skill-scanner          # 不带参数直接跑,会启动交互向导
skill-scanner interactive

向导会带你选目标、analyzer、policy、输出格式,并在运行前把拼好的命令显示出来。对熟悉 CLI 很有帮助。

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 核心引擎(静态 + 字节码 + 管道 + 关联)
skill-scanner scan /path/to/skill

# 加行为数据流分析
skill-scanner scan /path/to/skill --use-behavioral

# 全引擎
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-aidefense

# Meta 误报过滤
skill-scanner scan /path/to/skill --use-llm --enable-meta

# 触发词特异性检查(模糊描述)
skill-scanner scan /path/to/skill --use-trigger

# LLM 多次投票,只保留多数一致的 finding
skill-scanner scan /path/to/skill --use-llm --llm-consensus-runs 3

# 批量 + 跨 skill 描述重叠检测
skill-scanner scan-all /path/to/skills --recursive --check-overlap

# 直接扫 GitHub 仓库
skill-scanner scan-repo owner/repo
skill-scanner scan-repo https://github.com/owner/repo --use-llm

# 宽容模式(容忍格式不规范的 skill)
skill-scanner scan /path/to/skill --lenient

Python SDK

1
2
3
4
5
6
7
8
9
10
11
12
13
from skill_scanner import SkillScanner
from skill_scanner.core.analyzers import BehavioralAnalyzer

scanner = SkillScanner(analyzers=[BehavioralAnalyzer()])
result = scanner.scan_skill("/path/to/skill")

print(f"Findings: {len(result.findings)}")
print(f"Max severity: {result.max_severity}")

# 注意:is_safe 表示没检出 HIGH/CRITICAL,
# 不代表这个 skill 没有任何风险。
if not result.is_safe:
print("Issues detected -- review findings before deployment")

输出与门禁

--format 支持 summary / json / markdown / table / sarif / html。其中 HTML 格式是自包含的交互式报告,带可折叠的关联分组、可展开的代码片段、以及管道污点流向图。

门禁:--fail-on-findings(等价于 --fail-on-severity high)或 --fail-on-severity LEVEL。

六、和 SkillSpector(第 015 期)怎么选

这俩是直接的同类竞品,我按实际差异列一下,不做推荐,只给判断依据:

维度 SkillSpector(NVIDIA) Skill Scanner(Cisco)
Star 18,488 2,561
历史 6 个月 8 个月
模式数 71 个 / 17 类(明列) 未给总数,9 个引擎
独特能力 MCP least privilege / tool poisoning、YARA、污点追踪 .pyc 完整性校验、shell 管道污点、VirusTotal 哈希
评测透明度 给研究基数(26.1% / 5.2%),未给自身精确率/召回率 给了完整混淆矩阵,含难看的 7.75% 召回
决策层 累加评分 + band CEL 形式化规则(目前全在 shadow)
上门禁 exit code + --fail-on-findings exit code + --fail-on-severity,且有 GitHub Actions 与 pre-commit
装 skill 前 有 Pi / OpenCode extension 有 pre-commit hook
许可证 Apache-2.0(一致) Apache-2.0(README)/NOASSERTION(API,不一致)

我的看法:如果你要覆盖度和生态(18.5k star、Pi/OpenCode 集成、明列的 71 个模式),SkillSpector 更成熟;如果你要可审计的评测数据和精细可调的策略(以及 VirusTotal、.pyc 校验这些独特引擎),Cisco 这份更扎实。两者都跑一遍的成本并不高 —— 前五个引擎都不要 API key。

七、边界与风险(必须诚实说的部分)

1)召回率是硬伤。 held-out 切分上 FN=774 / 召回 7.75%。它漏掉的远比抓到的多。不能当唯一的门禁。

2)CEL 目前是摆设(观察模式)。 所有内置规则 rollout: shadow,即使 --cel-mode enforce 也不抑制。想靠它降噪的会失望。

3)Meta-analyzer 没验证数据。 官方写「paired accuracy validation remains pending」。用它过滤 finding 有可能滤掉真阳性。

4)许可证状态不一致。 README 和 badge 都写 Apache-2.0,但 GitHub API 返回 NOASSERTION。企业用之前人工读 LICENSE 原文。

5)Behavioral 只覆盖 Python 文件。 AST 数据流分析的范围是 Python;JS/TS 只有 Correlation 层的有界关联。

6)云引擎要 API key,且会外发数据。 VirusTotal(哈希 / 可选上传未知二进制)、AI Defense(文本内容)、LLM。敏感 skill 扫描前先确认数据出境合规。

7)项目 8 个月、108 次提交、8 个 open issue。 比 SkillSpector 历史略长但社区小得多。

8)概念密度偏高。 CEL 模式、policy 预设、meta、consensus runs、rule pack、taxonomy profile…… 想调好需要投入学习成本。

八、上手建议(按这个顺序来)

  1. 别带任何 flag 先跑一次 skill-scanner(交互式向导)。 它会把拼好的命令显示出来,是最快理解这套 CLI 的方式。
  2. 零成本跑核心引擎:skill-scanner scan <dir>,静态 + 字节码 + 管道 + 关联,不要 API key。先看这个基线。
  3. --use-behavioral 一定要加。 AST 数据流是它能抓到绕过的关键,且不要钱。
  4. 重要 skill 用 --llm-consensus-runs 3。 多次投票取多数一致,能压掉单次 LLM 的抖动。
  5. 接 CI 用 --fail-on-severity 显式指定,别依赖默认。同时配上官方的 GitHub Actions 或 pre-commit。
  6. 别指望 CEL 降噪(目前全 shadow);要降噪用 policy 预设调,从 balanced 起步。
  7. 看 HTML 报告(--format html)。它有管道污点流向图,比 JSON 直观得多,适合人工复核。
  8. 敏感 skill 别开云引擎(VirusTotal 会上传未知二进制、AI Defense 发文本内容)。
  9. 和 SkillSpector 双跑。 两者引擎不重叠(Cisco 有 .pyc 校验和 VirusTotal,NVIDIA 有 MCP 专项),互补性不错。

九、一句话结论

Cisco Skill Scanner 最值钱的不是那 9 个引擎,而是它那份敢把「召回率 7.75%、未通过晋升门槛」写进 README 的评测报告 —— 在一个所有人都在报喜的赛道里,这种诚实让它成为少数几个「没检出」也值得信任的工具之一。

给平台团队的第一动作:uv pip install cisco-ai-skill-scanner → 不带 flag 跑一次向导 → 用 skill-scanner scan-all <你的 skills 目录> --recursive --use-behavioral 跑一遍(零 API 成本)→ 出 HTML 报告人工核一遍。 然后在你自己的 skill 分布上复现一遍评测,拿到你自己的召回率 —— 那个数字才是你敢不敢拿它当门禁的依据。

评论Comments