Introduction
由于在研究内核漏洞的时候,在漏洞的利用方式上有时候,时常会用到Physical Address
的概念,最先是在研究SMBleeding CVE-2020-0796、CVE-2020-1206
(记录文档丢失)的RCE利用的时候接触到这一方式。后续在研究CVE-2018-1038
时,再次接触到这一利用方式,有感于这种利用方式的威力,思路的新颖,特此学习记录。
Background
Windows 自从Windows Vista以来在安全方面做了很多功课,除了在用户层我们熟知的NX/DEP/ALSR/SafeSEH等缓解措施,Windows 在内核层也做了很多漏洞缓解措施。
NX/DEP
在kernel mode下也区分data
和code
,通过PROTECTED MODE MEMORY SEGMENTATION
实现内存的属性标记。
KALSR
与ALSR类似,在kernel mode下,将Windows 的模块基地址随机化,提高RCE利用难度(需要一个泄漏内核模块地址的信息泄漏漏洞)。而对LPE是没有影响的,因为在Local System下,可以通过NtQuerySystemInfomation
获取模块信息。
Integrity Levels
即可信级别
,高风险的程序(典型的浏览器)可信级别低,将不被允许执行敏感操作(系统调用),如NtQuerySystemInfomation
,以此避免这类程序完成权限提升。
SMEP
全称Supervisor Mode Excution Protect
,该保护措施严格区分Kernel Space
和User Spcae
,即不允许以SYSTEM
权限运行User Space
的代码。
以上种种措施,使得exploit更难实现利用,很多情况下是拥有一定的权限(常见的任意地址写),但是无法转为LPE
或者RCE
Windows Pages
unit
1KB = 0x400B
1MB = 1KB * 0x400
1GB = 1MB * 0x400
1TB = 1GB * 0x400
Intel Paging x86
在32bits机器上,cpu需要访问的虚拟内存空间达到4G
,为了达到这个目的,采用了PAGE DIRECTORY
和PAGE TABLE
两级寻址机制。
在Window 上CR3寄存器指向当前的PAGE DIRECTORY
的Physical Address
,每个PAGE DIRECTORY有1024
个ENTRY
(简称PDE
),每个PDE指向一个PAGE TABLE的Physical Address。每个PAGE TABLE有1024
个ENTRY(简称PTE
),每个PTE指向一块4KB
物理地址,即将4KB物理地址映射到4KB的虚拟地址。
一个虚拟地址即可以用下面的方式映射到物理地址(也可以反过来由物理地址得到虚拟地址)
每个ENTRY都是4bytes,其中低位用于标记相应地址的属性。
其中,PDE在一种特殊情况下可以不指向1024个PAGE TABLE,而是指向1个Large Page
(拥有4MB大小),即将PS
(Page size)标记。
需要注意到的是,Windows上的每个进程都拥有4GB的虚拟内存,而且互相之间不可以访问,这种实现方式必然要求每个进程的指向Page Directory的Physical Address不同!
PAE
即Physical Address Extension
,引入了更高的一层寻址机制Page Directory Pointer Table(PDPT)。将物理地址的表示方式由32bits增加到了36bits,也就意味着此时的寻址空间达到了64GB。
PDPT中保存着Page Directory的Entry(简称PDPTE
),每个Entry指向一个Page Directory,表示1GB大小,因为此时每个entry表示需要8bytes,所以每个Table只有512个Entry,也就是512 PDE * 512 PTE * 4KB
。
此外PAE引入了NX bit,用于完成data和code的区分。
Intel Paging x64
在64bits 系统中,此时CPU可访问的物理地址有48bits,而虚拟地址达到了64bits。明显是不足的。这时提出了一个概念CANONICAL ADDRESS
,提出真实的虚拟地址空间也只有48bits,不过虚拟内存做了一个区分,即我们熟知的两部分:0 - 0x7FFF FFFF FFFF
和0xFFFF 8000 0000 0000 - 0xFFFF FFFF FFFF FFFF
。
为了满足48bits寻址需求,在PAE基础上引入了四级页表寻址的概念:PML4、PDPT、PAGE DIRECTORY、PAGE TABLE.
此时的寻址计算式512PML4Es * 512PDPTEs * 512PDEs * 512PTEs * 4KB = 256TB
Problems
到目前为止,Windows Page机制基本介绍完了,但是这里有个问题,上面都是在介绍Windows物理地址如何映射到整个虚拟地址空间,但是为了管理虚拟地址,Windows有必要完成逆过程,即 将任意一个虚拟地址定位到某一物理地址。这一过程会存在一些问题。
1、应用程序需要分配一块虚拟地址 VirtualAlloc 得到 0x402000