KASan介绍

news2024/10/7 14:34:16

目录

概括介绍

配置说明

单独关闭读或写检查

操作使用

影响及注意事项

结果解读

使用注意

实现原理简介

KASAN原理

malloc原理

内容参考


概括介绍

  1. KernelAddressSANitizer (KASAN) 是一个动态内存错误检测器。它提供了一个快速而全面的解决方案,用于查找释放后使用(use-after-free)和越界等错误。
  2. KASAN 使用编译插桩来检查每次内存访问,因此您需要 GCC 版本 4.9.2 或更高版本。如果希望能够对栈或者全局变量的越界访问做检测,那么需要GCC 5.0或者更高的版本。
  3. 插桩主要是针对在llvm/gcc编译器级别对访问内存的操作(store,load,alloca等),将它们进行处理。动态运行库主要提供一些运行时的复杂的功能(比如poison/unpoison shadow memory)以及将malloc,free等系统调用函数hook住。
  4. 该算法的思路是:ASAN用的是shade memory直接标记内存的状态(global、stack、heap、free),每次内存读写,先检查标记再操作实际内存。

配置说明

# 启用KASan
CONFIG_MM_KASAN=y
# 全局开启KASan,可能会导致image大小暴涨,通常会翻倍
CONFIG_MM_KASAN_ALL=y

也可以对单个文件或者应用启用KASan来有效减少KASan带来的体积增加,例如,如果只想对apps/examples/hello应用程序进行检测,可以在它的Makefile(apps/examples/hello/Makefile)中添加:

CFLAGS   += -fsanitize=kernel-address
CXXFLAGS += -fsanitize=kernel-address

想对某个目录去掉kasan:
CFLAGS += -fno-sanitize=kernel-address

单独关闭读或写检查

默认Kasan对读写都做检查,会显著降低系统的性能、增大image大小。

当确定发生的问题是内存写导致的错误时,可以关闭读检查,提高系统性能和运行速度,进而间接提高问题的复现度。

关闭读检查后,flash占用空间overhead也将大幅降低,对于穿戴设备,关闭读检查后,flash空间减小约1MB。

# 开启改选项将会关闭Kasan读检查
CONFIG_MM_KASAN_DISABLE_READS_CHECK=y

# 开启该选项将关闭Kasan写检查
CONFIG_MM_KASAN_DISABLE_WRITES_CHECK=y

操作使用

void __asan_handle_no_return(void);

void __asan_report_load_n_noabort(FAR void *addr, size_t size);

void __asan_report_store_n_noabort(FAR void *addr, size_t size);

void __asan_report_load16_noabort(FAR void *addr);

void __asan_report_store16_noabort(FAR void *addr);

void __asan_report_load8_noabort(FAR void *addr);

void __asan_report_store8_noabort(FAR void *addr);

void __asan_report_load4_noabort(FAR void *addr);

void __asan_report_store4_noabort(FAR void *addr);

void __asan_report_load2_noabort(FAR void *addr);

void __asan_report_store2_noabort(FAR void *addr);

void __asan_report_load1_noabort(FAR void *addr);

void __asan_report_store1_noabort(FAR void *addr);

void __asan_loadN_noabort(FAR void *addr, size_t size);

void __asan_storeN_noabort(FAR void * addr, size_t size);

void __asan_load16_noabort(FAR void *addr);

void __asan_store16_noabort(FAR void *addr);

void __asan_load8_noabort(FAR void *addr);

void __asan_store8_noabort(FAR void *addr);

void __asan_load4_noabort(FAR void *addr);

void __asan_store4_noabort(FAR void *addr);

void __asan_load2_noabort(FAR void *addr);

void __asan_store2_noabort(FAR void *addr);

void __asan_load1_noabort(FAR void *addr);

void __asan_store1_noabort(FAR void *addr);

void __asan_loadN(FAR void *addr, size_t size);

void __asan_storeN(FAR void *addr, size_t size);

void __asan_load16(FAR void *addr);

void __asan_store16(FAR void *addr);

void __asan_load8(FAR void *addr);

void __asan_store8(FAR void *addr);

void __asan_load4(FAR void *addr);

void __asan_store4(FAR void *addr);

void __asan_load2(FAR void *addr);

void __asan_store2(FAR void *addr);

void __asan_load1(FAR void *addr);

void __asan_store1(FAR void *addr);

影响及注意事项

使能KASAN后,会让程序明显变慢,如果这时使能了看门狗,很可能导致看门狗复位,实际使用中建议同时关闭看门狗。

使用ASAN会增加额外1/8的内存消耗用于shadow memory。

ASAN通过每8字节对应1字节的映射的方式建立影子内存区。

相同功能下,开启asan后,代码rom大小多了约20%-30%(每个对内存访问的指令前都会增加一个跳转指令),data没有变化,因为heap大小是自适应的,实际应该多消耗1/32的heap空间。如果以后功能增强,资源占用会变化。

