首页 -> 安全研究

安全研究

安全漏洞
NetBSD setlocale本地缓冲区溢出漏洞

发布日期:2002-09-16
更新日期:2002-09-19

受影响系统:
NetBSD NetBSD 1.6 beta
NetBSD NetBSD 1.5.3
NetBSD NetBSD 1.5.2
NetBSD NetBSD 1.5.1
NetBSD NetBSD 1.5
NetBSD NetBSD 1.4.3
NetBSD NetBSD 1.4.2
NetBSD NetBSD 1.4.1
NetBSD NetBSD 1.4
不受影响系统:
NetBSD NetBSD 1.6
描述:
CVE(CAN) ID: CVE-2002-1476

locale子系统由一系列存储语言和国家信息的数据库组成,它也包含一套库函数用来对这些信息进行存取和管理。setlocale用于改变每个locale类中的本地化信息。

libc库中的setlocale()函数对数组边界缺少正确检查,本地攻击者可以利用这个漏洞进行缓冲区溢出攻击,如果利用setlocal()函数的二进制程序是以suid root属性安装的情况下,可能以root用户权限在系统上执行任意指令。

setlocale()函数一般定义在lib/libc/locale/setlocale.c文件中,用于改变每个locale类中的本地化信息。setlocale()函数通过第一参数所指定的Locale转换到第二个参数所指定的类,而特殊的种类LC_ALL可以用于同时更改所有Locale类,在这种情况下,NetBSD的setlocale实现允许第二个参数字符串以特别的形式来指定每类中独立的Locales。

在这种形式下,第一个参数中的每个locale将由"/"字符来分隔,如"A/B/C/D/E/F"。这里每个元素代表类LC_COLLATE, LC_CTYPE, C_MONETARY, LC_NUMERIC, LC_TIME和LC_MESSAGES,而selocale()函数会尝试把这些元素放置到lib/libc/locale/setlocale.c定义的new_categories数组对象中,但是代码对数组边界缺少正确的检查,如果字符串包含6个以上元素的情况下可导致放置过程中破坏数据段数据。

如果某个系统程序具有set[ug]id位或者某个set[ug]id程序把LC_ALL做为setlocale() 的第一个参数,而第二个参数的字符串数据由用户提供的情况下(e.g. setlocale(LC_ALL, getenv("FOO")) ),就可能通过缓冲区溢出而进行权限提升。X Toolkit Intrinsics (Xt)程序的DefaultLanguageProc函数就是一个例子,DefaultLanguageProc以"setlocale(LC_ALL, xnl)"的方式调用setlocale,而xnl变量默认是NULL字符串(""),但是用户可以通过-xnllanguage选项提供用户数据给xnl。许多Xt程序包括xterm,使用这个语言处理,xterm一般默认以suid root属性安装,因此本地用户可以利用这个漏洞获得root用户权限。

<*链接:ftp://ftp.netbsd.org/pub/NetBSD/security/advisories/NetBSD-SA2002-012.txt.asc
*>

建议:
临时解决方法:

如果您不能立刻安装补丁或者升级,NSFOCUS建议您采取以下措施以降低威胁:

* 暂时去掉xterm的SETUID ROOT属性。

厂商补丁:

NetBSD
------
NetBSD已经为此发布了一个安全公告(NetBSD-SA2002-012)以及相应补丁:
NetBSD-SA2002-012:buffer overrun in setlocale
链接:ftp://ftp.netbsd.org/pub/NetBSD/security/advisories/NetBSD-SA2002-012.txt.asc

最新的NetBSD 1.6 release不存在此漏洞,建议用户升级到NetBSD 1.6版本。

否则你必须升级libc,你也必须升级所有静态连接的二进制程序,所以NetBSD不包含这类静态二进制程序,但系统有可能包含第三方的程序利用了这个有漏洞的库。

* NetBSD-current:

    系统运行在2002-08-08之前的NetBSD-current版本必须升级到2002-08-08 NetBSD-current版本或者之后的版本。
    
    下面的目录必须从netbsd-current CVS branch (aka HEAD)升级:
        lib/libc/locale
        
    要升级CVS,重建和重安装LIBC:
  
        # cd src
        # cvs update -d -P lib/libc/locale

        # cd lib/libc
        # make cleandir dependall
        # make install

* NetBSD 1.6 betas:
    
    系统运行NetBSD 1.6 BETAs和Release Candidates版本必须升级到NetBSD 1.6 release版本。
    

    下面的目录必须从netbsd-1-6 CVS branch上升级:
        lib/libc/locale
        
    要升级CVS,重建和重安装LIBC:
  
        # cd src
        # cvs update -d -P lib/libc/locale

        # cd lib/libc
        # make cleandir dependall
        # make install
        
* NetBSD 1.5.x:

    系统运行在2002-09-05之前的NNetBSD 1.5 betas版本必须升级到2002-09-05 NetBSD 1.5 tree版本或者之后的版本。
    
    下面的目录必须从netbsd-1-5 CVS branch升级:
        lib/libc/locale
        
    要升级CVS,重建和重安装LIBC:
  
        # cd src
        # cvs update -d -P lib/libc/locale

        # cd lib/libc
        # make cleandir dependall
        # make install

* NetBSD 1.4.x:


        尚无

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