我最近一直在阅读有关 DNS 的文章 cache-poisoning attacks 强>。从本质上讲,它们是可能的,因为攻击者可以猜测 DNS 消息事务 ID,因为它只是一个 16 位整数。即使整数是随机的,一连串的 DNS 数据包仍然有可能在短时间窗口内巧合地匹配 2^16 个数据包中的一个。
因此,第二个安全措施是端口随机化。如果 UDP 源端口是随机的,攻击者将不得不在短时间窗口内猜测两者源端口和事务 ID,这通常是不可行的。但是我读到旧版本的 DNS 软件,例如 BIND 9 之前的版本,没有执行端口随机化,因此很容易受到攻击。
这让我想到了一个问题:大多数 UNIX 操作系统(如 Linux 和 BSD)在 SOCK_DGRAM
时不会自动分配随机端口吗?在没有事先调用 bind
的情况下使用?我认为这就是临时端口的全部想法。为什么应用程序(如 BIND)必须特意执行端口随机化?
我的理解是,从本质上讲,像 Linux 这样的操作系统将具有一系列可供每个进程使用的临时端口。进程可以调用 bind()
将 UDP 套接字绑定(bind)到特定端口。但是如果使用 UDP 套接字(即调用 send
)而不先调用 bind
,操作系统将延迟分配一个随机的临时端口给套接字。那么,为什么旧版本的 BIND 不自动执行端口随机化?
最佳答案
This brings me to the question: don't most UNIX OS's like Linux and BSD automatically assign random ports when a SOCK_DGRAM is used without a prior call to bind? I thought that was the whole idea with ephemeral ports.
临时端口的主要思想不是以安全的方式随机,而是快速选择一些未使用的端口。不同的操作系统使用不同的策略,有些有点随机,有些使用更强的随机生成器,有些甚至以顺序方式分配端口。 这意味着并非在所有操作系统上临时端口都无法预测以用于 DNS。
有关更多详细信息,我建议研究 RFC 6506 “端口随机化建议”和关于端口选择策略的概述 https://www.cymru.com/jtk/misc/ephemeralports.html .
关于c - DNS 安全和端口随机化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29240991/