x024n/almalinux-januscape-mitigation

GitHub: x024n/almalinux-januscape-mitigation

面向 AlmaLinux 9.5 生产环境的 Januscape 等 KVM 漏洞缓解指南与脚本,提供分阶段的宿主机安全加固操作流程。

Stars: 0 | Forks: 0

# AlmaLinux 9.5 — 缓解 Januscape (CVE-2026-53359) & Bad Epoll (CVE-2026-46242) 针对运行**多个 VPS 客户端 (KVM)** 的 **AlmaLinux 9 / 9.5** 宿主机提供的**生产级安全**、分步操作指南。 ## 摘要(请先阅读此部分) | 项目 | 详情 | |------|--------| | **主要 CVE** | **CVE-2026-53359** — *Januscape* — KVM/x86 **客户机 -> 宿主机逃逸**(+ 宿主机 DoS) | | **附加 CVE (Alma 9)** | **CVE-2026-46242** — *Bad Epoll* — 本地非特权用户 LPE -> root | | **易受攻击群体** | 使用 **KVM**(Intel/AMD)的 x86_64 宿主机,多租户 VPS | | **彻底修复** | 将内核更新至 **≥ `5.14.0-687.23.1.el9_8`**,然后**重启宿主机** | | **临时缓解措施** | 禁用 **nested virtualization** + 限制对 **`/dev/kvm`** 的访问 | | **不重启宿主机?** | 可以实施**部分**软缓解措施;**在虚拟机运行时卸载 KVM 模块 = 危险 / 不可能** | ### 生产环境原则 1. **切勿**在生产宿主机上运行 PoC / exploit。 2. 当还有客户机在运行时,**切勿**执行 `rmmod kvm*`。 3. 先进行软缓解(关闭 nested + 修改权限),然后安排**计划内的宿主机重启**以打补丁。 4. 重启前(如果是 cluster)将 VPS 实时迁移到其他节点。 5. 在**每个**步骤后进行验证。 ## 目录 1. [什么是 Januscape?](#1-apa-itu-januscape) 2. [你的宿主机受影响吗?](#2-apakah-host-kamu-terdampak) 3. [生产环境策略(决策流程)](#3-strategi-production-alur-keputusan) 4. [阶段 0 — 安全预检查(只读)](#4-fase-0--pre-check-aman-read-only) 5. [阶段 1 — 软缓解(最少重启)](#5-fase-1--soft-mitigasi-minim-reboot) 6. [阶段 2 — 内核补丁(彻底修复,需重启宿主机)](#6-fase-2--patch-kernel-fix-penuh-perlu-reboot-host) 7. [阶段 3 — 缓解后验证](#7-fase-3--verifikasi-pasca-mitigasi) 8. [禁止事项](#8-yang-tidak-boleh-dilakukan) 9. [常见问题解答 (FAQ)](#9-faq) 10. [脚本](#10-script) 11. [官方参考资料](#11-referensi-resmi) 12. [免责声明](#12-disclaimer) ## 1. 什么是 Januscape? **Januscape (CVE-2026-53359)** 是存在于 **KVM/x86**(Intel & AMD)中的一个漏洞,它允许: | 影响 | 说明 | |--------|------------| | **客户机到宿主机的逃逸** | 恶意客户机可以在**宿主机**上以 root 身份执行代码 | | **宿主机 DoS** | 客户机可以触发宿主机的 **kernel panic** -> 该节点上的所有 VPS 都会宕机 | | **本地 LPE** | 如果 `/dev/kvm` 是全局可写的(`0666`,这在许多 RHEL 系系统中是默认设置),无特权的本地用户**无需**虚拟机即可提权至 root | 简要来源: - [AlmaLinux — Januscape and Bad Epoll](https://almalinux.org/blog/2026-07-06-januscape-bad-epoll/) - [Ubuntu 缓解措施](https://ubuntu.com/blog/januscape-linux-vulnerability-mitigations-available) - [Red Hat CVE-2026-53359](https://access.redhat.com/security/cve/cve-2026-53359) - 研究人员的分析文章:[V4bel/Januscape](https://github.com/V4bel/Januscape)(切勿在生产环境中运行) **Bad Epoll (CVE-2026-46242)**(AlmaLinux 9 & 10):epoll 子系统中的 UAF 竞争条件 -> 本地 LPE。该漏洞的修复包含在 AlmaLinux 发布的**同一个内核**中。 ## 2. 你的宿主机受影响吗? ### 快速检查(只读,安全) ``` # OS cat /etc/os-release | egrep 'NAME|VERSION' # Kernel uname -r rpm -q kernel # KVM 模块 lsmod | egrep 'kvm|kvm_intel|kvm_amd' # 开启 Nested? (Y/1 = Nested 路径易受攻击;N/0 = 关闭 Nested) grep -H . /sys/module/kvm_intel/parameters/nested 2>/dev/null grep -H . /sys/module/kvm_amd/parameters/nested 2>/dev/null # /dev/kvm 权限 (0666 = 在多用户主机中非常宽松) namei -l /dev/kvm 2>/dev/null stat -c '%a %U:%G %n' /dev/kvm 2>/dev/null getfacl /dev/kvm 2>/dev/null | head # 有 guest 吗? # libvirt: virsh list --all 2>/dev/null | head # 或 qemu 进程: ps aux | egrep 'qemu-system|qemu-kvm' | grep -v grep | wc -l ``` 或者: ``` sudo bash scripts/00-precheck.sh ``` ### 结果判读 | 状态 | 情况 | |---------|--------| | 无 `kvm` 模块 / 不是 hypervisor | Januscape KVM **关联不大**(但如果是 Alma 9,仍需更新内核以防范 Bad Epoll) | | `nested=Y` 或 `1` | **nested virt** 路径处于活动状态 — 优先进行软缓解 | | 内核 **< `5.14.0-687.23.1.el9_8`** | 尚未修补 Januscape+Bad Epoll(针对 Alma 9 生产环境) | | 内核 **≥ `5.14.0-687.23.1.el9_8`** 且已重启至该内核 | 已彻底修复(通过 `uname -r` 确认) | | `/dev/kvm` 权限为 `666` | 本地 LPE 变得更容易 — **请锁定权限** | ## 3. 生产环境策略(决策流程) ``` ┌─────────────────────┐ │ Host KVM multi-VPS? │ └──────────┬──────────┘ │ ya ┌──────────▼──────────┐ │ Kernel sudah patched│ │ + sudah boot ke sana│ └──────────┬──────────┘ belum │ │ ya ┌────────────▼──┐ ┌──▼────────────┐ │ Soft mitigasi │ │ Verifikasi + │ │ (Fase 1) │ │ monitoring │ └────────────┬──┘ └───────────────┘ │ ┌────────────▼──────────────────────┐ │ Jadwalkan maintenance: │ │ migrate VPS (jika bisa) → │ │ dnf upgrade kernel → reboot host │ │ (Fase 2) │ └───────────────────────────────────┘ ``` | 优先级 | 操作 | 是否重启宿主机? | 对 VPS 客户端的风险 | |-----------|----------|--------------|----------------------| | **P0** | 软缓解:nested=0(持久化)+ 检查无 nested guest | 如果仅写入配置,通常**不需要**;**完全生效**往往需要重载模块 / 重启 | Nested guest(如果有)将会损坏 | | **P0** | 软缓解:`/dev/kvm` 权限不是 0666 | **否** | 不会关闭现有虚拟机 | | **P1** | 打内核补丁 + 重启宿主机 | **是** | 该节点上的所有 VPS 将随宿主机一起重启(除非事先进行实时迁移) | ## 4. 阶段 0 — 安全预检查(只读) **仅运行只读命令**。不会修改系统。 ``` sudo bash scripts/00-precheck.sh | tee /root/januscape-precheck-$(date +%F).txt ``` 保存输出。这对于审计和内部工单非常有用。 手动检查清单: - [ ] 已记录运行中的 VPS 数量 - [ ] 已记录 Nested 状态 - [ ] 已记录 `uname -r` - [ ] 备份/迁移计划已就绪 - [ ] 宿主机的 IPMI/iDRAC/控制台访问权限已就绪 ## 5. 阶段 1 — 软缓解(最少重启) ### 5.1 禁用 nested virtualization(持久化) 这是 Ubuntu/Proxmox/Red Hat 公开指南中建议在等待重启至已修补内核期间采取的缓解措施: - [Ubuntu — 禁用 nested](https://ubuntu.com/blog/januscape-linux-vulnerability-mitigations-available) - [Red Hat CVE 页面 — modprobe 选项](https://access.redhat.com/security/cve/cve-2026-53359) - [Proxmox 论坛 — nested=0](https://forum.proxmox.com/threads/are-there-mitigations-available-for-cve-2026-53359-januscape.184874/) #### A) 首先检查:是否有客户机**正在使用** nested? ``` # Libvirt:查找 CPU 模式 host-passthrough + nested feature,或 XML 中的 vmx/svm feature virsh list --name 2>/dev/null | while read -r vm; do [ -z "$vm" ] && continue echo "=== $vm ===" virsh dumpxml "$vm" 2>/dev/null | egrep -i 'nested|vmx|svm|host-passthrough|host-model' | head -20 done ``` 如果**有客户端特意在 VPS 内部使用 nested KVM**: - 软缓解 nested=0 将**破坏他们的功能** - 需先进行协调,或者优先在不关闭 nested 的情况下进行**补丁修复 + 重启**(内核修复后,可根据需要重新打开 nested) 如果**没有** nested guest(大多数共享 VPS 的情况): #### B) 写入永久配置(安全,不会自行触发重启) ``` sudo tee /etc/modprobe.d/disable-kvm-nested.conf >/dev/null <<'EOF' # Januscape CVE-2026-53359 临时缓解措施 # 参考:https://ubuntu.com/blog/januscape-linux-vulnerability-mitigations-available # https://access.redhat.com/security/cve/cve-2026-53359 options kvm_intel nested=0 options kvm_amd nested=0 EOF # 确保没有其他文件强制 nested=1 grep -rni 'nested' /etc/modprobe.d/ || true ``` 这对于**下次加载模块**(在宿主机重启或重载模块后)是**持久化**的。 #### C) **不重启**的情况下激活 nested=0 — **仅当没有正在运行的客户机时** Ubuntu 文档显示的模式: ``` # 仅当:virsh list --state-running 为空 / 没有 qemu 时 sudo rmmod kvm_amd 2>/dev/null || true sudo rmmod kvm_intel 2>/dev/null || true sudo rmmod kvm 2>/dev/null || true sudo modprobe kvm sudo modprobe kvm_intel # atau kvm_amd ``` **在运行着数十个 VPS 的生产环境中:切勿执行 rmmod。** KVM 模块**正在被**客户机使用 -> `rmmod` 将**失败**或**非常危险**。 | 情况 | 应用 nested=0 的方法 | |---------|---------------------| | **0 个客户机运行中** | 可以重载模块(无需重启 OS) | | **有客户机运行中** | 仅写入 `/etc/modprobe.d/...`;在**宿主机重启**(阶段 2)或维护排空时完全生效 | | 集群 / 实时迁移 | 将所有 VM 迁移出该节点 -> 重载模块或重启空节点 | 重载/重启后检查运行时状态: ``` grep -H . /sys/module/kvm_intel/parameters/nested 2>/dev/null grep -H . /sys/module/kvm_amd/parameters/nested 2>/dev/null # 缓解预期:0 或 N ``` 脚本: ``` sudo bash scripts/01-soft-mitigation-nested.sh # 默认:仅写入 config,不执行 rmmod # 强制重新加载 (如果有 VM 则很危险): # sudo bash scripts/01-soft-mitigation-nested.sh --reload-modules ``` ### 5.2 锁定 `/dev/kvm` 权限(无需重启) Alma/RHEL 系统的 `/dev/kvm` 权限通常过于宽松;AlmaLinux 博客提到 **0666** 会使本地 LPE 变得更容易。 ``` # 立即查看 stat -c '%a %U:%G %n' /dev/kvm # 运行时 (直接生效,无需重启) — 严格示例: # root:kvm, mode 660 (仅限 root + kvm 组) sudo chown root:kvm /dev/kvm sudo chmod 660 /dev/kvm # 通过 udev 持久化 (示例) sudo tee /etc/udev/rules.d/99-kvm-restrict.rules >/dev/null <<'EOF' # 加固 /dev/kvm — 减少非特权本地访问 (Januscape LPE 路径) KERNEL=="kvm", GROUP="kvm", MODE="0660" EOF sudo udevadm control --reload-rules sudo udevadm trigger --name-match=kvm stat -c '%a %U:%G %n' /dev/kvm ``` **生产环境注意事项:** - 确保 hypervisor 服务用户(`qemu`, `libvirt-qemu` 等)仍处于正确的组中。 - 不要将其锁定到导致 **libvirtd/qemu 无法打开** `/dev/kvm` 的地步。 - 测试:`virsh list` 仍然正常,并创建一个非关键测试 VM。 ``` sudo bash scripts/02-soft-mitigation-devkvm.sh ``` ### 5.3 (可选)限制允许创建 VM 的人员 - 切勿让不受信任的用户加入 `kvm` / `libvirt` 组。 - VPS 控制面板:除非必要,否则不要向客户暴露 nested CPU flag。 - SELinux:保持 **enforcing** 状态(切勿将其作为“缓解措施”关闭)。 ## 6. 阶段 2 — 内核补丁(彻底修复,需重启宿主机) ### 已修复的 AlmaLinux 9 内核(生产环境) 根据 [AlmaLinux 博客](https://almalinux.org/blog/2026-07-06-januscape-bad-epoll/): | 发行版 | 已修复内核(最低版本) | |---------|---------------------------| | AlmaLinux 9 | **`kernel-5.14.0-687.23.1.el9_8`** 或更新版本 | | AlmaLinux 8 | `kernel-4.18.0-553.141.2.el8_10`+ | | AlmaLinux 10 | `kernel-6.12.0-211.31.1.el10_2`+ | 生产环境的补丁已进入主仓库(不再需要 testing 仓库)。 ### 6.1 维护计划(多租户环境必做) 1. 向客户宣布维护窗口。 2. 对关键 VPS 进行快照/备份(根据策略)。 3. 如果有**集群**:将 VPS 实时迁移到其他节点 -> 清空节点 -> 升级 -> 重启 -> 迁移回来。 4. 如果是**单节点**:该节点上所有 VPS 的停机时间 = 宿主机的重启时长。 ### 6.2 更新(重启前) ``` # 干净的 Metadata sudo dnf clean metadata sudo dnf makecache # 查看将要安装的 kernel sudo dnf list --available 'kernel*' | egrep 'kernel.x86_64|kernel-core' | tail -20 # 升级 (建议进行完整的安全更新,至少更新 kernel*) sudo dnf upgrade -y 'kernel*' # 或完整更新: # sudo dnf upgrade -y # 确保新 kernel 已安装到磁盘上 (不一定正在运行) rpm -q kernel kernel-core | sort -V ``` **切勿**在维护窗口之外自动重启。需手动重启: ``` # 最终检查 guest 数量 virsh list --state-running # 同步并重启 HOST sudo sync sudo reboot ``` ### 6.3 重启后 ``` uname -r # 必须 >= 5.14.0-687.23.1.el9_8 (与 sort -V 进行比较) rpm -q kernel # Nested:符合策略 (可以为 0;如果已修补且需要 nested 则为 1) grep -H . /sys/module/kvm_*/parameters/nested 2>/dev/null # VPS virsh list --all ``` ``` sudo bash scripts/03-patch-kernel.sh # 脚本不会自动重启;仅执行 dnf upgrade kernel* + 打印重启说明 ``` ## 7. 阶段 3 — 缓解后验证 ``` sudo bash scripts/04-verify.sh ``` 检查清单: - [ ] `uname -r` ≥ 已修补版本 - [ ] 无新的 Oops/panic:`journalctl -k -p err --since "1 hour ago"` - [ ] Nested 状态符合策略 - [ ] `/dev/kvm` 权限不是 `666` - [ ] Libvirt/qemu 状态健康 - [ ] 抽样 VPS 的网络/磁盘正常 ## 8. 禁止事项 | 切勿 | 原因 | |--------|--------| | 在生产环境中运行 Januscape PoC | 可能导致**宿主机 panic** / 逃逸 | | 在虚拟机运行时执行 `rmmod kvm*` | 会失败或断开所有客户机的连接 | | 在未通知客户的情况下重启宿主机 | 造成大规模停机 | | 为了“图方便”关闭 SELinux | 扩大了攻击面 | | 假设软缓解 = 已完全安全 | 关闭 nested 可减少途径;**内核补丁仍是强制性的** | | 仅给 1 个节点打补丁而忘记其他节点 | 需要审计所有 x86 KVM hypervisor | ## 9. 常见问题解答 (FAQ) ### 是否可以 100% 不重启? - **软缓解**(modprobe 文件 + chmod/udev):**无需重启**。 - 在运行时**不重启关闭 nested**:仅当模块可以重载时 -> **要求该节点上有 0 个客户机**。 - **彻底修复 CVE(内核代码)**:**需要引导至新内核** -> 重启宿主机(如果供应商提供,可使用企业级 live-patch;Alma 标准方式 = 重启)。 ### 关闭 nested 会断开普通 VPS 吗通常**不会**。普通 VPS 不会在客户机内部运行 hypervisor。 受影响的是**特意**使用 nested virt 的客户(在共享主机中很少见)。 ### 宿主机不是 KVM(仅 OpenVZ/LXC)? Januscape = **KVM/x86**。如果宿主机是**纯容器**且没有 KVM,则 KVM 客户机逃逸路径不适用 — 但仍需检查 Bad Epoll 并更新内核。 ### Virtuozzo / OpenVZ 7? 不是本仓库的重点(内核不同)。对于 Vz7,请遵循供应商的安全公告以及单独的 ReadyKernel/vzkernel 指南。 ## 10. 脚本 | 脚本 | 功能 | 生产环境备注 | |--------|--------|-----------------| | [`scripts/00-precheck.sh`](scripts/00-precheck.sh) | 只读资产清单 | 安全 | | [`scripts/01-soft-mitigation-nested.sh`](scripts/01-soft-mitigation-nested.sh) | 写入 nested=0 | 默认**不执行** rmmod | | [`scripts/02-soft-mitigation-devkvm.sh`](scripts/02-soft-mitigation-devkvm.sh) | 强化 `/dev/kvm` | 检查 libvirt 是否仍正常工作 | | [`scripts/03-patch-kernel.sh`](scripts/03-patch-kernel.sh) | `dnf upgrade kernel*` | **不**自动重启 | | [`scripts/04-verify.sh`](scripts/04-verify.sh) | 验证状态 | 安全 | ``` chmod +x scripts/*.sh sudo bash scripts/00-precheck.sh sudo bash scripts/01-soft-mitigation-nested.sh sudo bash scripts/02-soft-mitigation-devkvm.sh # 维护窗口: sudo bash scripts/03-patch-kernel.sh # 然后:sudo reboot sudo bash scripts/04-verify.sh ``` ## 11. 官方参考资料 | 来源 | URL | |--------|-----| | AlmaLinux — 生产环境补丁 | https://almalinux.org/blog/2026-07-06-januscape-bad-epoll/ | | Ubuntu — nested 缓解措施 | https://ubuntu.com/blog/januscape-linux-vulnerability-mitigations-available | | Red Hat CVE-2026-53359 | https://access.redhat.com/security/cve/cve-2026-53359 | | CloudLinux 公告 | https://blog.cloudlinux.com/januscape-cve-2026-53359-mitigation-and-kernel-update-on-cloudlinux/ | | TuxCare 概览 | https://tuxcare.com/blog/januscape-exposes-the-kvm-shadow-paging-bug-that-kept-coming-back/ | | Proxmox 讨论 | https://forum.proxmox.com/threads/are-there-mitigations-available-for-cve-2026-53359-januscape.184874/ | | 研究人员分析文章(切勿在生产环境进行 PoC) | https://github.com/V4bel/Januscape | ## 12. 免责声明 - 本指南是为运维人员提供的社区指南。不能替代供应商的公告或法律顾问。 - 如果可能,请在实验室/预发布环境中进行测试。 - 对于执行命令造成的停机或损失,作者不承担责任。 - 请务必将内核版本与最新的 [AlmaLinux 博客](https://almalinux.org/blog/2026-07-06-januscape-bad-epoll/) 进行核对。 ## 速查表 ``` # 1) 预检查 uname -r grep . /sys/module/kvm_*/parameters/nested 2>/dev/null stat -c '%a %n' /dev/kvm virsh list --state-running | wc -l # 2) 软缓解 (持久化关闭 nested) echo -e 'options kvm_intel nested=0\noptions kvm_amd nested=0' | \ sudo tee /etc/modprobe.d/disable-kvm-nested.conf # 3) 软缓解 (/dev/kvm) sudo chown root:kvm /dev/kvm; sudo chmod 660 /dev/kvm # 4) 修复 (维护中) sudo dnf clean metadata && sudo dnf upgrade -y 'kernel*' # 迁移 VM 或宣布停机 sudo reboot # 5) 验证 uname -r # >= 5.14.0-687.23.1.el9_8 ``` ## License MIT — 详情见 [LICENSE](LICENSE)。
标签:AlmaLinux, KVM, Web报告查看器, 安全漏洞修复, 应用安全, 本地提权, 系统运维, 虚拟化安全