【发布时间】:2015-03-24 19:14:03
【问题描述】:
我最近一直在阅读有关 DNS cache-poisoning attacks 的内容。本质上它们是可能的,因为攻击者可以猜测 DNS 消息事务 ID,因为它只是一个 16 位整数。即使整数是随机的,一连串的 DNS 数据包仍然有可能在短时间内巧合匹配 2^16 个数据包中的 1 个。
所以第二个安全措施是端口随机化。如果 UDP 源端口是随机的,攻击者将不得不在短时间内猜测 both 源端口 和 事务 ID,这通常是不可行的。但我了解到,旧版本的 DNS 软件(例如 9 之前的 BIND 版本)没有执行端口随机化,因此很容易受到攻击。
这让我想到了一个问题:当使用SOCK_DGRAM 而没有事先调用bind 时,大多数 UNIX 操作系统(如 Linux 和 BSD)不会自动分配随机端口吗?我认为这就是使用临时端口的全部想法。为什么应用程序(如 BIND)必须不遗余力地执行端口随机化?
我的理解是,从本质上讲,像 Linux 这样的操作系统将具有一系列可用于每个进程的临时端口。进程可以调用bind() 将UDP 套接字绑定到特定端口。但是,如果使用 UDP 套接字(即调用 send)而没有先调用 bind,则操作系统会懒惰地为套接字分配一个随机的临时端口。那么,为什么旧版本的 BIND 没有自动执行端口随机化?
【问题讨论】: