多个应用程序fd_set结构bitmap数组索引溢出漏洞
发布日期:2005-01-24
更新日期:2005-01-25
受影响系统:BNC BNC 2.8.4
GUNGK gnugk 2.2.0
JABBER jabber 1.4.1
Citadel citadel 6.27
Dante dante 1.1
BLD bld 0.3
3Proxy 3proxy 0.4
描述:
fd_set结构定义用于select()函数,一般由select()和一些宏使用(FD_SET、FD_CLR、FD_ISSET、FD_CLEAR)。
多个应用程序在调用select()或fd_set宏时没有检查套接口数量,远程攻击者可以利用这个漏洞覆盖fd_set结果之后的内存,可能以进程权限在系统上执行任意指令。
很少基于select()的应用程序去检查FD_SETSIZE值,如下面一个简单的有此漏洞影响的函数:
int waitsockdata(SOCKET sock, int timeosec, int timeousec){
fd_set fds;
struct timeval tv;
int res;
tv.tv_sec = timeosec;
tv.tv_usec = timeousec;
FD_ZERO(&fds);
FD_SET(sock, &fds);
if ((res = select (sock+1, &fds, NULL, NULL, &tv))!=1) return EOF;
return(sock);
}
在这个例子中,如果waitsockdata()调用大的套接口数值,堆栈中的一些数据如EIP就会覆盖,但攻击者只能可数据中的一位,在不同的环境下,如在fd_set上放置多个套接口就可以使攻击者更容易控制。
基于Unix服务器的有如下类型的select()调用:
1、一个进程一个客户端模型(服务程序为每个客户端fork()连接)
2、单个应用程序单个线程。
3、多线程服务器。
不同模型可以混合,如果在单个进程中打开套接口或文件时,进程的客户端数量没有限制或者限制为FD_SETSIZE值以下,模型2和3就会受此类漏洞影响。
<*来源:3APA3A (
3APA3A@security.nnov.ru)
链接:
http://marc.theaimsgroup.com/?l=bugtraq&m=110660879328901&w=2
*>
建议:
临时解决方法:
如果您不能立刻安装补丁或者升级,NSFOCUS建议您采取以下措施以降低威胁:
* 设置所有网络守护程序ulimits低于FD_SETSIZE,不要使用Cygwin编译的网络守护程序。
厂商补丁:
GUNGK
-----
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://www.gnugk.org/h323download.html
3Proxy
------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://www.security.nnov.ru/soft/3proxy浏览次数:2758
严重程度:0(网友投票)