CodeQL中能否追踪free函数参数克隆值以检测UAF漏洞?
解决CodeQL无法追踪别名指针/结构体成员的Use-After-Free问题
要覆盖你提到的别名指针、结构体成员这类UAF场景,核心思路是从内存分配点(malloc/calloc/realloc等函数)开始,追踪该内存块的所有引用链,而不是仅聚焦free函数的参数。具体实现可以拆解为以下步骤:
定义内存分配实体
识别所有内存分配函数的返回值,将其标记为AllocatedMemory实体,记录分配的上下文信息(如分配位置、大小等)。追踪全链路引用传播
- 处理指针赋值:包括直接赋值(如
char *b = a)、函数参数传递/返回值、结构体指针复制(如MyStruct *t = s),将所有指向同一AllocatedMemory的指针关联起来。 - 处理结构体成员:当结构体中的指针成员被赋值或结构体指针被复制时,把成员指针和对应的
AllocatedMemory绑定,比如struct s *q = p后,q->buf要和p->buf指向的内存块保持关联。
- 处理指针赋值:包括直接赋值(如
标记内存释放状态
当检测到free调用时,找到其参数对应的AllocatedMemory实体,标记该内存为已释放,并记录释放位置。检测Use-After-Free行为
遍历所有内存读写操作(如*b = 'x'、t->buf[0] = 'y'),检查当前操作的指针是否关联到已标记为释放状态的内存块,且操作发生在释放点之后,满足则判定为UAF漏洞。
举个具体场景的检测逻辑:
// 测试代码 char *a = malloc(10); char *b = a; free(a); *b = 'x'; // 目标UAF场景
从malloc的返回值a开始,将b关联到同一AllocatedMemory;free(a)标记该内存已释放;后续检测*b的写操作时,发现其指向的内存已被释放,即可触发告警。
无需单独针对“克隆引用”做特殊函数追踪,而是通过CodeQL的数据流/污点分析框架,定义完整的指针传播规则,覆盖所有可能的引用传递路径即可。
内容的提问来源于stack exchange,提问作者Jija Biba
相关产品推荐
相关产品推荐

