摘要

  • Kaminsky 型投毒不断诱发全新的域名查询,让离路径攻击者一次次重开竞速:猜中未决查询的参数,并赶在真实权威响应之前把伪造数据送进缓存。
  • 2008 年的协同补丁没有认证 DNS 数据,而是把不可预测的事务 ID 和逐查询源端口加入本地接受边界;这份熵还必须穿过防火墙和 NAT,并在真实线路上接受验证。

缓存相信的是第一个合格报文

递归解析器通常通过无签名的 UDP 向权威服务器提问。普通响应本身没有提供密码学身份证明,解析器只能检查它是否对应一笔确实发出的、仍在等待答案的查询。

RFC 5452 后来把边界写得很清楚:回复中的问题区必须等同于未决查询,事务 ID 必须相同,源地址必须是被询问的服务器,响应还必须回到查询发出时使用的地址和端口。一般而言,第一个满足这些条件的响应会被接受。

离路径攻击者看不到真实查询,却可以伪造权威服务器的源地址,批量发送不同候选响应。只要其中一个碰巧匹配,并先于真实报文到达,缓存就会把伪造数据继续提供给客户端。网页、邮件以及依赖域名的其他服务都可能因此被导向错误主机。

这并不等于攻击者接管了整个 DNS。它取得的是某个缓存对特定名字、特定记录和有限存活期的有效控制。正因为范围有限,防御也必须拆开看:谁能触发递归、回复应匹配哪些字段、哪些附带数据属于权威范围、猜测空间有多大,以及是否存在签名证明。

一次失败不再意味着等待 TTL

缓存投毒并非 2008 年才出现。RFC 3833 在 2004 年已经描述 ID 猜测、查询预测和名字链攻击。DNS 事务 ID 只有 16 位,一些实现的随机数质量还更差;固定 UDP 源端口则完全没有增加新的未知量。

Dan Kaminsky 展示的关键,是如何把这些已知弱点组合成可持续的机会。攻击者诱导解析器查询目标域名之下一个从未出现的随机标签。缓存没有答案,解析器便必须向权威服务器发起新查询。伪造响应随即与真响应竞速。猜错之后,换一个随机标签又能开启下一局。

随机子域名只是触发器,不一定是攻击收益。伪造响应可以试图写入影响父域的委派信息,能否成功还受相关性与 bailiwick 规则约束。攻击者因此不必等目标记录自然过期,而是自己制造缓存未命中。

RFC 5452 把某些重复投毒手法的有效 TTL 视为接近零。在每秒 7,000 个伪造报文、只有一个源端口的模型里,它计算出约七秒即可达到 50% 成功概率。这个数字不是所有网络的实测时长。它说明的是控制结构:当每次尝试都便宜且可重开时,小概率很快会累积成现实风险。

补丁给接受边界再加一只刻度盘

紧急修复扩大了攻击者必须猜中的组合。解析器不再长期复用一个 UDP 端口,而是逐查询选择不可预测的源端口,同时使用更强的事务 ID。端口由此成为额外的本地标识。

RFC 5452 估算,若有效端口池约有 64,000 个,搜索空间就会相应扩大。在同一个每秒 7,000 包的重复模型里,50% 成功点从约七秒推迟到约 116 小时。CERT/CC 说这在原理上接近增加 16 位随机性,同时提醒保留端口和已占用端口会缩小实际集合。

这项缓解能迅速部署,因为它没有改变 DNS 报文格式。权威服务器本来就会向查询来源端口作答。供应商可以修改实现,运营者可以分别升级,不必等全球在同一日期切换新协议。

代价并非为零。ISC 警告,最初的 BIND 补丁在每秒查询量达到约 10,000 以上时可能带来明显性能影响,并另外提供优化的测试分支。只允许从源端口 53 发出 DNS 的防火墙规则需要调整;有状态中间设备也要承担更多映射。

因此,补丁不是消灭工程问题,而是用更复杂的套接字和状态管理换掉过于可预测的竞速。这个交换可以本地执行、度量和回滚。

