为什么银行网站的登录页会悄悄变成钓鱼站?因为在 DNS 这一步,答案就已经被掉包了。看懂缓存投毒,才能看懂 DNSSEC 为什么重要。
DNS 劫持/欺骗的核心是让你把域名解析到攻击者指定的 IP:缓存投毒往递归解析器里塞假记录、中间人在链路上篡改响应、恶意路由直接把你导向恶意服务器。传统 DNS 明文无认证,是这类攻击长盛不衰的根源。防护有两层:DNSSEC(RFC 4033/4034/4035)用数字签名验证记录"确实来自权威方且未被篡改";DoH/DoT 加密 DNS(RFC 8484/7858)保护查询内容不被中间人看见和篡改。两者互补:DNSSEC 管"答案真不真",加密 DNS 管"路上看不看得到"。
位置不同、效果相同:你访问的是假网站
递归解析器会把查到的结果缓存一段时间(TTL)以加速后续查询。攻击者若能让解析器把伪造记录写进缓存,之后所有用这台解析器的用户查询该域名,都会被导向攻击者的服务器。经典手法:监听解析器发出的查询,抢先回一个伪造响应,只要事务 ID 对得上,解析器就信以为真。一次投毒,影响整台解析器背后成千上万用户——这就是它危害远大于单点攻击的原因。
在你和解析器之间的网络路径上(公共 Wi-Fi、被入侵的路由器、运营商设备),攻击者直接改写出境查询与入境响应。你以为自己在和正规 DNS 通信,其实每一份答案都经过中间人之手。这类篡改和"DNS 污染"在技术上是同构的,只是动机从内容干预变成了钓鱼牟利。
更直接的方式:改掉你设备或路由器的 DNS 设置,让所有查询都发到攻击者控制的 DNS 服务器(典型如恶意软件篡改 hosts 文件、路由器被入侵后改 DHCP 下发的 DNS)。此时解析结果完全由攻击者说了算,证书警告也能配合伪造网站做得很逼真。
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 安全演进史的一把钥匙。
把攻击方式和对应防护放在一张表里看
| 攻击方式 | 它利用了什么缺陷 | 防护手段 | 规范 / 工具 |
|---|---|---|---|
| 缓存投毒 / Kaminsky | 响应无身份认证,可伪造 | DNSSEC 数字签名验证 + 解析器随机化端口/事务 ID | RFC 4033/4034/4035 |
| 中间人篡改响应 | DNS 报文明文,可被改写 | DoH / DoT 加密传输 + TLS 证书校验 | RFC 8484 / RFC 7858 |
| 窥探查询内容 | 明文暴露你访问的域名 | DoH(443 端口,与网页流量混淆) | RFC 8484 |
| 路由器/设备 DNS 设置被改 | 本地配置无保护 | 改路由器默认密码、开启管理日志、用不可篡改的加密 DNS | 路由器固件 + DoT 客户端 |
| 肉眼难辨假网站 | 钓鱼页伪装逼真 | 核对浏览器地址栏证书、用 dig 对比解析结果 | dig / nslookup |
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,多次结果不一致要警惕。dig 返回与官方公告不符的 IP。用 dig 向多个公共 DNS 对比同一域名的解析结果,配合浏览器证书检查,即可快速识别。