背景
packetdrill 在 2013 年开源,在 Google 内部久经考验,Google 用它发现了 10 余个 Linux 内核 bug,同时用测试驱动开发的方式开发新的网络特性和进行回归测试,确保新功能的添加不影响网络协议栈的可用性。
github地址
使用参考文章
Challenge-ACK定义:
Linux 内核对于收到的乱序 SYN 报文,会回复一个携带了正确序列号和确认号的 ACK 报文。
本文通过packetdrill模拟ESTAB状态下服务端收到乱序SYN后,发送challenge-ack的现象。
测试
packetdrill程序
1 | --tolerance_usecs=100000 |
3个SYN分别间隔0.1s,+0.5s,+1s发送。
tcpdump查看过程
抓包命令:tcpdump -i any -n host 192.0.2.1
1 | 14:43:40.546883 IP 192.0.2.1.42451 > 192.168.193.131.8080: Flags [S], seq 0, win 32792, options [mss 1000,nop,wscale 7], length 0 |
可以看到在ESTAB状态,服务端对每一个SYN都回复了一个ACK(最后6个报文)。
如果攻击者利用这一特性,可造成服务器发送大量的ack消耗资源,可调小内核参数net.ipv4.tcp_challenge_ack_limit
,该参数定义1s之内发送挑战应答的次数,默认为1000,1s内只发送1000个ack,之后不再发送,需要等下一秒内重新恢复1000计数,本次测试中,如果将该参数调整到1后,因为3个SYN分别间隔0.1s
,+0.5s
,+1s
发送,前两个SYN应该只有第一个SYN收到ack应答,测试结果抓包如下:
1 | 14:52:16.067101 IP 192.0.2.1.53531 > 192.168.175.120.8080: Flags [S], seq 0, win 32792, options [mss 1000,nop,wscale 7], length 0 |
可以看到倒数第三个数据包(第二个SYN),服务器并没有响应挑战应答。
内核相关代码
1 | static bool tcp_validate_incoming(struct sock *sk, struct sk_buff *skb, |
赞赏支持一下