c - DNS 安全和端口随机化

标签 c linux security dns udp

我最近一直在阅读有关 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/

相关文章:

c - ipv6迁移的副作用

c - 程序要求用户输入文本文件,然后用相同长度的单词替换单词

linux - 用于在 Linux 上监视磁盘 i/o 速率的脚本

Python 套接字连接在 Ubuntu 16.04 上每 9 个连接延迟一秒

oracle - 确定使用 Oracle utl_http 执行 https post 需要哪个证书

android - 如何在移动应用中实现高安全性?

c - Alpha Blending C 中的 2 种 RGBA 颜色

c++ - 如何使用 'C' 或 'C++' 创建独立的 Windows 程序或应用程序

c - 使用 NCurses 获取 CTRL 字符

http - 是否使用 https 执行登录,但随后 http 中的所有内容都毫无意义?