slab与slub的区别

  • slab:只有大小,类型相同的对象才能共用一块空间
  • slub:只要大小相同就能共用

需要考虑的几个问题

是否需要占位

  • 需要占位:一般情况下,kmalloc后面会跟着kfree,因此,有些需要占位的堆喷函数,可能需要通过一些方法进行阻塞,例如userfaultfd+setxattr
  • 不需要占位:这种情况下直接使用堆喷函数申请大量对象,但是存在一个问题,因为被kfree的对象会通过单向链表freelist组织起来,导致前8个字节被next指针占用不可控。

slab还是slub

在选择堆喷对象时,需要根据哪种分配器来选择

  • slab只允许同大小,同类型的对象申请同一块内存空间
  • slub只要对象大小相同,就能使用freelist中的内存空间

sleep

堆喷的时候可能需要先释放对象,在进行喷射,这时可能会使用sleep函数,这时相当于主动放弃cpu,其他的进程会占用当前cpu,因此刚free的对象可能会被其他进程申请出去

kmalloc的flags

不同的flags会在不同的地方申请对象

因此,如果申请victim obj是的flags与duipen函数采用的flags不同,也不能喷射成功。

static __always_inline void *kmalloc(size_t size, gfp_t flags)
{
    ............................
        if (!(flags & GFP_DMA)) {
            return kmem_cache_alloc_trace(kmalloc_caches[index],
                    flags, size);
        }
    return __kmalloc(size, flags);
}

preView