在IP层协议处理IP分片重组时,会调用ip_defrag() -> ip_frag_queue()
在ip_frag_queue函数中有关于分片与前个分片或后个分片重叠的情形,比如与前个分片重叠的处理:
不明白的还是如果重叠攻击才会导致分片重叠,直接在IP重组时丢弃掉不行吗?
在ip_frag_queue函数中有关于分片与前个分片或后个分片重叠的情形,比如与前个分片重叠的处理:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
if
(prev) {
int
i = (FRAG_CB(prev)->offset + prev->len) - offset;
if
(i > 0) {
offset += i;
err = -EINVAL;
if
(end <= offset)
goto
err;
err = -ENOMEM;
if
(!pskb_pull(skb, i))
goto
err;
if
(skb->ip_summed != CHECKSUM_UNNECESSARY)
skb->ip_summed = CHECKSUM_NONE;
}
}
|
我想问的是,在什么情况下会发生分片间重叠的情况?IP分片时应该都是分割的不会重叠的
内核对分片队列fragments限制了内存大小的,应该不会被溢出
1
2
|
if
(atomic_read(&net->ipv4.frags.mem) > net->ipv4.frags.high_thresh)
ip_evictor(net);
|
不明白的还是如果重叠攻击才会导致分片重叠,直接在IP重组时丢弃掉不行吗?
一定不只是攻击行为,分片重叠一定还有其他用途,可我现在只能举出这个例子。
现在的内核一定不会有溢出的可能,限制ip碎片的大小应该不是关键,最后ip包要整合在一起送给上一层协议处理,ip包声明的长度和实际送上来的数据长度就有可能出现偏差。
重叠部分的大小不确定,这个丢弃的工作也不好完成把。个人认为ip层的数据应该尽量多的交给上层,这样上层控制才能更灵活。