我正在查看有关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
能够达到所有目标吗?
答案 0 :(得分:1)
GHOST.c调用gethostbyname_r():你将溢出的缓冲区及其内存中的EXACT大小是调用者提供的。你溢出的几个字节将直接覆盖缓冲区后面的任何内容(canary,在GHOST.c中)。
clockdiff调用gethostbyname():你溢出的缓冲区是malloc(),它在内存中的REAL大小包括一个额外的size_t(大小,在struct malloc_chunk中),也许还有一些填充(request2size(),in malloc.c)。您正在谈论的神秘的4个字节确保根本没有填充(否则您溢出的几个字节可能会覆盖填充而没有其他内容)。