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 =...
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到空。。