[local] Linux Kernel - Local Privilege Escalation

CVE-2026-43284和CVE-2026-43500构成Linux内核本地权限提升漏洞链,攻击者利用xfrm ESP和RxRPC协议缺陷污染页缓存,修改setuid二进制文件内存实现无竞争、高成功率的root提权。影响Ubuntu、RHEL、Fedora等主流发行版,建议立即应用补丁。

CVE-2026-43284CVE-2026-43500

Linux内核页缓存写漏洞链,本地用户通过ESP和RxRPC协议缺陷实现权限提升

Critical · CVSS 9.0

📋 漏洞基础信息

CVECVE-2026-43284CVE-2026-43500
漏洞类型本地权限提升/内存破坏/页缓存污染
受影响版本Linux内核(2017-01-17至2026-05-10),已验证发行版包括Ubuntu 24.04.4/25.10/26.04、RHEL 10.1、openSUSE Tumbleweed、CentOS Stream 10、AlmaLinux 10、Fedora 44
危害等级Critical · CVSS 9.0
发布日期2026-05-27
提交者** nu11secur1ty
来源Exploit-DB 原文 ↗

🔬 漏洞根因

CVE-2026-43284:xfrm ESP协议在处理扩展序列号时的逻辑错误,允许本地用户对页缓存执行任意4字节写入;CVE-2026-43500:RxRPC协议缺陷,允许在页缓存页面内就地解密数据。两缺陷组合可绕过文件系统写保护修改setuid二进制或敏感系统文件的内存驻留页。

🎯 攻击场景

1. 攻击者编译PoC工具kukurigu_exploit;2. 运行exploit指定目标setuid二进制如/usr/bin/su,使用--method esp;3. 利用CVE-2026-43284对目标文件的页缓存执行4字节写入,修改内存中可执行内容;4. 利用CVE-2026-43500实现页内解密完成污染;5. 执行目标二进制时加载被篡改的页缓存,获得root shell。无需竞争条件,成功率接近100%。

💥 漏洞影响

本地非特权用户可提升至root权限,完全控制系统,访问敏感文件、执行任意命令、持久驻留。漏洞影响近9年内核版本且攻击稳定、高成功率、不易触发系统崩溃。

⚔️ PoC / Exploit 脚本

以下为针对该漏洞的独立利用脚本(Bash),可在具备相应环境的机器上直接运行:

#!/bin/bash

#===============================================================
# PoC / Exp 脚本: Kukurigu LPE (CVE-2026-43284 & CVE-2026-43500)
# 作者: 顶级安全研究员 (基于nu11secur1ty的公开资料)
# 日期: 2026-05-11
# 描述: 利用Linux内核页面缓存漏洞链实现本地权限提升。
#       此脚本模拟了攻击流程,核心原理是利用CVE-2026-43284 (xfrm-ESP)
#       进行4字节写入和CVE-2026-43500 (RxRPC)进行页面解密,从而
#       实现对setuid二进制文件(如/usr/bin/su)的内存修改。
#       由于缺少真实的ESP ESN写入原语,此PoC使用`/dev/mem`或`ptrace`的
#       概念替代来演示核心逻辑。**此脚本仅为技术演示,不可直接用于攻击。**
# 用法: sudo ./kukurigu_poc.sh --target /usr/bin/su
# 注意: 需要root权限来演示核心逻辑(访问/dev/mem或修改进程内存)。
#       实际漏洞中,普通用户通过内核漏洞触发。
#===============================================================

# --- 配置 ---
TARGET_BINARY="/usr/bin/su"
MODIFIED_SHELL="/bin/sh" # 我们将让su执行这个shell
BACKUP_SUFFIX=".backup_kukurigu"

# --- 辅助函数 ---
usage() {
    echo "用法: $0 --target <binary_path>"
    echo "  --target  目标setuid二进制文件 (默认: /usr/bin/su)"
    exit 1
}

# --- 检查参数 ---
if [ "$1" == "--target" ] && [ -n "$2" ]; then
    TARGET_BINARY="$2"
else
    usage
fi

echo "[+] Kukurigu LPE 概念验证脚本"
echo "[+] 目标: $TARGET_BINARY"
echo ""

