我试图在一个开源项目中寻找保留漏洞,以支持基于I2C的触控板(https://github.com/kprinssu/VoodooI2CHID)。
之所以认为存在保留泄漏,是因为当我尝试通过以下命令卸载内核扩展时:
sudo kextunload -verbose 6 VoodooI2CHID.kext
我得到以下输出:
Kext user-space log filter changed from 0xff2 to 0xfff.
Kext kernel-space log filter changed from 0xff2 to 0xfff.
Kext library architecture set to x86_64.
Requesting unload of com.alexandred.VoodooI2CHID (with termnation of IOServices).
(kernel) User-space log flags changed from 0x0 to 0xfff.
(kernel) Received 'Unload' request from user space.
(kernel) Rescheduling scan for unused kexts in 60 seconds.
(kernel) Can't unload kext com.alexandred.VoodooI2CHID; classes have instances:
(kernel) Kext com.alexandred.VoodooI2CHID class VoodooI2CPrecisionTouchpadHIDEventDriver has 1 instance.
(kernel) Kext com.alexandred.VoodooI2CHID class VoodooI2CMultitouchHIDEventDriver has 1 instance.
Kernel error handling kext request - (libkern/kext) kext is in use or retained (cannot unload).
Failed to unload com.alexandred.VoodooI2CHID - (libkern/kext) kext is in use or retained (cannot unload).
我遇到了pmdj关于追踪保留泄漏(Can't Unload Kernel Extension; Classes Have Instances)的出色回答。我确认我的情况是通过ioreg发生的第二种情况(类已终止,但未正确释放)。另外,我通过覆盖aggedRelease和tagRetain(https://stackoverflow.com/a/13471512/48660)使用pmdj的提示来打印函数调用的堆栈跟踪。
这是我遇到问题的地方,我无法使用atos
将十六进制地址转换回人类可读的符号。我使用以下命令生成符号:
atos -arch x86_x64 -o VoodooI2C.kext/Contents/MacOS/VoodooI2C -l 0xffffff7f8432b000 0xffffff804588dfa0
从kextstat
中检索了加载地址参数,我希望-l
参数可以处理滑动算法。
atos
应该返回一个有效的符号,但我得到的只是十六进制地址。在上面的示例中,我得到0xffffff804588dfa0
作为输出。有人可以指出我到底想念什么吗?
答案 0 :(得分:0)
OSReportWithBacktrace
和0xffffff7f8432b000
都报告了不固定的地址,因此KASLR并不是您的问题。
请注意,您的kext显然加载在0xffffff804588dfa0
上,而回溯帧地址是0xffffff7f8???????
。这相差很远,实际上kexts总是加载在0xffffff804588dfa0
(未滑动)范围内,因此atos
不能在kext代码附近。 (偏移量约为3GB)几乎可以肯定是内核中的函数。如果您将atos -o /Library/Developer/KDKs/KDK_10.14.5_18F132.kdk/System/Library/Kernels/kernel 0xffffff804588dfa0
与适当的正在运行的内核二进制文件一起使用,则它应该能够找到哪个二进制文件。例如:
switchMap
(我不知道您使用的是哪个内核版本,并且该地址在18F132内核中似乎没有意义,但是您明白了。)