Skip to main content

17. Security Considerations (安全考虑)

本节考虑在 TURN 部署中可能发生的攻击,并讨论如何通过协议中的机制或实现中的推荐做法来缓解这些攻击。

针对 TURN 的大多数攻击通过服务器要求对请求进行身份验证来缓解。因此,本规范要求使用身份验证。强制实现的机制是 STUN 的长期凭证机制。可以使用具有相同或更强安全属性的其他身份验证机制。但是,重要的是确保它们可以以可互操作的方式调用。

17.1. Outsider Attacks (外部攻击)

外部攻击是攻击者在系统中没有凭证,并试图破坏客户端或服务器看到的服务的攻击。

17.1.1. Obtaining Unauthorized Allocations (获取未授权分配)

攻击者可能出于任何数量的恶意目的希望在 TURN 服务器上获取分配。TURN 服务器提供了一种在隐藏客户端实际 IP 地址的同时发送和接收数据包的机制。这使得 TURN 服务器成为希望使用它来掩盖其真实身份的攻击者的有吸引力的目标。

攻击者也可能只是希望在不付费的情况下利用 TURN 服务器的服务。由于 TURN 服务需要提供商的资源,预计它们的使用将伴随成本。

这些攻击通过使用长期凭证机制来防止,该机制允许 TURN 服务器确定请求者的身份以及请求者是否被允许获取分配。

17.1.2. Offline Dictionary Attacks (离线字典攻击)

TURN 使用的长期凭证机制容易受到离线字典攻击。能够窃听客户端和服务器之间的消息交换的攻击者可以通过尝试多个候选密码并查看其中一个是否正确来确定密码。当密码是低熵的(例如字典中的单词)时,此攻击有效。可以通过使用具有大熵的强密码来缓解此攻击。在需要更强缓解的情况下,可以在客户端和服务器之间使用 TLS 传输。

17.1.3. Faked Refreshes and Permissions (伪造刷新和权限)

攻击者可能希望通过向其发送具有立即过期的 Refresh 请求来攻击活动分配,以删除它并破坏对客户端的服务。这通过对刷新进行身份验证来防止。类似地,希望发送 CreatePermission 请求以创建到不希望的目标的权限的攻击者通过身份验证被阻止这样做。此类攻击的动机在第 17.2 节中描述。

17.1.4. Fake Data (伪造数据)

攻击者可能希望向客户端或对等方发送数据,就好像它们分别来自对等方或客户端一样。为此,攻击者可以向客户端发送伪造的 Data 指示或 ChannelData 消息,或向 TURN 服务器发送伪造的 Send 指示或 ChannelData 消息。

由于指示和 ChannelData 消息未经过身份验证,因此 TURN 不会阻止此攻击。但是,此攻击通常存在于基于 IP 的通信中,并且不会因 TURN 而显著恶化。考虑主机 A 和 B 之间的正常非 TURN IP 会话。攻击者可以通过使用 B 的伪造 IP 地址向 A 发送数据包来向 B 发送看似来自 A 的数据包。此攻击要求攻击者知道 A 和 B 的 IP 地址。使用 TURN 时,希望使用 Data 指示向客户端发送数据包的攻击者需要知道其 IP 地址(和端口)、TURN 服务器的 IP 地址和端口以及对等方的 IP 地址和端口(用于包含在 XOR-PEER-ADDRESS 属性中)。要向客户端发送伪造的 ChannelData 消息,攻击者需要知道客户端的 IP 地址和端口、TURN 服务器的 IP 地址和端口以及通道号。这种特殊组合比非 TURN 情况稍微更容易猜测。

这些攻击更适合通过应用层身份验证技术来缓解。在实时流量的情况下,使用 SRTP [RFC3711] 可以防止这些攻击。

在某些情况下,TURN 服务器可能位于网络中,使其能够向客户端无法直接发送的主机发送。例如,如果服务器位于防火墙后面,该防火墙允许来自防火墙外部的数据包传递到服务器,但不传递到防火墙后面的其他主机。在这些情况下,攻击者可以向服务器发送 Send 指示,其中 XOR-PEER-ADDRESS 属性包含防火墙后面的其他主机之一的传输地址。如果服务器允许将流量中继到任意对等方,那么这将为攻击者提供一种攻击防火墙后面任意主机的方法。

