比如说,我挂上了一个 sys_*(例如 sys_open)处理程序;当我发现从用户空间传递的参数是恶意的,我打印用户空间的堆栈跟踪。我该怎么做?
(dump_stack() 只打印内核堆栈)
比如说,我挂上了一个 sys_*(例如 sys_open)处理程序;当我发现从用户空间传递的参数是恶意的,我打印用户空间的堆栈跟踪。我该怎么做?
(dump_stack() 只打印内核堆栈)
您可以向内核中的目标进程发送一个可以生成核心转储文件的信号(例如 SIGBUS、SIGKABRT)。
例如:
do_send_sig_info(SIGABRT, SEND_SIG_FORCED, current, true);
然后您可以使用 gdb 显示生成的核心文件的回溯。
应用范围有限,这非常棘手。
oprofile
支持用户空间堆栈跟踪,这些是通过遍历用户空间堆栈在内核中计算的。(但请注意:它不解析符号;这是由用户空间中的报告工具完成的。)
如果我必须解决这个问题,我会开始(再次)查看 oprofile 代码并使用/调整那里的内容。
也许这种“恶意”事件可以简单地建模为一种要记录的oprofile事件,嗯。