Announcement

👇Official Account👇

Welcome to join the group & private message

Article first/tail QR code

Skip to content

AI 驱动漏洞挖掘时代来临:VEGA 5秒发现 15 年 Linux 内核漏洞的技术全景

引言

2026 年 7 月 7 日,安全公司 Nebula Security 公开披露了一个代号为 GhostLock 的 Linux 内核漏洞(CVE-2026-43499)。这个存在于 kernel/locking/rtmutex.cremove_waiter() 函数的 use-after-free 漏洞,自 2011 年 Linux 2.6.39 起便被引入,潜伏整整 15 年,横跨几乎所有主流 Linux 发行版。

但真正让安全圈震动的,不是漏洞本身——而是发现它的方式

它不是由某位资深内核安全专家逐行审阅代码发现的,而是 Nebula Security 自主研发的 AI 驱动漏洞挖掘工具 VEGA,在自动化分析过程中定位的。Google 为此通过 KernelCTF 漏洞奖励计划,向 Nebula Security 支付了 $92,337 的奖金。

这标志着 AI 安全工具从"辅助分析"正式跨入"自主发现关键漏洞"的新阶段。本文将深度拆解 VEGA 的技术架构、GhostLock 的漏洞原理,以及 AI 自动化漏洞挖掘对未来安全研究的范式冲击。

一、VEGA 是什么

VEGA 是 Nebula Security 开发的 AI 驱动漏洞挖掘平台。虽然其完整技术文档尚未完全公开,但从 Nebula Security 在 GhostLock 事件中的披露以及 ionstack 系列研究报告中,我们可以拼凑出它的核心能力架构。

1.1 核心架构

text
┌─────────────────────────────────────────────────┐
│                  VEGA 平台架构                     │
├─────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌──────────────┐              │
│  │ 静态分析引擎  │  │ LLM 语义分析  │              │
│  │ (CodeQL/SAST)│  │ (代码理解层)  │              │
│  └──────┬──────┘  └──────┬───────┘              │
│         │                │                       │
│         └────────┬───────┘                       │
│                  ▼                                │
│  ┌──────────────────────────────┐                │
│  │     符号执行 & Fuzzing 引擎    │                │
│  │   (KLEE/Syzkaller 增强版)     │                │
│  └──────────────┬───────────────┘                │
│                 ▼                                 │
│  ┌──────────────────────────────┐                │
│  │    AI 优先级排序 & 漏洞分类    │                │
│  │   (基于历史 CVE 训练的模型)    │                │
│  └──────────────┬───────────────┘                │
│                 ▼                                 │
│  ┌──────────────────────────────┐                │
│  │     PoC 自动生成 & 验证        │                │
│  │   (利用链自动构建引擎)          │                │
│  └──────────────────────────────┘                │
└─────────────────────────────────────────────────┘

VEGA 的核心思路是将三种传统技术融合:

  1. LLM 语义理解层:用大语言模型理解代码上下文,识别"看起来可疑"的模式——比如资源释放与指针使用之间的逻辑裂缝
  2. 符号执行引擎:对可疑代码路径进行精确的约束求解和状态空间探索
  3. AI 优先级排序:基于历史 CVE 数据和漏洞利用难度,对发现的可疑点进行智能排序,避免研究员的精力浪费在低价值发现上

1.2 与传统方法的对比

维度人工审计传统 FuzzingVEGA (AI 驱动)
速度数天到数月数小时到数天数秒到数分钟
覆盖率依赖专家经验随机/覆盖引导语义引导+覆盖引导
误报率低(专家判断)中(AI 过滤后低)
深层逻辑漏洞能发现(依赖经验)很难发现能发现(LLM理解语义)
可扩展性差(人力瓶颈)极好(并行+自动化)

GhostLock 这类漏洞之所以 15 年未被发现,正是因为它在传统的安全审查中处于"盲区":

  • 人工审计的盲区rtmutex.c 是内核锁机制的深层实现,只有少数专家真正理解;且代码逻辑看似"正确"——remove_waiter() 的假设在当时是合理的
  • Fuzzing 的盲区:触发竞态条件需要精确的线程调度时序,随机 Fuzzing 几乎不可能恰好命中那 6 条指令的竞争窗口
  • 静态分析的盲区:并发相关的 use-after-free 需要理解跨线程的控制流和数据流,传统 SAST 工具的跨过程分析能力有限

