为什么 TCP 比 UDP 更安全?

信息安全 tcp UDP
2021-08-23 09:43:49

在阅读 MS SDL(Microsoft 安全开发生命周期)演示文稿时,我发现了在应用程序中用 TCP 替换 UDP 的建议,因为 TCP 比 UDP 更安全。但它们都只是传输层,仅此而已。

那么为什么 TCP 比 UDP 更安全呢?

4个回答

要使用 TCP 向应用程序发送数据,您首先必须建立连接。在建立连接之前,数据包只能到达操作系统层,而不是应用程序。建立连接要求您将数据包接收回发起端。如果你想伪造一个不在你自己网络上的IP地址并建立一个TCP连接,你需要能够拦截对方发出的数据包。(您需要“介于”端点之间,以及发送到伪造 IP 地址的数据包通常会去哪里,或者做一些其他巧妙的路由技巧。)

UDP 没有连接,因此您可以伪造具有任意 IP 地址的数据包,它应该可以到达应用程序。当然,除非你在正确的“地方”,否则你仍然不会取回数据包。这是否重要取决于您在应用程序中设置的安全性。如果您在应用程序中比其他 IP 地址更信任某些 IP 地址,这可能是个问题。

所以从这个意义上说,TCP 比 UDP 更“安全”。根据应用程序,这可能与安全性相关,也可能不相关。就其本身而言,用 TCP 代替 UDP 并不是一个很好的理由,因为这两个协议之间还涉及其他权衡。

普通 UDP 不保持状态、握手等。这意味着攻击者可以轻松发送欺骗数据包,除非在其他层有保护。

另一方面,发送欺骗性 TCP 数据包需要攻击者猜测已建立连接的序列号和客户端端口。

TCP 并不比 UDP 更安全,它更“可靠”,因为它是有状态的并且需要确认每个段。UDP 是无状态的,只是在不知道客户端是否获取它们的情况下发送段。

两者都没有其他人没有的任何定制的安全功能,差异取决于每个协议的不同要求,任何感知到的安全优势在功能上都是协议的副产品,而不是故意的安全功能。

编辑:UDP 和 TCP 有特定用途,这些用途都与安全性无关。

两种协议都依赖于其他协议来提供安全性。因此,尽管 TCP 可能具有稍小的攻击面,但这对于保护您需要面向安全的协议来说真的无关紧要。协议,例如 DTLS 或 googles QUIC。

选择为更适合 UDP 的用例实现 TCP,而不是正确保护 UDP(TCP 在大多数用例中也需要保护),就像使用 9 号铁杆进行推杆一样,因为您认为 9 号铁杆将是在战斗中保护自己的更好武器......当你口袋里有枪时。

TCP 比 UDP 更安全吗?

是的,但是当我们谈论“安全”时,我们必须非常清楚我们在谈论什么,而不是将这个陈述推广到上层协议。

目前,安全通常与CIA三元组相关联:

  • 保密
  • 诚信
  • 一种可用性。

IP 协议的第 4 版,现在仍然是最常用的,是 70 和 80 年代开发的非常古老的野兽。

那时,机密性并不是真正的主题,真正的目标是实现完整性和可用性(Arpanet 网络,诞生 IP 协议的互联网的祖先,旨在确保服务的连续性,即使在发生核战争,不保护在途数据)。

在这种光纤中,在 IP 层上开发了两种传输协议:TCP 和 UDP。

TCP 是一种旨在确保完整性可用性属性的协议。它包括当时的高级技术,例如三次握手、参数协商、各种连接状态处理、透明数据包重新排序、确认窗口和重试机制。这为发送者提供了良好的保证,即它发送的数据已经以完整的未损坏形式(即没有丢失、更改或无序的部分)被接收。

请注意,该协议的目标是技术灾难,而不是对传输中数据的恶意篡改。这样的问题在当时完全超出了范围。

相反,UDP 被设计为一种快速协议。它没有上述任何功能,因此也没有任何开销。特别是,当发送方使用 UDP 发送一些数据时,接收到的数据可能不完整、无序或根本没有接收到:UDP 协议本身并没有提供任何机制来防止或检测发送方或接收方的这种情况。

这样,在关注安全性的数据完整性和可用性属性时,TCP 确实比 UDP 更安全。

依赖 TCP 的应用协议是否比依赖 UDP 的应用协议更安全?

当然不是。

这仅意味着开发依赖于 UDP 的应用程序协议的人将有更多的工作,因为他们可能必须在他们的应用程序协议中实现 UDP 协议中缺少的功能的变通方法。他们必须考虑到发送的数据可能不一定会被接收,接收到的数据可能没有按正确的顺序等等。这些都是众所周知的问题。

例如,OpenVPN,虽然它支持 TCP 主要是为了与限制性防火墙兼容,但默认运行并且在 UDP 上运行最好。将其切换到 TCP 是可能的,但不会以任何方式增加其安全性,因为两个传输层协议 UDP 和 TCP 之间的差异完全由 OpenVPN 本身处理。将其切换到 TCP 只会增加 OpenVPN 协议的 TCP 开销,从而降低其性能。

TCP比UDP好吗?

不,这完全是一个应用程序协议设计选择。

UDP 是一种更原始​​的协议。如果使用得当且谨慎,它可能会获得比 TCP 更好的性能,但代价是应用协议的开发和维护更加困难。

  • 当应用程序对时间不敏感时,TCP 将自己作为自然选择,因为不需要重新发明轮子。
  • 当应用程序对时间敏感时,必须讨论选择哪一个,知道每个都有其缺点:使用 TCP 的潜在性能损失与使用 UDP 的肯定更复杂的应用程序相比。

大多数协议对时间不敏感,因此 TCP 是使用最广泛的协议。确实,当您加载网页或接收电子邮件时,早晚 10 毫秒收到它并没有什么区别。

除了前面提到的 OpenVPN 之外,使用 UDP 的两个经典协议示例是媒体流和 DNS。

使用媒体流,您并不关心是否缺少一个视频帧或几毫秒的视频或音频,只要视频或音频流畅且同步地播放即可。在这种情况下,您不想因为 TCP 检测到丢失的数据包并要求发送方重新发送最后一个确认窗口的内容而导致重复暂停。

使用 DNS,请求和响应通常非常短,您希望名称解析过程尽可能快(请注意,较长且时间敏感度较低的响应,例如 DNS 区域传输通常仍然发生在 TCP 上)。与为每个请求处理完整的三向握手相比,在请求或其答案丢失的极少数情况下将名称解析请求重新发送到 DNS 服务器更快。

机密性和恶意嗅探/篡改(和 IPv6)呢?

到目前为止,我们所关心的只是,本着旧 IPv4 的精神,传输速度和数据完整性 + 可用性之间的平衡。现在,如果我们想在此之上添加机密性,我们可以这样做,但必须在应用层完成,如前所述,IPv4 不关心机密性问题。

一个现代的、成熟的安全实现可以在应用层实现,并且依赖于 TCP 或 UDP(或两者)协议,而不会对应用协议安全本身产生任何影响(参见上面的 OpenVPN 示例)。

然而,正如开头所说,IPv4 确实来自另一个计算时代。它的后继者是 IPv6,它在 IP 层原生支持 IPSec,从而在 UDP 和 TCP 等传输协议之下提供更现代的安全服务。

这允许将传输中的数据加密从应用程序委托给网络层,并允许 UDP 和 TCP 提供完全相同的安全保证。但是,在大多数情况下,UDP 性能增益将被 IPSec 开销抵消,所以我不确定只要使用 IPv6 IPSec,使用 UDP 代替 TCP 会有什么优势。