内核地址消毒剂(KASAN)

概述
Kernel Address SANitizer(KASAN)是一种动态内存安全错误检测工具,主要功能是 检查内存越界访问和使用已释放内存的问题。

KASAN有三种模式:

通用KASAN
基于软件标签的KASAN
基于硬件标签的KASAN
用CONFIG_KASAN_GENERIC启用的通用KASAN,是用于调试的模式,类似于用户空 间的ASan。这种模式在许多CPU架构上都被支持,但它有明显的性能和内存开销。

基于软件标签的KASAN或SW_TAGS KASAN,通过CONFIG_KASAN_SW_TAGS启用, 可以用于调试和自我测试,类似于用户空间HWASan。这种模式只支持arm64,但其 适度的内存开销允许在内存受限的设备上用真实的工作负载进行测试。

基于硬件标签的KASAN或HW_TAGS KASAN,用CONFIG_KASAN_HW_TAGS启用,被 用作现场内存错误检测器或作为安全缓解的模式。这种模式只在支持MTE(内存标签 扩展)的arm64 CPU上工作,但它的内存和性能开销很低,因此可以在生产中使用。

关于每种KASAN模式的内存和性能影响的细节,请参见相应的Kconfig选项的描述。

通用模式和基于软件标签的模式通常被称为软件模式。基于软件标签的模式和基于 硬件标签的模式被称为基于标签的模式。

支持
体系架构
在x86_64、arm、arm64、powerpc、riscv、s390、xtensa和loongarch上支持通用KASAN, 而基于标签的KASAN模式只在arm64上支持。

编译器
软件KASAN模式使用编译时工具在每个内存访问之前插入有效性检查,因此需要一个 提供支持的编译器版本。基于硬件标签的模式依靠硬件来执行这些检查,但仍然需要 一个支持内存标签指令的编译器版本。

通用KASAN需要GCC 8.3.0版本或更高版本,或者内核支持的任何Clang版本。

基于软件标签的KASAN需要GCC 11+或者内核支持的任何Clang版本。

基于硬件标签的KASAN需要GCC 10+或Clang 12+。

内存类型
通用KASAN支持在所有的slab、page_alloc、vmap、vmalloc、堆栈和全局内存 中查找错误。

基于软件标签的KASAN支持slab、page_alloc、vmalloc和堆栈内存。

基于硬件标签的KASAN支持slab、page_alloc和不可执行的vmalloc内存。

对于slab,两种软件KASAN模式都支持SLUB和SLAB分配器,而基于硬件标签的 KASAN只支持SLUB。

用法
要启用KASAN,请使用以下命令配置内核:

CONFIG_KASAN=y
同时在 CONFIG_KASAN_GENERIC (启用通用KASAN模式), CONFIG_KASAN_SW_TAGS (启用基于硬件标签的KASAN模式),和 CONFIG_KASAN_HW_TAGS (启用基于硬件标签 的KASAN模式)之间进行选择。

对于软件模式,还可以在 CONFIG_KASAN_OUTLINE 和 CONFIG_KASAN_INLINE 之间进行选择。outline和inline是编译器插桩类型。前者产生较小的二进制文件, 而后者快2倍。

要将受影响的slab对象的alloc和free堆栈跟踪包含到报告中,请启用 CONFIG_STACKTRACE 。要包括受影响物理页面的分配和释放堆栈跟踪的话, 请启用 CONFIG_PAGE_OWNER 并使用 page_owner=on 进行引导。

启动参数
KASAN受到通用 panic_on_warn 命令行参数的影响。当它被启用时,KASAN 在打印出错误报告后会使内核恐慌。

默认情况下,KASAN只对第一个无效的内存访问打印错误报告。使用 kasan_multi_shot,KASAN对每一个无效的访问都打印一份报告。这会禁用 了KASAN报告的 panic_on_warn。

另外,独立于 panic_on_warn 、 kasan.fault= boot参数可以用 来控制恐慌和报告行为。

kasan.fault=report 或 =panic 控制是否只打印KASAN report或 同时使内核恐慌(默认: report )。即使 kasan_multi_shot 被 启用,恐慌也会发生。

基于软件和硬件标签的KASAN模式(见下面关于各种模式的部分)支持改变堆栈跟 踪收集行为:

kasan.stacktrace=off 或 =on 禁用或启用分配和释放堆栈痕 迹的收集(默认: on )。

