DNS 安全 · 攻击与防护

DNS 劫持与欺骗
攻击方式与防护全景

为什么银行网站的登录页会悄悄变成钓鱼站?因为在 DNS 这一步,答案就已经被掉包了。看懂缓存投毒,才能看懂 DNSSEC 为什么重要。

缓存投毒污染解析器缓存
Kaminsky2008 年著名漏洞
DNSSECRFC 4033/4034/4035
加密 DNSDoH / DoT 加持
TL;DR · 核心结论

DNS 劫持/欺骗的核心是让你把域名解析到攻击者指定的 IP:缓存投毒往递归解析器里塞假记录、中间人在链路上篡改响应、恶意路由直接把你导向恶意服务器。传统 DNS 明文无认证,是这类攻击长盛不衰的根源。防护有两层:DNSSEC(RFC 4033/4034/4035)用数字签名验证记录"确实来自权威方且未被篡改";DoH/DoT 加密 DNS(RFC 8484/7858)保护查询内容不被中间人看见和篡改。两者互补:DNSSEC 管"答案真不真",加密 DNS 管"路上看不看得到"。

Attack Vectors

三类常见攻击方式

位置不同、效果相同:你访问的是假网站

1. DNS 欺骗 / 缓存投毒(Cache Poisoning)

递归解析器会把查到的结果缓存一段时间(TTL)以加速后续查询。攻击者若能让解析器把伪造记录写进缓存,之后所有用这台解析器的用户查询该域名,都会被导向攻击者的服务器。经典手法:监听解析器发出的查询,抢先回一个伪造响应,只要事务 ID 对得上,解析器就信以为真。一次投毒,影响整台解析器背后成千上万用户——这就是它危害远大于单点攻击的原因。

2. 中间人篡改(MITM on DNS)

在你和解析器之间的网络路径上(公共 Wi-Fi、被入侵的路由器、运营商设备),攻击者直接改写出境查询与入境响应。你以为自己在和正规 DNS 通信,其实每一份答案都经过中间人之手。这类篡改和"DNS 污染"在技术上是同构的,只是动机从内容干预变成了钓鱼牟利。

3. 恶意路由与设置篡改

更直接的方式:改掉你设备或路由器的 DNS 设置,让所有查询都发到攻击者控制的 DNS 服务器(典型如恶意软件篡改 hosts 文件、路由器被入侵后改 DHCP 下发的 DNS)。此时解析结果完全由攻击者说了算,证书警告也能配合伪造网站做得很逼真。

Case Study

Kaminsky 攻击:缓存投毒的巅峰案例

2008 年披露的漏洞,让整个互联网连夜升级 DNS 软件

2008 年安全研究员 Dan Kaminsky 公布了一个影响深远的 DNS 缓存投毒方法。此前的投毒只能针对单个域名,且要赶在真实响应之前猜中 16 位事务 ID,成功率低。Kaminsky 的思路是:随机向目标域查询大量不存在的子域名(如 zz123.example.com),每次查询都会触发解析器去问 example.com 的权威服务器;攻击者同时高速回送海量伪造响应,拼命猜事务 ID。一旦某一次猜中,伪造包里夹带的不只是这个子域名的答案,还能附带"example.com 的权威服务器是我控制的 ns.attacker.com"——从此整个 example.com 域的所有记录都被攻击者接管。

这个漏洞之所以震动业界,是因为它把"猜中一次"的收益从单个 IP 扩大到整个域,而且攻击可自动化、成功率随尝试次数线性提升。修复方案包括:随机化查询源端口(扩大攻击所需的猜测空间)、严格校验响应字段,以及从根上推 DNSSEC。今天主流递归解析器(Unbound、BIND、dnspod 等)都已默认具备这些防护,但理解 Kaminsky 仍是理解 DNS 安全演进史的一把钥匙。

Defense

防护手段:DNSSEC + 加密 DNS 双管齐下

把攻击方式和对应防护放在一张表里看