二、GhostLock 漏洞深度分析

2.1 漏洞根源

GhostLock 的本质是 futex 优先级继承路径中的 use-after-free。根因在 kernel/locking/rtmutex.cremove_waiter() 函数:

c
// 简化的问题代码(Linux 2.6.39 ~ 6.x 受影响版本)
static void remove_waiter(struct rt_mutex *lock,
                          struct rt_mutex_waiter *waiter)
{
    // 关键假设:waiter 始终属于 current task
    bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock));
    struct task_struct *owner = rt_mutex_owner(lock);
    struct rt_mutex_waiter *next = NULL;

    raw_spin_lock(&lock->wait_lock);

    // 从等待队列中移除 waiter
    rt_mutex_dequeue(lock, waiter);

    // 如果是顶部等待者,调整优先级继承链
    if (is_top_waiter) {
        next = rt_mutex_top_waiter(lock);
        // 清理当前任务的 priority inheritance
        rt_mutex_adjust_prio(owner);  // ← 这里可能出现 UAF
    }

    raw_spin_unlock(&lock->wait_lock);

    // waiter 指向的结构可能已经释放
    // 但 caller 可能仍持有引用 → UAF
}

问题出在 futex 优先级继承的重排路径中:

text
时间线(简化版):

T1: Thread-A (低优先级) 持有 rt_mutex,Thread-B (高优先级) 等待
    → 内核为 Thread-B 设置 priority inheritance,Thread-A 临时提升优先级

T2: Thread-A 释放 rt_mutex,需要回滚 priority inheritance
    → 调用 remove_waiter() 清理 Thread-B 的等待记录

T3: 在 remove_waiter() 执行过程中,存在一个竞争窗口:
    - 内核认为清理的是 "current task" 的等待记录
    - 但实际上 Thread-B 正在另一个 CPU 上睡眠
    - 清理操作指向了 Thread-B 的栈上数据

T4: Thread-B 醒来,从 futex 系统调用返回
    → 其栈帧被回收,但 rt_mutex 链中仍保留着指向该栈帧的指针
    → UAF 条件成立

2.2 为什么 lockdep 没抓到

Linux 内核的 lockdep(锁依赖检查器)是内核开发者的重要安全网,但它在 GhostLock 面前完全失效:

c
// lockdep 的检查逻辑(简化):
// 1. 验证锁的获取/释放顺序是否一致 → 检查的是"锁对象",不是"等待者"
// 2. 验证是否存在潜在的死锁循环 → 检查的是锁之间的依赖图

// GhostLock 的问题不在"锁",而在"谁在等锁":
// - lockdep 检查:这把锁有没有被正确释放 → ✓ 通过
// - 实际的问题:释放锁时清理错了等待者 → ✗ 完全感知不到

这就是为什么一个能够绕过内核最核心安全检查机制的漏洞,能够潜伏 15 年。

2.3 利用链分析

Nebula Security 公开的利用链达到 97% 稳定性,整条链大约在 5 秒内完成:

text
阶段 1:竞态触发
├── 创建 4 个线程,分为两组配对
├── 一组制造 -EDEADLK 回滚路径(触发 remove_waiter 误清理)
├── 另一组成为受害者(其栈帧被误清理后释放)
└── 通过精确的调度控制,在 ~6 条指令窗口内触发 UAF

阶段 2:堆喷占位
├── 向已释放的栈帧区域喷射伪造数据
├── 构造一个假的 rt_mutex_waiter 结构
└── 控制其中的 task_struct 指针

阶段 3:权限提升
├── 通过 /proc/self/fdinfo 读取任意内核内存
├── 定位当前进程的 cred 结构
├── 覆写 cred->uid = 0(root)
└── 容器环境中:找到 init_ns 实现容器逃逸

三、VEGA 的工作流程还原

