安全研究

安全漏洞
多个应用程序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(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障