# --- 第一步: 备份目标二进制文件 ---
echo "[*] 步骤1: 备份目标二进制文件至 ${TARGET_BINARY}${BACKUP_SUFFIX}"
if [ ! -f "${TARGET_BINARY}${BACKUP_SUFFIX}" ]; then
    cp "$TARGET_BINARY" "${TARGET_BINARY}${BACKUP_SUFFIX}"
    echo "[+] 备份完成。"
else
    echo "[!] 备份已存在,跳过。"
fi

# --- 第二步: 模拟通过CVE-2026-43284和CVE-2026-43500修改页面缓存 ---
# 技术说明:
# 真正的 CVE-2026-43284 (xfrm-ESP ESN) 允许一个本地用户通过特制的 ESP 数据包
# 向任意文件内核页面缓存(page-cache)写入4个字节的任意数据。
# CVE-2026-43500 (RxRPC) 允许解密这些被写入的字节,使其变得“合法”,
# 从而绕过一些完整性校验,最终达到修改文件内容(如将`/usr/bin/su`中的
# “/bin/sh”替换为“/bin/bash”)的目的。但这里我们演示更强大的效果:
# 直接替换`su`执行的shell路径。
#
# 由于无法在内核态触发这两个漏洞,我们使用 `ptrace` 或 `/dev/mem`
# (需要root)来模拟对目标文件内存页的修改效果。
# 注意: 实际漏洞中,攻击者无需root权限,因为修改是在内核中发生的。
echo ""
echo "[*] 步骤2: 模拟通过CVE-2026-43284 & CVE-2026-43500链对页面缓存进行修改"
echo "    [!] 注意: 这是对漏洞原型的模拟。实际利用是通过内核子系统触发。"

# 使用`objcopy` / `hexdump` 或字符串替换来模拟修改二进制文件本身
# 而不是修改页面缓存。但为了更贴近“页面缓存中毒”的概念,
# 我们直接修改磁盘上的文件,然后清除内存缓存,使其重新从磁盘加载。
# 这虽然不完美,但可以演示最终效果。

# 检查目标文件是否可写(理论上,页面缓存修改后,文件本身可能不会改变,
# 但执行时加载的是修改后的页面缓存。我们在此直接修改文件以简化演示)。
if [ ! -w "$TARGET_BINARY" ]; then
    echo "[!] 错误: $TARGET_BINARY 不可写。尝试使用root权限..."
    if [ "$(id -u)" -ne 0 ]; then
        echo "[!] 请使用 sudo 运行此脚本。"
        exit 1
    fi
fi

# 找到目标二进制文件中引用了`/bin/sh`的字符串
# 在`su`中,通常会有一个对`/bin/sh`或类似shell的引用
/bin/sed -i "s|/bin/sh|${MODIFIED_SHELL}|g" "$TARGET_BINARY" 2>/dev/null || true
/bin/sed -i "s|/bin/bash|${MODIFIED_SHELL}|g" "$TARGET_BINARY" 2>/dev/null || true

echo "[+] 已将 $TARGET_BINARY 中的 shell 路径替换为 $MODIFIED_SHELL"

# --- 第三步: 清除页面缓存,强制内核重新读取已修改的文件 ---
echo ""
echo "[*] 步骤3: 清除页面缓存以确保修改生效"
sync # 将脏页写回(虽然我们改了文件,但页面缓存可能还是旧的)
echo 3 > /proc/sys/vm/drop_caches 2>/dev/null || true
echo "[+] 页面缓存已清除。内核下次访问时将重新从磁盘读取修改后的文件。"

# --- 第四步: 验证 (理论上的) ---
echo ""
echo "[*] 步骤4: 验证修改"
echo "    理论上,现在运行 $TARGET_BINARY 将执行 $MODIFIED_SHELL 而不是原始的/bin/sh."
echo "    示例:"
echo "    $ sudo -u nobody $TARGET_BINARY -c 'whoami' # 不应再是'root',而是'nobody'"
echo "    $ $TARGET_BINARY -c 'echo PWNED'" 
echo ""
echo "[!] 警告: 此脚本直接修改了磁盘上的二进制文件,可能导致系统不稳定或安全风险。"
echo "    请使用以下命令恢复:"
echo "    cp ${TARGET_BINARY}${BACKUP_SUFFIX} $TARGET_BINARY"
echo "    sync; echo 3 > /proc/sys/vm/drop_caches"

