Detecting Kernel Memory Leaks in Specialized Modules with Ownership Reasoning

news2024/9/26 6:35:24

Detecting Kernel Memory Leaks in Specialized Modules with Ownership Reasoning

背景:

内存泄漏:A memory leak happens when an allocated memory region is not released even though it will never be used again.分配的内存未被正常释放。

内存泄漏bug的不断触发,会造成denial-of-service

eg:

在这里插入图片描述

如果skb为假,则return err 但并未释放skb.

do:present K-MELD, a static detection system for kernel memory leaks.

Two key challenges

(1) Specialized functions.(An effective detection requires identifying such specialized allocation functions and the corresponding deallocation functions)

​ allocation/deallocation of a network buffer

(2) Complicated and lengthy data flow. (An effective detection must determine which location or function is responsible to release the memory object)

K-MELD (Kernel Memory Leak Detector)

​ K-MELD identifies specialized allocation functions by using a usage-driven and structureaware analysis, then uses a context-aware and path-sensitive mining technique to detect corresponding release functions.

​ K-MELD 通过使用驱动和结构感知分析来识别专门的分配函数,然后使用上下文感知和路径敏感的挖掘技术来检测相应的释放函数。

1.识别specialized allocation functions和the corresponding deallocation functions

2.回答应该在哪释放内存对象

Contributions

An approach for identifying specialized allocation functions.识别专用分配函数

A rule-mining approach for corresponding specialized deallocations.识别专用释放函数

An ownership reasoning mechanism for kernel objects.探索所有权

A scalable implementation and numerous new bugs. fuzz bug

对function中的内存泄漏进行建模:

		1) A function retains ownership of the allocated memory 
		1) The function finishes without releasing the allocated memory

整体框架:

在这里插入图片描述

allocating function的识别

分配函数是在程序执行期间为数据结构动态分配内存的函数。

an allocation function has the following properties,分配函数的必要属性

• It returns a pointer.

• The pointer is immediately followed by a NULL check.

• The pointer is not derived from another base pointer.

int main() {
   int arr[] = { 1, 2, 3, 4, 5 };
   int* p = arr; // p points to the first element of arr
   int* q = p + 2; // q points to the third element of arr//q为派生指针
   printf("%d\n", *q); // prints 3
   return 0;
}

• The object is initialized before being used, e.g., being read.

使用的分析方法:

Use-finding

分析涉及跟踪程序中给定变量或指针的使用情况,以确定其使用方式和使用位置。 分析可以帮助检测与以意外方式使用的未初始化变量或指针相关的潜在问题。 分析的输出可能是一组使用变量或指针的指令,以及它们各自的程序位置。

source-finding

分析涉及跟踪程序中给定变量或指针的来源,以确定它在何处以及如何被初始化。 该分析可以帮助检测与未初始化的变量/指针相关的潜在问题,或者不同表达式或程序流之间的不一致初始化。 分析的输出可能是一组创建或修改变量/指针的指令,以及它们各自的程序位置。

释放函数的识别

Identifying and Collecting Error-Handling Paths.

Sequential Pattern Mining.

​ error-handing

​ 通过执行错误路径,触发回滚,调用释放函数。(比正常执行路径段的多)

​ use-finding

OWNERSHIP REASONING

enhanced escape analysis and consumer function detection

​ 逃逸分析(escape analysis)就是在程序编译阶段根据程序代码中的数据流,对代码中哪些变量需要在栈上分配,哪些变量需要在堆上分配进行静态分析的方法。原本分配在栈上的内存,由于函数的return和其他函数对该内存的使用,造成栈上变量被分配到堆空间上,而堆上的内存需要自行释放,但没有进行释放,造成内存泄漏。

​ consumer function detection是分析对象如何被程序的其他部分使用和消费的技术。消费者函数是获取内存对象所有权的当前函数的被调用者。如果函数消费者释放或接收到内存对象,或者允许它在所有或部分执行路径上逃逸,我们就称它为函数消费者。

