Dirty Frag:Linux 内核 IPsec / RxRPC Page Cache 写入提权漏洞

文档版本:v1.0 · 更新日期:2026-05-18 适用对象:安全研究员、系统管理员、DevSecOps 团队


漏洞速览

属性
CVE 编号CVE-2026-43284 (ESP) / CVE-2026-43500 (RxRPC)
漏洞别名Dirty Frag / CopyFail 2
CVSS 评分7.8 HIGH(两者)
CVSS 向量AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
漏洞类型本地权限提升 LPE(Page Cache 写入原语)
攻击向量本地 Local
权限要求低权限 Low
用户交互不需要 None
公开日期2026-05-07
PoC 状态已公开(含 “Copy Fail 2: Electric Boogaloo”)
补丁版本ESP: commit f4c50a4034e6 已合并; RxRPC: 暂无官方补丁
临时缓解可禁用 esp4 / esp6 / rxrpc 模块
发现者Hyunwoo Kim (@v4bel),独立于 CopyFail 发现

关键时间线:2026-05-07 Hyunwoo Kim 公开披露 → 2026-05-08 ESP 补丁合并主线 (commit f4c50a4034e6) → RxRPC 补丁截至 2026-05-18 仍未合并。


漏洞简介

Dirty Frag 是由安全研究员 Hyunwoo Kim (@v4bel) 发现的两个 Linux 内核本地权限提升漏洞的组合。Kim 独立发现了与 CopyFail 相同的漏洞类型——Page Cache 写入原语,但漏洞位于不同的内核子系统中。由于有人通过逆向分析内核补丁 commit 推导出了利用方法,导致披露被迫提前公开。

该漏洞由两个独立的 Page Cache 写入原语组成,二者可以组合成完整的权限提升利用链:

CVE-2026-43284:在 xfrm-ESP(IPsec)接收路径(esp4 / esp6)中,splice() / sendfile() 系统调用将管道页(pipe page)注入到 socket 缓冲区。内核在对 ESP 报文进行原地解密时,并未对分页缓冲区获取独占所有权,导致无特权的进程仍然保留对解密后明文的引用,从而实现了 Page Cache 写入原语。该漏洞自 2017 年起已存在于内核中。

CVE-2026-43500:在 RxRPC(AFS 文件系统协议)接收路径中,存在类似的 splice() 注入机制,从而产生类似的 Page Cache 写入原语。该漏洞自 2023 年起存在于内核中。

将两个漏洞组合使用,攻击者可以实现完整的本地权限提升链,从低权限用户直接获取 root 权限。


技术原理

CVE-2026-43284 利用链(ESP 路径)

攻击流程如下:

  1. IPsec ESP 接收路径:内核在 esp4 / esp6 模块中处理 IPsec ESP 报文接收。
  2. splice()/sendfile() 注入:攻击者调用 splice()sendfile() 系统调用,将管道页(pipe page)注入到 socket 缓冲区中。
  3. 原地解密缺陷:内核在对 ESP 报文进行解密时,直接在原缓冲区上进行原地解密,而未对分页缓冲区获取独占所有权。
  4. 明文引用残留:由于解密未获取独占所有权,无特权进程仍然保留对解密后明文页面的引用。
  5. Page Cache 写入原语:通过操作这一引用,攻击者可以构造任意 Page Cache 写入原语。
  6. 权限提升:利用 Page Cache 写入能力修改内核关键数据结构(如文件内容、进程凭证等),最终实现本地权限提升至 root。

CVE-2026-43500 利用链(RxRPC 路径)

攻击流程如下:

  1. RxRPC 接收路径:内核通过 rxrpc 模块处理 AFS 文件系统协议的接收。
  2. 相同 splice() 注入:与 ESP 路径类似,攻击者通过 splice() 将管道页注入到 socket 缓冲区。
  3. Page Cache 写入原语:利用相同的缺陷机制获得 Page Cache 写入能力。
  4. 联合利用:与 ESP 路径组合,构成完整的权限提升利用链。

