源文档 docs/01-known-cve-detection.md
渲染 sky-skills / anthropic-design / md-mirror

01 · 已知 CVE 检测

目标:给定一棵内核源码 / 一个内核版本,查出它里面有哪些已经公开、有 CVE 编号的漏洞没修。这是"检测 CVE 这种安全漏洞"的正解。

对 vendor 内核最大的坑:版本号骗人。厂商在某个 LTS 上叠自己的补丁,可能 backport 了上游修复却不 bump 版本号,也可能自带驱动引入上游没有的 bug。所以"按版本号匹配 CVE"这条路在 vendor 内核上误判高。真正靠谱的是看源码 / 看 commit


工具对比

工具 原理 需要 git 历史? 强项 弱项
cvehound coccinelle/grep 规则,在源码里找漏洞代码模式在不在 / 修复补丁打了没 不需要 vendor 源码包、抓漏掉 SUBLEVEL 的 backport 只覆盖有规则的 CVE(规则库有限)
kernel-cve-tool 用 linux_kernel_cves 数据集,查CVE 修复 commit 是否已进你的分支 需要 有 git 历史的下游内核,精确到 commit 依赖分支从 stable 标签派生
linux_kernel_cves CVE ↔ 修复 commit 映射数据库(非扫描器) 给上面两个当数据源 / 手查 本身不扫你的树
Vuls 按包版本号匹配 CVE(系统级 agentless) 不需要 整机/发行版扫描 vendor 内核版本对不上,误判高,故未克隆

cvehound(vendor 内核首选)

来源:github.com/evdenis/cvehound · 本地:repos/01-known-cve-detection/cvehound/

它解决什么:很多厂商把内核当源码包发,没有开发 git log。Makefile 里的版本串只能告诉你"上游到这个版本修了哪些 CVE",不能告诉你厂商自己 backport 了什么。cvehound 直接查源码里"未修的 CVE 代码"或"缺失的修复"。

判定两种形态:

依赖:Python ≥ 3.11 · grep 带 pcre(-P)· coccinelle ≥ 1.0.7(scripts/install-deps.sh 会装)

:

pip install --user cvehound          # 或 scripts/install-deps.sh 一起装
cvehound --kernel "$KERNEL"          # $KERNEL = 你的内核源码目录
# 命中形如: Found: CVE-2020-27830

它自己发现过的真问题(README 列):CVE-2020-27825 / CVE-2021-4149 / CVE-2022-26490 / CVE-2023-1989 等在多个 stable 树缺 backport——说明它确实能抓 backport 遗漏,正是 vendor 内核的痛点。


kernel-cve-tool(有 git 历史时更精确)

来源:github.com/madisongh/kernel-cve-tool · 本地:repos/01-known-cve-detection/kernel-cve-tool/

它解决什么:review 一个有 git 历史的下游内核,查哪些 CVE 修复 commit 已 cherry-pick 进来。要求你的分支从某个 stable 标签(如 v6.1)派生。

流程:

# 1. 你的内核要有 git,加 linux-stable 远程并 fetch
cd "$KERNEL"
git remote add stable git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
git fetch stable          # 大,耗时;给它定位 fix commit 用

# 2. linux_kernel_cves 数据集(clone-tools.sh 已克隆到 repos/)
# 3. 跑(数据源指到本库 repos/ 下那份)
kernel-cve-tool -P "$LKSEC/repos/01-known-cve-detection/linux_kernel_cves"

输出(当前目录生成 3 个文件):

原理:解析顶层 Makefile 拿基础版本,读 linux_kernel_cves 的 JSON,对每个"疑似未修" CVE 在你分支里找对应 fix commit。跑一遍要几分钟。


linux_kernel_cves(数据库,不是扫描器)

来源:github.com/nluedtke/linux_kernel_cves · 本地:repos/01-known-cve-detection/linux_kernel_cves/

上游内核 CVE 的追踪数据集,JSON + 文本,web 前端 linuxkernelcves.com。给 kernel-cve-tool 当数据源,也能自己按 stream 查。

README 的一句实话值得记:"你可以修光所有已知 CVE,仍然可能被攻破。" 已知 CVE 检测只是内核安全的一小块,配置加固(docs/02)和新洞挖掘(docs/03)是另外的维度。


建议流程

  1. cvehound 先扫 $KERNEL,拿一份源码级命中清单(抓 backport 遗漏)。
  2. kernel-cve-tool 再跑(利用 git 历史 + linux-stable),交叉验证哪些 fix commit 真进了分支。
  3. 两份清单求并 + 差异分析:cvehound 报命中但 kernel-cve-tool 说已 patch → 多半是 vendor 用不同 commit/backport 修了,cvehound 规则没识别 → 用 ⑤ Claude 逐条判真假(见 docs/05)。
  4. 剩下的真命中,按可达性(要不要本地权限、特定 config、特定驱动是否编入)排优先级。

变量约定:$KERNEL = 你的内核源码目录;$LKSEC = 本库根目录。