结果解读

测试演示:

如下所示,测试代码第一条printf未越界,第二条pritnf越界立即上报并打印PANIC信息,通过backtrace信息可以直接定位到越界访问处。

int main(int argc, FAR char *argv[])
{
  char *p = malloc(1024);
  printf("Hello, World!!,%d\n", p[1023]);
  printf("Hello, World!!,%d\n", p[1024]);
  return 0;
}

利用printf()分别访问已申请的p[1023]和未申请的空间p[1024]

使用注意

  1. M55核心,memset 使用 v8.1m 里的 vstrb 指令,不是传统意义的 LDR 或 STR,因此 asan 检查无法插入,故不会针对 memset 的越界进行报错提醒。 
  2. asan 以内存管理分配器实际 alloc 的内存大小作为是否越界判断,故实际分配 size 可能大于申请 size,因此 asan 检测可能出现延迟触发报错提醒的情况。(例如申请大小为10,实际可能在写超到 index 24才报错)

实现原理简介

KASAN原理

进程的虚拟内存空间被ASAN划分为2个独立的部分:

  1. 主应用内存区 (Mem): 专门提供给普通APP代码内存使用区。

  2. 影子内存区 (Shadow): 该内存区仅ASAN感知,影子顾名思义是指该内存区与主应用内存区存在一种类似“影子”的对应关系。ASAN在将主内存区的一个字节标记为“中毒”状态时,也会在对应的影子内存区写一个特殊值,该值称为“影子值”。

这两个内存区需要精心划分,确保可以快速从主应用内存区映射到影子内存区(MemToShadow)。

主应用内存与影子内存Shadow bytes映射

KASAN将8字节的主应用区内存映射为1bit影子区内存。

针对任何8字节对齐的主应用区内存,总共有1种不同的影子内存值:

8字节中的有一个字节未“中毒”(可访问的),影子值是1。

8字节中的全部字节都“中毒”(不可访问的),影子值是0。

malloc原理

#include "mm_heap/mm.h"
struct mm_freenode_s
{
#if CONFIG_MM_BACKTRACE >= 0
  pid_t pid;                                /* The pid for caller */
#  if CONFIG_MM_BACKTRACE > 0
  FAR void *backtrace[CONFIG_MM_BACKTRACE]; /* The backtrace buffer for caller */
#  endif
#endif
  mmsize_t size;                            /* Size of this chunk */
  mmsize_t preceding;                       /* Size of the preceding chunk */
  FAR struct mm_freenode_s *flink;          /* Supports a doubly linked list */
  FAR struct mm_freenode_s *blink;
};

malloc()有两种申请内存的方式。

brk()

小于128KB的内存,往往是通过brk()申请,malloc 通过 brk() 方式申请的内存,free 释放内存的时候,并不会把内存归还给操作系统,而是缓存在 malloc 的内存池中,待下次使用;

mmap()

大于128KB的内存,一般是通过mmap()申请,malloc 通过 mmap() 方式申请的内存,free 释放内存的时候,会把内存归还给操作系统,内存得到真正的释放。

定义于 mm_hap/mm.h的相关宏

内容参考

利用ASAN在单片机上查找内存错误(英文)

tinyK22_FreeRTOS_ASAN

KASAN实现原理

kasan部分源码

Armv8.1-M architecture: PACBTI extensions - Architectures and Processors blog - Arm Community blogs - Arm Community

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1090730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

D课堂 | 如何设置域名解析?解析记录类型选哪个?

上回,D妹和各位小伙伴们介绍了DNS的作用和原理——《什么是DNS?DNS是怎么运作的?》,相信大家对DNS已经有了一定的认识。 DNS是互联网不可或缺的基础服务,核心作用是将域名翻译成计算机可读取的IP地址,也就是…

VMware搭载linux出现的bugs

---------后续在实际Linux项目复盘过程中有遇到问题(解决办法)会不定时更新.......----------- ques: Linux自带的media目录用于挂载或可移动存储设备已满(造成这一原因是由于我多次创建新的虚拟机并在同一虚拟目录下挂载同一镜象导致有些残存文件没有删除干净&…

【OpenCv光流法进行运动目标检测】

opencv系列文章目录 文章目录 opencv系列文章目录前言一、光流法是什么?二、光流法实例1.C的2.C版本3.python版本 总结 前言 随着计算机视觉技术的迅猛发展,运动目标检测在图像处理领域中扮演着至关重要的角色。在现实世界中,我们常常需要追…

JDK21要来了,协程对Java带来什么

目录 前言 协程是什么 多线程有什么问题? 协程的线程模型 Reactor模型 使用协程后 RPC并发 IO阻塞 网络IO 磁盘IO epoll为什么不支持磁盘io? Kotlin与Go的协程 Go 使用 Go的协程调度(GPM模型) Kotlin 使用 Kotlin协程调度 阿里Wisp协程…

Linux程序调试工具使用整理

Linux程序调试工具使用整理 GDB调试入门 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、…

万界星空科技可视化数字大屏应用场景及作用

一、MES系统大屏显示:实时监控生产数据的关键 随着制造业的发展,现代企业越来越依赖于高效的生产管理系统来保证生产效率和质量。其中,MES系统数据大屏显示成为了监控生产数据的关键工具。通过实时监控和显示生产数据,企业能够及…

智能网关在校园能耗监测系统中的应用介绍

安科瑞 崔丽洁 摘要:国家提出了全社会节能减排的战略举措,节约型校园的建设是实现这一举措的重要内容。为了对校园能耗实行量化管理、实时监测,需要建立一个完善的监管体系校园节能监管体系。而节能监管体系的核心是能耗监测平台,…

解决react集成typescript报错:找不到名称“div“之类的错误

现象: 原因:Typescript 不希望在 Typescript 文件中看到 JSX元素。 解决此问题的最简单方法是将文件后缀从 .ts 重命名为 .tsx 。

【学习笔记】DTM分布式事务

分布式事务是什么 本文的分布式事务指的是DTM下的分布式事务。 分布式事务有两类,这里指的是跨数据库、跨服务的分布式事务。 分布式事务指事务的发起者、资源及资源管理器和事务协调者分别位于分布式系统的不同节点之上。 CAP理论 C(一致性&#x…

【UVM 验证平台打印时间单位控制】

UVM 验证平台打印时间单位控制 UVM 具有丰富的打印功能,打印信息会包含时间/打印位置等信息,根据打印时间可以方便的在波形上找到错误点。默认打印时间单位时fs,由于单位太小会导致打印信息上的时间信息比较长,不方便查看与查找。…

实现Element Select选择器滚动加载

<template><el-selectpopper-class"more-tag-data"v-model"tagId"filterableplaceholder"请选择"focus"focusTag"><el-optionv-for"(item, index) in taskTagLists":key"index":label"item.n…

软件开发无人天车智能控制系统智能库存管理单元解决方案

天车&#xff08;行吊 起重机&#xff09;智控系统在自动控制的基础上&#xff0c;添加了基于智能控制、数据分析存储等尖端技术研发出的各类算法&#xff0c;赋予天车更“聪明”的任务执行及决策制定能力。智控系统能够根据获取的数据和预设的任务需求&#xff0c;通过智能决策…

ftp发布服务器

ftp工具 发布测试 第一步&#xff1a;下载FileZilla 第二部建立站点 连接成功之后可以看到文件了 项目打包后上传 远程站点里的文件删除 左边本地站点上传。over

淘天集团大模型应用十大挑战命题发布

以AI人工智能为代表的新技术正在成为全球商业发展的新动能。淘天集团从去年开始&#xff0c;就已经在AI重点领域&#xff0c;展开和高校的一系列深入合作。 近期&#xff0c;淘天集团集合基础模型和电商应用场景的具体问题&#xff0c;面向高校师生和全社会发布大模型应用十大挑…

【算法-贪心】分数背包问题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

Redis 图形化界面下载及使用超详细教程(带安装包)! redis windows下客户端下载

redis图形化界面的压缩包&#xff0c;直接解压缩即可&#xff0c;双击 rdm.exe 即可运行 打开后是这样子&#xff1a; 我已经连接过本地的redis数据库&#xff0c;所以左边有个localhost&#xff0c;你的可能是空白的&#xff0c;正常&#xff01; 1、连接本地Redis服务器 这…

uniapp-vue3-标签选择器wo-tag

采用uniapp-vue3实现, 是一款支持高度自定义的标签选择器组件&#xff0c;支持H5、微信小程序&#xff08;其他小程序未测试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net.cn/plugin?id14960 使用示例 <template>&…

设计模式03———包装器模式 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 创建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 &#xff08;个人喜好&#xff09;调节渐变色 可更改同种颜色的色调 &#xff08;个人喜好&#xff09; 调节天空盒 准备工作做完后 接下我们做【…

晨控CK-GW06系列网关与汇川可编程控制器MOSBUSTCP通讯手册

晨控CK-GW06系列网关与汇川可编程控制器MOSBUSTCP通讯手册 晨控CK-GW06系列是支持标准工业通讯协议 MODBUSTCP 的网关控制器,方便用户集成到PLC等控制系统中。本控制器提供了网络 POE 供电和直流电源供电两种方式&#xff0c;确保用户在使用无 POE 供电功能的交换机时可采用外…

统信UOS1060设置自动关机02

原文链接&#xff1a;统信UOS1060设置自动关机02 hello&#xff0c;大家好啊&#xff0c;今天继续给大家介绍一篇如何在统信UOS 1060上实现自动关机的文章&#xff0c;本篇文章采用创建系统服务&#xff08;Systemd&#xff09;的方式。 你可以创建一个systemd服务来在特定时间…