linux配置开启KASAN功能


【KASAN linux内存检测工具】
(本文档将引导编译一个开启kasan功能的内核)

一 简介:
  Kernel Address Sanitizer 缩写KASAN;是linux内核的动态内存检测工具,
  主要检查所有程序中内存越界访问和使用已经释放内存空间的问题。
  !注意:开启kasan后系统可用内存会减少约1/8,并且系统运行的程序性能会大幅下降。

二 获取:
  kasan在linux4.0及其之后被集成在linux内核中,但是直到linux4.4版本才开始支持ARM64(不支持ARM32);
  所以在linux官网(https://www.kernel.org)下载的内核源码(版本>=4.0)已经自带了kasan,我们所需要做的就是在编译内核前将其功能打开。

三 配置kasan及编译内核:
  此处以4.15.1版本内核为例(环境为在Ubuntu1804虚拟机中再编译一个带kasan功能的内核);

  3.1. 将下载的内核源码压缩包拷贝到虚拟机:

  3.2. 在虚拟机中解压:
    tar -zxvf linux-4.15.1.tar.gz

  3.3. 解压完成后,进入源码目录:
    cd linux-4.15.1/

  3.4. 将本地(当前linux内核)使用的配置复制到解压出来的目录中,替换linux官网默认的.config文件
    cp /boot/config-版本号-编号-generic ./.config
    (使用linux源码中默认的.config配置文件编译出来的内核可能无法正确启动)
    例如: cp /boot/config-4.15.0-192-generic ./.config

  3.4. 在新的内核中配置kansan
    3.4.1. 开启配置界面:
      make menuconfig

    /* 执行过程中可能会报错:
      ① recipe for target'scripts/kconfig/dochecklxdialog' failed.
        需要安装: sudoapt-get install ncurses-dev
      ② recipe for target 'menuconfig' failed.
        检查是否安装libncurses5-dev库:
          没安装: sudo apt-get install libncurses5-dev
          已安装:终端窗口太小,调大终端窗口。 */

    3.4.2. 在弹出的图形化界面中,使用键盘的上下按键,选中 Kernel hacking --->
      然后点击回车,进入此项;再继续选中 Memory Debugging --->
      点击回车,进入此项;在此界面中选中将如下几项选中:
          [*] SLUB debugging on by default
          <M> Memory hotplug notifier error injection module
          [*] KASan: runtime memory debugger
      选中某一项时,可以使用Y/N来选择或者取消(也可使用空格键切换);
      第二项<M> Memory hotplug ...可选,该项是以动态加载的形式提供一个有内存操作错误的内核模块;可用于验证kasan功能是否成功开启。

    3.4.3. 配置完成后,选中图形化界面下方的 < Save > 以保存更改;保存后,逐级退出(选择 < Exit>);

  3.5. 编译内核
    3.5.1. 在配置完成后,在源码目录下输入
      sudo make -j(CPU核数)
      可使用命令[ getconf _NPROCESSORS_ONLN ]查询cpu核数;
      编译指令可使用:sudo make -j'getconf _NPROCESSORS_ONLN'

      /* 如果在这一步骤出现了错误:“openssl/opensslv.h: No such file or directory”
        则说明系统缺乏OpenSSL开发包,执行如下指令:
        sudo apt-get install libssl-dev
      */

    3.5.2. 编译完成并无报错后再输入
      sudo make modules_install

    3.5.3. modules安装完成后再输入
      sudo make install

    3.5.4. 等待执行完成后,重启虚拟机即可
      reboot

  3.6. 以带kasan版本内核启动linux系统
    3.6.1. 如果重启系统后,出现了选择内核的界面,说明内核编译成功。
      选择带kasan版本的内核启动即可
      当前例子为 *Ubuntu, with Linux 4.15.1....

    3.6.2.如果重启后直接开机,没有出现选择内核的页面.
      (1)则在进入系统后,执行下面的命令:
        vi /etc/default/grub
      (2)然后将GRUB_HIDDEN_TIMEOUT=0使用#注释掉:
        # GRUB_HIDDEN_TIMEOUT=0
        保存退出;
      (3)执行如下命令
        sudo update-grup
        然后重启系统


/* 参考资料 */
Linux内核内存检测工具KASAN:http://t.zoukankan.com/linhaostudy-p-14028917.html
Linux内核编译: https://blog.csdn.net/ibless/article/details/82349507

posted on 2022-11-26 14:50  为何学习  阅读(1749)  评论(0编辑  收藏  举报