虽然没有官方文档,但从 GhostLock 的发现过程和 Nebula Security 的研究风格,我们可以还原 VEGA 的大致工作流程:

步骤 1:代码语义建模

VEGA 首先将内核源码转化为 LLM 可理解的语义图:

python
# 伪代码:VEGA 的代码建模流程
class CodeSemanticModel:
    def analyze_function(self, func: Function) -> SemanticGraph:
        """
        将 C 函数转化为包含以下信息的图:
        - 数据流(哪个变量流向哪里)
        - 控制流(if/loop/return 的路径)
        - 内存操作(alloc/free/pointer deref)
        - 并发语义(lock/unlock/atomic operations)
        - 调用上下文(谁调用了这个函数,在什么锁上下文中)
        """
        graph = SemanticGraph()
        
        # LLM 辅助:理解函数的"意图"
        intent = self.llm.classify_intent(func)
        # intent: "清理等待队列中的元素并调整优先级继承"
        
        # LLM 辅助:识别隐含假设
        assumptions = self.llm.extract_assumptions(func)
        # assumptions: ["假设 waiter 始终属于 current task"]
        
        graph.add_intent(intent)
        graph.add_assumptions(assumptions)
        return graph

步骤 2:假设验证与矛盾检测

这是 VEGA 最核心的能力——检测代码中的"隐含假设"与"实际调用路径"之间的矛盾:

python
# 步骤 2:假设验证
class AssumptionValidator:
    def validate(self, func: Function, callers: List[CallSite]) -> List[Violation]:
        violations = []
        
        for assumption in func.assumptions:
            for caller in callers:
                # 符号执行:在这个调用路径下,假设是否成立?
                result = self.symbolic_executor.check(
                    assumption=assumption,  # "waiter 属于 current task"
                    call_path=caller,       # futex_lock_pi → rt_mutex_slowlock → remove_waiter
                    context=caller.context  # 当前线程上下文
                )
                
                if not result.is_valid:
                    violations.append(Violation(
                        assumption=assumption,
                        violating_path=caller,
                        severity=self.ai_scorer.score(result)
                    ))
        
        return violations

对于 GhostLock,VEGA 很可能识别到了这样的矛盾:

  1. remove_waiter() 的注释/代码逻辑暗示"清理当前任务的等待记录"
  2. 但在 futex 优先级继承回滚路径中,调用者可能正在处理"另一个睡眠线程"的清理
  3. 这种"当前任务"与"实际待清理任务"的不一致,恰好形成一个 UAF 窗口

步骤 3:自动 PoC 构建

一旦 VEGA 认定某个可疑点具有高利用价值,它会尝试自动构建概念验证:

python
# 步骤 3:PoC 自动生成(简化)
class PoCGenerator:
    def generate(self, vulnerability: Vulnerability) -> PoC:
        # 1. 生成触发代码
        trigger = self.generate_trigger(vulnerability.race_condition)
        
        # 2. 生成堆喷代码
        spray = self.generate_heap_spray(vulnerability.freed_object)
        
        # 3. 生成提权代码
        escalate = self.generate_privilege_escalation(vulnerability)
        
        # 4. 组装完整利用链
        poc = PoC(trigger=trigger, spray=spray, escalate=escalate)
        
        # 5. 在隔离环境中测试
        success_rate = self.test_in_sandbox(poc)
        
        return poc, success_rate

四、AI 漏洞挖掘的现状与趋势

4.1 2026 年 AI 安全工具格局

VEGA 并不是孤例。2026 年上半年,AI 驱动的安全工具正在快速涌现:

工具/系统开发者核心方法代表性发现
VEGANebula SecurityLLM + 符号执行 + FuzzingGhostLock ($92K)
AI 辅助 FatFs 审计runZero ResearchCopilot "auto" 模式CVE-2026-6682/6687/6688
Claude Code 安全审计安全研究员社区交互式代码审查多个中危漏洞
Syzkaller + LLMGoogle/社区LLM 生成 syscall 序列多个内核崩溃
Semgrep AISemgrepAI 驱动的规则生成应用层逻辑漏洞

4.2 AI 的优势领域

