通常在Linux / ARM上,映射在0xffff0000
的特殊页面用于实现"读取TLS指针"操作,原子比较和交换以及内存屏障。该系统被称为" kuser助手" (CONFIG_KUSER_HELPERS
)并且必须解决早期手臂模型中缺乏原子比较和交换支持的问题。但是,最近的内核版本提供了一个禁用此功能的选项,原因是它存在安全风险(基于返回固定的可执行地址促进攻击,因为这些功能不受ASLR的限制);如果构建所有应用程序以直接使用较新ARM模型上提供的同步指令,则可以使用此选项。
我的问题是我希望能够支持旧的ARM模型(缺少同步指令)和新的加固内核(缺少kuser帮助程序)和相同的二进制文件,所以我正在寻找一种可靠的方法,从用户空间,检测kuser帮助页面的可用性(如果它可用则使用它,并假设它不是新指令必须可用)。可靠的排除了可能并非总是可用的/proc
之类的内容。有没有办法探测kuser帮助页面是否存在,而不是尝试使用它并捕获SIGSEGV
?
答案 0 :(得分:2)
向量页面在arch / arm / kernel / traps.c:early_trap_init()中在内核初始化期间设置,并且仍然存在,只是没有助手,所以你不应该首先获得SEGV;出于同样的原因,mmap技巧不起作用(我没有检查过这些假设)。
但是:矢量页面由early_alloc_aligned()初始化为零,所以你很幸运,因为0xffff0ffc处的kuser_helpers数量不会被填充,因此为零。
tl; dr:从0xffff0ffc中读取kuser助手的数量。如果为零=>不支持他们