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]...
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