glibc 2.34 malloc 的变化

Posted on Aug 3, 2021

昨天突然发现 glibc 2.34 发布了,虽然偶数版本似乎一般不会发布在稳定发行版中,但是还是挺好奇的,花了几分钟看了看,发现主要的变动是取消了几个 hook。

首先看原先的 hook 定义处

左边是 2.33,右边是 2.34,可见所有的 hook 都删掉了。

在 __libc_malloc 中有如下修改

__libc_malloc 中,__malloc_hook 原先承担两个职责

  1. 用户可以在第一次调用 malloc 前设置 __malloc_hook,这样可以方便地让用户通过其自己的内存分配器分配内存。
  2. 如果用户没有设置 __malloc_hook,__malloc_hook 默认指向 ptmalloc_init,在第一次调用 malloc 的时候会通过该钩子来对 ptmalloc 进行初始化。ptmalloc_init 会把 __malloc_hook 置 NULL。

2.34 这里把钩子删掉了,添加了一个 bool 型变量 __malloc_initialized 来判断是否进行过初始化。

在 __libc_free 中有如下修改

也就是直接把相关调用的语句删除。

所以在堆利用中,劫持 hook 的利用失效了。

其余没有什么重要的变化。