linux 内存检测工具 kfence 详解(二)

系列博文:

linux 内存检测工具 kfence 详解(一)

linux 内存检测工具 kfence 详解(二)

回上一篇博文

0. 前言

kfence虽然代码不多,但设计的内容、逻辑比较多。为了更加清晰、轻松地理解kfence,笔者将其知识点分两篇博文:

  • 第一篇重在kfence 基础数据结构、kfence初始化、kfence内存分配和释放;
  • 第二篇重在kfence 异常种类分析、kfence report剖析、具体案例分析;

 

0.1 回顾kfence初始化

linux 内存检测工具 kfence 详解(二)_第1张图片

在kfence 初始化的时候,会从 memblock 中申请一块内存,即 kfence pool,这块内存当然是页对齐的。

接着会从 page2 开始,每两个page 被看成一个 metadata,前一个page是object page,被设为PG_SLAB 标记;后一个page 是fence page,被设为protect,该page 用以方式越界访问。

当然初始化的细节比较多,包括 kfence_sample_interval、kfence_enabled、kfence_metadata、kfence_freelist、kfence_allocation_key、kfence_allocation_gate、KFENCE_POOL_SIZE 等等,详细可以查看上一篇博文

0.2 回顾kfence内存分配

在kfence 内存分配中,首先会从 kfence_freelist 中取出第一个 metadata,根据其在 kfence_metadata 数组中的index 计算出metadata所在的内存虚拟地址。但slab 从 kfence获取的object 地址并不一定是metadata 的首地址,而可能存在 canary byte:

linux 内存检测工具 kfence 详解(二)_第2张图片

上图是将 kfence pool 中第一个 metadata 拿出来分解,page2 原来是data page,但是因为所申请的 object 并不一定是一个page,为了防止object 越界访问,kfence 会将object 以外的多余部分打上pattern,这些多出来的字节又称为 canary bytes。在 kfence free 的时候,会对这些 canary bytes 进行 check,如果发现内容发生变化,则说明出现了越界访问的情况,会报出 memroy corruption 错误。

当然,内存分配的细节更多,包括申请的size控制、kfence_allocation_gate、kfence_enabled、kfence_freelist是否为空、meta是否允许上锁、meta的状态是否为 FREED等等,具体细节可以查看上一篇博文

 

0.3 回顾kfence内存释放

如同kfence alloc,首先也还是需要拿到metadata,但这里是通过需要释放的 object 的地址来确定metadata。

接着会check canary bytes,确定是否出现 OOB;

另外,会将该data page 进行保护,为了防止在下一次分配期间该 metadata 被重新使用,发生 UAF 的现象。

1. kfence 对page fault处理

回上一篇博文

你可能感兴趣的:(#,Linux内存管理,linux,kfence,内存检测,oob,ufa)