举例:
在这里插入图片描述

部分名词解释:

escaping pointers

​ 指针转义是指将指向对象的指针传递到内部范围然后保存以供将来在该范围之外使用的情况。 这可能会导致内存管理问题,并成为潜在的错误来源。

​ 例如,如果一个函数接受一个指向对象的指针,然后将该指针保存在该函数的范围之外,那么当对象被释放时就会出现问题,并且该指针变成一个悬空指针——一个引用一个对象的指针 不再存在的对象。 这可能会导致内存访问冲突和其他类型的错误。

​ 为避免指针转义,最好将指针的范围限制在尽可能小的范围内。 当需要在函数范围之外传递指针时,复制所指向的对象而不是获取指针本身通常是个好主意。 在无法避免指针转义的情况下,重要的是要确保所指向的对象在指针最后一次使用之前未被取消分配。 此外,使用引用计数或垃圾回收等内存管理工具来管理内存并避免此类问题是一种很好的做法。

consumer function

​ A consumer function, on the other hand is a callee of current function that takes the ownership of the memory object, therefore the current function should not try to release after returning from the consumer function.

​ 消费者函数是 获取内存对象所有权的当前函数的 被调用者。

​ 如果函数消费者释放或接收到内存对象,或者允许它在所有或部分执行路径上逃逸,我们就称它为函数消费者。

Error-handling code

错误处理代码是软件程序中的一段代码,负责处理程序执行期间可能发生的错误和异常。 错误处理代码的复杂程度可以从非常简单到非常复杂,具体取决于错误的性质和软件系统的要求。

错误处理代码的目的是防止程序崩溃或产生不正确的输出以响应错误。 错误处理代码通常首先识别错误源并确定它是否可以在本地处理或是否需要向上传递到程序的更高级别。 一旦错误被识别和定位,代码就会采取适当的措施从错误中恢复并将系统返回到稳定状态。

根据程序的设计和错误的性质,错误处理代码可能会执行诸如将错误记录到文件、向用户显示错误消息、重试操作或回滚数据库事务等操作。 有效的错误处理代码对于编写健壮、可靠且能够从不可预见的情况中恢复的软件至关重要。

kmlloc vs vmalloc

kmalloc()和vmalloc()都是Linux内核提供的内存分配函数,但是它们的用途不同,各有优缺点。

kmalloc() 用于从内核的内存池中分配内存,这是在启动时保留的固定大小的连续内存区域。 kmalloc() 可用于分配子系统或驱动程序所需的少量和大量内存,但其大小限制为内核内存池的最大大小。

另一方面,vmalloc() 用于从内核的虚拟内存池中分配内存,它可以比系统的物理内存大。 vmalloc() 在子系统或驱动程序需要大量内存时很有用,例如设备驱动程序缓冲区或多媒体应用程序。

vmalloc() 也可用于分配非连续内存,这意味着页面在物理内存中不一定是连续的,但在虚拟内存中仍然是连续的,从而可以更灵活地分配内存。

但是,kmalloc() 和 vmalloc() 之间在性能上存在一些差异。 kmalloc() 可以比 vmalloc() 更快地分配内存,但是 vmalloc() 允许更大的内存分配和更大的内存分配灵活性。

总之,kmalloc() 一般用于中小型内存分配,而 vmalloc() 适用于大型和非连续内存分配。 使用哪一个取决于需要内存的子系统或驱动程序的具体需求。

Slab 缓存

Slab 缓存是 Linux 内核中使用的内存分配子系统。 它旨在为频繁创建和销毁的内核对象分配和管理内存。 Slab 缓存被用作通用内存分配方法(如 kmalloc() 和 vmalloc())的更有效替代方法。

Slab 缓存通过将内核内存分解为称为 slab 的固定大小的小块来工作。 每个 slab 代表一组相同的对象,例如,文件描述符、索引节点或网络套接字。 当需要一个对象时,它从适当的slab中分配。

