uffd(userfaultfd)

该功能在 5.11 版本后变成需要 root 权限。

1
int sysctl_unprivileged_userfaultfd __read_mostly = 1

该值在较新版本中会默认为 0。
可以通过命令验证是否开启

1
2
3
4
$ cat /proc/sys/vm/unprivileged_userfaultfd 
1
$ sysctl vm.unprivileged_userfaultfd
vm.unprivileged_userfaultfd = 1

不过该功能十分好用。
userfaultfd 为用户可以为特定地址注册 page handler ,当 内核触发特定地址 pagefault 时,就会阻塞进而执行 handler 内容。从而可以在让内核读写时暂停,然后开启另一个线程进行篡改,实现 race。

1

punch hole

在 CTF 题目中,如果关闭了 userfaultfd 以及 fuse 情况下,同时时间竞争窗口较小,可以通过该方法来扩大时间窗口。
其基本原理是 fallocate 系统调用支持对 打开文件的对应内存打洞,即 unmmap,如果 copy_from_user 访问该地址,则会进入一系列函数调用来进行处理 page fault,同时如果一直维持打洞状态,则可以延长其处理时间。

因此我们可以通过该方法在 copy_from_user 处进行打洞,如果对应UAF,该方法还可以用于修改目标对象的内容,比较好用。
https://bbs.kanxue.com/thread-289370.htm
https://gist.github.com/pqlx/b1ed41e7557c042bcc7a8c74ea1feae8