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