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;
}
浏览次数:8682
严重程度:0(网友投票)