SMAP/SMEP 是否在用户空间(kmalloc)中阻塞分配?

Does SMAP/SMEP block allocation in userland (kmalloc)?

我正在尝试利用 Linux 内核中的堆溢出并启用所有保护,即 SMAP 和 SMEP。我的理解是 SMEP 不允许我执行用户态代码,而 SMAP 不允许我读取或写入用户态。但是我想知道:如果我用一些用户空间指针替换一些空闲对象的空闲列表指针,我是否能够在用户空间分配对象?

我也尝试替换空闲列表指针,但我遇到了奇怪的崩溃,我无法正确调试。我不确定他们是不是因为我试图在用户区分配一些东西。

SMAP / SMEP 是在硬件级别实施的缓解措施。如果启用,CPU 会在无效内存访问时生成异常,然后由已注册的内核异常处理程序捕获,该异常处理程序将恐慌、终止当前进程或执行任何其他需要的操作。无效访问是来自空闲列表指针还是来自其他内容并不重要。内核堆指针不是某种允许您绕过 SMAP 的“特殊”类型的指针。

如果出于某种原因,在 read/write 到用户 space 地址时,SMAP 被禁用,那么您所描述的东西唯一可行的方法。例如,如果您设法破坏一个指针,然后在执行路径中使用该指针:SMAP OFF → R/W → SMAP ON。事情是,你通常不会找到这样的用法,因为只有当内核 知道 它需要处理用户指针时才会这样做(例如 copy_{to,from}_user())。任何其他暂时禁用 SMAP 然后使用指针的实例基本上都应被视为错误。

所以不,您将无法在用户 space 中分配内核对象,除非它是您试图利用的一些非常有问题的内核模块,它会在不需要时错误地禁用 SMAP。