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

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

评论

评论不作进一步讨论;此对话已移至聊天。

#1 楼

要使用TCP将数据发送到应用程序,您首先必须建立一个连接。在建立连接之前,数据包仅到达OS层,而不到达应用程序。建立连接要求您将数据包接收回初始端。如果要伪造不在自己网络上的IP地址并建立TCP连接,则需要能够拦截另一侧发出的数据包。 (您需要位于端点之间,以及到伪造IP地址的数据包通常可以到达的位置,或执行其他一些巧妙的路由技巧。)

UDP没有连接,因此您可以伪造一个具有任意IP地址的数据包,它应该到达应用程序。当然,除非您在正确的“位置”,否则您仍然不会取回数据包。这是否重要取决于您放置在应用程序中的安全性。如果您比应用程序中的其他IP地址更信任某些IP地址,那么这可能是个问题。取决于应用程序,这可能与安全性相关或无关。就其本身而言,用TCP代替UDP并不是一个很好的理由,因为这两个协议之间还有其他折衷选择。

评论


“ UDP没有连接,因此您可以伪造具有任意IP地址的数据包,并且该数据包应到达应用程序。”应该是?由于ISP方面的出口/入口过滤,我感到这是一个城市神话。

–user541686
17年7月21日在7:40



@Merhdad不。这是DNS反射器DDoS攻击问题的一个主要因素。入口过滤仅意味着ISP会检查数据包的声明来源是否与它进入的接口/ BGP邻居相匹配,并且出口过滤的发生频率不像我们想要的那样频繁。

– Shadur
17年7月21日在8:41

我同意@Shadur和大多数答案,并补充称赞“更安全”不是设计使然,但它可以为欺骗提供相当多的保护,但它不是水密的。我认为它类似于NAT既不是设计为安全功能,也确实增加了攻击者必须跳过的障碍。适当的安全性意味着在UDP或TCP协议中使用身份验证功能,或添加身份验证标头(IPsec AH)。

–秘籍
17年7月22日在15:22

无论如何,不​​能仅仅用TPC任意替换UDP。数据包丢失时的传递延迟,冗长的连接建立,无多播... UDP vs TCP的选择与安全性无关,而与应用程序要求有关。

–光谱
17年7月22日在23:59

#2 楼

普通UDP不会保持状态,没有握手等。这意味着除非在其他层上没有保护,否则攻击者可以轻松发送欺骗包。猜测已建立连接的序列号和客户端端口。

评论


或者只是在同一个局域网中,毒害ARP表以获取所有通信,然后在他想要插入数据包时增加序列,这会使“合法”数据包作为不良重传而被丢弃...

–滕西拜
17年7月20日在14:54

值得一提的是,任何中途安全的应用程序本身都应该保持状态,实现握手等,因此TCP的额外功能应该是多余的。

–纳特
17年7月20日在21:53

@Nat值得比较将TCP包装在TLS中,并没有注意到通过重新实现IKE来实现更高级别的握手,而IKE重新实现了安全的UDP交互,可以处理握手中的丢失,这会使事情变得多余。

–损失负责人
17年7月21日在22:05

#3 楼

TCP并不比UDP更安全,它具有状态且需要确认每个段,因此更加“可靠”。 UDP是无状态的,只发送段就不知道客户端是否获得这些段。

都没有其他定制的安全功能,不同之处取决于每种协议的不同要求,公认的安全性好处是协议功能性的副产品,而不是故意的安全性功能。

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

这两种协议都依赖于其他协议来提供安全性。因此,尽管TCP的受攻击面可能稍小,但这对于确保您需要以安全性为导向的协议的安全性而言,确实是无关紧要的。选择诸如DTLS或googles QUIC之类的协议。

选择为更适合UDP的用例实现TCP,而不是正确保护UDP(在大多数用例中,TCP也需要保护)。之所以喜欢使用9铁,是因为您认为9铁将是在战斗中捍卫自己的更好武器……当口袋里有枪时。

评论


幸运的是,安全性仍然是安全性。它可能不是很好的安全性,但是它仍然可以比其他情况更安全。

– ak牛
17年7月20日在15:21



