安全研究
 安全漏洞 
	Linux Kernel ipv6_getsockopt_sticky函数拒绝服务及信息泄露漏洞
发布日期:2007-03-09
更新日期:2007-03-13
受影响系统:
Linux kernel < 2.6.20.2不受影响系统:
Linux kernel 2.6.20.2描述:
BUGTRAQ ID: 22904
CVE(CAN) ID: CVE-2007-1000
Linux Kernel是开放源码操作系统Linux所使用的内核。
Linux Kernel IPv6相关的代码实现上存在漏洞,可能导致拒绝服务或内核信息泄露。
Linux Kernel的net/ipv6/ipv6_sockglue.c文件中的ipv6_getsockopt_sticky()函数存在空指针引用漏洞,漏洞代码如下:
340 case IPV6_2292PKTOPTIONS:
341 {
342 struct ipv6_txoptions *opt = NULL; [1]
343 struct msghdr msg;
344 struct flowi fl;
345 int junk;
346
347 fl.fl6_flowlabel = 0;
348 fl.oif = sk->sk_bound_dev_if;
349
340 if (optlen == 0)
341 goto update; [2]
377 update:
378 retv = 0;
379 if (inet_sk(sk)->is_icsk) {
380 if (opt) {
...
389 }
390 opt = xchg(&np->opt, opt); [3]
391 sk_dst_reset(sk);
392 } else {
393 write_lock(&sk->sk_dst_lock);
394 opt = xchg(&np->opt, opt); [4]
395 write_unlock(&sk->sk_dst_lock);
396 sk_dst_reset(sk);
397 }
819 case IPV6_DSTOPTS:
820 {
821
822 lock_sock(sk);
823 len = ipv6_getsockopt_sticky(sk, np->opt->hopopt, [5]
824 optval, len);
825 release_sock(sk);
826 return put_user(len, optlen);
827 }
在do_ipv6_setsockopt()函数中,如果optname = IPV6_2292PKTOPTIONS且optlen = 0的话(如[2]所示),np->opt就会被设置为空([3][4]所示)。在do_ipv6_getsockopt()函数中,如果optname = IPV6_DSTOPTS,就会在[5]引用np->opt。
攻击者可以利用这个漏洞读取任意内核内存:ipv6_getsockopt_sticky()将np->opt->hopopt拷贝到optavl(用户缓冲区),np->opt可mmap到空。
<*来源:617255317 (617255317@hush.com)
链接:http://secunia.com/advisories/24493/
http://bugzilla.kernel.org/long_list.cgi?buglist=8134
http://kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.20.2
*>
测试方法:
警  告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
建议:
厂商补丁:
Linux
-----
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://bugzilla.kernel.org/attachment.cgi?id=10647&action=view
浏览次数:2869
严重程度:0(网友投票)
绿盟科技给您安全的保障
