为什么此次内存越界写入未被KASAN检测到?
KASAN未触发越界写告警的原因排查
内核未开启KASAN功能
KASAN是内核编译时的可选特性,ARM平台必须确保内核编译时配置了:- 基础开关
CONFIG_KASAN=y - 对应架构的KASAN模式:ARM64可选软件标签(
CONFIG_KASAN_SW_TAGS=y)或硬件标签(CONFIG_KASAN_HW_TAGS=y,需CPU支持);32位ARM仅支持软件标签模式。
可以通过zcat /proc/config.gz | grep KASAN确认配置是否生效。
- 基础开关
模块编译环境不匹配
模块必须基于开启KASAN的内核源码编译,且编译时自动继承内核的KASAN编译flags(比如-fsanitize=kernel-address)。如果模块用的是未开启KASAN的内核头文件,或者手动覆盖了编译参数,会导致KASAN无法检测模块内的内存错误。越界位置未命中KASAN红区
内核的kmalloc会将内存分配对齐到固定块大小(比如16字节),当你申请10字节时,实际分配的内存块是16字节。a[20]的位置可能落在下一个内存块的有效区域(而非KASAN设置的红区),这种情况不会触发告警。可以修改代码为a[16] = 0,确保写入红区触发检测。未查看内核日志
KASAN的告警默认输出到内核日志,而非当前控制台。执行insmod后,需要用dmesg | grep KASAN或查看/var/log/kern.log(若系统支持)来查看报告,不要只看控制台输出。KASAN被限制或禁用
如果内核开启了CONFIG_KASAN_LIGHT=y轻量模式,会减少检测范围以提升性能,可能漏检部分越界操作。另外,内核启动参数若设置了kasan.fault=0,会直接禁用KASAN的告警触发逻辑。
内容的提问来源于stack exchange,提问作者yuanjianpeng
相关产品推荐
相关产品推荐