攻击方式它利用了什么缺陷防护手段规范 / 工具
缓存投毒 / Kaminsky响应无身份认证,可伪造DNSSEC 数字签名验证 + 解析器随机化端口/事务 IDRFC 4033/4034/4035
中间人篡改响应DNS 报文明文,可被改写DoH / DoT 加密传输 + TLS 证书校验RFC 8484 / RFC 7858
窥探查询内容明文暴露你访问的域名DoH(443 端口,与网页流量混淆)RFC 8484
路由器/设备 DNS 设置被改本地配置无保护改路由器默认密码、开启管理日志、用不可篡改的加密 DNS路由器固件 + DoT 客户端
肉眼难辨假网站钓鱼页伪装逼真核对浏览器地址栏证书、用 dig 对比解析结果dig / nslookup

DNSSEC 到底防什么、不防什么?

DNSSEC 的思路是给 DNS 记录加上数字签名:权威服务器用私钥对记录签名,解析器用从根开始逐级下发的公钥链验证——响应一旦在途中被篡改,签名校验立即失败,解析器会拒绝使用这条记录(RFC 4033 定义整体框架,RFC 4034 定义 DNSKEY/RRSIG/NSEC 等记录,RFC 4035 定义验证流程)。它解决的是"答案是不是权威方给的、有没有被改过"。但请注意:DNSSEC 不加密查询内容——你查了哪些域名,链路上仍然看得见;它也不阻止你连到一个恶意的解析器。所以防窃听、防中间人窥探仍要靠 DoH/DoT(配置方法见 Cloudflare DoT 文档)。生产环境的正确姿势是:DNSSEC 验证 + 加密传输一起上。

个人怎么自查?

  • 重要网站(银行、邮箱、支付)登录前,先看浏览器地址栏证书是否有效、域名是否拼写正确。
  • 用 dig @223.5.5.5 域名 与 dig @1.1.1.1 域名 对比返回 IP,多次结果不一致要警惕。
  • 把系统 DNS 换成加密端点(DoH/DoT),并确认路由器管理密码不是默认值。
FAQ

常见问题

什么是 DNS 缓存投毒?+
缓存投毒(DNS cache poisoning)指攻击者向递归解析器注入伪造记录,使解析器把某域名缓存到恶意 IP。由于缓存会服务大量下游用户,一次成功投毒可让成千上万用户被引导到钓鱼站。它利用了传统 DNS 响应无身份认证的缺陷。
Kaminsky 攻击是怎么回事?+
2008 年披露的 Kaminsky 攻击利用 DNS 查询的事务 ID 竞争:攻击者大量随机查询目标域的不存在子域名,同时高速回送伪造响应猜事务 ID,一旦猜中就把伪造的权威服务器记录塞进缓存,进而污染整个域。修复方式是随机化源端口与事务 ID,并推动 DNSSEC 部署。
DNSSEC 能防住 DNS 劫持吗?+
DNSSEC(RFC 4033/4034/4035)通过数字签名给 DNS 记录做身份背书:解析器用公钥链验证响应确实来自权威方且未被篡改。它防的是“记录被伪造/篡改”,但不加密查询内容、也不能防你自己连到恶意解析器——防窃听仍需 DoH/DoT。
普通用户怎么发现自己被 DNS 劫持了?+
警惕信号:访问银行/邮箱/电商域名却弹出证书警告、页面被换成陌生登录框、dig 返回与官方公告不符的 IP。用 dig 向多个公共 DNS 对比同一域名的解析结果,配合浏览器证书检查,即可快速识别。
开了 DoH/DoT 还需要 DNSSEC 吗?+
需要,两者防护层面不同。DoH/DoT 加密的是"你到解析器"这一段传输,防止路上被窃听篡改;DNSSEC 验证的是"记录本身是否权威、是否被改"。即使加密传输,解析器返回的记录理论上仍可能来自被污染的权威源,DNSSEC 补上了这一环。
References

参考来源