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 inshadow…
「没通过晋升门槛」这句话是官方自己写的。 现在我见过的所有 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 | TP = 65 FP = 42 |
| 指标 | 值 |
|---|---|
| 精确率 | 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 | # 安装(uv 推荐) |
Python 3.11–3.14;源码装且带 CEL 改动的话还需要 Go 1.27.1+ 构建 helper。
交互式向导(新手友好)
1 | skill-scanner # 不带参数直接跑,会启动交互向导 |
向导会带你选目标、analyzer、policy、输出格式,并在运行前把拼好的命令显示出来。对熟悉 CLI 很有帮助。
常用命令
1 | # 核心引擎(静态 + 字节码 + 管道 + 关联) |
Python SDK
1 | from skill_scanner import SkillScanner |
输出与门禁
--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…… 想调好需要投入学习成本。
八、上手建议(按这个顺序来)
- 别带任何 flag 先跑一次
skill-scanner(交互式向导)。 它会把拼好的命令显示出来,是最快理解这套 CLI 的方式。 - 零成本跑核心引擎:
skill-scanner scan <dir>,静态 + 字节码 + 管道 + 关联,不要 API key。先看这个基线。 --use-behavioral一定要加。 AST 数据流是它能抓到绕过的关键,且不要钱。- 重要 skill 用
--llm-consensus-runs 3。 多次投票取多数一致,能压掉单次 LLM 的抖动。 - 接 CI 用
--fail-on-severity显式指定,别依赖默认。同时配上官方的 GitHub Actions 或 pre-commit。 - 别指望 CEL 降噪(目前全 shadow);要降噪用 policy 预设调,从
balanced起步。 - 看 HTML 报告(
--format html)。它有管道污点流向图,比 JSON 直观得多,适合人工复核。 - 敏感 skill 别开云引擎(VirusTotal 会上传未知二进制、AI Defense 发文本内容)。
- 和 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 分布上复现一遍评测,拿到你自己的召回率 —— 那个数字才是你敢不敢拿它当门禁的依据。