slab 缓存的主要优点之一是它比通用内存分配更有效。 由于 slab 是预分配和预初始化的,因此可以通过简单地从其对应的 slab 返回一个预分配的对象来快速完成内存分配。 Slab 缓存避免了 kmalloc() 和 vmalloc() 的开销,这需要在每次需要对象时分配和初始化内存。

Slab 缓存还提供了更好的性能,因为它们可以重用驱动程序或子系统不再使用的对象,而不是每次需要新对象时都释放和重新分配内存。 这降低了内存分配和释放的频率和成本。

总的来说,slab 缓存是一种为频繁使用的对象分配内核内存的快速有效的方法,提供比通用内存分配方法更好的性能和更低的开销。

kmem_cache_create()

kmem_cache_create()是Linux内核提供的创建slab缓存的函数,slab缓存是一种比使用内核的通用内存分配器更快的对象分配缓存。

kmem_cache_create() 函数有几个参数,包括缓存的名称、缓存中每个对象的大小,以及应该与缓存一起使用的任何特定标志。 这些参数有助于定义缓存的特征以及它将分配的对象。

使用 slab 缓存可以通过为频繁使用的对象预分配内存来帮助优化内存中小对象的分配和释放。 缓存保持一个备用对象池,准备在需要时分配给进程,与使用通用内存分配器相比,提高了整体系统性能。

创建缓存后,可以使用 kmem_cache_alloc() 函数从中分配对象,该函数将指向缓存的指针作为其参数。 同样,可以使用 kmem_cache_free() 函数将对象释放回缓存。

总的来说,kmem_cache_create() 是一个有助于提高系统性能的函数,它允许创建适合特定系统需求的对象缓存,从而实现更高效的内存分配和释放。

function signature

函数签名,也称为函数原型或函数声明,是指编程语言中函数的语法和结构,规定了函数名称、返回类型、参数类型和名称。 函数签名向编译器提供有关函数输入和输出的信息,允许编译器验证函数是否被正确使用。

Use-finding

分析涉及跟踪程序中给定变量或指针的使用情况,以确定其使用方式和使用位置。 分析可以帮助检测与以意外方式使用的未初始化变量或指针相关的潜在问题。 分析的输出可能是一组使用变量或指针的指令,以及它们各自的程序位置。

source-finding

分析涉及跟踪程序中给定变量或指针的来源,以确定它在何处以及如何被初始化。 该分析可以帮助检测与未初始化的变量/指针相关的潜在问题,或者不同表达式或程序流之间的不一致初始化。 分析的输出可能是一组创建或修改变量/指针的指令,以及它们各自的程序位置。

errno

errno 是 C 和类似编程语言中的全局整数变量,用于报告在执行系统调用和库函数期间遇到的错误情况。 当函数调用遇到错误时,可以将errno的值设置为相应的错误代码或值,用于识别和诊断错误。

在 C 语言中,errno 通常在 <errno.h> 头文件中定义,并在程序启动时或调用 main() 时初始化为 0。 当库函数或系统调用失败时,它会设置 errno 的值,指示发生的错误类型。 然后开发人员可以检查 errno 的值并相应地处理错误。

例如,用于在 C 中打开文件的 open() 系统调用如果成功则返回一个文件描述符,如果失败则设置 errno 的值以指示特定错误,例如 ENOENT(没有这样的 文件或目录)、EACCES(权限被拒绝)或 EINVAL(无效参数)。
main() 时初始化为 0。 当库函数或系统调用失败时,它会设置 errno 的值,指示发生的错误类型。 然后开发人员可以检查 errno 的值并相应地处理错误。

例如,用于在 C 中打开文件的 open() 系统调用如果成功则返回一个文件描述符,如果失败则设置 errno 的值以指示特定错误,例如 ENOENT(没有这样的 文件或目录)、EACCES(权限被拒绝)或 EINVAL(无效参数)。

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

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

相关文章

Java高阶数据结构 图 图的表示与遍历

