一、研究背景
本研究针对当前DNS系统中不存在域名应答多以及否定缓存效率低的问题,开展协议层面的技术改进研究。DNS系统性风险在于大量请求在同一时间空间汇聚,若此类请求成本较低则容易被利用发起攻击。本研究通过发现造成此类低成本请求的原因、改进DNS协议,达到降低DNS系统性风险发生概率的目的。
具体而言,低成本请求是指对DNS发起一个不存在域名的查询请求,该请求会导致一个不存在应答(NXDOMAIN)。相比于庞大的分布式DNS来说,少量NXDOMAIN应答本身并无明显危害。然而,如果大量不存在域名查询请求同时被发起,则表明一种利用NXDOMAIN的分布式攻击正在发生。攻击者通过发送大量对不存在域名的查询来耗尽DNS服务器资源,导致合法用户无法访问互联网服务。对关键DNS节点的攻击甚至可以引发“蝴蝶效应”,造成更大规模的解析故障。
在权威服务器层面,ICANN公布的数据显示NXDOMAIN应答在根服务器上的占比浮动在34%~78%。荷兰国家顶级域名(“.nl”)公布的数据显示,NXDOMAIN响应占比约为8%~15%。当以唯一名称进行统计时,“.nl”区的不存在域名查询量可达1亿次/日,远高于存在域名的查询量600万次/日。在递归服务器层面,Cloudflare(1.1.1.1)公共递归服务报告的NXDOMAIN占比约为5%~12%。奇安信递归报告了约10%~15%的NXDOMAIN流量占比。在中国互联网络信心中心运营的1.2.4.8递归服务商上,我们观测到不存在域名查询占比约为8%,日均不存在域名查询数量均在亿级。
二、重点问题
NXDOMAIN流量可能造成系统性风险的根本原因在于递归服务器无法对不存在域名进行穷举。由于不存在域名查询请求可以被轻易生成且不断变换,因此技术上递归解析器现有的缓存策略无法有效应对这类域名,造成此类流量直接击穿递归解析器缓存,外发至权威服务器,并造成两方面负面影响:其一,递归解析器需要时间成本和网络成本向权威解析服务器发起查询并等待响应;其二,权威解析服务器需要时间成本和计算成本区应答每次查询。

图1
图1展示了一种NXDOMAIN攻击的典型场景,攻击者可控制海量终端设备向受害者权威发起持续性不存在域名查询。在Akamai公布的1份日志数据中显示,当服务器遭受NXDOMAIN攻击时,NXDOMAIN流量平均是正常流量的2~3倍。
抑制NXDOMAIN流量主要存在两方面难点:一是常规流量层面。由于终端软件的错误配置、域名过期等原因,部分设备可能会频繁地查询不存在域名,该方面已有相关研究成果。二是攻击流量层面。目前流量监测防护都是事后介入,方法多为黑白名单,抑制NXDOMAIN攻击效果显著但会造成IP“误杀”。由于DNS是一个开放的问答系统,而攻击流量与合法流量共存,因此限制封禁请求段不是解决问题的最优手段。目前,已知的协议级NXDOMAIN否定缓存效率提升方法主要是RFC 8198(《Aggressive Use of DNSSEC-Validated Cache》)中提出的激进缓存方案(注RFC 8020 《NXDOMAIN:There Really Is Nothing Underneath》也具有重要意义但无法根本解决否定缓存效率问题)。本研基于已有的激进缓存方案,提出进一步改进。改进方案能够在部分应用场景下更好地抑制NXDOMAIN流量,提升否定缓存效率。
三、激进缓存原理
激进缓存(Aggressive Caching,也可译为积极缓存,本文使用激进缓存)方法是由RFC 8198提出,RFC 8198可直译为:积极使用经过DNSSEC验证的缓存。该规范的核心目的在于提升DNS查询效率并减轻权威服务器的负载。它提出了一种基于DNSSEC验证缓存的积极查询响应机制,允许递归解析器直接利用本地缓存过、经过安全验证的NSEC或NSEC3记录,对查询请求生成否定应答,而无需再次向权威服务器发起请求。

图2
图2展示了一个DNS权威区为每一个主机记录生成的NSEC记录,这些NSEC记录首尾相连,形成一个环得以覆盖整个DNS区。具备激进缓存的递归服务器通过缓存上述记录中的最后一条便可知tomato.example.cn不存在于该区。若此4条记录全被缓存,则该区的所有不存在请求均可被递归服务器使用激进缓存技术进行合成。
具体而言,由于NSEC或NSEC3记录这些否定应答记录包含了所请求域名前后的两个距离最近的存在域名,因此可以用来证明两个存在域名之间的域名都不存在。这解决了无法对不存在域名进行穷举这个关键问题。部署了激进缓存的递归解析器能够利用已验证的否定应答记录,直接合成NXDOMAIN或NODATA等否定响应,显著减少了发往权威服务器的查询数量。
(注:RFC 8198于2017年成为正式标准,2018年发布的BIND 9.12版本首次实现了激进缓存技术并被作为了默认开启的配置项。最新的探测研究表明互联网上过半数量的递归解析起具备激进缓存能力。)
四、激进缓存的局限性
技术上来看,NSEC记录名称连续,是激进缓存的最佳搭档。然而正因其名称连续,NSEC记录产生了隐私等问题,导致其部署率在注重隐私的区并不高。NSEC3记录为了提升隐私能力,将记录中的名称进行哈希处理。哈希后的名称离散度高,导致激进缓存的命中几率大幅降低。此外NSEC3的opt-out功能将原本连续的NSEC3环拆分,也导致了激进缓存完全不可用。目前域名量较大的“.com”“.net”区均采用NSEC3并开启了opt-out功能。关于NSEC和NSEC3在激进缓存效率差异上已有公开数据研究。黑色谎言(Black Lies)和白色谎言(White Lies)是基于NSEC记录对隐私进行提升的两种较为相似的技术,这两种技术均改变了原本NSEC记录中的下一个域名名称(Next Owner Name),因此大幅缩小了这个不存在区间,同时也导致激进缓存完全不可用。目前Cloudflare的公共递归服务正在使用该“谎言”技术。以上,激进缓存技术的实际应用受限于多种内外部因素,具有很大局限性。
五、我们的改进思路

图3
图3展示了本研究的改进思路,我们的思路和上述提到的“谎言”思路恰好相反,我们进一步增加否定缓存的区间,使不存在域名请求有更大概率落在否定缓存区间。(目前我国递归解析器普遍没有开启DNSSEC校验,因此普遍处于“无激进缓存的方案”状态)
本研究提出了一种经过重新设计的改进版NSEC,该改进版本的核心点在于能够在单次请求中携带更多的权威区信息至递归。如下图左侧所示,传统的NSEC记录中,包含了所有者名称(Owner Name)和下一个所有者名称(Next Owner Name),这意味着具备激进缓存能力的递归能够合成所有者名称和下一个所有者之间的名称,因为这两个名字之间没有其他子域。在改进版NSEC中,仍然包含了两个所有者名称,区别在于改进版的NSEC中这两个名称之间跨越了多个存在的域名名称,这就相当于一次请求返回多个传统NSEC,但这样做会将DNS响应的网络开销升高。因此,在改进版NSEC中,我们使用了一种概率性数据结构将两个所有者名称之间的多个名称进行存储,然后作为NSEC记录的数据段进行传输。

图4
图4简要展示了改进版的NSEC的结构简图,核心改进在于使用一个NSEC记录携带更多信息。
该改进具有以下特性:
隐私保护:概率性数据结构提供了单向哈希和有损压缩机制,可防止区域内容直接暴露。相比NSEC3而言,概率性数据结构使得枚举操作依赖于在线查询,攻击成本升高。
确定性:若查询名称不存在于概率性数据结构中,则必定不在区域中。这是概率性数据结构自身特性所决定的,这个特性配合DNSSEC校验可以用于验证所请求域名的不存在性。
低开销:概率性数据结构的成员查询操作仅涉及少量哈希运算,计算复杂度是O(1)。相比于在线签名技术,该改进不会为递归造成显著的性能开销。同时,在递归的运算开销要比向上游权威服务器查询更快。
六、改进方案效果验证
在验证阶段,本项目分别在方案提出前期进行了理论仿真验证,随后对方案进行了细致设计和实现,最后使用真实区数据进行了模拟。整个验证阶段主要关注三个指标:解析器与权威服务器间的网络流量;解析器缓存命中率;资源利用率。
首先本研究对改进版方案进行了仿真模拟(见图5)。模拟结果显示扩大否定区间能够帮助递归解析器快速构建NSEC环,即在递归解析器可以快速学习到权威区的所有存在域名信息。

图5
该测试中,模拟权威区具有10000个子域名,模拟向递归连续查询5000个不存在的子域名。该仿真模拟了递归外发次数占查询次数的比例,每个统计点选取最近的50次结果作为统计输入。
模拟仿真的有效性促使我们基于BIND 9.18.27进一步验证了改进方案,结果显示改进版的NSEC能够大幅、快速降低递归和权威之间的NXDOMAIN流量(见图6)。

图6
测试区包含10万个机器生成的域名,NSEC的TTL被设置为60秒。该测试针对此区向递归持续发送不存在子域名查询,模拟5分钟的NXDOMAIN攻击。该测试记录了递归和权威之间的流量比例。
此外,为了能够更加真实反映出实际注册域名名称对实验的干扰,本研究在实验中加载“.net”区的真实区文件数据(约1200万域名),分别使用NSEC、NSEC3、改进版NSEC进行DNSSEC签名(见图7)。测得改进版的NSEC能够在缓存数量较低时实现远高于NSEC和NSEC3的否定缓存命中率,该实验结果对于改进版NSEC的有效性具有重要意义。

图7
该测试在权威加载“.net”区数据,在递归发起随机域名查询。该测试记录了递归服务器的否定缓存数量,并观测了不同数量下的否定缓存命中率(即激进缓存的合成率)。
最后,本研究对改进方案的开销进行了验证,改进方案由于减少了NSEC记录的生成,因此能够大幅减少大区DNSSEC签名后的文件大小,这对大区的运维至关重要。改进方案小幅度增加了递归处理单次请求的时间,响应的可能降低递归服务的QPS能力,但是这相对于NXDOMAIN攻击带来的负面影响是可以忽略的。后续,递归也可以有策略地开启和关闭改进方案相关功能,以寻求安全和性能间的平衡。

表1
表1展示了改进方案的部分性能测试数据,数据具体含义和测试背景不在本文中具体解释。
七、总结
本研究提出了一种创新的否定缓存机制,通过改进的NSEC记录提升否定缓存命中率。该方案显著增强了激进缓存策略的有效性,并针对类NXDOMAIN攻击提供了更强有力的防御。本研究的核心创新在于利用概率型数据结构扩展NSEC记录中所有者名称之间的间隔,从而实现更高效的否定响应合成。本研究所提的解决方案只需对区域内更少的否认记录进行签名,既保护了隐私又减少了区域文件大小。实验结果表明,与传统NSEC相比,改进的NSEC记录能有效减少递归解析器对NXDOMAIN查询的外发流量。
作者简介:左拔山,中国互联网络信息中心技术发展所。
编辑:芦笛(中国互联网络信息中心创新业务所)

被折叠的 条评论
为什么被折叠?



