我正在查看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;
此字符串长度会导致大小检查通过,如他在"分析"部分中提到的,在求解来自size_needed
大小临时缓冲区的strlen(name)
:
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)
。
同样在开发部分,他描述了覆盖malloc
块的size
字段:
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
不是他所能达到的吗?
GHOST.c 调用 gethostbyname_r():您将溢出的缓冲区及其在内存中的确切大小由调用方提供。您将溢出的几个字节将直接覆盖缓冲区后面的任何内容(GHOST.c 中的金丝雀)。
clockdiff 调用 gethostbyname():你将溢出的缓冲区是 malloc()ated,它在内存中的实际大小包括一个额外的size_t(size,在结构malloc_chunk中),也许还有一些填充(在 malloc.c 中 request2size()。您正在谈论的神秘的 4 个字节确保根本没有填充(否则您将溢出的几个字节可能会覆盖填充,仅此而已)。