kasan.stack_ring_size= 指定堆栈环的条 目数(默认: 32768 )。

基于硬件标签的KASAN模式是为了在生产中作为一种安全缓解措施使用。因此,它 支持额外的启动参数,允许完全禁用KASAN或控制其功能。

kasan=off 或 =on 控制KASAN是否被启用(默认: on )。

kasan.mode=sync, =async o

  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好!您想知道如何在 Android 设备上打开 KASAN 吗? KASAN(KernelAddressSANitizer)是一种 Linux 内核检测工具,用于检测内核代码中的内存访问错误。它是通过在内核启动时启用内存布局随机化(KASLR)和插入许多内存访问检查来实现的。 要在 Android 设备上使用 KASAN,您需要先编译内核并启用 KASAN 支持。这通常需要使用特定的内核配置选项来启用 KASAN,然后重新编译内核。具体来说,您需要在内核配置文件中启用以下选项: - CONFIG_KASAN - CONFIG_KASAN_INLINE 然后,您可以在内核启动时通过命令行参数启用 KASAN。具体来说,您可以在内核命令行中添加 "kasan" 选项来启用 KASAN。 例如,如果您使用的是 GRUB 引导程序,则可以在 /etc/default/grub 文件中的 GRUB_CMDLINE_LINUX 变量中添加 "kasan" 选项,然后运行 "update-grub" 命令重新生成 GRUB 配置文件。 希望这些信息能帮助您!如果您有其他问题,请随时联系我。 ### 回答2: KASAN(Kernel Address Sanitizer)是Android系统中用于检测内核地址错误的一种工具。 要在Android设备上打开KASAN,首先需要一个已经编译了KASAN内核镜像。通常,你可以在Android源代码的内核目录中找到已经编译好的内核。之后,你需要按照以下步骤进行操作: 1. 首先,将已编译的内核镜像刷入你的设备。你可以使用adb工具将内核镜像传输到设备,并使用fastboot命令将其刷入设备的内存中。 2. 接下来,你需要启动设备进入bootloader模式。这可以通过按下设备特定的组合键进行操作。 3. 进入bootloader模式后,你可以使用fastboot命令来启动已刷入的内核镜像。例如,你可以运行以下命令: ``` fastboot boot <path_to_image> ``` 其中,`<path_to_image>`是你刷入的内核镜像的路径。 4. 内核启动后,你可以通过启用KASAN来调试和检测内核地址错误。可以通过在内核启动参数中开启KASAN选项来实现。这取决于你的设备和内核版本,你可以在启动命令中添加`kasan.enabled=1`或者`asan=1`参数来开启。 当KASAN被启用后,每次内核运行时,KASAN会检查和报告任何潜在的内核地址错误。这有助于发现和解决内核空间的地址错误问题,并提高系统的稳定性和安全性。 请注意,启用KASAN需要一定的技术和安全意识。在实践中,请确保你明白其影响和使用方法,并确保有备份和恢复的手段,以防意外或错误发生。 ### 回答3: KASAN(Kernel Address SANitizer)是Android内核的一个代码分析工具,用于检测和修复内核中的堆缓冲区溢出和使用未初始化的内存等问题。KASAN通过在内存中插入摘要信息和附加的元数据来实现,以对内存访问进行跟踪和检查。 要在Android设备上打开KASAN,首先需要确保设备的内核版本支持该功能。然后,按照以下步骤进行操作: 1. 在Android设备上访问开发者选项。可以通过连续点击设备的“设置”> “关于手机”> “版本号”几次来激活开发者选项。 2. 进入开发者选项后,找到并打开“调试”部分。 3. 在调试选项中,查找名为“开启KASAN”或“打开内核地址SANitizer”等类似选项。 4. 打开“开启KASAN”选项,如果需要,系统可能会要求输入密码或确认。 5. 如果一切顺利,系统将在后台配置KASAN并启动该功能。一旦完成,KASAN将开始监视和检测内核中的潜在内存问题。 请注意,启用KASAN可能会导致系统性能略微下降,并可能增加资源消耗。因此,建议只在需要分析和调试内核问题时才开启KASAN功能。此外,由于不同的Android设备和内核版本之间有所差异,上述步骤在不同设备上可能会有所不同。因此,在启用KASAN之前,建议查找设备的特定文档和指南,以确保操作的准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值