主机产生的熵可能死在下一跳

软件清单可以显示“已修补”,但外部看到的端口仍可能高度规律。NAT/PAT 会改写源端口。CERT/CC 指出它可能削弱甚至清空补丁收益;RFC 5452 特别警告会串行分配或严格限制 UDP 端口的设备。

这不表示每一台 NAT 都有害。不同映射策略可能保留、减少,甚至增加外部观察到的变化。真正需要审计的是完整路径:攻击者要猜的不是解析进程最初选择的端口,而是经过主机、防火墙和转换之后真正上网的那个值。

DNS-OARC 的端口与事务 ID 测试把这件事变成可见证据。解析器向受控权威端点发出查询,对方回报实际收到的值及其分布。运营者不再只能从版本号推断,而能观察安全属性是否抵达线路边界。

这正是“运行代码优先”的具体含义。公告描述设计意图,包管理器证明某个文件被安装,只有真实流量才能证明周围系统没有把防御重新压扁。

多厂商同步发布不是中央命令

DNS-OARC 的时间线记载,2008 年 3 月 31 日各方在微软办公室举行 DNS 峰会。7 月 8 日,CERT/CC 发布 VU#800113,多家供应商同步推出更新。ISC 修补 BIND;微软增强事务 ID、随机 UDP 套接字和缓存逻辑;其他厂商各自维护自己的实现。

原定保密期没有坚持到公开说明。DNS-OARC 记录 7 月 21 日细节事实上泄露,23 日出现可运行利用代码,24 日又有新的实现。微软 25 日的公告称公开知识与代码提高了威胁;同时说明其当时不知道有活跃攻击或客户影响,并确认已安装 MS08-037 的系统不受其测试的公开利用影响。

这些陈述不能混成“没有攻击”。公开代码提升了能力;单一厂商观察范围内没有已知事件,不等于全球没有利用。某一补丁挡住某个公开样本,也不是对全部解析器与中间盒组合的认证。

Kaminsky 于 8 月 7 日在 Black Hat 公开完整机制。RFC 5452 到 2009 年 1 月才发布。顺序很重要:可兼容的运行补丁先提供紧急防御,标准文件随后把接受匹配与不可预测性写成共同规则。文件总结了经验,却没有让七月的代码自动落地。

提高谎言成本不等于认证答案

端口随机化显著降低了离路径伪造包命中过滤器的概率,却没有证明无签名数据来自被委派的区域权威。猜测次数、泄露状态、中间盒压缩,或攻击者进入路径,都可能改变胜算。

ISC 因而把 DNSSEC 称为最终方案,同时承认当时不现实地要求立即全面部署。DNSSEC 通过签名和信任链验证数据来源与完整性。这与“让无签名竞速更难赢”是不同的安全属性。

两层并不冲突。严格匹配和端口熵能在执行昂贵验证之前排除大量垃圾响应;DNSSEC 决定内容是否携带授权证明。两种控制都不应冒充另一种控制。

Heng Lu 的“最小初始规范”适合划出共同层:要求响应精确对应未决查询,并维护必要的不可预测性,但不把某家供应商的随机数算法、套接字分配器和上线日历写成全球权力。后续选择留给运行系统的参与者,是否采用则由可观测行为证明,而不是由公告宣布。

证据边界

现有记录支持“多厂商暴露”和“攻击显著变得实用”,却不能证明所有解析器走同一缺陷路径、所有运营者在 7 月 8 日升级,或七秒和 116 小时适用于任意网络。端口随机化在明确假设下大幅提高离路径攻击成本,但没有消除所有投毒。DNSSEC 提供认证机制,其规范存在也不等于真实解析器已经验证。

更精确的结论已经足够有力:DNS 信任的一部分依赖一场狭窄竞速,而很多系统无意中压缩了其中的未知量。修复把未知量扩大、暴露给测量,并把密码学认证保留为另一项必须部署的工作。

来源