CVE-2019-9946
前置知识
portmap 插件是干嘛的
Kubernetes 的 Pod 声明了 hostPort: 30080 后,需要在宿主机上把"访问宿主机 30080 的流量"转发到 Pod。干这件事的就是 CNI 插件里的 portmap。
它的实现手段很粗暴:往宿主机的 iptables nat 表里插入两条 DNAT 规则
- 一条:
dport=30080 → DNAT 到 pod IP(把流量送进 pod) - 一条配套的 MASQUERADE(让回包能找回来)
关键问题不是它插规则,而是它把规则插在什么位置。
漏洞原理
CNI 0.7.4 及更早版本把 HostPort 规则插在了链的最前面,导致数据包一进来就被 HostPort 规则截走,Service 规则根本没机会匹配。攻击者可以创建一个 HostPort 端口和某个 Service 冲突的 Pod,把所有本该访问该 Service 的流量劫持到自己的容器里,造成服务中断或信息泄露
漏洞复现
起攻击 pod

起"受害服务"

劫持前验证(确认流量现在归受害服务)

手动调 portmap 注入 hostPort 规则

验证规则确实被插到了最前

劫持后验证
