CVE:CVE-2007-1000
CNNVD:CNNVD-200703-332
Linux kernel是美国Linux基金会发布的开源操作系统Linux所使用的内核。NFSv4 implementation是其中的一个分布式文件系统协议。
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到空。。
solution:Upgrade linux linux_kernel to a higher version than 2.6.20.1,and avoid the version (,2.6.20.1]