Linux KASAN工具
阅读数:320 评论数:0
跳转到新版页面分类
Linux
正文
一、概述
Kernel Address Sanitizer是一个动态内存错误检测工具,它用于发现Linux内核中的内存安全问题。KASAN能够检测到的错误类型包括:
- 堆栈溢出
- 全局缓冲区溢出
- 堆缓冲区溢出
- 使用后释放(use-after-free)
- 释放后使用(use-after-scope)
KASAN被集成在Linux内核中,可以通过编译时选项来启用。
二、启用kasan
1、配置内核
在编译内核之前,需要启用KASAN。这通常是通过内核的配置系统完成的,例如使用make menuconfig或make nconfig命令。
2、选择KASAN
在内核配置菜单中,进入“Kernel hacking”部分,然后选择“Memory Debugging”选项。在那里,你可以找到KASAN选项。
然后从CONFIG_KASAN_OUTLINE和CONFIG_KASAN_INLINE之间选择,前者产生较小的二进制文件,后者要快1.1~2倍。
KASAN支持SLUB和SLAB内存分配器,为了更好的bug检测和报告形式,启用CONFIG_STACKTRACE。
3、编译内核
启用KASAN后,保存配置并退出配置菜单。然后编译内核和模块:
make -j$(nproc)
make modules_install
make install
4、更析引导加载器
如果你不是使用的内核自动安装脚本,你可能需要手动更新引导加载器配置,例如GRUB。
5、重启到新内核
编译并安装新内核后,重启系统并选择新编译的内核启动。
三、使用KASAN
启用KASAN后,如果内核代码中存在内存错误,KASAN会在系统日志中报告它们。这些报告会包含错误的类型和位置,以及相关的调用堆栈。
-
查看日志:你可以使用
dmesg
命令或查看/var/log/kern.log
文件来获取KASAN的输出。 -
分析输出:KASAN的输出会给出错误发生的确切位置,包括文件名和行号。它还会提供一个堆栈跟踪,显示了错误发生时函数调用的顺序。
四、示例输出
一个典型的KASAN报告可能看起来像这样:
==================================================================
BUG: KASAN: use-after-free in __func__+0xabcdef/0x123456 at addr XYZ
Read of size 4 by task a.out/1234
Call Trace:
[<ffffffff81001234>] __func__+0xabcdef/0x123456
[<ffffffff81002345>] __another_func__+0x123456/0xabcdef
...
在这个例子中,__func__
是发生错误的函数,0xabcdef/0x123456
是错误发生的内核地址。addr XYZ
是被错误访问的内存地址。随后的调用跟踪显示了导致错误的函数序列。
五、注意事项
- KASAN对性能有一定影响,因此通常只在开发或测试内核时使用。
- KASAN需要额外的内存,因为它会为每个内存分配添加元数据。
- 对于生产环境,通常不建议启用KASAN,因为它会增加内核的内存占用,并可能降低系统的性能。