为了缓解此攻击,TURN 要求客户端在向主机发送数据之前建立对该主机的权限。因此,攻击者只能攻击客户端已经与之通信的主机,除非攻击者能够创建经过身份验证的请求。此外,服务器管理员可以配置服务器以限制它将中继数据的 IP 地址和端口范围。为了提供更大的安全性,服务器管理员可以要求客户端使用 TLS 进行客户端和服务器之间的所有通信。

17.1.5. Impersonating a Server (冒充服务器)

当客户端从 TURN 服务器学习到中继地址时,它在应用协议中使用该中继地址来接收流量。因此,希望拦截或重定向该流量的攻击者可能会尝试冒充 TURN 服务器并向客户端提供伪造的中继地址。

此攻击通过长期凭证机制来防止,该机制为响应提供消息完整性,并验证它们来自服务器。此外,攻击者无法重放旧的服务器响应,因为 STUN 头中的事务 ID 可以防止这种情况。通过频繁更改随机数值进一步阻止重放攻击。

17.1.6. Eavesdropping Traffic (窃听流量)

TURN 主要关注身份验证和消息完整性。机密性只是次要关注点,因为 TURN 控制消息不包含特别敏感的信息。消息的主要协议内容是对等方的 IP 地址。如果重要的是防止 TURN 连接上的窃听者学习到这一点,TURN 可以在 TLS 上运行。

TURN 中继的应用程序数据的机密性最好由应用协议本身提供,因为在 TLS 上运行 TURN 不会保护服务器和对等方之间的应用程序数据。如果应用程序数据的机密性很重要,则应用程序应该加密或以其他方式保护其数据。例如,对于实时媒体,可以通过使用 SRTP 提供机密性。

17.1.7. TURN Loop Attack (TURN 循环攻击)

攻击者可能会尝试导致数据包在两个 TURN 服务器之间无限循环。攻击如下进行。首先,攻击者使用服务器 B 的源地址向服务器 A 发送 Allocate 请求。服务器 A 将其响应发送到服务器 B,为了使攻击成功,攻击者必须能够查看或猜测此响应的内容,以便攻击者可以学习分配的中继传输地址。然后,攻击者使用服务器 A 的源地址向服务器 B 发送 Allocate 请求。同样,攻击者必须能够查看或猜测响应的内容,以便可以学习分配的中继传输地址。使用相同的伪造源地址技术,攻击者然后在服务器 A 上将通道号绑定到服务器 B 上的中继传输地址,并类似地在服务器 B 上将相同的通道号绑定到服务器 A 上的中继传输地址。最后,攻击者向服务器 A 发送 ChannelData 消息。

结果是一个数据包从服务器 A 上的中继传输地址循环到服务器 B 上的中继传输地址,然后从服务器 B 的传输地址到服务器 A 的传输地址,然后再次循环。

此攻击的缓解措施如下。通过要求对所有请求进行身份验证和/或通过随机化为中继传输地址分配的端口号,服务器迫使攻击者拦截或查看发送给第三方(在本例中为另一台服务器)的响应,以便攻击者可以验证请求并学习中继传输地址。如果没有这两项措施之一,攻击者可以在不需要看到响应的情况下猜测响应的内容,这使得攻击更容易执行。此外,通过要求经过身份验证的请求,服务器迫使攻击者拥有服务器可接受的凭证,这将其从外部攻击变为内部攻击,并允许将攻击追溯到发起它的客户端。

可以通过对该用户名拥有的分配用于中继数据的带宽施加每用户名限制来进一步缓解攻击,以限制此攻击对其他分配的影响。可以通过在中继数据包时递减 TTL(如果底层操作系统允许)来实现更多缓解。

17.2. Firewall Considerations (防火墙考虑)

TURN 的一个关键安全考虑是 TURN 不应削弱部署在客户端和 TURN 服务器之间的防火墙提供的保护。预计 TURN 服务器通常会出现在公共互联网上,而客户端可能通常位于具有企业防火墙的企业网络内。如果 TURN 服务器为进入企业提供"后门",TURN 将被这些防火墙阻止。

因此,TURN 服务器模拟实现地址依赖过滤 [RFC4787] 的 NAT 设备的行为,这是许多防火墙中常见的属性。当 NAT 或防火墙实现此行为时,仅当内部 IP 地址和端口最近向该外部 IP 地址发送了数据包时,才允许来自外部 IP 地址的数据包发送到内部 IP 地址和端口。TURN 服务器引入权限的概念,在 TURN 服务器上提供完全相同的行为。攻击者无法向 TURN 服务器发送数据包并期望它被中继到客户端,除非客户端首先尝试联系攻击者。

