TCP Fast Open(TFO)是一种初始化 TCP 连接的方法,客户端可以在发送给服务器的初始 SYN 数据包中携带数据。这有利于提升速度,因为可以跳过初始 TCP 握手过程中的往返通信。如果你打算在生产环境中使用它,实现细节还有很多值得关注的地方,但它在规避某些基于系统调用的规则引擎时非常有用,因为它是无需显式使用 connect 系统调用即可打开 TCP 连接的方式之一。
从系统调用的角度来看,一个基本的 TCP 连接通常如下所示:
socket() -> connect() -> write()/read()
然而,TFO 连接是通过带有 MSG_FASTOPEN 标志的 sendto 系统调用来初始化的:
socket() -> sendto(...,MSG_FASTOPEN,...) -> write()/read()
我算是把它当作我正在做的其他事情的一个支线任务来探索的,但在对 TFO 做更多研究时,CVE-2026-63828 作为一个(最近的)已知绕过方式出现了,它专门针对 AppArmor 中受网络限制的进程。不过它适用的范围远不止 AppArmor,所以我想在这里发布一个基础的 PoC。
假设你希望在后期侦察阶段从容器内部查询 Kubernetes API 服务器,但环境中存在 eBPF、AppArmor 或其他基于系统调用的监控/阻断规则。
如果你不想在用户态使用更重量级的网络实现/库,而且像 io_uring 这样的其他系统调用规避原语又不可用,那么 TFO 可能会派上用场。再次说明,这只是一个简单的 PoC,并非健壮的 TFO 协议栈。
可移植构建:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build test.go
参考: