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

image-20260916142609343

起"受害服务"

image-20260916142640436

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

image-20260916142701491

手动调 portmap 注入 hostPort 规则

image-20260916142752458

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

image-20260916142846916

劫持后验证

image-20260916142904354

标签: none

添加新评论

邮箱仅用于识别回复,不会在页面公开。提交后请等待页面确认结果。

文章图片预览