安全研究

安全漏洞
FreeBSD本地内核缓冲区溢出漏洞

发布日期:2004-09-14
更新日期:2004-09-20

受影响系统:
FreeBSD FreeBSD 5.2.1-RELEASE
FreeBSD FreeBSD 5.2
FreeBSD FreeBSD 5.1
FreeBSD FreeBSD 5.0
FreeBSD FreeBSD 4.9
FreeBSD FreeBSD 4.8
FreeBSD FreeBSD 4.7
FreeBSD FreeBSD 4.6
FreeBSD FreeBSD 4.5
FreeBSD FreeBSD 4.4
FreeBSD FreeBSD 4.3
FreeBSD FreeBSD 4.2
FreeBSD FreeBSD 4.10
FreeBSD FreeBSD 4.1.1
FreeBSD FreeBSD 4.1
FreeBSD FreeBSD 4.0
描述:
FreeBSD是一款免费开放源代码的UNIX操作系统。

FreeBSD的i386/i386/trap.c syscall()函数存在缓冲区溢出,本地攻击者可以利用这个漏洞可以使内核崩溃,或获得系统权限。

为了维护系统调用机制,在IDT中提供特殊128 (0x80)中断,要服务这个中断,i386/i386/exception.s int0x80_syscall()函数在最后调用syscall()。Syscall()负责从syscall中装载参数和拷贝到kspace指针用于访问它们。代码如下:

void
syscall(frame)
    struct trapframe frame;
{
    caddr_t params;
    struct sysent *callp;
    struct thread *td = curthread;
    struct proc *p = td->td_proc;
    register_t orig_tf_eflags;
    u_int sticks;
    int error;
    int narg;
    int args[8];
    u_int code;


    ...


    narg = callp->sy_narg & SYF_ARGMASK;  (<- you can see it's the only one
check)

    if (params != NULL && narg != 0)
        error = copyin(params, (caddr_t)args,
            (u_int)(narg * sizeof(int)));
    else
        error = 0;


    ...


and:

> grep SYF_ARGMASK /usr/src/sys/sys/sysent.h
#define SYF_ARGMASK     0x0000FFFF

很明显可选的内存数量超过args数组的(8 * sizeof(int))限制,因此通过syscall()可能覆盖保存的EIP或破坏struct proc *p结构。

精心构建参数数据可导致内核崩溃,可能用于执行任意指令。但是只有root用户才有权限访问系统调用入口,所以这个漏洞没有实际意义。

<*来源:gerarra (gerarra@tin.it
  
  链接:http://marc.theaimsgroup.com/?l=bugtraq&m=109545096507850&w=2
*>

建议:
厂商补丁:

FreeBSD
-------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://www.freebsd.org/security/index.html

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