DNS 缓存投毒是攻击者向解析器塞入伪造的域名解析结果,让解析器把错误的地址缓存下来,用户随后被导向错误网站。2008 年安全研究员丹·卡明斯基发现的方法让这类攻击一度极易成功,推动了域名系统安全措施的升级。
第 25 期介绍过,解析器会把域名解析结果缓存一段时间。缓存投毒针对的就是这个缓存:攻击者向解析器发送伪造的解析响应,抢在真实响应到达之前让解析器接收,解析器随后把这个错误结果缓存下来,在一段时间内把访问该域名的用户都导向攻击者指定的地址。
早期这类攻击并不容易,因为攻击者需要猜中查询消息里的事务 ID 等字段。2008 年,安全研究员丹·卡明斯基(Dan Kaminsky)公开了一种新方法,利用当时事务 ID 空间较小的缺陷,大幅降低猜测难度,让攻击者能在较短时间内污染缓存。这种方法让缓存投毒从理论威胁变成现实风险,业内因此紧急修补。
此后的防护主要有两条。一是加大随机性:解析器把事务 ID 和源端口都随机化,增大攻击者猜测的难度;二是部署域名系统安全扩展(DNSSEC),对解析结果做数字签名,让解析器能够验证响应是否被篡改。如今主流解析器都已随机化端口和事务 ID,DNSSEC 的部署也在逐步推进。