CVE-2023-32233: Linux内核中的安全漏洞

作者:Sec-Labs | 发布时间:

项目地址

https://github.com/Liuk3r/CVE-2023-32233

构建和配置

以下说明在Ubuntu 23.04(Lunar Lobster)下进行了测试。

1f37fff1ab001035

 

 

安装构建依赖

运行以下命令以安装构建依赖项:

Copy codesudo apt install gcc libmnl-dev libnftnl-dev

构建二进制文件

运行以下命令以构建PoC二进制文件:

Copy codegcc -Wall -o exploit exploit.c -lmnl -lnftnl

更新配置文件

内置配置文件包含特定于以二进制形式分发的Linux内核的参数,这些内核来自Ubuntu 23.04(Lunar Lobster)中的以下软件包:

  • "linux-image-6.2.0-20-generic",版本"6.2.0-20.20"
  • "linux-modules-6.2.0-20-generic",版本"6.2.0-20.20"

内置配置文件如下所示:

yamlCopy code1                   race_set_slab                   # {0,1}
1572                race_set_elem_count             # k
4000                initial_sleep                   # ms
100                 race_lead_sleep                 # ms
600                 race_lag_sleep                  # ms
100                 reuse_sleep                     # ms
39d240              free_percpu                     # hex
2a8b900             modprobe_path                   # hex
23700               nft_counter_destroy             # hex
347a0               nft_counter_ops                 # hex
a                   nft_counter_destroy_call_offset # hex
ffffffff            nft_counter_destroy_call_mask   # hex
e8e58948            nft_counter_destroy_call_check  # hex

内核符号

在使用其他Linux内核进行测试时,可以选择性地覆盖内置配置文件的步骤:

bashCopy codemodprobe nf_tables
egrep ' (nft_counter_ops|nft_counter_destroy|free_percpu|modprobe_path)(\s|$)' /proc/kallsyms > profile

机器码

为了找到内核基址,我们检查内核内存中的nf_tables.ko映像。具体而言,我们分析nft_counter_destroy()子程序的机器码。这意味着我们的方法对编译器和编译选项都很敏感。然而,通过覆盖内置配置文件,可以处理所有常见情况。

例如,nft_counter_destroy()子程序的机器码可能如下所示:

yamlCopy code000000000001e310 <nft_counter_destroy>:
   1e310:       f3 0f 1e fa             endbr64
   1e314:       48 8b 7e 08             mov    rdi,QWORD PTR [rsi+0x8]
   1e318:       e9 00 00 00 00          jmp    <free_percpu>
   1e31d:       0f 1f 00                nop    DWORD PTR [rax]

在上述情况下,我们可以通过将以下三行追加到配置文件"profile"中来指定一些参数:

首先,重新定义free_percpu位移之前的dword的偏移量:

arduinoCopy code5                   nft_counter_destroy_call_offset # hex

其中,值5是使用表达式(1e31d - 1e310) - 8计算得出的。

 

 

作为合理性检查,我们使用以下掩码验证上述偏移量处的dword:

arduinoCopy codeffffffff            nft_counter_destroy_call_mask   # hex

期望的值如下所示:

arduinoCopy codee9087e8b            nft_counter_destroy_call_check  # hex

竞争调优

利用漏洞需要在Linux内核的后台工作线程中赢得竞争。内置配置文件已经调优,以最大程度地提高在包括移动Sandy Bridge和桌面Comet Lake在内的广泛范围的Intel微处理器上赢得竞争的机会。然而,某些微处理器需要额外的调优。例如,我们观察到在某些配置下,Alder Lake存在任务切换延迟增加的情况,此时可能需要将以下行追加到"profile"中:

Copy code400                 race_lead_sleep

在我们使用空闲裸机系统进行测试时,我们测量到80%或更高的概率成功利用漏洞。

测试建议

一旦在易受攻击的系统上启动了PoC,可能会使该系统处于不稳定状态,并且内核内存可能会损坏。我们强烈建议在专用系统上测试PoC,以避免潜在的数据损坏。

标签:工具分享, 思路分享, 漏洞分享, POC脚本