能力值:
( LV2,RANK:10 )
|
-
-
2 楼
详细一点可以吗
|
能力值:
( LV10,RANK:160 )
|
-
-
3 楼
请问明明是double free的洞,为什么crash的位置在ip_mc_leave_src+0x28/0xa8呢? 具体调试了一下,crash时由于源码中ip_mc_leave_src中的psf不为0,但是又不是一个合法的地址,因此导致空指针引用。
根据ADLab的漏洞分析,第二次free应该是在ip_mc_drop_socket中的kfree_rcu才对呀。ip_mc_leave_src在kfree_rcu之前,也就是还没有调用kfree_rcu就crash了。
static int ip_mc_leave_src(struct sock *sk, struct ip_mc_socklist *iml, struct in_device *in_dev) { struct ip_sf_socklist *psf = rtnl_dereference(iml->sflist); int err;
if (!psf) { /* any-source empty exclude case */ return ip_mc_del_src(in_dev, &iml->multi.imr_multiaddr.s_addr, iml->sfmode, 0, NULL, 0); } err = ip_mc_del_src(in_dev, &iml->multi.imr_multiaddr.s_addr, iml->sfmode, psf->sl_count, psf->sl_addr, 0); RCU_INIT_POINTER(iml->sflist, NULL); /* decrease mem now to avoid the memleak warning */ atomic_sub(IP_SFLSIZE(psf->sl_max), &sk->sk_omem_alloc); kfree_rcu(psf, rcu); return err; }
|
能力值:
( LV10,RANK:160 )
|
-
-
4 楼
void ip_mc_drop_socket(struct sock *sk) { struct inet_sock *inet = inet_sk(sk); struct ip_mc_socklist *iml; struct net *net = sock_net(sk);
if (!inet->mc_list) return;
rtnl_lock(); while ((iml = rtnl_dereference(inet->mc_list)) != NULL) { struct in_device *in_dev;
inet->mc_list = iml->next_rcu; in_dev = inetdev_by_index(net, iml->multi.imr_ifindex); (void) ip_mc_leave_src(sk, iml, in_dev); if (in_dev) ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr); /* decrease mem now to avoid the memleak warning */ atomic_sub(sizeof(*iml), &sk->sk_omem_alloc); kfree_rcu(iml, rcu); // 1 2 3 4 } rtnl_unlock(); }
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
看不懂
|
|
|