是的,我可以看到这种观点。但是在UDP上选择TCP是基于副作用的设计决策。就个人而言,如果我有一个更适合UDP的用例,我将使用UDP并使用为安全性而设计的协议来保护它。

–TheJulyPlot
17年7月20日在15:28

由于按照定义,完整性是安全性的基础,而UDP的更大攻击面主要包括通过欺骗数据包来攻击完整性,因此我可以肯定地说TCP更安全。

– Panos Kal。
17年7月21日在4:25



@PanosK。完整性意味着数据值得信赖。 TCP中的简单错误检测不提供此功能。它不应该也没有为此设计。说TCP比UDP更安全,就像在谈论什么是更好的战车时,大众汽车比福特汽车是更好的家用汽车。是的,大众汽车可能具有5星安全评级,而福特可能只有4星,但它仍然不是更好的坦克,也不会在坦克大战中为您辩护。

–TheJulyPlot
17年7月21日在5:15



迄今为止最好的解释。

–注意
17年11月16日在9:51

#4 楼

是TCP,它比UDP更安全吗?

是的,但是当我们谈论“安全性”时,我们必须非常清楚所谈论的内容,而不是将此语句概括为上层协议。 />
当前,安全性通常与CIA三合会相关:



机密性。 br />可用性。

IP协议的第4版(至今仍是最常用的)是非常古老的野兽,它是在70年代和80年代开发的。 />那时,机密性并不是真正的主题,真正的目标是实现完整性和可用性(诞生于IP协议的Internet的始祖Arpanet网络旨在确保服务的连续性,甚至如果发生核战争,则不能保护传输中的数据。

在此光学系统中,在IP层上开发了两种传输协议:TCP和UDP。

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

尽管该协议的目标是技术灾难,而不是恶意篡改传输中的数据。当时,这种问题完全不在讨论之列。

相反,UDP被设计为快速协议。它没有上述功能,因此也没有任何开销。特别是,当发送方使用UDP发送某些数据时,接收到的数据可能是不完整的,无序的或根本没有接收到:UDP协议本身不提供任何机制来防止或检测到这两个发送方或接收方。 br />
这样,当关注安全的数据完整性和可用性属性时,TCP确实比UDP更安全。

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

肯定不是。

这仅意味着开发依赖UDP的应用程序协议的人们将有更多工作,因为他们可能必须在其应用程序协议中实施UDP协议中缺少的功能。他们必须考虑到发送的数据不一定会被接收,接收的数据可能未按正确的顺序等等。这些都是众所周知的问题。例如,OpenVPN它主要支持TCP以与限制性防火墙兼容,默认情况下运行,并且在UDP上运行效果最佳。可以将其切换到TCP,但不会以任何方式提高其安全性,因为两个传输层协议UDP和TCP之间的差异完全由OpenVPN自己处理。将其切换为TCP只会增加OpenVPN协议的TCP开销,从而降低其性能。

TCP是否比UDP更好?

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

UDP是更原始的协议。如果正确,谨慎地使用它,则可能会以比应用程序协议更困难的开发和维护为代价而获得比TCP更好的性能。作为自然选择,因为无需重新发明轮子。
当应用程序对时间敏感时,必须进行讨论,以选择每个应用程序都将带来其缺点:选择TCP,可能会对使用UDP的更为复杂的应用程序造成潜在的性能损失。

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

除了先前引用的OpenVPN之外,还有两个使用UDP的经典协议示例,是媒体流和DNS。

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

对于DNS,请求和答复通常非常简短,您希望名称解析过程尽可能快(请注意,时间敏感度越来越低的答案,例如DNS区域传输通常仍在TCP上进行)。与处理每个请求的成熟的三向握手相比,在请求或其答案丢失的次数很少的情况下,重新发送名称解析请求到DNS服务器的速度更快。

机密性怎么样?和恶意嗅探/篡改(和IPv6)?

到现在为止,我们所关心的只是,按照旧的IPv4的精神,传输速度与数据完整性+可用性之间达到了平衡。现在,如果我们想在此之上添加机密性,我们可以做到这一点,但是它必须在应用程序层完成,因为如前所述,IPv4不受机密性问题的影响。

可以在应用程序层上实现现代的,完整的安全性实现,并且依赖于TCP或UDP(或两者)协议,而对应用程序协议安全性本身没有任何影响(请参见上面的OpenVPN示例)。

但是,正如开头所述,IPv4确实来自另一个计算时代。如果它是IP6的继任者,它本身就是IP层上支持IPSec的IPv6,从而在UDP和TCP等传输协议下提供了更现代的安全服务。从应用程序到网络层的加密,并允许UDP和TCP提供完全相同的安全性保证。但是,在大多数情况下,UDP性能增益将被IPSec开销抵消,因此,只要使用IPv6 IPSec,我不确定使用UDP代替TCP是否会有任何优势。

#5 楼

并非如此。

这两个协议都没有任何旨在提供机密性的内置功能。上面(或下面)的协议层都应该提供任何安全性。障碍。

当人们说TCP比UDP“更可靠”时,他们并不是在指安全性。 TCP更可靠,因为它确保按顺序接收所有段,并重新传输所有丢失的段。 UDP不能保证这一点。当连接不良时,UDP段可能会丢失而无法跟踪或到达错误的顺序。如何解决此问题取决于应用程序。

评论


您能否在最后一段进行扩展?您所说的“欺骗”到底是什么意思?据我所知,TCP不仅在欺骗上不但有点困难,而且在欺骗上实际上要困难得多。

–阿迪
2014年10月8日,12:41

@Adnan我不想扩大这个范围,因为无论如何这并不是真正的话题(欺骗是在侵犯完整性,而不是保密)。但是,如果您对此主题感兴趣,可以随意打开一个新问题。

– Philipp
2014年10月8日12:44

哦,对不起。也许我不清楚。我客气地说,您的最后一段措辞不佳,质量低下,并可能说明了不正确的信息(除非您详细说明)。我并不是要提供更多信息,而是告诉您解决问题(以防万一,如果您详细说明了欺骗的含义,那么这很清楚)。

–阿迪
14-10-8在12:45



据我所知,如果我错了,请纠正我,一旦您谈论TCP / UDP和欺骗,就会自动假定您正在谈论建立连接(对于TCP)似乎来自不是真正的来源。当然,除非您是指网络工程过程协议欺骗,否则en.wikipedia.org/wiki/Protocol_spoofing#TCP_spoofing(而且我认为您不是在谈论这个问题)

–阿迪
2014年10月8日12:48



哦,看来我不是唯一一个措辞不佳的段落,security.stackexchange.com / questions / 69181 / what-is-tcp-spoofing

–阿迪
2014年10月8日,12:50

#6 楼

TCP是“基于连接的”,这意味着它以序列号的形式内置了可靠性。因此,例如,我通过TCP向您发送了一个图像,但是有1/4的数据包丢失了。由于我们有一个基于序列号的基于连接的协议,因此您的计算机将知道您缺少该数据,因此向我请求该数据以确保数据完整性。这比较慢,但是更安全。另外,为了欺骗TCP / IP数据包,您必须捕获该序列号并发送恶意数据包。没有中间人,这几乎是不可能的!

UDP是“无连接”协议,意味着它只是发送数据而忘记了。没有数据的可靠性或完整性,但是对于某些应用程序,它更快,更高效。

评论


这不是不可能用tcp syn / ack / syn-ack数据包淹没一台机器...侦听比较困难,但是序列可以通过在arp中毒后进行嗅探来猜测(例如,不是在Internet上,而是在一方的本地网络上) )。因此,本身并没有真正增加的安全性。

