安全研究

安全漏洞
BSD Kernel SHMAT系统调用权限提升漏洞

发布日期:2004-02-05
更新日期:2004-02-12

受影响系统:
FreeBSD FreeBSD 5.2-RELEASE
FreeBSD FreeBSD 5.1-RELEASE
FreeBSD FreeBSD 5.0
FreeBSD FreeBSD 4.8
FreeBSD FreeBSD 4.7
FreeBSD FreeBSD 4.6
NetBSD NetBSD 1.6.1
NetBSD NetBSD 1.6
NetBSD NetBSD 1.5.3
NetBSD NetBSD 1.5.2
NetBSD NetBSD 1.5.1
NetBSD NetBSD 1.5
NetBSD NetBSD 1.4.2
NetBSD NetBSD 1.4.1
NetBSD NetBSD 1.4
NetBSD NetBSD 1.3.3
NetBSD NetBSD 1.3.2
NetBSD NetBSD 1.3.1
NetBSD NetBSD 1.3
OpenBSD OpenBSD 3.4
OpenBSD OpenBSD 3.3
OpenBSD OpenBSD 3.2
OpenBSD OpenBSD 3.1
OpenBSD OpenBSD 3.0
OpenBSD OpenBSD 2.9
OpenBSD OpenBSD 2.8
OpenBSD OpenBSD 2.7
OpenBSD OpenBSD 2.6
描述:
BUGTRAQ  ID: 9586
CVE(CAN) ID: CVE-2004-0114

BSD系统中的shmat(2)函数映射一个或多个进程/线程共享内存段中,之前可通过shmget(2)函数建立。

shmat(2)系统调用存在编程错误,可导致共享内存段参考计数器错误的增长,可能造成权限提升。

这个函数在sysv_shm.c文件中实现:

        -- sysv_shm.c lines 317-322 --


                vm_object_reference(shm_handle->shm_object);

                rv = vm_map_find(&p->p_vmspace->vm_map,
                                 shm_handle->shm_object,
                                 0, &attach_va, size,
                                 (flags & MAP_FIXED) ? 0 : 1,
                                 prot, prot, 0);

                if (rv != KERN_SUCCESS) return ENOMEM;

        -- end of code snippet --

shmat(2)函数开始增加下面的vm_object的参考计数,然后尝试插入vm_object到进程地址空间。问题是由于shmat(2)函数在当vm_map_find函数返回失败时忘记递减参考计数值。

此漏洞可以被本地用户利用:

可以使用shmget(2)函数建立共享内存段,和使用shmat(2)函数在进程地址空间中建立两个不同地点的映射。

在经过大约2^32-2(非法)调用shmat(2)函数,vm_object的参考计数值会变为1。

在使用shmdt(2)函数删除一个映射后,vm_object会释放,不过我们会拥有一个额外的映射。然后利用欺骗执行一个会重用释放了的vm_object堆栈段的SUID进程,这时候就可以直接写SUID程序的堆栈段,并方便的提升权限。

<*来源:Joost Pol (joost@pine.nl
  
  链接:http://marc.theaimsgroup.com/?l=bugtraq&m=107608375207601&w=2
        ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/FreeBSD-SA-04:02.shmat.asc
*>

建议:
临时解决方法:

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

* FreeBSD系统建议用户采用如下方法,不过此方法会引起依靠共享内存X Windows系统不稳定或失败:

1)通过如下步骤关闭System V共享内存接口:

-在内核配置文件中注释掉`SYSVSHM',然后按照如下方法重新编译内核:

http://www.freebsd.org/handbook/kernelconfig.html

-在/boot/loader.conf和/etc/rc.conf文件中注释`sysvshm'。

- 在FreeBSD 5.x系统中,System V共享内存支持通过kld(4)提供,为了绝对安全,删除任何在/modules中 `sysvshm.ko'命名的文件。

-重新启动机器。

2)配置System V共享内存参数,使新的共享内存段不能建立,使用共享内存终止所有进程,删除所有存在的共享内存段,运行如下命令:

# sysctl -w kern.ipc.shmmax=0
# echo 'kern.ipc.shmmax=0' >> /etc/sysctl.conf
# ipcs | awk '/^m/ { print $2 }' | xargs -n 1 ipcrm -m

厂商补丁:

FreeBSD
-------
FreeBSD已经为此发布了一个安全公告(FreeBSD-SA-04:02)以及相应补丁:
FreeBSD-SA-04:02:shmat reference counting bug
链接:ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/FreeBSD-SA-04:02.shmat.asc

补丁下载:

# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-04:02/shmat.patch
# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-04:02/shmat.patch.asc

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