首页
社区
课程
招聘
[求助]linux内核代码udp_recvmsg()函数中的代码绕过问题。
发表于: 2017-4-15 17:18 3770

[求助]linux内核代码udp_recvmsg()函数中的代码绕过问题。

2017-4-15 17:18
3770
函数中又这么一段代码

if (

err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr),

     msg->msg_iov, len);

else {

err = skb_cskb_csum_unnecessary(skb))opy_and_csum_datagram_iovec(skb,

      sizeof(struct udphdr),

      msg->msg_iov);

}

 -------------------------------------------------------------

skb_csum_unnecessary()函数内定义

static inline int skb_csum_unnecessary(const struct sk_buff *skb)

{

return skb->ip_summed & CHECKSUM_UNNECESSARY;

}

请问怎么把udp数据包能绕过skb_csum_unnecessary(skb)也就是让他的返回值为零。

问题的中心是怎么设置数据包使其能让skb-》ip_summed!=CHECKSUM_UNNECESSARY;跪拜。求大神指点。;


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 1392
活跃值: (5142)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
2

不是recvfrom的时候加入MSG_PEEK  flag  然后接受缓冲区大小比skb里面数据的长度大?

他是第二次的checksum才会触发

楼主你的内核代码是这个样子。我的版本4.1.19,但是好像代码不是这个样子的 

我的没有

skb_copy_datagram_iovec

而是

if (copied < ulen || UDP_SKB_CB(skb)->partial_cov) {

if (udp_lib_checksum_complete(skb))

goto csum_copy_err;

}

if (skb_csum_unnecessary(skb))

err = skb_copy_datagram_msg(skb, sizeof(struct udphdr),

   msg, copied);

else {

err = skb_copy_and_csum_datagram_msg(skb, sizeof(struct udphdr),

    msg);

if (err == -EINVAL)

goto csum_copy_err;

}

你的skb_copy_datagram_iovec在哪里找到的?


2017-4-15 19:01
0
雪    币: 1392
活跃值: (5142)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
3
到现在为止没有发现谁写出了溢出代码。。。有消息了楼主@wo 
2017-4-15 21:05
0
雪    币: 54
活跃值: (68)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
这个溢出得自己写客户端。问题是不知道怎么让代码执行到这一部。
else  {
err  =  skb_cskb_csum_unnecessary(skb))opy_and_csum_datagram_iovec(skb,
            sizeof(struct  udphdr),
            msg-&gt;msg_iov);
同时官方说你de      skb_copy_and_csum_datagram_msg  这个函数是安全的。
This  bug  does  not  happen  in  upstream  kernels  since  Al  Viro  did  a  great
job  to  replace  this  into  :
skb_copy_and_csum_datagram_msg(skb,  sizeof(struct  udphdr),  msg);
This  variant  is  safe  vs  short  buffers.

2017-4-16 00:09
0
雪    币: 246
活跃值: (264)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
也在查这个问题,反正现在得到的结果是因为网卡可以利用硬件直接计算出checksum,效率高,或者是loopback发送的数据,数据可靠,所以给设置成了CHECKSUM_UNNECESSARY,
2017-4-16 19:38
0
游客
登录 | 注册 方可回帖
返回
//