Linux 5.12 内核采用了 KFence 子系统来检测使用内存时的错误

正在开发的 Linux 内核 5.12 包含 KFence(内核电子围栏)机制的实现,该机制检查内存处理、捕获缓冲区溢出、释放后的内存访问以及类似类别的其他错误。

类似的功能已经以 KASAN 构建选项的形式存在于内核中(内核地址清理程序,在现代 gcc 和 clang 中使用地址清理程序) - 然而,它主要用于调试用途。 KFence 子系统与 KASAN 的不同之处在于其高运行速度,这使得即使在工作系统的核心上也可以使用此功能。

生产系统上的应用程序将能够捕获在测试运行中不会出现、仅在工作负载或长期运行(正常运行时间较长)期间出现的内存错误。 此外,在生产系统上使用KFence将可以显着增加使用内存检查内核运行情况所涉及的机器数量。

KFence 通过以固定间隔将保护页插入堆中来实现最小的与负载无关的开销。 下一个保护间隔到期后,KFence 通过标准内存分配系统(SLAB 或 SLUB 分配器)从 KFence 对象池中添加下一个保护页,并启动新的时间计数器报告。 每个KFence对象位于一个单独的内存页中,左右边界的内存页形成保护页,其大小是随机选择的。

因此,具有对象的页面通过保护页面彼此分开,保护页面被配置为在任何访问时生成“页面错误”。 为了检测对象页面内的越界写入操作,还使用了基于模式的“红色区域”,它们占用对象未使用的内存,在内存页面大小对齐时剩余。 —+————+————+————+————+————+— | xxxxxxxxx | 哦:| xxxxxxxxx | :哦| xxxxxxxxx | | xxxxxxxxx | 乙: | xxxxxxxxx | :B | xxxxxxxxx | | x 守卫 x | J : 红色- | x 守卫 x | 红色-:J | x 守卫 x | | xxxxxxxxx | E:区域| xxxxxxxxx | 区域:E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | 电话:| xxxxxxxxx | :T | xxxxxxxxx | —+————+————+————+————+————+—

如果尝试访问缓冲区边界之外的区域,该操作会影响保护页面,从而导致生成“页面错误”,该错误会拦截 KFence 并记录有关检测到的问题的信息。 默认情况下,KFence 不会阻止错误,仅在日志中显示警告,但有一个“panic_on_warn”设置,允许您在检测到错误时将内核置于恐慌状态。

来源: opennet.ru

添加评论