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部分类有效