关于 Use-After-Free(UAF) 漏洞的检测与防护,已经有很多成熟的方案,但对于 web server 这样包含大规模计算/存储,且需要长期运行的程序来说,分析检测和防护方案如果造成了很高的性能开销,就不够实用。今天我们推荐一篇发表在 CCS 2022 上的研究论文–DangZero: Efficient Use-After-Free Detection via Direct Page Table Access,介绍一种基于页表别名的 UAF 漏洞检测技术。
本文的作者来自知名的安全研究团队VUSec,而他们所在的Vrije Universiteit Amsterdam也是计算机系统研究的重镇。所以这篇文章充分考虑了操作系统级别的特性,把 UAF 检测做到了底层,大大提高了性能。作者实现了名为DangZero
的 UAF 检测系统,其整体结构如下图所示:
作者指出,对于 UAF 漏洞,检测往往比防护更加有效。但之前的检测方法需要借助编译器基础架构,不能直接适配二进制文件;要么就是需要引入特定的硬件扩展支持,不够普及。在DangZero
的设计中,用户态的程序需要先经过中继内存分配器(Overlay allocator)之后才会真正地调用默认的内存分配器(glibc),中继内存分配器在每次内存分配/释放时都会对当前对象进行页表别名的处理,其实现如下图所示:
然而,如果程序在每次内存分配/释放上都经过别名内存的处理,则会逐渐耗尽地址空间。为此, **DangZero 提出了别名回收(alias reclaiming)的技术。**该技术和垃圾回收器(garbage collector)标记-回收的原理类似,通过定期扫描悬垂指针(dangling pointer)的指向情况,让程序安全地使用已经被释放过的内存(这也是防止 UAF 的关键)。
如何实现页表别名回收的方案也是DangZero
的一大亮点。用户态的程序每次想要修改页表,都要经过系统调用陷入到内核态。而DangZero
使用了特权后端(privileged backend),从而可以在 ring 0 模式下直接运行用户态程序,并调用其他的内核态函数,从而提高了操作页表的效率。
对于每一项页表,如下图所示,DangZero
还充分使用了空闲的比特位,来用于提供页表别名回收和页表压缩的元信息。具体来说, DangZero 使用了 Kernel Mode Linux(KML)作为特权后端,此时 Linux 变成了 UniKernel,运行在 Qemu/KVM 提供的虚拟环境中。最后,作者将DangZero
以共享库的形式提供给应用程序,让其透明地使用中继内存分配器。
作者对DangZero
进行了漏洞检测,性能开销两方面的实验,实验对象包含 Benchmark 和真实程序。漏洞检测方面, DangZero 能够准确检测出 Juliet 测试集中的所有 UAF(CWE416)和 Double-Free(CWE415)的漏洞,还检测出 SPEC CPU2006 数据集中的 1 个 UAF 漏洞和 Python 和 PHP 中的 6 个 CVE。
性能开销测试则是实验部分的重点。作者使用不包含 KML 的虚拟环境作为 baseline,在 SPEC CPU2006/2017上进行了对比实验。
如下图所示,DangZero 平均引入了 14% 的时间开销,如果使用别名回收技术则增加 2% 的时间开销。具体到每个组件来看,KML 对性能的影响可以忽略不计;创建页表别名的开销也不大;造成最多开销的环节则是使用页表别名,这是因为其造成了 TLB 的增加;此外,回收页表别名也造成了一些开销。
作者还将DangZero
和其他的工作进行了对比,可以看出其比使用类似技术的 Oscar 的表现更佳。
作者采用了 Resident Set Size 和页表数量的上界作为内存使用的指标。如下图所示, **DangZero 平均引入了 75% 的内存开销,但在使用页表压缩技术之后降低到了 25%。**对比来看,DangZero
在内存开销上的表现比其他工作都好很多。
而在 SPEC CPU2017 上,DangZero
也有不错的表现(时间开销 22%,内存开销 27%)。作者也将之前的工作在该数据集上与DangZero
进行了对比实验。
最后,回到本工作的“初心”,作者对 Nginx 进行了测试。如上图所示,DangZero 降低了 18% 的吞吐量。为了测试其他的工作,作者又在 forkless 模式(依赖单核性能)下进行了对比实验,DangZero
也是优于其他工作的。
而在长期运行的场景下,作者评估了页表别名回收技术的作用。可以看出页表别名在达到一定的 watermark 后会被回收,从而使程序使用的物理内存保持在一个较为稳定的状态。
论文PDF:https://download.vusec.net/papers/dangzero_ccs22.pdf
论文Artifact(Work In Progress):https://github.com/vusec/dangzero
原文始发于微信公众号(安全研究GoSSIP):G.O.S.S.I.P 阅读推荐 2022-10-08 DangZero