c-DNS安全和端口随机化



我最近一直在阅读有关DNS缓存中毒攻击的文章。本质上,它们之所以可能,仅仅是因为攻击者可以猜测DNS消息事务ID,因为它只是一个16位整数。即使整数是随机的,一系列DNS数据包仍有可能在短时间窗口内巧合地匹配2^16个数据包中的1个。

因此,第二个安全措施是端口随机化。如果UDP源端口是随机的,攻击者将不得不在短时间窗口内猜测源端口事务ID,这通常是不可行的。但我读到旧版本的DNS软件,如9之前的BIND版本,没有执行端口随机化,因此很容易受到攻击。

这就引出了一个问题:当使用SOCK_DGRAM而不事先调用bind时,大多数UNIX操作系统(如Linux和BSD)难道不会自动分配随机端口吗?我以为这就是短暂港口的全部想法。为什么应用程序(如BIND)必须竭尽全力执行端口随机化?

我的理解是,从本质上讲,像Linux这样的操作系统将有一系列可用于每个进程的临时端口。进程可以调用bind()将UDP套接字绑定到特定端口。但是,如果在不首先调用bind的情况下使用UDP套接字(即调用send),操作系统将延迟地为套接字分配一个随机的临时端口。那么,为什么旧版本的BIND没有自动执行端口随机化呢?

这就引出了一个问题:当使用SOCK_DGRAM而没有事先调用绑定时,像Linux和BSD这样的大多数UNIX操作系统难道不会自动分配随机端口吗?我以为这就是短暂港口的全部想法。

临时端口的主要思想不是以安全的方式随机,而是快速选择一些未使用的端口。不同的操作系统使用不同的策略,有些是随机的,有些使用更强的随机生成器,有些甚至以顺序的方式分配端口。这意味着并非所有操作系统上的临时端口都是不可预测的,足以与DNS一起使用。

关于更多细节,我建议研究RFC 6506";端口随机化建议";以及关于港口选择策略的概述https://www.cymru.com/jtk/misc/ephemeralports.html.

最新更新