高阶数据结构&#xff01; 文章目录 Java高阶数据结构 & 图的概念 & 图的存储与遍历1. 图的基本概念1.1 图的属性1.2 无向图与有向图1.3 完全图1.4 简单路径和回路1.5 子图1.6 连通图 2. 图的存储&#xff08;理论&#xff09;2.1 ※邻接矩阵2.2 邻接链表3. 图的存储&a…

新唐NUC980使用记录(5.10.y内核):u-boot linux rootfs 编译与烧录测试(基于SD1位置SD卡)

文章目录 目的基础准备烧录环境开发编译环境SD卡分区 制作和设置编译工具链制作toolchain和rootfs拷贝rootfs内容到SD卡设置编译工具链 u-boot编译与测试下载、配置与编译烧录u-boot与环境变量 linux kernel编译与测试下载、配置与编译系统运行测试 总结设备树文件内容 目的 从…

【STM32】基础知识 第十一课 sys, delay usart 文件夹

【STM32】基础知识 第十一课 sys, delay & usart 文件夹 sys 文件介绍delay 文件夹函数简介SysTickSysTick 工作原理SysTick 寄存器介绍 delay_init() 函数delay_us() 函数usart 文件夹介绍printf 的使用常用输出控制符表常用转椅字符表 半主机模式简介 sys 文件介绍 函数…

浅谈Linux epoll机制

前言 概述 epoll是一种当文件描述符的内核缓冲区非空的时候&#xff0c;发出可读信号进行通知&#xff0c;当写缓冲区不满的时候&#xff0c;发出可写信号通知的机制&#xff1b; 关键函数 int epoll_create(int size);创建 eventpoll 对象&#xff0c;并将 eventpoll 对象…

Python+Yolov5墙体桥梁裂缝识别

程序示例精选 PythonYolov5墙体桥梁裂缝识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonYolov5墙体桥梁裂缝识别>>编写代码&#xff0c;代码整洁&#xff0c;规则&am…

【安装Nginx】

Linux上安装Nginx 文章目录 Linux上安装NginxUbuntuCentOS查看已安装的软件 Ubuntu 在 Ubuntu 上安装 Nginx 非常简单。只需按照以下步骤操作&#xff1a; 打开终端&#xff0c;更新软件包索引&#xff1a; sudo apt update安装 Nginx&#xff1a; sudo apt install nginx安…

2023世界超高清视频产业发展大会博冠8K明星展品介绍

2023世界超高清视频产业发展大会博冠8K明星展品介绍&#xff1a; 一、博冠8K全画幅摄像机B1 这是一款面向广电应用的机型&#xff0c;可适配外场ENG制作轻量化需求&#xff0c;应用于8K单边机位、新闻、专题的拍摄工作&#xff0c;也可应用于体育转播、文艺节目等特殊机位及各…

使用react脚手架初始化项目

1.使用react脚手架初始化项目 1.初始化命令&#xff0c;&#xff08;create-react-app脚手架的名称&#xff0c;my-app项目名称&#xff09; npx create-react-app my-app2.初始化完成之后可以看到Happy hacking&#xff01; 3.启动项目&#xff0c;进去根目录cd my-app &am…

这才是 玩转Github 的正确姿势

这才是 玩转Github 的正确姿势 GitHub各位应该都很熟悉了&#xff0c;全球最大的开源社区&#xff0c;也是全球最大的同性交友网站~~&#xff0c;但是大部分同学使用GitHub应该就是通过别人的开源链接&#xff0c;点进去下载对应的项目&#xff0c;而真正使用Github来查找开源…

RF学习-RF基本概念

射频(RF)指的是无线波的频率在3KHZ~300GHZ&#xff1b; RF系统通常包括以下模块&#xff1a; 本振(LO)放大器(Amplifier)混频器(Mixer)滤波器(Filter)天线(Antenna) RF接收机有如下三种类型&#xff1a; 超外差式接收机(Super heterodyne structure)零中频接收机(Homodyne…

GAN与DCGAN

GAN&#xff1a;生成对抗网络&#xff0c;首先是一个生成模型&#xff0c;区别与之前的辨别模型&#xff0c;对抗体现在生成器与辨别器之间的对抗。 生成器输入的是噪音&#xff0c;通过多层的MLP可以产生图片&#xff0c;将产生的图片和真实图片输入到辨别器&#xff0c;辨别器…

AI绘画5大免费工具

AI现在最火爆的两个方向一个是以ChatGPT为主导的文本生成工具&#xff0c;还有一个就是以Midjourne为主导的文本生成图片工具。 Midjourne 现在基本是都是需要收费的&#xff0c;但确实Midjourne的效果是顶尖的&#xff0c;如果我们只是想试一下 文本生图的过程&#xff0c;这里…

【ArcGIS Pro二次开发】(26):数据筛选器

在使用【OpenItemDialog】打开数据时&#xff0c;其中一个重要的属性【Filter】&#xff0c;可用于筛选要打开的数据。示例代码如下&#xff1a; // 打开文件对话框OpenItemDialog dlg new OpenItemDialog(){Title "选择要打开的文本文件",Filter ItemFilters.Dat…

如何用ChatGPT写专业方向的科普内容?

该场景对应的关键词库&#xff08;13个&#xff09;&#xff1a; 目标用户、科普内容、生活问题、医疗类型、科普文章、病情症状、通俗性、专业名词、背景资质、权威领域、执业范围、证言人、内容形式。 提问模板&#xff08;3个&#xff09;&#xff1a; 第一步&#xff0c;…

打包工具--pyinstaller

下载库 pip install pyinstaller 打包命令 Pyinstaller -D setup.py 打包exePyinstaller -F -w run.py 不带控制台的打包Pyinstaller -F -i xx.ico setup.py 打包指定exe图标打包 ❝ -D&#xff1a;打包为一个文件夹&#xff0c;其中exe文件在文件夹内部&#xff0c;这样子单个…

更换外线和智能电表后家里用电频繁跳闸的检修

老家的电路老是跳闸。今天检修了老家的线路&#xff0c;故障就是更换了外线路后&#xff0c;家里烧水或者用电磁炉就频繁跳闸。其实也说不清楚&#xff0c;因为最近又改了智能表嘛。 到电表处观察&#xff0c;是插卡智能表&#xff0c;电表进线有个空开C63A。电表出来有个空开C…

万字长文 - Nature 综述系列 - 给生物学家的机器学习指南 4 (生物应用的挑战)...

万字长文 - Nature 综述系列 - 给生物学家的机器学习指南 1 万字长文 - Nature 综述系列 - 给生物学家的机器学习指南 2 &#xff08;传统机器学习方法如何选择&#xff09; 万字长文 - Nature 综述系列 - 给生物学家的机器学习指南 3 &#xff08;人工神经网络&#xff09; 生…

C++实践模拟(stack,queue priority_queue,仿函数)

stack和queue的实现&#xff0c;不同于vector和list那般复杂&#xff0c;如果你经历过vector和list的洗礼&#xff0c;那么当你看到stack和queue的大致实现时&#xff0c;你可能会惊叹&#xff0c;怎么能这么简洁。其原因有很多方面的&#xff0c;比如stack和queue不需要实现迭…

第11届蓝桥杯国赛真题剖析-2020年10月31日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第129讲。 第11届蓝桥杯Scratch国赛真题&#xff0c;这是2020年10月31日举办的全国总决赛&#xff0c;由于疫情影响&am…

【图像】图像格式(3) : BMP

1. 背景 BMP可以说是图像中最简单的格式了&#xff0c;没有图像压缩算法&#xff0c;基本可以看做图像的RGB裸数据加了一些基本的metadata构成。 这也导致了bmp的文件一般都是非常的大&#xff0c;除了windows原生的支持之外&#xff08;从1990年的windows3.0开始&#xff09;…