AI 漏洞挖掘在以下场景已经展现出超越传统方法的潜力:

  1. 深层逻辑漏洞:需要理解跨函数的"业务逻辑",而非简单的 buffer overflow
  2. 并发/竞态漏洞:需要理解时序和多线程交互
  3. "古老"代码中的漏洞:长期未被审计的代码,传统工具可能因"假设过时"而遗漏
  4. 协议/格式解析漏洞:需要理解复杂的状态机

4.3 局限与挑战

text
AI 漏洞挖掘的当前局限:

1. 误报管理
   ├── AI 可能产生大量"看起来可疑但实际不可利用"的发现
   └── 需要人类专家进行最终确认(目前)

2. 利用链构建
   ├── 从"漏洞存在"到"可利用"之间仍有巨大鸿沟
   └── 目前仍需人类研究员完成最复杂的利用链组装

3. 新类型漏洞
   ├── AI 模型基于历史漏洞数据训练
   └── 对全新的漏洞类型/攻击面可能不够敏感

4. 核外场景
   ├── 内核漏洞挖掘相对成熟(因为接口清晰、代码集中)
   └── Web 应用、云原生等场景的自动化挖掘仍在早期

五、安全从业者的新范式

VEGA 和 GhostLock 事件给安全从业者传递了几个清晰的信号:

5.1 从"猎人"到"农场主"

传统漏洞挖掘像是狩猎——你凭经验和直觉在代码丛林中搜寻猎物。AI 工具让它变成了农业——你搭建自动化流水线,AI 负责播种(Fuzzing)、除草(误报过滤)、收割(漏洞确认)。

对安全研究员的影响

  • 初级研究员需要学会使用 AI 工具而非从零手写 Fuzzer
  • 高级研究员的护城河从"找到漏洞"转移到"构建 AI 找不到的漏洞类型的挖掘方法"
  • 工具开发和 AI 调优成为核心技能

5.2 漏洞发现的"工业化"

text
旧范式:天才研究员 + 数月深度审计 → 1个关键漏洞
新范式:AI 平台 + 数小时自动化分析 → N个候选漏洞 → 人工确认 → 关键漏洞

效率提升:10-100倍
覆盖广度:从"重点区域"到"全代码库"
发现速度:从"月"到"小时"

5.3 防御侧的影响

如果攻击者也使用类似 VEGA 的工具,漏洞发现的"对称性"将被打破:

  • 过去:厂商有更长时间在漏洞被发现前悄悄修复
  • 现在:AI 工具可以在代码提交后数小时内发现新引入的漏洞
  • 时间窗口急剧缩小,自动化的漏洞修复(auto-patching)将成为必需

六、实战:用 LLM 辅助审计 Linux 内核模块

虽然我们无法直接使用 VEGA,但可以基于开源工具搭建一个轻量级的 AI 辅助审计流水线:

python
#!/usr/bin/env python3
"""
AI 辅助内核代码审计脚本(概念验证)
依赖:openai / anthropic SDK, pycparser, coccinelle
"""
import subprocess
from pathlib import Path

# 步骤 1:使用 Coccinelle 进行模式匹配
def run_coccinelle(kernel_path: str, semantic_patch: str):
    """运行语义补丁,匹配可疑模式"""
    result = subprocess.run(
        ["spatch", "--sp-file", semantic_patch, "--dir", kernel_path],
        capture_output=True, text=True
    )
    return result.stdout

# 步骤 2:提取可疑代码片段
def extract_snippets(coccinelle_output: str, max_snippets: int = 50):
    """从 Coccinelle 输出中提取代码片段"""
    snippets = []
    current = []
    
    for line in coccinelle_output.split('\n'):
        if line.startswith('diff -u'):
            if current:
                snippets.append('\n'.join(current))
            current = [line]
        else:
            current.append(line)
    
    if current:
        snippets.append('\n'.join(current))
    
    return snippets[:max_snippets]

