MITM — 中间人攻击

一句话概括

中间人攻击(Man-in-the-Middle, MITM)是攻击者 secretly 拦截、窃听甚至篡改通信双方之间数据的攻击方式,而通信双方误以为自己在直接对话。


攻击模型

正常通信:
  客户端 ──────────────────────→ 服务器

MITM 攻击:
  客户端 ──→ 攻击者(拦截) ──→ 服务器
               ↕ 窃听/篡改

攻击者处于通信路径上,可以:

  • 窃听(Eavesdropping) — 读取通信内容
  • 篡改(Tampering) — 修改传输中的消息
  • 劫持(Hijacking) — 冒充其中一方继续通信

常见 MITM 攻击场景

1. 公共 WiFi 嗅探

攻击者在公共 WiFi 热点上监听所有未加密流量,读取 HTTP 请求中的 Cookie、密码等敏感信息。

2. ARP 欺骗(局域网)

攻击者伪造 ARP 应答,将网关的 MAC 地址指向自己
→ 受害者的所有流量先经过攻击者的机器

3. DNS 欺骗 / DNS 劫持

用户访问 bank.com
DNS 返回攻击者控制的 IP(而非真正银行的 IP)
→ 用户连接到假冒的银行网站

4. 恶意代理 / SSL 剥离

类型说明
SSL Stripping攻击者将 HTTPS 链接降级为 HTTP,读取明文数据
恶意代理受害者配置了攻击者的代理服务器,所有流量经过代理

5. 伪造证书(当 TLS 验证被跳过时)

客户端(带 --insecure)
  │  ← [攻击者证书,非服务器证书]
  │  ✓ 跳过验证,接受连接
  │
攻击者(代理转发)
  │  ← [服务器正常证书]
  │
服务器

这就是 --insecure 的核心风险所在。 详见 insecure-到底做了什么?


TLS 如何防御 MITM

TLS 通过 三层防御 阻止 MITM:

防御层机制防什么
身份认证数字证书 + CA 信任链验证防止冒充服务器
加密对称加密(握手时协商密钥)防止窃听数据
完整性MAC(消息认证码)防止篡改数据

关键: 只要 TLS 证书验证未被跳过,MITM 攻击者就无法插入自己,因为:

  1. 攻击者没有服务器的私钥 → 无法冒充服务器完成 TLS 握手
  2. 攻击者自己的证书不会被客户端信任 → 客户端拒绝连接

但是: 如果客户端通过 --insecure 跳过了证书验证(如 curl -khelm login --insecure),上述三层防御全部瓦解 — 攻击者只需提供任意自签名证书即可成功冒充。


真实案例

案例 1:私有仓库自签名证书 + --insecure

开发者在 CI/CD 中配置:
  helm registry login myharbor.com --insecure
  helm push mychart.tgz oci://myharbor.com/project

如果网络路径被劫持:
  攻击者插入自己的证书 → 客户端不验证 → 成功冒充 myharbor.com
  → 攻击者获取推送的 Chart → 注入恶意代码 → 转发到真正仓库

案例 2:公共 WiFi + HTTP 登录页

用户在咖啡馆连接 WiFi,访问 HTTP 页面 → 攻击者直接读取所有明文数据(密码、Token、Cookie)。

案例 3:恶意软件安装伪造根证书

恶意软件将自签名根证书安装到系统信任库 → 对该 CA 签发的所有域名发起 MITM 攻击 → 浏览器不再显示告警。


防御最佳实践

措施说明
始终验证证书永远不要在生产环境使用 --insecure
证书固定(Certificate Pinning)客户端硬编码预期的证书或公钥
HSTS(HTTP Strict Transport Security)强制浏览器始终使用 HTTPS
公钥基础设施(PKI)使用正规 CA 签发的证书
证书透明度(Certificate Transparency)监控是否有证书被误签发
自签名证书的正确方式将 CA 证书添加到系统信任库,而非跳过验证

关联笔记