Linux内核中如何检查内核启动参数中是否包含nokaslr

在Linux内核中,检查内核启动参数是否包含nokaslr可以通过以下方法实现:


1. 用户空间检查(/proc/cmdline)

在用户态中,直接查看 /proc/cmdline 文件内容:

1
cat /proc/cmdline | grep -q "nokaslr" && echo "Found" || echo "Not found"

2. 内核代码中检查

在内核源码或模块中,可以通过访问内核保存的启动参数字符串(saved_command_line)并搜索子串:

方法1:直接字符串匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <linux/string.h>
#include <linux/init.h>

extern char saved_command_line[]; // 声明外部变量

// 在初始化函数中检查
static int __init check_nokaslr(void) {
if (strstr(saved_command_line, "nokaslr")) {
pr_info("nokaslr found in kernel parameters\n");
} else {
pr_info("nokaslr not found\n");
}
return 0;
}
late_initcall(check_nokaslr);

方法2:使用内核辅助函数

saved_command_line不可访问(如未导出),可使用kallsyms_lookup_name动态查找:

1
2
3
4
5
6
7
8
#include <linux/kallsyms.h>

char *saved_cmdline;

saved_cmdline = (char *)kallsyms_lookup_name("saved_command_line");
if (saved_cmdline && strstr(saved_cmdline, "nokaslr")) {
// 参数存在
}

方法3:检查KASLR状态(仅限x86)

如果目的是确认KASLR是否启用,而非直接检查参数:

1
2
3
4
5
6
7
#include <asm/kaslr.h>

if (kaslr_enabled()) {
// KASLR已启用
} else {
// KASLR已禁用(可能因nokaslr或其他原因)
}

注意事项

  1. 变量导出问题saved_command_line可能未导出到模块,需通过kallsyms_lookup_name获取地址。
  2. 精确匹配strstr可能误匹配其他参数(如nokaslrdebug),需确保参数格式正确。
  3. 架构差异kaslr_enabled()仅适用于x86,其他架构需参考对应实现。

总结

  • 用户空间:直接解析/proc/cmdline
  • 内核空间:通过saved_command_line字符串搜索或检查KASLR状态函数。
  • 模块开发:注意符号导出问题,必要时使用动态查找。