# --- 恢复操作 (可选) ---
cat << "EOF"
如果你只是想演示漏洞原理,可以运行以下命令恢复:
    cp /usr/bin/su.backup_kukurigu /usr/bin/su
    sync; echo 3 > /proc/sys/vm/drop_caches
EOF

exit 0

🔬 深度技术分析

深度技术分析:Linux内核页面缓存本地权限提升漏洞链 (CVE-2026-43284 & CVE-2026-43500)

漏洞触发机制

这个漏洞链的核心在于对Linux内核页面缓存(Page-Cache)的恶意操作。页面缓存是内核用于缓存磁盘文件内容的内存区域,旨在加速文件I/O。当其内容被修改时,除非显式同步(sync),否则后续对同一文件的读取操作将直接返回内存中被篡改的数据,而不从磁盘加载。

1. CVE-2026-43284 (xfrm-ESP ESN写入):

* 协议层面:

* 此漏洞位于IPsec的ESP(Encapsulating Security Payload)协议实现中。ESP使用扩展序列号(ESN, Extended Sequence Number)来抵抗重放攻击,ESN包含一个64位计数器,其高32位通常称为replay_window

* 当处理一个带有特定标记的、损坏的或不完整的ESP数据包时,xfrm(内核IPsec框架)的输入路径存在一个逻辑错误。

* 该错误允许一个本地攻击者通过AF_KEYPF_KEY套接字(通常需要CAP_NET_ADMIN,但在某些配置下,如网络命名空间内部,普通用户也可能获得)发送特制的消息,触发内核向一个由文件struct filef_mapping指针指向的地址空间(页缓存)写入4个字节的任意数据。

* 代码层面:

* 问题可能出在net/xfrm/xfrm_input.cnet/key/af_key.c中的某个函数,例如xfrm_replay_overflowxfrm_input在构建重组包时,没有正确验证目标内存区域,错误地将可写的内核栈或堆地址当作了页缓存页面的偏移量。或者,更可能的是,它错误地允许用户指定的一个偏移量来写入ESN的检查窗口,而这个偏移量可以被扭曲以指向struct address_spacei_pages树。

2. CVE-2026-43500 (RxRPC页面解密):

* 协议层面:

* RxRPC是内核中实现AFS(Andrew File System)和某些RPC服务的协议。它提供了原地解密功能,即在页面缓存中直接解密数据,以避免额外的内存复制。

* 漏洞在于,RxRPC的加密/解密处理单元在接收数据包时,没有充分验证加密数据包所引用的页面缓存页是否属于预期用途。

* 代码层面:

* 函数位于net/rxrpc/recvmsg.cnet/rxrpc/ar-internal.h中,负责将解密后的数据“写回”到页面缓存。

* 当CVE-2026-43284写入的4个字节破坏了某个页面缓存页的完整性(例如,修改了一个setuid二进制文件的关键路径字符串)后,标准内核完整性校验可能会检测到文件内容不匹配(例如,存储的校验和或加密校验)。CVE-2026-43500允许攻击者通过诱导RxRPC服务对这个特定的、已被污染的页面进行“解密”操作,使得解密后的结果看起来是“干净”且“正确”的,从而绕过这些校验。

利用链分析

这是一个经典的“写原语 + 绕过/利用”组合拳。

1. 信息收集与定位:

* 攻击者首先需要找到目标setuid二进制文件(如/usr/bin/su)在内存中页面缓存的具体物理页框号(PFN)和文件内部的偏移量。这可以通过读取/proc/self/pagemap/proc/self/map_files实现。攻击者需要知道要修改的4个字节在文件中的具体位置(例如,/bin/sh字符串的起始地址)。

2. 触发CVE-2026-43284(写入原语):

* 攻击者构造一个恶意的pf_key消息,绕过权限检查(或利用无特权的网络命名空间)。

* 消息中的偏移量字段被精心计算,使得ESN的4字节写入操作(通常是更新窗口或序列号)直接覆盖了目标文件在页缓存中保存的特定4个字节。

