几种安全机制

MemGC

memgc是edge的一个防止uaf的机制。

1、分配

分配内存时候将一个标记插入chunk中。

2.释放

当程序释放内存时,并不回收内存,而是清理标记为。

3.回收

当释放的内存到达一定数量,进行扫描,只有没有标记并且在堆栈寄存器中都没有引用的chunk才会被真正回收。

CFG

检测程序间接跳转地址是否合理,在间接跳转前调用检测函数。

访问一个bitmap(称为CFGBitmap),其表示在进程空间内所有函数的起始位置。在进程空间内每8个字节的状态对应CFGBitmap中的一位。如果在每组8字节中有函数的起始地址,则在CFGBitmap中对应的位设置为1;否则设置为0。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
一个例子

目标地址 :
0x00b613a0 = ‭00000000 10110110 00010011 10100000‬ (b)
首先取高位的3个字节:00000000 10110110 00010011 = 0x00b613
那么CFGbitmap的基地址加上 0x00b613 就是指向一个字节单元的指针。
这个指针最终取到的假设是:
CFGBitmap :0x10100444 = 0001 0000 0001 0000 0000 0100 0100 0100(b)
接着判断目标地址是否以0x10对齐:地址 & 0xf 是否等于 0 ;

如果等于0,那偏移是:最低字节二进制位的前5位,这里就是 10100;
若不等于0,则偏移是: 10100|0x1。
这里的例子,0x00b613a0 & 0xf = 0 ,所以偏移: 1010 0 = 20 (d)
这个偏移就是该函数在CFGbitmap中第20位的位置上,若这个位置是1,说明该函数调用是合法有效的,反之则不是。
那么:
CFGBitmap :0x10100444 = 0001 0000 0001 0000 0000 0100 0100 0100(b)
第20位加粗的 1 ,说明这个调用合法有效。

绕过CFG保护的思路还包括跳转到有效的API地址(如LoadLibrary)[41]、覆盖堆栈数据(如返回地址)

VTGuard

  • 用以检测vftable指针的修改,使用一个canary存储在每个有效虚表的特定位置。vftable使用前,代码会检查canary的值。
  • 因此攻击者需要去leak/brute-force这个canary值,放在自己伪造的虚表中。

目前这个只对edge部分类有效