Sploitus

Exploit for Zapscape-Fix

kitploit · 2026-09-02

Exploit Code

MARKDOWN354 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-AORIPUS-LTD-ZAPSCAPE-FIX
# Zapscape-Fix — CVE-2026-64561 KVM 内核热补丁

> **English | 简体中文**

给 **CentOS Stream 8 / RHEL 8** (4.18.0 全系列内核)的 KVM 宿主机修复 **CVE-2026-64561(Zapscape)** 漏洞的**内核热补丁** :

**不打补丁的风险** :租户虚拟机(guest)可以仅凭自身操作逃逸到宿主机,以宿主 内核 root 权限执行代码——击穿整台物理机及其上所有虚拟机。

**本项目的补丁** :基于 Linux 上游官方修复(`2abd5287f083`)backport 而来, 通过内核 livepatch 机制**在线生效** :

> ✅ 不重启宿主机 ✅ 不重启虚拟机 ✅ 不关闭任何虚拟化特性 ✅ 全程无感

* * *

## 目录

  * 受影响范围(按 CPU)
  * Kernel-ML(ELRepo mainline 内核)支持
  * 系统要求
  * 部署步骤
  * 验证补丁是否生效
  * 回滚
  * 常见问题
  * 项目结构
  * 参考资料
  * 版权与许可



* * *

## 受影响范围(按 CPU)

Zapscape 的触发条件分平台:**AMD 无任何额外硬件要求** (任意支持 SVM/NPT 的 CPU 均可触发);**Intel 必须支持 5 级 EPT(EPT page-walk length 5, PWL5)** 且宿主将其暴露给 L1,否则 root/child 别名无法构造,该攻击路径 不可触发。

**依据** :5-level paging / 5-level EPT 由 Intel 在 **Ice Lake 微架构** 首次实现 (Wikipedia: Intel 5-level paging;Intel 白皮书《5-Level Paging and 5-Level EPT》,文档号 671442);本仓库在 Xeon Platinum 8259CL(Cascade Lake)上实测 `IA32_VMX_EPT_VPID_CAP (MSR 0x48C)` 的 bit 7(PWL5)= **0** ,`/proc/cpuinfo` 无 `la57`——印证 Cascade Lake 及更早无 5 级 EPT。AMD 的 NPT 始终为 4 级硬件 walk,Zapscape 不需要 5 级能力,故 AMD 全代可触发。

> ⚠️ 代际表仅供参考,**以实测为准** (云厂商/固件可能禁用特性)。一条命令确认 你的 Intel 宿主机是否需要打补丁:

root@kitploit:~
    
    
    # 方法一(简单):检查 LA57(5-level paging)
    grep -m1 flags /proc/cpuinfo | grep -o la57 && echo "有 LA57 → 需打补丁" || echo "无 LA57 → 大概率无需"
    
    # 方法二(直接,Intel 专用):读取 EPT 能力 MSR 0x48C 的 bit 7(PWL5)
    dnf install -y msr-tools && modprobe msr
    V=$(rdmsr -p0 0x48c); echo "EPT PWL5 支持: $(( (0x$V >> 7) & 1 ))"   # 1=支持(需打补丁) 0=不支持
    

> ⚠️ "不可触发"≠"绝对安全":仅代表 Zapscape 的 Intel 攻击路径不成立;KVM shadow MMU 仍可能有其他风险,请继续关注官方安全更新。

* * *

## Kernel-ML(ELRepo mainline 内核)支持

如果你的宿主机因其他 CVE 需要新内核而从 ELRepo 安装了 `kernel-ml` (mainline 内核),Zapscape 的修复状态取决于版本:

kernel-ml 版本| Zapscape 状态| 处理  
---|---|---  
7.1.3 / 7.1.4| ❌ 未修复(源码已验证)| 升级到 7.1.7,或使用本仓库 kernel-ml livepatch(已实测)  
7.1.5 / 7.1.6| ✅ 已修复(上游 2abd5287f083 已合入)| 无需任何操作  
7.1.7| ✅ 已修复(源码已验证)| 无需任何操作  
  
  * **推荐做法** :把 kernel-ml 升级到当前最新版(7.1.7),漏洞随上游修复 一并解决,无需 livepatch。
  * **7.1.3/7.1.4 热修补(已实测)** :mainline 内核自带完整的 KLP 工具链 (`CONFIG_LIVEPATCH=y` \+ `CONFIG_KLP_BUILD=y` \+ objtool `klp` 子命令), 无需 kpatch。本仓库用内核原生的 `objtool klp diff` \+ `post-link` 流程, 以 `7.1.7` 中已修复的 `direct_page_fault` / `paging64_page_fault` / `paging32_page_fault` / `ept_page_fault` 为替换体,生成对 7.1.3 的 livepatch 模块(`livepatch/kernel-ml/`,详见 livepatch/kernel-ml/README.md)。 已在 7.1.3(自编译,与 ELRepo 7.1.x 源码一致)上实测: `kpatch`/`objtool` 生成的模块加载成功, 显示 4 个函数全部替换(enabled=1)、transition 完成,运行中的虚拟机零感知。