利用条件

  • 通常需要 CAP_NET_ADMIN 权限,这限制了在容器环境中的直接利用。
  • 在默认 Kubernetes 节点(使用默认 seccomp 配置文件)中,利用难度较高。
  • 在普通虚拟机或未加固的 Linux 主机上,普通用户可通过一条命令获取 root 权限。

受影响版本

发行版受影响情况备注
Ubuntu(所有版本)CVE-2026-43284 + CVE-2026-43500两个漏洞均受影响
RHEL 8 / 9 / 10CVE-2026-43284 + CVE-2026-43500两个漏洞均受影响
AlmaLinux 8仅 CVE-2026-43284不含 rxrpc 模块
AlmaLinux 9 / 10CVE-2026-43500需安装 kernel-modules-partner
CentOS Stream 10CVE-2026-43284 + CVE-2026-43500两个漏洞均受影响
Fedora(近期版本)CVE-2026-43284 + CVE-2026-43500两个漏洞均受影响
openSUSE TumbleweedCVE-2026-43284 + CVE-2026-43500两个漏洞均受影响
OpenShift 4潜在受影响需进一步评估

漏洞影响场景

  1. 普通 Linux 主机本地提权:攻击者在获得低权限 shell 后,可执行一条命令直接提升至 root 权限,完全控制主机。
  2. Kubernetes 集群容器逃逸:攻击者可在 Pod 内利用漏洞从容器逃逸至宿主机节点。由于默认 seccomp 配置文件的存在,利用难度高于普通主机,但仍不可忽视。
  3. 云虚拟机完全接管:在 AWS EC2、Azure VM、GCP Compute Engine 等云环境中,低权限用户可利用此漏洞获取虚拟机 root 权限,进而横向移动至同一网络中的其他资源。
  4. IPsec 网关沦陷:若攻击者已获得 IPsec 网关的本地访问权限,可利用该漏洞提升权限并进一步渗透内网。不过该场景的前提是攻击者已具备本地访问能力。

修复措施

推荐修复(根本解决)

CVE-2026-43284(ESP 路径)内核升级

  • Ubuntu/Debian:sudo apt update && sudo apt upgrade
  • RHEL/AlmaLinux:sudo dnf update kernel*

CVE-2026-43500(RxRPC 路径): 截至 2026-05-18,RxRPC 的官方补丁尚未合并。请持续关注各发行版的安全公告,一旦补丁发布后立即更新。

临时缓解(无法立即升级时)

在无法立即升级内核的环境中,可通过禁用受影响的内核模块进行临时防护:

# 立即卸载受影响模块
sudo modprobe -r esp4 esp6 rxrpc 2>/dev/null || true
 
# 阻止模块被自动加载
cat << 'EOF' | sudo tee /etc/modprobe.d/dirty-frag-mitigation.conf
install esp4 /bin/false
install esp6 /bin/false
install rxrpc /bin/false
EOF
 
# 更新 initramfs 以确保重启后生效
sudo update-initramfs -u

⚠️ 警告

  • 禁用 esp4 / esp6 会导致 IPsec 功能不可用,影响 VPN 和加密隧道通信。
  • 禁用 rxrpc 会影响 AFS 文件系统功能。
  • Kubernetes 环境建议额外配置:移除 Pod 的 CAP_NET_ADMIN 能力,并使用 RuntimeDefault seccomp 配置文件。

一键检查与执行临时修复脚本

检查脚本

#!/bin/bash
# Dirty Frag 漏洞检查脚本
# 用途:检查系统是否受 CVE-2026-43284 / CVE-2026-43500 影响
 
echo "=== Dirty Frag 漏洞检查 ==="
echo ""
 
# 1. 检查当前内核版本
echo "[1] 当前内核版本:"
uname -r
echo ""
 
# 2. 检查受影响模块是否已加载
echo "[2] 受影响模块加载状态:"
for mod in esp4 esp6 rxrpc; do
    if lsmod | grep -q "^${mod}\s"; then
        echo "  [⚠ VULNERABLE] ${mod} 已加载"
    else
        echo "  [✓ OK] ${mod} 未加载"
    fi