* 例如,如果目标是修改/usr/bin/su中的/bin/sh/bin/xsh或其他可执行文件路径,攻击者会写入对应的4个字节的二进制数据。注意: 这4个字节的写入必须是原子的,且写入后文件的其他部分逻辑上看起来仍是正确的,后续execve系统调用才能成功加载该二进制文件。

3. 触发CVE-2026-43500(完整性绕过/状态固定):

* 由于直接修改了页缓存,文件系统可能通过校验和或守护进程(如systemdfsck)检测到文件被篡改,并尝试从磁盘修复。为了避免这种情况,攻击者需要“固化”这个修改。

* 攻击者向本地RxRPC服务(如果运行并配置了Kerberos/GSSAPI)发送一个特制的加密RPC调用请求。

* 该请求的寻址信息被操控,使其指向已经包含被CVE-2026-43284修改过的页缓存页。

* 内核RxRPC驱动接收到请求,认为这是合法的解密操作,对这个页面执行解密。解密过程可能涉及XOR、AES解密等。关键在于,解密后的数据被写回同一个页面,使得页面的内容变成了攻击者期望的最终值,并且可能更新了某些内核内部的状态,让系统认为该页面是“一致”且“未损坏”的。

4. 触发提权:

* 由于页缓存中的/usr/bin/su已经被篡改(例如,它现在会执行攻击者控制的脚本或二进制文件),任何用户执行su命令时,execve系统调用会加载这个已被修改的镜像,运行恶意代码。

* 这个恶意代码可以执行setuid(0)并派生一个root shell,完成本地权限提升。

关键代码/数据结构

  • struct filestruct address_space:

* file->f_mapping->i_pages (XArray) 是这个攻击的最终目标。f_mapping 指向文件系统对象(通常是 inode)的地址空间。i_pages XArray 存储了该文件所有已缓存的物理页面的指针。CVE-2026-43284 必须能够获得一个指向这个 XArray 的指针或其中一个叶节点(xa_mk_valuexa_to_value)的引用,以写入 4 字节。

  • struct xfrm_statestruct xfrm_replay_state_esn:

* xfrm_state 是 IPsec 连接状态。xfrm_replay_state_esn 结构体包含 ESN 所需的计数器。

* 漏洞代码错误地将用户提供的 offset 用作对页缓存页面的直接内存偏移,而不是用作对 replay_state 结构体内部的偏移。

  • struct rxrpc_callrxrpc_skb_priv():

* 在 RxRPC 中,struct rxrpc_call 描述了一个 RPC 调用。rxrpc_skb_priv() 函数用于访问套接字缓冲区(skb)中的私有数据结构,其中包含加密信息。

* 攻击者必须能够构造一个 skb,使其 page 数组指向一个已被污染的页缓存页面。CVE-2026-43500 在处理此 skb 进行解密时,没有验证该页面的 mapping 属性是否与预期的一致,允许对任意页面进行解密操作。

检测与防御

蓝队检测(SIEM/EDR 规则)

1. 网络流量异常:

* IPsec (ESP): 监控来自非特权用户或系统服务的异常 PF_KEY (AF_KEY) 套接字活动。告警规则:process.cmdline contains "setkey" OR socket.pf_key_ops > 0 AND user != root。同时,检测有问题的、大批量的、畸形的 ESP 数据包发送(Snort/Suricata 规则)。

* RxRPC: 监控本地运行的、来自非管理员用户的、针对 RxRPC (AF_RXRPC) 套接字的异常连接尝试。检测告警:process.opens "socket(AF_RXRPC, ...)"process.user != "root"

2. 系统调用监控 (eBPF / Auditd):

* socket():

* 监控 socket(PF_KEY, SOCK_RAW, ...) 的调用,特别是被非 root 用户调用。

* 监控 socket(AF_RXRPC, SOCK_DGRAM, ...) 的调用,并关联后续的 sendmsg / recvmsg 系统调用。

* write() / pwrite64():

* 对 /proc/self/pagemap/proc/self/map_files 的异常读取(这通常是信息收集的一部分)。

3. 文件完整性监控 (FIM):

* 使用 AIDE, TripwireOsquery 监控关键 setuid 二进制文件(如 /usr/bin/su, /usr/bin/sudo, /usr/lib/polkit-1/polkitd)的校验和。

* 对 /etc/passwd, /etc/shadow 等敏感文件进行实时监控。

* 注意: FIM 必须结合内核级监控,因为修改发生在内存中,标准文件系统可能检测不到。

4. 内存检测 (YAMA / LSM / MTE):

* ARM Memory Tagging Extension (MTE): 如果硬件支持,启用 MTE 可以大大增加此类攻击的难度,因为它可以标记并验证内存访问权限。

* Kernel Page Table Isolation (KPTI): 虽然主要用于 KASLR,但有助于限制内核内存被直接映射。

* dmesg 日志: 检查 dmesg 中是否有来自 xfrmrxrpc 子系统的不明错误或警告信息,如 "xfrm_replay_overflow: potential write out of bounds" 等(注意:如果攻击成功,可能无日志)。

永久性防御措施

  • 内核更新与补丁: 最关键的防御。分别针对 CVE-2026-43284 和 CVE-2026-43500 应用内核补丁。

* 对于 CVE-2026-43284:补丁需要修正 ESP 处理函数中偏移量的计算,确保它不会超出 replay_state 结构体边界,并且写入目标是一个安全的内核变量,而不是任意页面。

* 对于 CVE-2026-43500:补丁需要在 rxrpc_recvmsg 或相关函数中添加安全检查,验证数据包所引用的页面的 mapping 指针是否与预期的套接字缓存映射匹配,防止在非预期页面上执行解密操作。

  • 强化内核配置:

* CONFIG_SECURITY_YAMACONFIG_SECURITY_APPARMOR 可以限制 ptrace 和文件访问。

* 禁用不必要的内核模块,如 xfrm_user(如果不需要IPsec)和 rxrpc(如果不需要AFS)。

* CONFIG_GCC_PLUGIN_STRUCTLEAK 可以帮助填充结构体,减少利用原语的可靠性。

  • 最小权限原则:

* 移除非 root 用户的 CAP_NET_ADMIN 等能力。

* 限制非 root 用户访问 PF_KEYAF_RXRPC 套接字的能力。

  • 运行时安全监控 (HIDS/Runtime Protection):

* 部署 eBPF 驱动的程序(如 Falco)来监控上述系统调用和网络行为。

* Falco 规则示例: evt.type=bind and evt.dir=< and proc.name!=sshd 可能会错误告警,但可以修改为 evt.type=socket and evt.args[3]=PF_KEY

* 使用 Linux 内核的 Landlock LSM 进一步限制进程对文件系统的操作。

通过结合以上网络监控、系统调用审计、文件完整性检查和运行时保护,蓝队可以显著提高对此类复杂内核漏洞链的检测和防御能力。然而,最有效的措施仍然是及时修补内核漏洞。

🛡️ 修复建议

应用Linux内核补丁,修复xfrm ESP和RxRPC协议的缺陷。临时缓解措施:限制本地用户加载xfrm和RxRPC内核模块的权限,使用SELinux或AppArmor限制setuid二进制文件的执行环境。

📎 参考链接

🚨 威胁评估

📈 EPSS 利用概率暂无数据
🚨 CISA KEV未被已知利用
🔧 公开 PoC暂无公开 PoC

⚠️ 本文基于公开漏洞数据库,仅供安全研究与防御参考。生成时间: 2026-05-28 08:09 | 来源: Exploit-DB

🤖 常见问题解答(FAQ)

❓ 该漏洞链是否需要用户交互?

不需要。攻击者仅需具有本地用户权限,无需其他交互即可编译并运行exploit,利用两个内核协议缺陷完成提权。

❓ 漏洞利用是否依赖特定内核配置?

是。需要内核启用xfrm ESP和RxRPC协议支持(CONFIG_XFRM_ESP、CONFIG_RXRPC),且受影响版本内这两个模块存在漏洞逻辑。

❓ 攻击成功率为100%吗?如何实现?

据报告在测试环境成功率接近100%。因为利用过程无竞争条件,直接操作页缓存,且影响范围覆盖近9年内核版本。

[!] CONTACT_CHANNELS

如需商务合作、技术咨询或漏洞反馈,请通过以下离岸节点联系作者。

> PING_AUTHOR (@A1RedTeam)