多家厂商rpc.amd远程缓冲区溢出漏洞

2008-04-09 04:33:46来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

多家厂商rpc.amd远程缓冲区溢出漏洞

发布日期:1999-08-30
更新日期:1999-08-30

受影响系统:
Linux rpc.amd
- BSDI BSD/OS 4.0.1
- BSDI BSD/OS 3.1
- FreeBSD 3.2
- FreeBSD 3.1
- FreeBSD 3.0
- RedHat Linux 6.0 x86
- RedHat Linux 5.2
- RedHat Linux 5.2 x86
- RedHat Linux 5.1
- RedHat Linux 5.0
- RedHat Linux 4.2
描述:
BUGTRAQ ID: 614
CVE(CAN) ID: CVE-1999-0704

Linux 下的rpc.amd守护进程用来在收到试图访问某些文件系统的请求时自动装载相应的文件系统。在其他的系统中,这个功能由automountd来完成。

某些早期版本Linux类系统的rpc.amd实现上存在一个缓冲区溢出漏洞,远程或本地攻击者可能利用此漏洞通过溢出攻击以root用户的权限在主机上执行任意指令。

rpc.amd在使用plog()函数时,缺乏正确的缓冲区边界检查,可能发生远程溢出问题,远程攻击者可以通过提交精心构造的超长请求溢出缓冲区获取amd进程运行的权限(通常是root)。

相关漏洞的具体技术分析如下:

这个漏洞存在于xutil.c的real_plog()函数中:

----------------------------xutil.c----------------------------------
......
static void
real_plog(int lvl, char *fmt, va_list vargs)
{
char msg[1024]; //这里开辟了1024字节缓冲区
char efmt[1024];
char *ptr = msg; // ptr指向msg

.........

vsprintf(ptr, efmt, vargs); // 将参数串拷贝到msg中,如果串长度超过1024
// 那么就会导致缓冲区溢出,当从real_plog返回
// 时,可能会跳去执行任意代码
......
----------------------------xutil.c-----------------------------------

这个real_plog被plog()函数调用,而plog()被作者频繁的使用,因此出问题也就没什么可奇怪
的了.:-) 让我们来看amq_subr.c中的amqproc_mount_1_svc()函数.当amd接收到amq传送来
的一个mount映射请求的时候(AMQPROC_MOUNT),就由这个函数来处理.由于这种方式很不安全
(因为只是基于ip检验,可能会被spoof),所以缺省amd是禁止这种请求的.


-------------------------amq_subr.c-------------------------------

#ifdef ENABLE_AMQ_MOUNT //如果使能了AMQ_MOUNT
......
int *
amqproc_mount_1_svc(voidp argp, struct svc_req *rqstp)
{
static int rc;
char *s = *(amq_string *) argp;
char *cp;

//记录mount信息,如果s的大小超过1024-23=1001,就会导致缓冲区溢出
plog(XLOG_INFO, "amq requested mount of %s", s);
......
#else /* not ENABLE_AMQ_MOUNT */ //如果没有使能AMQ_MOUNT(缺省设置)

int *
amqproc_mount_1_svc(voidp argp, struct svc_req *rqstp)
{
static int rc;
char *s = *(amq_string *) argp;

//记录mount错误信息,如果s的大小超过1024-23=1001,也会导致缓冲区溢出
plog(XLOG_ERROR, "amq requested mount of %s, but code is disabled", s);

我们可以看出,不管是不是禁止了AMQ_MOUNT,都有可能导致缓冲区溢出。

exploit成功的原理,看看下面这个简图就很清楚了:
只要提供一个1009个字节(多点也可以),就可以覆盖堆栈中保存的返回地址eip。当real_plog()函数返回时,就会跳转到攻击程序提供的地址去执行。如果这个地址返回到NOP指令段中(如图所示),就会顺序执行下去,一直执行到shellcode,从而可能以root权限执行任意指令。


不发生溢出时堆栈中的情况 发生溢出时堆栈中的情况
(s大小为1001) (s大于1009)

|........ | |........ |
|---------|0 ----x----- 0|---------|
| 'a' | | | 'a' |
|---------| | |---------|
| 'm' | | | 'm' |
|---------| | |---------|
| 'q' | | | 'q' |
|---------| |---------|
| ' ' | "amq requested mount of " | ' ' |
|---------| |---------|
| 'r' | | | 'r' |
|---------| | |---------|
|........ | | |........ |
|---------| | |---------|
| 'f' | | | 'f' |
|---------| | |---------|
| ' ' | | | ' ' |
|---------|23 ----x----- ----x---23|---------|
| ..... | | | | 0x90 |
|---------| | | |---------|

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Internet Explorer代码可以格式化本地硬盘

下一篇:Lotus Notes Domino Server 4.6 NLDAP拒绝服务攻击漏洞