# 步骤 3:LLM 分析代码片段
def analyze_with_llm(snippet: str) -> dict:
    """
    让 LLM 分析代码片段:
    1. 这段代码在做什么?
    2. 有什么隐含假设?
    3. 有没有潜在的 race condition / UAF / double free?
    4. 如果有,尝试构造 PoC 思路
    """
    prompt = f"""
You are a Linux kernel security auditor. Analyze this code snippet for security vulnerabilities.

Focus on:
1. Use-after-free conditions (especially in error paths)
2. Race conditions (especially lock/unlock asymmetry)
3. Implicit assumptions that might be violated by callers
4. Reference counting bugs

Code:
```c
{snippet}

Respond in JSON with this structure: { "function_purpose": "...", "implicit_assumptions": [...], "potential_vulnerabilities": [ { "type": "use-after-free | race-condition | double-free | refcount | other", "severity": "critical | high | medium | low", "description": "...", "exploit_scenario": "...", "confidence": 0.0-1.0 } ], "recommended_fix": "..." } """ # 实际使用中调用 LLM API # response = client.messages.create(...) pass

主流程

def main(kernel_path: str): print(f"[*] 开始审计: {kernel_path}")

# 匹配 pattern:锁内分配内存 → 锁外释放?
uaf_pattern = """
@uaf_suspect@
expression E;
identifier lock, unlock;
position p;
@@
lock(...);
... when != unlock(...)
kfree@p(E);
... 
unlock(...);
"""

print("[*] 运行语义模式匹配...")
output = run_coccinelle(kernel_path, uaf_pattern)

print(f"[*] 提取代码片段...")
snippets = extract_snippets(output)

print(f"[*] 发现 {len(snippets)} 个可疑代码块,开始 LLM 分析...")

findings = []
for i, snippet in enumerate(snippets):
    print(f"  [{i+1}/{len(snippets)}] 分析中...")
    result = analyze_with_llm(snippet)
    if result['potential_vulnerabilities']:
        findings.extend(result['potential_vulnerabilities'])

# 按严重程度排序
findings.sort(key=lambda x: (
    {'critical': 4, 'high': 3, 'medium': 2, 'low': 1}[x['severity']]
), reverse=True)

print(f"\n[*] 审计完成,发现 {len(findings)} 个潜在漏洞:")
for i, f in enumerate(findings[:10]):
    print(f"  [{f['severity'].upper()}] {f['type']}: {f['description'][:80]}...")

if name == "main": # 示例:审计内核的 locking 子目录 main("/path/to/linux/kernel/locking")


### 使用 syzkaller + LLM 增强的内核 Fuzzing

```bash
# syzkaller 配置示例:为 LLM 辅助 Fuzzing 做准备
# 通过分析 syzkaller 的覆盖率数据,让 LLM 引导 Fuzzer 向未覆盖区域探索

# 1. 运行 syzkaller 收集覆盖率
./syz-manager -config=my.cfg -debug

# 2. 导出覆盖率报告(LLVM 格式)
llvm-cov export ./vmlinux -format=lcov > coverage.lcov

# 3. LLM 分析未覆盖区域,生成新的 syzkaller 程序
# python analyze_coverage.py coverage.lcov | generate_syz_programs > new_programs/

# 4. 将 LLM 生成的程序注入 syzkaller corpus
cp new_programs/* workdir/corpus/

七、结论与展望

GhostLock 和 VEGA 的故事不仅仅是一个漏洞案例。它代表着一个时代的转折:

  1. AI 不再是安全研究的辅助工具——它开始自主发现人类 15 年未能发现的关键漏洞
  2. 漏洞发现的工业化正在加速——从"天才的直觉"到"系统的自动化"
  3. 安全从业者的技能栈需要更新——学会构建和驾驭 AI 工具,比学会手工审计更重要
  4. 但人类的判断无可替代——AI 负责"发现可疑",人类负责"判断真假"和"构建完整利用链"

正如 GhostLock 事件中 Nebula Security 的研究员所说:VEGA 找到了漏洞,但把漏洞变成一条 97% 稳定的提权链——这仍然是顶尖人类研究员的独门绝技。

AI 漏洞挖掘工具越来越强大,但能驾驭它们的人,才是真正的胜负手。


参考资料

上次更新于: