![DNS 缓存中毒和事务 ID](https://linux22.com/image/760888/DNS%20%E7%BC%93%E5%AD%98%E4%B8%AD%E6%AF%92%E5%92%8C%E4%BA%8B%E5%8A%A1%20ID.png)
我读了很多关于它的文章,我不明白缓存中毒是如何发生的,如果:
- 如果响应的交易 ID 不匹配,则查询将被取消并标记为失败(即攻击者无法强行破解交易 ID,因为只有第一个响应才会被接受)
- 递归解析器每次只针对同一个域/类型/类别发送 1 个请求,这意味着攻击者无法针对同一个域触发多个请求来暴力破解交易 ID
在看起来很基本的配置中,如果攻击者需要猜测交易 ID,那么如何进行缓存中毒?攻击者是否会强迫递归解析器一次又一次地解析同一个域以进行更多尝试?在这种情况下,这可能需要几个小时……
答案1
主要是你的第一个要点不准确:
- 如果响应的交易 ID 不匹配,则查询将被取消并标记为失败(即攻击者无法强行破解交易 ID,因为只有第一个响应才会被接受)
当收到未知的交易 ID 时,该响应将被丢弃。但您认为未完成的查询以某种方式被视为失败的假设是不正确的。
实际上,这种攻击场景变成了一场竞赛,攻击者争相在真实名称服务器的响应到达之前获得有效的响应。
您的假设存在问题,即事务 ID(+ UDP 源端口)的整个目的是将响应与未完成的查询进行匹配,但是当响应中的这些值错误(与任何查询都不匹配)时,您如何判断应该将哪个查询视为失败?
如果您要允许某种形式的部分匹配,您将如何实现它,而不会用可轻松利用的 DoS 攻击取代对攻击者来说有点繁重的竞争?
“真正”保护的选项:
- DNSSEC 允许查询发起者验证响应中记录的真实性,从而确保攻击者生成的响应不会被签名区域中的名称接受。
- 对于从某种形式的客户端/转发器到解析器服务器的查询,DoT 和 DoH 还可以避免缓存中毒问题对于这个特殊的“跳跃”(DoT/DoH 仅保护两个主机之间的通信通道,DNS 解析往往有多个这样的“跳跃”)。
(即使只是通过 TCP 进行查询也可以改善问题中的特定场景,但基于加密的解决方案在处理的攻击方面显然要广泛得多。)