首页 -> 安全研究

安全研究

安全漏洞
FreeBSD-SA-00:63 getnameinfo允许远程拒绝服务

发布日期:2000-11-02
更新日期:2000-11-02

受影响系统:

FreeBSD 4.x (低于4.2的所有版本)
FreeBSD 4.1.1-STABLE (在更正日期之前的版本
不受影响系统:

FreeBSD 3.x
2000/09/25 (FreeBSD 4.1.1-STABLE)
描述:

getnameinfo()函数是KAME小组提供的解析库中的一部分。

由于在对DNS主机名的处理过程中存在一个错误(少考虑了一个字节),当进行域
名的解析时一个长DNS主机名可能导致getnameinfo()函数崩溃。

在下列条件下,这个问题可以被用来对有问题的服务进行拒绝服务攻击:

* 攻击者必须控制他们的DNS服务器
* 这个服务必须以一个持续守护程序的方式运行
* 这个守护进程必须在fork一个子进程处理连接以前调用getnameinfo()。
  (否则这只会导致子进程崩溃).
* 这个守护程序不会被“看门狗”程序自动重启。


所有在更正日期(2000/10/04)之前的FreeBSD(包括4.0, 4.1, 4.1.1)
均受到影响。但是它已经在4.1.1-STABLE中被修复。FreeBSD 3.x不受此问题影
响,因为它们没有包含KAME的问题代码。


<* 来源: Pavel Kankovsky (peak@argo.troja.mff.cuni.cz)
          FreeBSD Security Advisory: FreeBSD-SA-00:63.getnameinfo
*>


建议:

厂商补丁:

您可以采用下列方法中的任意一种:

1) 将您的有问题的FreeBSD系统升级到更正日期后的4.1.1-STABLE版本

2) 使用下面的补丁程序并且重建相关二进制程序

您可以保存这则公告到一个文件,或者从下列地址下载补丁以及PGP签名文件,并使用
您的PGP工具来验证签名。

ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-00:63/getnameinfo.patch
ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-00:63/getnameinfo.patch.asc

然后以root身份这样操作:

# cd /usr/src/lib/libc
# patch -p < /path/to/patch_or_advisory
# make depend && make all install

针对有问题系统的补丁如下:

    --- net/getnameinfo.c 2000/07/05 05:09:17 1.5
    +++ net/getnameinfo.c 2000/09/25 23:04:36 1.6
    @@ -154,12 +153,12 @@
         (flags & NI_DGRAM) ? "udp" : "tcp");
       }
       if (sp) {
    -   if (strlen(sp->s_name) > servlen)
    +   if (strlen(sp->s_name) + 1 > servlen)
         return ENI_MEMORY;
        strcpy(serv, sp->s_name);
       } else {
        snprintf(numserv, sizeof(numserv), "%d", ntohs(port));
    -   if (strlen(numserv) > servlen)
    +   if (strlen(numserv) + 1 > servlen)
         return ENI_MEMORY;
        strcpy(serv, numserv);
       }
    @@ -253,7 +252,7 @@
          *p = '\0';
        }
     #endif
    -   if (strlen(hp->h_name) > hostlen) {
    +   if (strlen(hp->h_name) + 1 > hostlen) {
         freehostent(hp);
         return ENI_MEMORY;
        }

浏览次数:8673
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障