Lucene search

K
seebugRootSSV:19049
HistoryFeb 03, 2010 - 12:00 a.m.

Sun Solaris CODE_GET_VERSION IOCTL本地拒绝服务漏洞

2010-02-0300:00:00
Root
www.seebug.org
18

0.0004 Low

EPSS

Percentile

5.9%

BUGTRAQ ID: 38016
CVE ID: CVE-2010-0453

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

Solaris的内核中负责处理UCODE_GET_VERSION IOCTL请求的代码中存在空指针引用漏洞,本地用户可以通过发送特制的IOCTL请求导致拒绝服务。以下是intel/io/ucode_drv.c中的有漏洞代码段:

[…]
static int
ucode_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cr, int
*rval)
{

switch (cmd) {
case UCODE_GET_VERSION: {
int size;
uint32_t *revp, *rev_array;
ucode_errno_t rc = EM_OK;

 STRUCT_DECL(ucode_get_rev_struct, h);
 STRUCT_INIT(h, mode);

[1] if (ddi_copyin((void *)arg,
STRUCT_BUF(h), STRUCT_SIZE(h), mode))
return (EFAULT);

[2] if ((size = STRUCT_FGET(h, ugv_size)) > NCPU)
return (EINVAL);

 if ((rev_array = STRUCT_FGETP(h, ugv_rev)) == NULL)
   return (EINVAL);

 size *= sizeof (uint32_t);

[3] revp = kmem_zalloc(size, KM_SLEEP);
if (ddi_copyin((void *)rev_array, revp, size, mode) != 0) {
kmem_free(revp, size);
return (EINVAL);
}

[4] rc = ucode_get_rev(revp);
[…]

[1] h结构填充了用户控制的IOCTL输入数据。
[2] 从用户控制的数据中获得了size值。
[3] 如果size值为0,kmem_zalloc()会返回NULL,导致revp指向NULL。
[4] revp用作了ucode_get_rev()的函数指针。

i86pc/os/microcode.c:

[…]
/*

  • Returns microcode revision from the machcpu structure.
    */
    ucode_errno_t
    ucode_get_rev(uint32_t *revp)
    {
    int i;

    ASSERT(ucode);
    ASSERT(revp);

    if (!ucode->capable(CPU))
    return (EM_NOTSUP);

    mutex_enter(&cpu_lock);
    for (i = 0; i < max_ncpus; i++) {
    cpu_t *cpu;

    if ((cpu = cpu_get(i)) == NULL)
    continue;

[5] revp[i] = cpu->cpu_m.mcpu_ucode_info->cui_rev;
[…]

[5] 这个分配导致了空指针引用,因为revp == NULL。

Sun Solaris 10.0_x86
Sun OpenSolaris snv_69 - snv_133
厂商补丁:

Sun

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

http://sunsolve.sun.com/search/document.do?assetkey=1-21-143913-01-1

0.0004 Low

EPSS

Percentile

5.9%