安全研究

安全漏洞
Sun Solaris aio_suspend()整数溢出本地拒绝服务漏洞

发布日期:2009-01-10
更新日期:2009-01-13

受影响系统:
Sun Solaris 9.0_x86
Sun Solaris 9.0
Sun Solaris 8.0_x86
Sun Solaris 8.0
Sun Solaris 10.0_x86
Sun Solaris 10.0
Sun OpenSolaris
描述:
BUGTRAQ  ID: 33188

Solaris是一款由Sun开发和维护的商业性质UNIX操作系统。

Solaris内核中用于在32位模式系统上处理SYS_kaio系统调用请求的代码存在整数溢出漏洞,本地攻击者可以利用这个漏洞导致由于内核忙碌而触发的系统崩溃。由于所有的Solaris区共享相同的内核,因此即使由普通的非全局区触发也可以导致整个系统崩溃。

/uts/common/os/aio.c中的源码:

[..]
221 static int64_t
222 kaioc(
223        long  a0,
224        long  a1,
225        long  a2,
226        long  a3,
227        long  a4,
228        long  a5)
229 {
230        int  error;
231        long rval = 0;
232
233        switch ((int)a0 & ~AIO_POLL_BIT) {
...
266        case AIOSUSPEND:
267 [1]        error = aiosuspend((void *)a1, (int)a2, (timespec_t *)a3,
268                (int)a4, &rval, AIO_64);
269            break;
[..]

[1] aiosuspend()函数的a1、a2、a3和a4参数是受控的。

/uts/common/os/aio.c中的源码:

[..]
897   static int
898   aiosuspend(
899          void   *aiocb,
900          int    nent,
901          struct timespec   *timout,
902          int    flag,
903          long   *rval,
904          int    run_mode)
905   {
...
925        aiop = curproc->p_aio;
926 [2]    if (aiop == NULL || nent <= 0)
927               return (EINVAL);
...
951        if (model == DATAMODEL_NATIVE)
952 [3]           ssize = (sizeof (aiocb_t *) * nent);
953      #ifdef    _SYSCALL32_IMPL
954        else
955 [3]           ssize = (sizeof (caddr32_t) * nent);
956      #endif  /* _SYSCALL32_IMPL */
957
958 [4]    cbplist = kmem_alloc(ssize, KM_NOSLEEP);
[..]

[2] 由于nent是受控的,如果nent > 0就可以绕过这个检查
[3] 使用用户控制的nent值计算ssize值,对nent提供0x3fffffff值就可以触发整数溢出,导致ssize = 0x00000000。在[4]处用0x00000000长度值调用kmem_alloc()函数,kmem_alloc()函数本身用0x00000000值调用vmem_alloc(),该函数用相同的size值调用vmem_xalloc()。

/lib/libumem/common/vmem.c中的源码:

[..]
815 void *
816 vmem_xalloc(vmem_t *vmp, size_t size, size_t align, size_t phase,
817   size_t nocross, void *minaddr, void *maxaddr, int vmflag)
818 {
...
934 [6]  if (size == 0)
935         umem_panic("vmem_xalloc(): size == 0");
[..]

[6] 如果向vmem_xalloc()函数提供了0x00000000的size值就会导致内核忙碌。

<*来源:Tobias Klein
  
  链接:http://marc.info/?l=bugtraq&m=123178257830477&w=2
        http://secunia.com/advisories/33516/
        http://sunsolve.sun.com/search/printfriendly.do?assetkey=1-66-247986-1
*>

建议:
厂商补丁:

Sun
---
Sun已经为此发布了一个安全公告(Sun-Alert-247986)以及相应补丁:
Sun-Alert-247986:Security Vulnerability in aio_suspend(3RT) May Lead to a System Panic, Resulting in a Denial of Service (DoS)
链接:http://sunsolve.sun.com/search/printfriendly.do?assetkey=1-66-247986-1

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