–滕西拜
17年7月20日在14:51

我仍然认为它更安全,因为危害包含更多有价值数据的TCP的步骤更加困难且麻烦。本质上,您需要破坏网络,通过ARP中毒以及随后的(可能是)DNS中毒来设置MiTM,然后从那里注入所有正在通过您的流量的东西,即“假网关”。或者,您可以设置一个伪造的AP,然后等待人们连接,这很容易哈哈。无论哪种方式,TCP劫持=都需要更多步骤来进行黑客入侵,而UDP劫持=则需要进行更多步骤。大声笑

–约书亚·浮士德
17年7月20日在15:21



如果目标是代表原始用户发送数据包,则只需响应用户侧网关或服务器侧目标服务器的arp请求,即可获取数据包的副本以进行猜测序列号。这仅比udp多了一步。如果您希望双向,是的,您必须获得MITM,但对于UDP也是如此。增加的安全性很小

–滕西拜
17年7月20日在15:27

#7 楼

实际上,TCP更易于在防火墙网络中进行管理:与外部建立的连接还是内部建立的连接有关的流量,以及客户端与服务器的角色,都可以通过单独的策略加以区分和处理。例如,您可以轻松确保受保护的网络上的主机可以访问外部Web服务器,但不能充当外部客户端的Web服务器。对于UDP服务(例如DNS),强制执行此类策略需要更多的情报和猜测,因为您必须考虑传输层之上和之下的信息。