> 说明:7.1.x 已移除 kpatch 时代的 `klp_reloc` 旧格式,改用 `.klp.rela.*` 段(`klp_resolve_symbols` 解析),因此 4.18 用的 kpatch 0.9.x 工具链在 7.1.x 上不可用;本仓库的 kernel-ml 方案完全基于内核原生 KLP 工具链。

### 中国大陆安装 kernel-ml(ELRepo 国内镜像)

ELRepo 官方源(elrepo.org)在国内连通性差(实测约 15 kB/s)。请改用 国内镜像(实测 4 MB/s+):

root@kitploit:~
    
    
    # 安装 elrepo-release(一次)
    dnf install -y https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
    
    # 把 elrepo-kernel 源切换到清华 TUNA 镜像(中科大 USTC 同样可用:
    #   https://mirrors.ustc.edu.cn/elrepo/kernel/el8/$basearch/)
    awk '
    /^\[elrepo-kernel\]/ {ink=1}
    /^\[/ && !/^\[elrepo-kernel\]/ {ink=0}
    ink && /^baseurl=/ { print "baseurl=https://mirrors.tuna.tsinghua.edu.cn/elrepo/kernel/el8/$basearch/"; next }
    ink && /^[[:space:]]/ { next }
    ink && /^mirrorlist=/ { print "#" $0; next }
    { print }
    ' /etc/yum.repos.d/elrepo.repo > /etc/yum.repos.d/elrepo.repo.new && \
    mv /etc/yum.repos.d/elrepo.repo.new /etc/yum.repos.d/elrepo.repo
    
    # 安装最新 mainline 内核(含 kernel-ml-devel,kpatch 构建也需要它)
    dnf --enablerepo=elrepo-kernel install -y kernel-ml kernel-ml-devel
    
    # 确认新内核成为默认启动项
    grubby --default-kernel
    # 输出 /boot/vmlinuz-7.1.7-1.el8.elrepo.x86_64 即为成功
    

> ⚠️ 升级内核**必须重启** 才生效;重启会使 4.18 内核上已加载的 livepatch 失效(新内核自带修复则无需重新加载)。重启前请确认虚拟机的恢复机制 (魔方云面板会自动拉起其管理的 VM)。

* * *

## 系统要求

> 内核必须支持 livepatch(`CONFIG_LIVEPATCH=y`,RHEL 8 / Stream 8 默认开启), 部署第 0 步会先检查。

* * *

## 部署步骤

### 第 0 步:确认内核支持 livepatch

root@kitploit:~
    
    
    grep CONFIG_LIVEPATCH /boot/config-$(uname -r)
    

必须输出 `CONFIG_LIVEPATCH=y`,否则该内核无法热补丁。

### 第 1 步:获取本项目

root@kitploit:~
    
    
    # 中国大陆网络环境请用 ghproxy 加速镜像(直连 GitHub 可能失败):
    #   git clone https://ghproxy.net/github.com/Aoripus-LTD/Zapscape-Fix.git
    git clone https://github.com/Aoripus-LTD/Zapscape-Fix.git
    cd Zapscape-Fix/livepatch
    

### 第 2 步:安装前置工具

root@kitploit:~
    
    
    dnf install -y gcc make git patch elfutils elfutils-devel \
                   elfutils-libelf-devel openssl-devel bc bison flex dwarves \
                   yum-utils dnf-plugins-core kpatch kpatch-dnf
    

### 第 3 步:安装内核开发包(必须与运行内核一致)

root@kitploit:~
    
    
    dnf install -y kernel-devel-$(uname -r)
    

### 第 4 步:获取内核源码 ⚠️ 重点

**CentOS Stream 8 已于 2024-05-31 停止维护(EOL)** ,默认软件源已失效, `dnf download --source kernel` 在绝大多数机器上会失败。请按下面任选一种方式。

#### 方式 A:把 dnf 源切换到 vault 镜像(推荐,之后 `dnf` 全家都能用)

以阿里云镜像为例(测试环境实测可用):

root@kitploit:~
    
    
    # 把 Stream 8 的源从已失效的 mirrorlist 切换到 vault 快照
    sed -i 's|^mirrorlist=|#mirrorlist=|; s|^#baseurl=http://mirror.centos.org|baseurl=http://mirrors.aliyun.com/centos-vault|' \
        /etc/yum.repos.d/CentOS-Stream-*.repo
    
    dnf clean all && dnf makecache
    
    # 然后正常下载内核源码(会自动定位到正确文件)
    dnf download --source kernel
    

> 清华镜像同样可用:把上面的 `mirrors.aliyun.com/centos-vault` 换成 `mirrors.tuna.tsinghua.edu.cn/centos-vault`。

#### 方式 B:直接用 curl 下载源码 RPM

root@kitploit:~
    
    
    # URL 规则:<镜像>/centos-vault/8-stream/BaseOS/Source/SPackages/Packages/kernel-<内核版本>.src.rpm
    # 内核版本 = uname -r 去掉结尾的 .x86_64,例如:
    curl -O http://mirrors.aliyun.com/centos-vault/8-stream/BaseOS/Source/SPackages/Packages/kernel-4.18.0-553.6.1.el8.src.rpm
    
    # 也可以自动拼出你自己的内核版本:
    VER=$(uname -r | sed 's/\.x86_64$//')
    curl -O "http://mirrors.aliyun.com/centos-vault/8-stream/BaseOS/Source/SPackages/Packages/kernel-${VER}.src.rpm"
    

#### 解压源码

root@kitploit:~
    
    
    rpm2cpio kernel-*.src.rpm | cpio -idmv 'linux*.tar.xz'
    tar xf linux-*.tar.xz
    SRC=$(ls -d /root/linux-* | head -1)
    echo "内核源码目录: $SRC"
    

### 第 5 步:构建热补丁模块

root@kitploit:~
    
    
    ./build-livepatch.sh -s "$SRC" -j "$(nproc)"
    

> 中国大陆网络环境请追加 `-cn`(kpatch 源码改走 ghproxy 镜像): `./build-livepatch.sh -s "$SRC" -j "$(nproc)" -cn`

脚本会自动检测内核代码形态并选择正确的补丁变体,无需手工指定。 构建成功后生成 `/root/kpatch-out/zapscape_cve_2026_64561.ko`。

### 第 6 步:在线加载

root@kitploit:~
    
    
    kpatch load /root/kpatch-out/zapscape_cve_2026_64561.ko
    

加载过程约 2 秒,所有任务(包括运行中的虚拟机 vCPU 线程)在安全点切换, **虚拟机与业务全程无感知** 。

### 第 7 步:验证

root@kitploit:~
    
    
    ./verify-livepatch.sh
    

* * *

## 验证补丁是否生效

root@kitploit:~
    
    
    kpatch list
    

root@kitploit:~
    
    
    Loaded patch modules:
    zapscape_cve_2026_64561 [enabled]
    

`[enabled]` 即补丁已生效。补丁会替换 KVM 的 4 个缺页处理函数:

root@kitploit:~
    
    
    direct_page_fault,1
    paging64_page_fault,1
    paging32_page_fault,1
    ept_page_fault,1
    

(`/sys/kernel/livepatch/zapscape_cve_2026_64561/kvm/` 下可查看,`,1` 表示已替换)

**实测记录** :2026-08-07 在真实 智简魔方 魔方云 KVM加强版(idcsmart Cloud KVM) 宿主机上、租户 VM 运行期间完成全流程验证——补丁加载 2 秒完成,VM 的 qemu 进程 PID 不变、guest uptime 连续、guest 功能完全正常,宿主机全程未重启。

* * *

## 回滚

root@kitploit:~
    
    
    kpatch disable zapscape_cve_2026_64561   # 停用补丁(任务自然回到旧代码)
    kpatch unload zapscape_cve_2026_64561    # 卸载模块
    

回滚即时完成,内核本身从不被改写。

> ⚠️ 注意:**宿主机重启后热补丁会失效** ,需要重新执行 `kpatch load /root/kpatch-out/zapscape_cve_2026_64561.ko`。 建议把该命令加入开机自启,或使用 `kpatch-dnf` 自动跟随内核更新。

* * *

## 常见问题

**Q:我用的内核是 4.18.0-XXX 的某个具体版本,支持吗?** 支持。构建脚本会按源码形态自动选择补丁变体,覆盖 RHEL 8.0 ~ 8.10 / CentOS Stream 8 全部 `4.18.0-*` 内核(变体对照表见 docs/TECHNICAL.md)。

**Q:`dnf download --source kernel` 报错/找不到包怎么办?** 这是 Stream 8 EOL 后的正常现象。按部署第 4 步把源切换到 vault 镜像 (方式 A),或直接按 URL 规则 curl 下载(方式 B)。

**Q:加载补丁会影响正在运行的虚拟机吗?** 不会。实测中虚拟机(qemu 进程、guest uptime、guest 内服务)全程无感。 补丁只调整 KVM 缺页处理内的两条语句顺序,不改变任何数据结构或虚拟化特性。

**Q:补丁和 Red Hat 官方的关系?** 本补丁是 Linux 上游官方修复(`2abd5287f083`)的 backport。RHEL 8 已停止 维护、没有官方 KLP,因此我们提供自建热补丁方案,机制与 Red Hat 官方 KLP 完全相同(kpatch / CONFIG_LIVEPATCH)。

**Q:仓库里的 one-click.sh 一键脚本能用吗?** ⚠️ **实验性,未经完整测试** 。一键脚本(依赖安装 → 构建 → 加载 → 验证) 逻辑与手动步骤等价,但请**优先按本文档手动步骤操作** ;使用一键脚本前请 逐行阅读其内容。

**Q:这是攻击工具吗?** 不是。本仓库只包含**防御性** 修复补丁与部署脚本。漏洞利用代码(PoC)见 漏洞作者仓库(V4bel/Zapscape), 请勿对未授权系统使用。

* * *

## 项目结构

root@kitploit:~
    
    
    Zapscape-Fix/
    ├── README.md              本文档(中文)
    ├── README.en.md           英文版
    ├── LICENSE                GPL-2.0
    ├── SECURITY.md            安全披露政策
    ├── docs/
    │   ├── TECHNICAL.md       技术细节:漏洞原理、修复、变体对照表(中文)
    │   └── ANALYSIS.md        逐行代码证据(英文,面向研究者)
    ├── patches/               7 个内核代码形态的补丁变体
    └── livepatch/
        ├── build-livepatch.sh 构建热补丁模块(自动选变体,支持 -cn 镜像模式)
        ├── load-livepatch.sh  加载补丁
        ├── verify-livepatch.sh 验证补丁
        ├── install-deps.sh    自动安装前置环境(辅助)
        ├── one-click.sh       一键部署(⚠️ 实验性)
        └── kernel-ml/         kernel-ml 7.1.3/7.1.4 专用方案(内核原生 objtool
                                klp 工具链,已实测;含 build-klp.sh / load-klp.sh
                                / 源码 / 文档)
    

* * *

## 参考资料

  * 漏洞 PoC 与技术报告 — https://github.com/V4bel/Zapscape
  * 上游修复 commit — https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2abd5287f083
  * 补丁讨论邮件 — https://lore.kernel.org/all/some-email@example.com/
  * 引入缺陷的 commit — https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f95eec9bed76
  * kpatch 项目 — https://github.com/dynup/kpatch
  * 「受影响范围」来源: 
    * Wikipedia: Intel 5-level paging(首次实现于 Ice Lake) — https://en.wikipedia.org/wiki/Intel_5-level_paging
    * Intel 白皮书《5-Level Paging and 5-Level EPT》(文档号 671442) — https://www.intel.com/content/www/us/en/content-details/671442/5-level-paging-and-5-level-ept-white-paper.html
    * IA32_VMX_EPT_VPID_CAP 位定义(`VMX_EPT_PAGE_WALK_4_BIT`/`_5_BIT`,Linux 内核头文件 `arch/x86/include/asm/vmx.h`)
    * KVM 向 L1 透传 EPT 能力的逻辑(Linux 内核 `arch/x86/kvm/vmx/nested.c`)
    * 本仓库实测:Xeon Platinum 8259CL 的 MSR 0x48C bit 7(PWL5)= 0(见上表)



* * *

## 致谢

感谢 **林枫云(四川)网络科技有限公司** (GitHub: @Edakerx) 在 PoC 泄露后第一时间为我们提供了用于验证测试的服务器。

* * *

## 版权与许可

  * **版权所有** :© 2026 安锐普世(北京)科技有限公司 · Aoripus (Beijing) Technology Co., Ltd.
  * **联系邮箱** :some-email@example.com
  * **内核补丁** :GPL-2.0(与 Linux 内核一致)
  * **脚本与文档** :GPL-2.0-or-later
  * **免责声明** :本仓库为防御性安全工程,仅供对自有/授权主机加固,无任何担保。