【问题标题】:DNS security and port randomizationDNS 安全性和端口随机化
【发布时间】: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 没有自动执行端口随机化?

【问题讨论】:

    标签: c linux security dns udp


    【解决方案1】:

    这让我想到了一个问题:当使用 SOCK_DGRAM 而没有事先调用绑定时,大多数 UNIX 操作系统(如 Linux 和 BSD)不会自动分配随机端口吗?我认为这就是使用临时端口的全部想法。

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

    有关更多详细信息,我建议您研究RFC 6506“端口随机化建议”和https://www.cymru.com/jtk/misc/ephemeralports.html 上有关端口选择策略的概述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      相关资源
      最近更新 更多