done
echo ""
 
# 3. 检查是否存在 modprobe 黑名单配置
echo "[3] modprobe 黑名单配置检查:"
if [ -f /etc/modprobe.d/dirty-frag-mitigation.conf ]; then
    echo "  [✓] 检测到缓解配置文件 /etc/modprobe.d/dirty-frag-mitigation.conf"
    cat /etc/modprobe.d/dirty-frag-mitigation.conf
else
    echo "  [✗] 未检测到缓解配置文件"
fi
echo ""
 
# 4. 检查内核模块是否可加载
echo "[4] 受影响模块可用性检查:"
for mod in esp4 esp6 rxrpc; do
    if modinfo ${mod} &>/dev/null; then
        echo "  [⚠] ${mod} 模块可用(存在被加载风险)"
    else
        echo "  [✓] ${mod} 模块不可用"
    fi
done
echo ""
 
echo "=== 检查完毕 ==="

临时修复脚本

#!/bin/bash
# Dirty Frag 临时修复脚本
# 用途:禁用 esp4 / esp6 / rxrpc 内核模块以防止漏洞利用
# 注意:会创建修复前的状态备份,可回滚
 
set -e
 
BACKUP_DIR="/root/dirty-frag-backup-$(date +%Y%m%d_%H%M%S)"
 
echo "=== Dirty Frag 临时修复脚本 ==="
echo "备份目录:${BACKUP_DIR}"
echo ""
 
# 创建备份目录
mkdir -p "${BACKUP_DIR}"
 
# 备份当前已加载模块状态
echo "[1] 备份当前模块状态..."
lsmod > "${BACKUP_DIR}/lsmod_before.txt" 2>/dev/null || true
 
# 备份旧的 modprobe 配置(如果存在)
if [ -f /etc/modprobe.d/dirty-frag-mitigation.conf ]; then
    cp /etc/modprobe.d/dirty-frag-mitigation.conf "${BACKUP_DIR}/mitigation.conf.bak"
    echo "  [✓] 已备份旧配置"
fi
 
# 卸载受影响模块
echo "[2] 卸载受影响模块..."
for mod in esp4 esp6 rxrpc; do
    if lsmod | grep -q "^${mod}\s"; then
        modprobe -r ${mod} 2>/dev/null && echo "  [✓] 已卸载 ${mod}" || echo "  [✗] 无法卸载 ${mod}(可能正在使用中)"
    else
        echo "  [-] ${mod} 未加载,跳过"
    fi
done
 
# 写入 modprobe 黑名单
echo "[3] 写入 modprobe 黑名单配置..."
cat << 'EOF' > /etc/modprobe.d/dirty-frag-mitigation.conf
# Dirty Frag 漏洞临时缓解 - 禁止加载受影响模块
# 创建时间:$(date)
install esp4 /bin/false
install esp6 /bin/false
install rxrpc /bin/false
EOF
echo "  [✓] 配置已写入 /etc/modprobe.d/dirty-frag-mitigation.conf"
 
# 更新 initramfs
echo "[4] 更新 initramfs..."
if command -v update-initramfs &>/dev/null; then
    update-initramfs -u && echo "  [✓] initramfs 已更新"
elif command -v dracut &>/dev/null; then
    dracut --force && echo "  [✓] initramfs 已更新 (dracut)"
else
    echo "  [!] 未找到 update-initramfs 或 dracut,请手动更新 initramfs"
fi
 
echo ""
echo "=== 修复完成 ==="
echo ""
echo "回滚方法:"
echo "  1. 删除黑名单配置:rm /etc/modprobe.d/dirty-frag-mitigation.conf"
echo "  2. 更新 initramfs:update-initramfs -u"
echo "  3. 手动加载模块:modprobe esp4; modprobe esp6; modprobe rxrpc"
echo "  4. 备份文件位于:${BACKUP_DIR}"

参考资源