这是我第一个 1-day 漏洞利用。
补丁:tls: stop recv() if initial process_rx_list gave us non-DATA
我在 kernelCTF 电子表格 上看到了 exp407,并尝试复现该漏洞利用。
我成功在 kernelCTF 环境中运行了该漏洞利用,并拿到了 flag:

我稍后会为此写一份详细的 write-up。
漏洞利用的日志有点长,因为中间出现了一个内核 WARNING。不过,warning 不是 error,它并不会让我的漏洞利用失效 ;)

我从这个文件夹中移除了许多体积较大的文件。
./rootfs_v3.img./ramdisk_v1.img./releases/mitigation-v4-6.6/bzImage./releases/mitigation-v4-6.6/vmlinux你可以通过运行 原始的 local_runner.sh 获取前 3 个文件。
至于第四个文件以及源代码,你可以连接到 kernelCTF 服务器获取下载链接。
但为了方便你,以下是 mitigation-v4-6.6 实例的信息:
Kernel image (bzImage): https://storage.googleapis.com/kernelctf-build/releases/mitigation-v4-6.6/bzImage
Kernel image (vmlinux): https://storage.googleapis.com/kernelctf-build/releases/mitigation-v4-6.6/vmlinux.gz
Kernel config: https://storage.googleapis.com/kernelctf-build/releases/mitigation-v4-6.6/.config
-> derived from COS config: https://storage.googleapis.com/kernelctf-build/releases/mitigation-v4-6.6/lakitu_defconfig
Source code info: https://storage.googleapis.com/kernelctf-build/releases/mitigation-v4-6.6/COMMIT_INFO
另外,下载 .img 文件的命令如下:
wget https://storage.googleapis.com/kernelctf-build/files/rootfs_v3.img.gz
gzip -d rootfs_v3.img.gz
wget https://storage.googleapis.com/kernelctf-build/files/ramdisk_v1.img
cd ./exploit/mitigation-v4-6.6/
make
该漏洞利用分为两个部分:
服务器端:
./server --port <port>
客户端:
./client --ip <server_ip> --port <port>
我编写了 2 个脚本,用于在本地测试该漏洞利用:
这个脚本会先在后台启动服务器端,然后在 qemu 虚拟机中运行客户端。
首先,进入 exploit/mitigation-v4-6.6,并在 3000 端口启动一个 http 服务器,以便稍后将漏洞利用下载到 qemu 虚拟机中
cd exploit/mitigation-v4-6.6
python3 -m http.server 3000
然后,在另一个终端中启动该脚本:
python3 test.py <your_ip> <port>
<your_ip> 是你的网卡 IP。以我为例,我全程在 WSL 中运行,执行 ip a,获取 eth0 接口的 IP,即 172.30.248.93➜ CVE-2024-58239 git:(main) ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.255.255.254/32 brd 10.255.255.254 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:22:a0:d1 brd ff:ff:ff:ff:ff:ff
inet 172.30.248.93/20 brd 172.30.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fe22:a0d1/64 scope link
valid_lft forever preferred_lft forever
<port> 是你本地机器上任意一个未使用的端口,用于客户端与服务器端之间的 TLS 连接。该脚本会多次运行漏洞利用并测量其成功率。
与 test.py 的用法类似,进入 exploit/mitigation-v4-6.6,并在 3000 端口启动一个 http 服务器,以便稍后将漏洞利用下载到 qemu 虚拟机中
cd exploit/mitigation-v4-6.6
python3 -m http.server 3000
python3 calc_AC_rate.py <your_ip> <port> <number_of_time_to_run>
例如,在我的 WSL 上,我这样运行:python3 calc_AC_rate.py 172.30.248.93 1118 100。
我仍在改进成功率,目前它还不太稳定。
我运行 calc_AC_rate.py 对漏洞利用测试了 100 次,结果是 50/100。
至于失败的尝试,是因为 common_interrupt 在运行中途出现,触发了内核 slab 中朴素的 double free 检测,如下面的回溯所示。
我会想办法禁用它。
[ 4.050330] ? die+0x32/0x80
[ 4.050809] ? do_trap+0xd6/0x100
[ 4.051365] ? __slab_free+0x16c/0x380
[ 4.052198] ? do_error_trap+0x6a/0x90
[ 4.052767] ? __slab_free+0x16c/0x380
[ 4.053350] ? exc_invalid_op+0x4c/0x60
[ 4.053916] ? __slab_free+0x16c/0x380
[ 4.055031] ? asm_exc_invalid_op+0x16/0x20
[ 4.055675] ? tcp_rcv_state_process+0x791/0xef0
[ 4.056527] ? __slab_free+0x16c/0x380
[ 4.057097] ? lock_timer_base+0x61/0x80
[ 4.057795] ? tcp_get_metrics+0x142/0x380
[ 4.058560] ? tcp_rcv_state_process+0x791/0xef0
[ 4.059265] kmem_cache_free+0x599/0x5e0
[ 4.059915] tcp_rcv_state_process+0x791/0xef0
[ 4.060918] ? security_sock_rcv_skb+0x31/0x50
[ 4.061857] ? sk_filter_trim_cap+0x11a/0x290
[ 4.062558] tcp_v4_do_rcv+0xcd/0x280
[ 4.063281] tcp_v4_rcv+0xf81/0x1010
[ 4.063832] ? raw_local_deliver+0xcd/0x250
[ 4.064668] ip_protocol_deliver_rcu+0x32/0x320
[ 4.065355] ip_local_deliver_finish+0x7a/0xa0
[ 4.066455] ip_sublist_rcv_finish+0x7e/0x90
[ 4.067231] ip_sublist_rcv+0x1e1/0x220
[ 4.067919] ? __netif_receive_skb_core.constprop.0+0xbf/0x1080
[ 4.068822] ip_list_rcv+0x139/0x170
[ 4.069362] __netif_receive_skb_list_core+0x29d/0x2c0
[ 4.070173] ? __pfx_csum_block_add_ext+0x10/0x10
[ 4.071054] netif_receive_skb_list_internal+0x1e1/0x310
[ 4.072068] napi_complete_done+0x6e/0x1a0
[ 4.072752] virtnet_poll+0x40d/0x5a0
[ 4.073313] __napi_poll+0x28/0x1c0
[ 4.073854] net_rx_action+0x14c/0x2d0
[ 4.074622] ? vp_vring_interrupt+0x73/0x90
[ 4.075746] __do_softirq+0xf6/0x30f
[ 4.076379] __irq_exit_rcu+0x79/0xc0
[ 4.077356] common_interrupt+0xb9/0xd0