Monday, January 7, 2019

[07] 部分编译器下realloc可能导致double free问题

注意到libcurl有如下漏洞:
53 double-free in curl_maprintf November 02, 2016 7.1 7.50.3 CVE-2016-8618 CWE-415: Double Free
52 double-free in krb5 code November 02, 2016 7.3 7.50.3 CVE-2016-8619 CWE-415: Double Free

在某些编译器下(如gcc),当调用realloc(ptr, 0)即size=0时,realloc将试图释放原内存。当开发人员通过realloc的返回值决定是否做失败后释放时,将可能在第二次释放处产生double free。

leonwxqian@leonwxqian-VirtualBox:~$ cat realloc.c 
#include <stdlib.h>

void main(){
  void* a = malloc(16);
  if(!realloc(a, 0))  //free 1
      free(a);           //free 2 !!!
}
leonwxqian@leonwxqian-VirtualBox:~$ ./realloctest
*** Error in `./realloctest': double free or corruption (fasttop): 0x000000000081b010 ***