Original blog:Dirty_Pagetable (yanglingxi1993.github.io)

做一些记录

How DirtyPageTable Works

先简单过一遍DirtyPageTable的流程,以最常见的UAF为例

  1. 获得一个UAF obj,将其释放回到slab中,并将slab中所有其他的obj全部释放,这样该slab就变成了空slab,

    从而回到伙伴系统中

  2. 大量分配用户页表,使得用户页表占用victim slab

  3. 构造用于操作页表条目 (PTE) 的原语

  4. 修改PTE,使得将该PTE的物理内存变为内核代码/数据的物理内存,例如我们可以修改setresuid(),setresgid()等函数对是否具有调用权限的判别

  5. getroot

    1
    2
    3
    setresuid(0, 0, 0);
    setresgid(0, 0, 0);
    system("/bin/sh");

这就是整个DiryPageTable的工作流程了,原理并不复杂,和USMA非常相似

需要解决的问题有两个:

  1. 如何得到UAF,并且获得操作页表条目的能力
  2. 如何得到目标地址的物理内存地址

利用手法提出者给了我们三种示范

DPT with CVE-2023-21400