安全研究

安全漏洞
Sun Solaris和OpenSolaris本地IP多播过滤器整数溢出漏洞

发布日期:2008-06-12
更新日期:2008-06-17

受影响系统:
Sun Solaris 10_x86
Sun Solaris 10.0
Sun OpenSolaris
描述:
BUGTRAQ  ID: 29699

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

Solaris的内核没有正确的处理SIOCSIPMSFILTER IOCTL请求,本地攻击者可以利用这个漏洞以内核级权限执行任意指令。

以下是inet/ip/ip_multi.c中的漏洞代码:

static int
ip_set_srcfilter(conn_t *connp, struct group_filter *gf,
   struct ip_msfilter *imsf, ipaddr_t grp, ipif_t *ipif,
   boolean_t isv4mapped)
{
[...]
int i, err, insrcs, infmode, new_fmode; <-- [1]
[...]
insrcs = imsf->imsf_numsrc; <-- [2]
[...]
/* Make sure we can handle the source list */
if (insrcs > MAX_FILTER_SIZE) <-- [3]
   return (ENOBUFS);
[...]
fp->sl_numsrc = insrcs; <-- [4]
ilg->ilg_filter = fp; <-- [5]
[...]
l_copy(ilg->ilg_filter, new_filter); <-- [6]
[...]
    
在[2]处将用户所提供的imsf->imsf_numsrc值分配给了insrcs,imsf->imsf_numsrc变量为无符int型,而insrcs为有符int型。如果用户所提供的imsf->imsf_numsrc值为很大的整数的话,insrcs就可能成为负值。

在netinet/in.h文件中:

struct ip_msfilter {
struct in_addr imsf_multiaddr;
struct in_addr imsf_interface;
uint32_t imsf_fmode;
uint32_t imsf_numsrc; <-- [7]
struct in_addr imsf_slist[1];
};


当insrcs为负值的时候,就可以绕过[3]处的检查,之后用户所提供的数据用作了ilg->ilg_filter的值(请见[4]和[5]),而ilg->ilg_filter值会用作l_copy的参数(请见[6]),这就会由于l_copy中的越界写操作而导致内核内存破坏。

<*来源:Tobias Klein
  
  链接:http://secunia.com/advisories/30693/
        http://seclists.org/fulldisclosure/2008/Jun/0191.html
        http://sunsolve.sun.com/search/printfriendly.do?assetkey=1-66-237965-1
*>

建议:
厂商补丁:

Sun
---
Sun已经为此发布了一个安全公告(Sun-Alert-237965)以及相应补丁:
Sun-Alert-237965:A Security Vulnerability in IP Multicast Filter processing of Sockets may lead to a system panic or possible execution of Arbitrary Code
链接:http://sunsolve.sun.com/search/printfriendly.do?assetkey=1-66-237965-1

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