kptr_restrict 内核文件简介
一、简介
系统为了保护内核符号地址不被泄露, 而用的一种保护手段, 从而使除 root 用户外的普通用户不能直接查看符号地址。原因在于内核文件 kallsyms.c 中的显示符号地址命令中做了如下限制:
seq_printf(m, "%pK %c %s\n", (void *)iter->value, iter->type, iter->name);
只需要把其中的 %pK 换成 %p 就可以让普通用户查看符号地址了. 很多提权漏洞一般会用到此处的修改来获取符号地址。
内核提供控制变量 /proc/sys/kernel/kptr_restrict 来进行修改. 从内核文档 Documentation/sysctl/kernel.txt 中可以看到 kptr_restrict 用于控制内核的一些输出打印,Documentation/printk-formats.txt 有更加详细的描述。
值和权限对应关系如下:
kptr_restrict 权限描述 --------------------------------------------------------------------- 2 内核将符号地址打印为全0, root和普通用户都没有权限 1 root用户有权限读取, 普通用户没有权限 0 root和普通用户都可以读取
二、实验
1. 为0时可以看到符号地址
# echo 0 > /proc/sys/kernel/kptr_restrict # cat /proc/kallsyms | head -10 ... ffffffee02481000 t efi_header_end ffffffee02481000 t sun4i_handle_irq # cat /proc/modules | head -5 ... rmnet_offload 28672 0 - Live 0xffffffedb6e9b000 (O) rmnet_shs 159744 0 - Live 0xffffffedb7192000 (O)
2. 为2时root用户也看不到符号地址
# echo 2 > /proc/sys/kernel/kptr_restrict # cat /proc/kallsyms | head -10 ... 0000000000000000 t efi_header_end 0000000000000000 t sun4i_handle_irq # cat /proc/modules | head -5 rmnet_offload 28672 0 - Live 0x0000000000000000 (O) rmnet_shs 159744 0 - Live 0x0000000000000000 (O)
3. 中间字符说明
kallsyms 是一个符号表,它包含了内核中所有的符号信息,包括函数、变量、常量等。在kallsyms中,每个符号都有一个类型,表示它的用途。下面是一些常见的符号类型:
T:表示该符号是一个函数,可以被其他代码调用。
t:表示该符号是一个局部函数,只能在当前文件中使用。
D:表示该符号是一个全局变量,可以被其他代码访问和修改。
d:表示该符号是一个局部变量,只能在当前文件中使用。
R:表示该符号是一个只读变量,不能被修改。
r:表示该符号是一个只读局部变量,只能在当前文件中使用。
A:表示该符号是一个可读写的变量,可以被其他代码访问和修改。
a:表示该符号是一个可读写的局部变量,只能在当前文件中使用。
B:表示该符号是一个未初始化的全局变量,它的值在程序启动时被初始化为0。
b:表示该符号是一个未初始化的局部变量,它的值在程序启动时被初始化为0。
G:表示该符号是一个全局变量,但是它的值在程序运行时可能会被修改。
C:表示该符号是一个常量,它的值在程序运行时不能被修改。
W:表示该符号是一个弱符号,
?: 表示该符号的类型未知。
注:可能并不完全准确,见 https://zhuanlan.zhihu.com/p/607285952?utm_id=0
参考:https://blog.csdn.net/gatieme/article/details/78311841
posted on 2022-07-11 21:28 Hello-World3 阅读(1397) 评论(0) 编辑 收藏 举报