首页 -> 安全研究

安全研究

绿盟月刊
绿盟安全月刊->第9期->最新漏洞
期刊号: 类型: 关键词:
FreeBSD安全公告: libmytinfo库存在缓冲区溢出漏洞

日期:2000-05-05


发布日期: 2000-5-10
更新日期: 2000-5-10

受影响的系统:  FreeBSD 3.x
不受影响系统:  FreeBSD 4.0

--------------------------------------------------------------------------------
描述:

libmytinfo是ncurses的一部分,是文本模式显示用的库文件。
libmytinfo允许用户指定一个termcap文件或者通过TERMCAP变量指定。但它没有正确处理
用户输入数据的长度,导致可能发生缓冲区溢出攻击。如果某些二进制文件使用了
libmytinfo库,并且被设置了setuid/setgid位,就有可能让本地用户提升自己的权限,甚
至是root权限。

<* 来源:FreeBSD-SA-00:17  *>


--------------------------------------------------------------------------------
建议:
删除所有使用libmytinfo库的程序(包括静态联结)的setuid/setgid位。

FreeBSD提供了一个libfind.sh脚本来查找所有使用了libmytinfo库的文件:

1) 可以从下列地址下载'libfind.sh':

ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-00:17/libfind.sh
例如使用fetch命令:

# fetch ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-00:17/libfind.sh
Receiving libfind.sh (460 bytes): 100%
460 bytes transferred in 0.0 seconds  (394.69 Kbytes/s)
#

2) 进行md5校验,并于下列结果比较:

# /sbin/md5 libfind.sh
MD5 (libfind.sh) = 59dceaa76d6440c58471354a10a8fb0b

3) 运行这个脚本来进行检查

# sh libfind.sh /

删除所有检查到的程序的setuid/setgid位
4) 如果不需要这些程序,删除它们

V.   Solution

按照下列步骤更新FreeBSD 3.x系统:保存patch到一个文件中,并以root身份
执行下列命令:


cd /usr/src/lib/libmytinfo
patch < /path/to/patch/file
make all
make install

下面就是针对3.x系统的patch文件:

Patches:        ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-00:17/libmytinfo.patch

内容为:

  Index: findterm.c
  ===================================================================
  RCS file: /usr/cvs/src/lib/libmytinfo/Attic/findterm.c,v
  retrieving revision 1.3
  diff -u -r1.3 findterm.c
  --- findterm.c    1997/08/13 01:21:36    1.3
  +++ findterm.c    2000/04/25 16:58:19
  @@ -242,7 +242,7 @@
               } else {
                   s = path->file;
                   d = buf;
  -                while(*s != '\0' && *s != ':')
  +                while(*s != '\0' && *s != ':' && d - buf < MAX_LINE - 1)
                       *d++ = *s++;
                   *d = '\0';
                   if (_tmatch(buf, name)) {
  @@ -259,7 +259,7 @@
               } else {
                   s = path->file;
                   d = buf;
  -                while(*s != '\0' && *s != ',')
  +                while(*s != '\0' && *s != ',' && d - buf < MAX_LINE - 1)
                       *d++ = *s++;
                   *d = '\0';
                   if (_tmatch(buf, name)) {



版权所有,未经许可,不得转载