Musl libc堆管理概述
Musl libc是一个轻量级的C标准库,设计作为GNU C library (glibc)、 uClibc或Android Bionic的替代用于嵌入式操作系统和移动设备。使用Musl的Linux发行版和项目包括sabotage,bootstrap-linux,LightCube OS,openwrt LEDE 等等。
Musl libc堆相关结构体分析
涉及到5个结构体 chunk,group,meta,meta_area,malloc_context
从小到大来理解,因为在源码里它就是从小到大索引的
malloc free流程分析
- 通过get_meta(p)得到meta地址
- 通过chunk->offset 索引到对应的group地址
- 通过group->meta 再索引到meta地址,并检查meta->mem是否等于group(每个meta对应一个group,两者互相指向, meta->mem=group, group->meta=meta)
- 通过meta&(-4096)得到meta_area地址(meta_area总位于页首,下面跟着很多meta)
- 检查meta_area->check==malloc_context->secret等等….
- 获得该chunk的idx,起始地址等信息,获取该chunk的掩码self = 1«(chunk->idx)。设置该chunk->idx=0xff,chunk->offset=0,标明该chunk已被free。
- 如果free后就该meta的所有chunk都可用【meta->freed_mask | meta->avail_mask = (2«last_idx)-1 】, 或者是该meta没有chunk释放过(!meta->freed_mask)进行free的话,调用nontrivial_free()函数进行特殊处理。
- 如果free后就该meta的所有chunk都可用,调用dequeue()函数将当前meta从&malloc_context->active[]中出队(unlink,unsafe unlink)。出队后malloc_context->active[idx] = meta->next,并将刚出队的meta加到ctx.free_meta_head队列中。
- 如果该meta没有chunk被释放过也没有avail的chunk(freed_mask=0且avail_mask=0),也就是全满的meta被free就调用queue()函数将该meta加入 malloc_context->active[]队列。
-
修改meta->freed_mask 标记chunk被释放。( freed_mask = freed_mask |
self) |
常见攻击方式和控制流劫持方式
- 程序有堆溢出/UAF等漏洞可以伪造meta,或对伪造的meta进行操作
- 能够泄露libc地址
- 能够泄露malloc_context中的secret值
本次组会内容下载链接