针对 Linux 内核(特别是 io_uring 系统)中 CVE-2022-29968(未初始化内存)的概念验证利用程序。
该崩溃由 Syzkaller 发现。崩溃分析由 Joseph Ravichandran 和 Michael Wang 完成。利用程序由 Joseph Ravichandran 编写。
作为 6.858 at MIT, Spring 2022 期末项目的一部分,我们发现了此漏洞并进行了报告。
任何版本在 3e08773c3841 ("block: switch polling to be bio based") 之后、32452a3eb8b6 ("io_uring: fix uninitialized field in rw io_kiocb") 之前的内核都可能受此漏洞影响。
/dev/sr0 需要被非特权用户可读。已在无 KVM 的 Busybox 安装中测试,内存 128M:
$QEMU -m 128M -kernel $KERNEL -initrd $INITRD -nographic -append "console=ttyS0 nokaslr no_hash_pointers ftrace_dump_on_oops"
initramfs 中的 init:
#!/bin/sh
/bin/busybox --install -s
# 挂载所需的文件系统(如果使用 ftrace/调试功能,这非常有用)
mount -t proc none /proc
mount -t sysfs sysfs /sys
mount -t tracefs nodev /sys/kernel/tracing
mount -t debugfs none /sys/kernel/debug
mkdir -p /tmp && mount -t tmpfs tmpfs /tmp
mount -t devtmpfs none /dev
# 为 sr0 设置权限
chmod -R 0777 /dev/sr0
# 创建一个临时文件(旧的 userfaultfd 方法使用它)
# 公开版本不需要
touch /tmp/test
# 切换到非 root 用户
su attacker
# 运行 shell
exec sh
# 运行 shell(只不过 ^C 现在有效)
#exec setsid sh -c 'exec sh </dev/ttyS0 >/dev/ttyS0 2>&1'
我们的 etc/passwd 包含一个非 root 用户(attacker)和一个 root 用户(root):
attacker:x:1000:1000:Linux User,,,:/home/attacker:/bin/sh
root:x:0:0:root:/tmp:/bin/sh
内核使用 make defconfig 为 x86_64 编译,并启用了一些额外的跟踪/调试功能。
make 编译./spray./exploit