#8 楼

TCP并不比UDP“更安全”:


TCP本身没有加密功能;
TCP数据包传输是可靠的,但是您可以在UDP上进行仿真。

UDP只是IP数据包之上的一个薄层,而TCP具有复杂的和标准的附加机制,它们是操作系统的一部分。

查看QUIC项目,以了解有关TCP / UDP差异的更多信息,以及Google为什么要在UDP而非TCP之上创建自己的安全HTTP / 2传输层。

让我们引述https://www.chromium.org/quic:


QUIC优于TCP + TLS + HTTP2的主要优点包括:


连接建立延迟
改进的拥塞控制
没有行头阻塞的多路复用
前向纠错
连接迁移

>

#9 楼

让我们为每个安全对象设置一些优点/缺点,并查看:

UDP


(+)扫描UDP开放端口比较困难,并且没有隐秘的扫描存在(通过发送SYN在TCP中建立半连接)。
(-)网络设备(例如,状态防火墙,NAT)难以控制UDP连接,因为没有FLAGS可以依靠。
(-)由于缺乏连接,反射攻击更为常见。
(-)欺骗IP很容易,并且可用于DoS攻击。仅发送SYN以检测打开的端口)
(+)网络设备(例如,状态防火墙)可以轻松跟踪和控制TCP连接。
(+)伪造数据包并不容易,因为它要求提供正确的`序列号和确认号。
(+)由于最初的握手,它不像UDP欺骗IP那样容易。


#10 楼

TCP具有连接的概念,而UDP没有。但是,从安全角度来看,连接概念既是优点也是缺点。连接的主要安全强度是标准化的,应用程序开发人员,网络设备和防火墙都可以依靠固定的方法来建立连接,处理数据包分段,重传等。另外,连接概念使在顶部建立其他安全层(例如SSL)变得更加容易。

但是,TCP连接并不能提供很多保护,使其免受直接针对传输层的攻击SYN洪水攻击。从理论上讲,使用UDP可以对每个数据包进行身份验证,以减轻其中的某些风险。 ,因此理论上的优势是毫无意义的。在现实世界中,可以通过两种方式找到示例-一种协议以另一种协议不易受到攻击的方式失败。

总而言之,我不认为要回答哪种协议更“安全”,您需要使问题符合您所关注的威胁以及您愿意花费多长时间来缓解这些威胁。如果这都是威胁,而您对时间和金钱有无限的了解,那么我的理论答案就成立了。

评论


UDP也有洪泛攻击。您的答案需要更多有关UDP为什么在理论上比TCP更安全的支持。

–user2320464
17年7月23日在1:18

@ user2320464可以通过永不发送“目标不可达”数据包来关闭rfc792孔。针对基于UDP的服务还存在许多不对称攻击;但我只是将它们归类为应用程序中的缺陷(或应用程序所实现的协议,DNS,ntp等)。我为TCP遇到了一个问题(接收到第一个数据包后需要分配资源)。请注意UDP中的任何协议级别(非特定于应用程序和非特定于实现)的缺陷,该缺陷也不适用于TCP,并且在我们的理论世界中无法解决。

– David Trott
17年7月24日在19:26

#11 楼

当前,TCP不比UDP更安全。 TCP比UDP更可靠,因为TCP可以检测并重新传输错误数据包。

如果希望进行安全的数据传输,那么您正在考虑使用某种格式加密,例如TLS或IPSec。 >