重要的是要注意,一些防火墙的策略甚至比地址依赖过滤更严格。防火墙也可以配置为地址和端口依赖过滤,或者可以配置为完全不允许入站流量。在这些情况下,如果允许客户端连接到 TURN 服务器,与客户端的通信将比防火墙通常允许的限制更少。

17.2.1. Faked Permissions (伪造权限)

在防火墙和 NAT 设备中,权限通过从网络内部到外部对等方的数据包穿越隐式授予。因此,根据定义,权限不能由防火墙或 NAT 内部以外的任何实体创建。使用 TURN,此限制不再成立。由于 TURN 服务器位于防火墙外部,防火墙外部的攻击者现在可以向 TURN 服务器发送消息并尝试为自己创建权限。

此攻击被阻止,因为所有创建权限的消息(即 ChannelBind 和 CreatePermission)都经过身份验证。

17.2.2. Blacklisted IP Addresses (黑名单 IP 地址)

许多防火墙可以配置黑名单,以防止防火墙后面的客户端向黑名单 IP 地址范围发送数据包或从中接收数据包。这是通过分别检查进入和离开防火墙的数据包的源和目标地址来实现的。

此功能也存在于 TURN 中,因为允许 TURN 服务器任意限制它将中继到的对等方的地址范围。

17.2.3. Running Servers on Well-Known Ports (在众所周知端口上运行服务器)

防火墙后面的恶意客户端可能会尝试连接到 TURN 服务器并获取一个分配,然后使用它来运行服务器。例如,客户端可能尝试运行 DNS 服务器或 FTP 服务器。

这在 TURN 中是不可能的。TURN 服务器永远不会接受来自客户端未安装权限的对等方的流量。因此,对等方不能只是连接到分配的端口以获取服务。

17.3. Insider Attacks (内部攻击)

在内部攻击中,客户端具有合法凭证但违反了这些凭证所附带的信任关系。这些攻击无法通过加密手段防止,但需要在协议设计中加以考虑。

17.3.1. DoS against TURN Server (针对 TURN 服务器的 DoS)

希望破坏对其他客户端服务的客户端可能会获取分配,然后用流量淹没它,试图压垮服务器并阻止其为其他合法客户端提供服务。这通过推荐服务器限制它将为给定用户名中继的带宽量来缓解。这不会阻止客户端发送大量流量,但它允许服务器立即丢弃超出的流量。

由于每个分配在 TURN 服务器的 IP 地址上使用一个端口号,因此服务器上的分配数量是有限的。攻击者可能会尝试通过请求大量分配来消耗所有分配。这通过推荐服务器对给定用户名同时处于活动状态的分配数量施加限制来防止。

17.3.2. Anonymous Relaying of Malicious Traffic (恶意流量的匿名中继)

TURN 服务器提供一定程度的匿名化。客户端可以向对等方发送数据而不泄露其自己的 IP 地址。因此,TURN 服务器可能成为攻击者发起针对目标的攻击而不担心被检测的有吸引力的工具。实际上,客户端可以将多个 TURN 服务器链接在一起,这样在目标收到数据包之前可以使用任意数量的中继。

担心此攻击的管理员可以维护日志,捕获客户端的实际源 IP 和端口,甚至可能捕获该客户端安装的每个权限。这将允许进行取证追踪以确定原始来源,如果发现攻击正在通过 TURN 服务器中继。

17.3.3. Manipulating Other Allocations (操纵其他分配)

攻击者可能会尝试通过发送 Refresh 请求或 CreatePermission 请求来破坏 TURN 服务器其他用户的服务,这些请求(通过源地址欺骗)看起来像是来自 TURN 服务器的另一个用户。TURN 通过要求 CreatePermission、Refresh 和 ChannelBind 消息中使用的凭证与用于创建初始分配的凭证匹配来防止这种情况。因此,来自攻击者的伪造请求将被拒绝。

17.4. Other Considerations (其他考虑)

通过 Allocate 请求学习到的任何中继地址在传输或隧道模式下都无法与 IPsec 认证头 (AH) [RFC4302] 正常工作。但是,隧道模式 IPsec 封装安全有效载荷 (ESP) [RFC4303] 应该仍然可以工作。