两个 Linux 内核模块损坏了共享指针 - 如何调试



假设有两个Linux kernel modules。这两个模块之间共享一个global pointerModule 1正在尝试访问此pointer,损坏此指针值并退出。现在Module 2正在尝试访问此pointer,该不再有效并崩溃。

模块 1:

module_function()
{
     //corrupt global_ptr
}
module2_function()
{
    local_ptr = global_ptr;
    //local_ptr corrupted
    //Now if local_ptr is accessed, it will crash
}

有人可以解释一下,如果这种情况有效且可能?然后

i) 如何调试此问题。也就是说,如何找出哪个模块损坏了指针?

ii) 如何解决此问题,以便模块 2 永远不会崩溃?

  1. 这是use-after-freeuse-after-modify一种通常会导致oopsbug的经典案例,因此tainting linux kernelG flag集合,导致system hang and reboot。如果您由于system hang而无法获得dmesg logs,则可以在/var/log/kern.log中观察这些logs
  2. 为了调试此类kernel memory pointer corruption问题,您需要Enable Slab Corruption debug kernel menuconfig,因此.config。为了更快地参考,执行此操作的步骤是:- make menuconfig ---> Kernel hacking ---> Memory debugging ---> Debug slab memory locations
  3. 此问题的设计解决方案是不在模块之间使用global pointers,因为您永远不知道哪个模块可能会首先freed导致指针损坏。

最新更新