CVE-2015-0235是如何被触发和利用的?

时间:2015-01-30 01:23:48

标签: c security memory exploit

我正在查看有关CVE-2015-0235(http://seclists.org/oss-sec/2015/q1/274)安全建议的一些案例研究和开发,但我无法弄清楚其中的一些细节。对不起,如果它很明显。

在漏洞测试中,他生成一个长度为字符串的字符串:

size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;

当从strlen(name)大小的临时缓冲区求解size_needed时,此字符串长度会导致大小检查在分析部分中提到:

85       size_needed = (sizeof (*host_addr)
86                      + sizeof (*h_addr_ptrs) + strlen (name) + 1);

然而,在案例研究中,当他尝试多个程序时,他使用这个字符串长度:

[user () fedora-19-32b ~]$ /usr/sbin/clockdiff `python -c "print '0' * $((0x10000-16*1-2*4-1-4))"`

在调用非重入0x10000时,我猜测gethostbyname来自默认缓冲区大小。 16*1来自sizeof(unsigned char)2*4来自32位计算机上的sizeof(char *)1用于空终止符。 4在哪里进来?看起来他正在减去指针的大小,但这不会导致字符串正确地适合临时缓冲区吗?该漏洞是因为size_needed遗漏了sizeof (*h_alias_ptr)

同样在开发部分,他描述了覆盖size块的malloc字段:

struct malloc_chunk {

  INTERNAL_SIZE_T      prev_size;  /* Size of previous chunk (if free).  */
  INTERNAL_SIZE_T      size;       /* Size in bytes, including overhead. */

  struct malloc_chunk* fd;         /* double links -- used only if free. */
  struct malloc_chunk* bk;

  /* Only used for large blocks: pointer to next larger size.  */
  struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
  struct malloc_chunk* bk_nextsize;
};

但是,由于仅溢出4个字节的限制(在32位机器上),他如何能够到达size?他不会prev_size能够达到所有目标吗?

1 个答案:

答案 0 :(得分:1)

GHOST.c调用gethostbyname_r():你将溢出的缓冲区及其内存中的EXACT大小是调用者提供的。你溢出的几个字节将直接覆盖缓冲区后面的任何内容(canary,在GHOST.c中)。

clockdiff调用gethostbyname():你溢出的缓冲区是malloc(),它在内存中的REAL大小包括一个额外的size_t(大小,在struct malloc_chunk中),也许还有一些填充(request2size(),in malloc.c)。您正在谈论的神秘的4个字节确保根本没有填充(否则您溢出的几个字节可能会覆盖填充而没有其他内容)。