DNS重绑定攻击为何难以彻底防御
服务端请求伪造风险怎么排查:从外部链接抓取到出站访问控制
DNS 重绑定攻击之所以难以彻底防御,根源在于它精准地击中了应用层校验与网络层访问控制之间的结构性缝隙。攻击者利用的是“域名解析结果随时间变化”这一 DNS 协议的固有特性:应用层在请求发起前校验域名,得到的解析结果是公网 IP,校验通过;而当客户端真正建立连接时,攻击者控制的 DNS 服务器再次解析,返回内网 IP。两次解析结果不一致,导致所有基于“先校验后连接”思路的防御措施都天然存在一个时间窗口漏洞。
这一攻击手法之所以特别棘手,是因为它绕过了绝大多数常规的输入校验逻辑。许多团队在防御 SSRF 时,习惯于在应用层对用户提交的 URL 做格式校验、域名黑名单或 IP 段过滤。但 DNS 重绑定攻击根本不依赖 URL 格式的变形,也不需要匹配到内网 IP 的字符串。攻击者只需要一个自己控制的域名,让该域名在首次解析时返回公网地址,在连接阶段切换为内网地址即可。这意味着,任何只校验用户输入的字符串、而不校验实际连接目标 IP 的方案,都会被轻松绕过。
更麻烦的是,即使防御方意识到了需要做“二次校验”,即在实际发起请求前重新解析一次域名并检查解析结果,仍然无法彻底封堵。因为攻击者可以精确控制 DNS 响应的切换时机,让防御方的第二次解析仍然拿到公网 IP,而客户端实际建立 TCP 连接时却拿到内网 IP。这种“两次解析都合法、连接时非法”的攻击方式,让单纯依赖解析结果校验的方案变得不可靠。这也是为什么业内普遍认为,应用层的 DNS 解析校验只能作为降低风险的辅助手段,而不能作为唯一的防线。
真正能够有效对抗 DNS 重绑定的,是网络层的出站访问控制。因为无论 DNS 解析结果如何变化,最终的 TCP 连接请求总是要经过服务器的网络协议栈。如果在防火墙或安全组层面默认拒绝服务器访问内网保留段、回环地址和云元数据地址,那么即使攻击者成功让域名解析到了内网 IP,连接请求也会被网络层直接阻断。这种防御方式的优势在于,它不依赖应用层对域名和 IP 的判断,而是从网络层面强制划定服务器可访问的边界,从根本上缩小了攻击的触达范围。
然而,网络层控制也并非一劳永逸。它面临的主要挑战是业务适配问题:很多合法业务确实需要服务器访问外部 URL,而严格的出站限制可能导致正常功能受损。例如,某些第三方回调的 IP 会变化,过严的白名单会导致回调失败;链接预览功能如果限制了域名,用户分享的合法链接可能无法生成预览。因此,网络层控制需要在安全与业务可用性之间取得平衡,通常需要配合灰度发布、日志审计和快速回滚机制来落地。
综合来看,DNS 重绑定攻击难以彻底防御的根本原因,在于它利用了协议特性而非应用漏洞,并且攻击链横跨应用层与网络层两个层面。单靠任何一层的防御都必然存在盲区:应用层无法预知连接时刻的解析结果,网络层则难以在保证业务灵活性的同时做到完全封闭。务实的防御思路是分层设防:应用层做域名白名单和解析结果校验以减少误报,网络层做强制出站控制以兜底阻断,再辅以出站请求日志和异常告警来发现绕过行为。三者配合,才能将 DNS 重绑定攻击的实际危害控制在可接受的范围之内。

参与讨论
原来这攻击是卡在两次解析不一致上,难怪光靠校验域名没用